C++图书管理系统(一)SQL光速入门
MySQL 基本操作
登录
启动MySQL
net start mysql
关闭MySQL
net stop mysql
在终端中输入。
mysql -u root -p
-u
后面输入要登录的用户名,回车后输出密码即可登录
输入
exit
即可登出
查看当前所有的数据库
show databases;
可以看到
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
6 rows in set (0.00 sec)
这就是内置的数据库。
创建新的数据库
假设我们要创建一个数据testdb
create database testdb;
再次看场当前数据库即可看到。
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| testdb |
| world |
+--------------------+
讲到这里,要提出两个点。第一,SQL语句和C++类似,分号用于标识一条 SQL 语句的结束。第二,SQL语句的关键字是不区分大小写,但是数据库名、表名等取决于不同的系统有些区分,有些不区分。但是行业的默认规范是关键字采用大写。因此刚才命令规划写法应该如下。
SHOW DATABASES;
CREATE DATABASE testdb;
切换数据库
我们切换到刚刚创建的数据库中。
USE testdb;
删除数据库
删除刚刚创建的数据库testdb
DROP DATABASE testdb;
什么是关系型数据库?
- 表:表是关系型数据库中存储数据的核心结构,由行和列构成的二维逻辑单元,用于组织同一类实体(如用户、订单)的数据集合。
- 列:列是表的属性字段,定义数据的类型(如整数、字符串)及约束条件(如主键、非空),用于描述实体的具体特征(如姓名、年龄)。
- 行:行是表中一条完整的记录,由多个列的值组成,代表一个具体的实体实例(如某个用户的姓名、年龄等数据),通常通过主键唯一标识。
- 主键:主键是关系型数据库中唯一标识表中每一行记录的字段或字段组合,其值必须唯一且不可为空,并作为数据检索、表间关联及数据完整性的核心保障。
MySQL 基本数据类型
整数类型
类型名称 | 大小/范围 | 说明 |
---|---|---|
TINYINT |
1字节(-128~127 或 0~255) | 微小整数,常用于布尔值(0/1)。 |
SMALLINT |
2字节(-32768~32767 或 0~65535) | 较小整数,适用于年龄、数量等小范围数值。 |
MEDIUMINT |
3字节(-838万~838万 或 0~1677万) | 中等整数,较少使用。 |
INT |
4字节(-21亿~21亿 或 0~42亿) | 标准整数,适用于大多数数值场景。 |
BIGINT |
8字节(±9.2×10¹⁸) | 大整数,适用于ID、时间戳等大范围数值。 |
浮点数与精确小数
类型名称 | 大小/范围 | 说明 |
---|---|---|
FLOAT |
4字节(单精度) | 精度约 6-7 位有效数字。 |
DOUBLE |
8字节(双精度) | 更高精度的浮点数,适用于科学计算。精度约 15 位有效数字。 |
DECIMAL |
变长 | 精确小数,适用于财务数据。 |
日期与时间
类型名称 | 大小/范围 | 说明 |
---|---|---|
DATE |
3字节('1000-01-01'~'9999-12-31') | 存储日期(年月日)。 |
TIME |
3字节('-838:59:59'~'838:59:59') | 存储时间(时分秒),支持负值(表示时间差)。 |
DATETIME |
8字节('1000-01-01 00:00:00'~'9999-12-31 23:59:59') | 存储日期和时间,不依赖时区。 |
TIMESTAMP |
4字节('1970-01-01 00:00:01' UTC~'2038-01-19 03:14:07' UTC) | 时间戳,自动记录数据修改时间,依赖时区。 |
YEAR |
1字节(1901~2155) | 存储年份。 |
字符串类型
子类 | 类型名称 | 大小/范围 | 说明 |
---|---|---|---|
文本 | CHAR(N) |
0~255字符(固定长度) | 定长字符串,适合短文本(如性别CHAR(1) )。 |
VARCHAR(N) |
0~65535字符(可变长度) | 变长字符串,适合长文本(如用户名、地址)。 | |
二进制 | BLOB |
最大64KB~4GB(TINYBLOB /BLOB /MEDIUMBLOB /LONGBLOB ) |
存储二进制数据(如图片、文件)。 |
TEXT |
最大64KB~4GB(TINYTEXT /TEXT /MEDIUMTEXT /LONGTEXT ) |
存储长文本(如文章内容),与BLOB 类似但不处理字符集。 |
|
枚举/集合 | ENUM('val1', 'val2') |
最多65535个枚举值 | 单选值集合(如性别ENUM('男', '女') )。 |
SET('val1', 'val2') |
最多64个成员 | 多选值集合(如兴趣SET('音乐', '运动') )。 |
其他类型
类型名称 | 大小/范围 | 说明 |
---|---|---|
JSON |
动态存储 | 存储JSON格式数据,支持JSON查询语法(如JSON_EXTRACT() )。 |
常用SQL命令
注意以下命令需要在某个数据库中使用,比如USE testdb;
之后才能使用。
创建表
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
);
比如我们的图书管理系统创建一个表
CREATE TABLE books(
book_id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100),
published_date DATE
);
这个命令中,book_id
比其他行多的就是约束条件。其中
AUTO_INCREMENT
:自动生成唯一递增整数,无需手动插入(如插入时省略该字段,值会自动+1)PRIMARY KEY
:唯一标识每一行,强制非空且唯一,默认建立聚簇索引以加速查询。
然后title,auther
的数据类型是VARCHAR(100)
,长度限制为100字符,实际存储空间按数据长度动态分配。
然后我们可以使用命令来查看
SHOW TABLES;
结果如下
+------------------+
| Tables_in_testdb |
+------------------+
| books |
+------------------+
如果需要删除表,和删除数据库类似
DROP TABLE books;
插入数据
插入数据格式如下
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
参数说明:
table_name
是你要插入数据的表的名称。column1
,column2
,column3
, ... 是表中的列名。value1
,value2
,value3
, ... 是要插入的具体数值。- 如果数据是字符型,必须使用单引号 ' 或者双引号 ",如: 'value1', "value1"。
比如我们要插入一条数据
INSERT INTO books(title, author, published_date) VALUES
('The Catcher in the Rye', 'J.D. Salinger', '1951-07-16');
如果我们要插入多条数据
INSERT INTO books VALUES
(2, 'Harry Potter', 'J.K. Rowing', '1997-06-26'),
(1234, 'The Hobbit', 'J.R.R Tolkien', '1937-09-21'),
(NULL, '1984', 'Geogre Orwell', '1949-06-08');
如果要插入所有列,就可以省略列名。NULL
就可以让系统自动给book_id
赋值,但是请注意,他是根据插入过的最大值进行自增。
查询数据
基础查询
SELECT column1, column2, ... FROM table_name
其中column1, column2, ...
表示查询的列。
比如我们查询所有的书名
SELECT title FROM books;
如果要查询完整的表,可以用*
代替所有的列。
SELECT * FROM books;
更新数据
以下是语法
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
我们看当前的表格
+---------+------------------------+---------------+----------------+
| book_id | title | author | published_date |
+---------+------------------------+---------------+----------------+
| 1 | The Catcher in the Rye | J.D. Salinger | 1951-07-16 |
| 2 | Harry Potter | J.K. Rowing | 1997-06-26 |
| 1234 | The Hobbit | J.R.R Tolkien | 1937-09-21 |
| 1235 | 1984 | Geogre Orwell | 1949-06-08 |
+---------+------------------------+---------------+----------------+
比如我想把《1984》的作者该成 Orwell 可以
UPDATE books
SET author = 'Orwell'
WHERE title = '1984';
删除数据
以下是语法,注意删除的是行
DELETE FROM table_name
WHERE condition;
我们看当前的表
+---------+------------------------+---------------+----------------+
| book_id | title | author | published_date |
+---------+------------------------+---------------+----------------+
| 1 | The Catcher in the Rye | J.D. Salinger | 1951-07-16 |
| 2 | Harry Potter | J.K. Rowing | 1997-06-26 |
| 4 | test2 | test2 | 2000-01-01 |
| 6 | test1 | test1 | 2000-01-01 |
| 1234 | The Hobbit | J.R.R Tolkien | 1937-09-21 |
| 1235 | 1984 | Geogre Orwell | 1949-06-08 |
| 1238 | test3 | test3 | 2000-01-01 |
| 1239 | test4 | test4 | 2000-01-01 |
+---------+------------------------+---------------+----------------+
比如说我要把这几个test
都删除
DELETE FROM books
WHERE book_id = 2;
这样可以删掉一个,如果我想把剩下的一起删掉可以
DELETE FROM books
WHERE book_id = 6 OR book_id = 1238 or book_id = 1239;
列的完整性约束
1. 主键约束(PRIMARY KEY)
-
作用:唯一标识表中的每一行,确保列值唯一且非空。
-
示例:
CREATE TABLE Students ( student_id INT PRIMARY KEY, name VARCHAR(100) );
-
注意:每个表只能有一个主键,可由单列或多列组成(多列时为表级约束)。
2. 唯一约束(UNIQUE)
-
作用:保证列中所有值唯一,但允许存在多个
NULL
值(具体因数据库而异)。 -
示例:
CREATE TABLE Users ( email VARCHAR(255) UNIQUE );
-
注意:与主键不同,唯一约束允许空值,适用于需要避免重复但非唯一标识的场景(如邮箱、用户名)。
3. 非空约束(NOT NULL)
-
作用:强制列不允许
NULL
值,必须提供有效数据。 -
CREATE TABLE Employees ( employee_id INT PRIMARY KEY, name VARCHAR(100) NOT NULL );
4. 默认值(DEFAULT)
-
作用:当插入数据未指定列值时,自动填充预设的默认值。
-
CREATE TABLE Orders ( order_date DATE DEFAULT CURRENT_DATE );
6. 外键约束(FOREIGN KEY)
-
作用:维护表间的参照完整性,确保列值引用另一表的主键或唯一键。
-
CREATE TABLE Orders ( customer_id INT REFERENCES Customers(customer_id) );
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· “你见过凌晨四点的洛杉矶吗?”--《我们为什么要睡觉》
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· C# 从零开始使用Layui.Wpf库开发WPF客户端
· C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
· 接口重试的7种常用方案!
2024-03-19 20240319天梯赛训练
2024-03-19 AtCoder Beginner Contest 345
2023-03-19 AtCoder Beginner Contest 293
2022-03-19 AcWing题目选做