MySQL通用语法
- SQL语句可以单行或多行书写,以分号结尾
- SQL语句可以使用空格/缩进来增强语句的可读性
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 注释:
- 单行注释:-- 注释内容 或 # 注释内容
- 多行注释:/* 注释内容 */
MySQL数据类型
整数类型
| 类型 | 大小(字节) | 有符号范围(UNSIGNED) | 无符号范围(SIGNED) |
| TINYINT | 1 | -128 到 127 | 0 到 255 |
| SMALLINT | 2 | -32,768 到 32,767 | 0 到 65,535 |
| MEDIUMINT | 3 | -8,388,608 到 8,388,607 | 0 到 16,777,215 |
| INT | 4 | -2,147,483,648 到 2,147,483,647 | 0 到 4,294,967,295 |
| BIGINT | 8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0 到 18,446,744,073,709,551,615 |
在 MySQL 中,数值类型可以指定为无符号(UNSIGNED)或有符号(默认)。无符号类型的数值只能存储非负数,而有符号类型的数值可以存储正数、零和负数。
浮点数类型
| 类型 | 大小 (字节) | 描述 |
| FLOAT(M,D) | 4 | 单精度浮点数,M 是总位数,D 是小数点后的位数 |
| DOUBLE(M,D) | 8 | 双精度浮点数,M 和 D 含义同上 |
| DECIMAL(M,D) | 可变 | 固定点数,M 是总位数,D 是小数点后的位数 |
字符串类型
| 类型 | 描述 |
| CHAR(N) | 固定长度字符串,N 表示最大长度 |
| VARCHAR(N) | 可变长度字符串,N 表示最大长度 |
| TEXT | 长文本数据,适合存储大量文本 |
| BLOB | 二进制大对象,适合存储图像、文件等二进制数据 |
CHAR 与 VARCHAR 的对比
性能
1.CHAR
- 插入和更新速度快:由于 CHAR 类型的字段长度固定,插入和更新操作通常更快,因为数据库不需要重新分配存储空间。
- 索引效率高:对于固定长度的字段,索引的构建和查找通常更高效。
2.VARCHAR
- 插入和更新速度较慢:由于 VARCHAR 类型的字段长度可变,插入和更新操作可能需要重新分配存储空间,这可能会导致一些性能开销。
- 索引效率稍低:对于可变长度的字段,索引的构建和查找可能会稍微复杂一些,但影响通常不大。
适用场景
1.CHAR
- 固定长度的字符串:适用于存储长度固定的字符串,如邮政编码、电话号码、性别(M/F)等。
- 短字符串:对于非常短的字符串,使用 CHAR 类型可以减少存储开销。
2.VARCHAR
- 长度不固定的字符串:适用于存储长度不固定的字符串,如姓名、地址、描述等。
- 长字符串:对于较长的字符串,使用 VARCHAR 类型可以节省存储空间。
查询 (SHOW / SELECT)
SHOW
SHOW 语句用于显示数据库和表的元数据信息。
-- 查看数据库 SHOW DATABASES; -- 查看当前数据库中的表 (需要先使用数据库) SHOW TABLES; -- 查看表的结构 (用 FROM 指定表) SHOW COLUMNS FROM 表名;SELECT
SELECT 语句用于从数据库中检索数据
SELECT 列1, 列2, ... FROM 表名 [WHERE 条件] [GROUP BY 列1, 列2, ...] [HAVING 条件] [ORDER BY 列1, 列2, ... [ASC 或 DESC【二选一】]] [LIMIT 数量];方括号中的内容为可选内容(注:正常执行不需要加上方括号)
- SELECT列1, 列2, ...
- 指定要查看表中的哪列
- FROM表名
- 指定要查询的表
- WHERE条件
- 类似HAVING,在GROUP BY之前执行
- 指定查询的条件
- GROUP BY列1, 列2, ...
- 将结果集按一个或多个列分组
- HAVING条件
- 类似WHERE,在GROUP BY之后执行
- 用于筛选分组后的结果集
- ORDER BY列1, 列2, ...[ASC或DESC]
- 用于对查询结果进行升序或降序排序
- [ASC或DESC]
- 从ASC与DESC中选一个(注意不要加方括号)
- ASC升序(不填就默认)
- DESC降序
- LIMIT数量
- 限制返回的行数为数量
创建 (CREATE)
CREATE
-- 创建数据库 CREATE 数据库名; -- 创建表 (需要先使用数据库) CREATE TABLE 表名 ( 字段1 数据类型 [约束条件] [COMMENT '注释'], 字段2 数据类型 [约束条件] [COMMENT '注释'], ... [表级约束] ) [COMMENT '注释'];方括号中的内容为可选内容(注:正常执行不需要加上方括号)
- [约束条件]
- NOT NULL:字段不能为空
- PRIMARY KEY:字段为主键
- FOREIGN KEY:字段为外键
- UNIQUE:字段值必须唯一
- CHECK:字段值必须满足某个条件
- [表级约束条件]
- PRIMARY KEY (字段1, 字段2):定义复合主键
- FOREIGN KEY (字段1) REFERENCES另一个表名(字段):定义外键
- [COMMENT '注释']
- 注释
插入 (INSERT INTO)
INSERT INTO 语句用于向数据库表中插入新的记录
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...),(值1, 值2, ...),(值1, 值2, ...);- 字段1, 字段2, ...:
- 表中的字段名称
如果指定了字段列表,则VALUES子句中的值必须与字段列表中的顺序和数量一致 - 指定要在哪列插入新行
- 表中的字段名称
- 值1, 值2, ...:
- 要插入的值。值的类型必须与对应字段的数据类型匹配。
删除 (DROP/DELETE)
DROP
DROP 语句用于删除数据库中的各种对象,如表、视图、索引、数据库等
-- 删除数据库 DROP DATABASES 数据库名 (WHERE 条件); -- 删除数据库中的表 (需要先使用数据库) DROP TABLE 表名;DELETE
DELETE 语句用于从表中删除记录(行)
-- 删除表中的数据 DELETE FROM 表名 [WHERE 条件];- WHERE条件
修改 (ALTER)
ALTER 语句用于修改已存在的表结构,它可以用来添加、删除或修改表中的列、索引、约束等
-- 添加列 ALTER TABLE 表名 ADD COLUMN 新列名1 数据类型 [约束条件], ADD COLUMN 新列名2 数据类型 [约束条件]; -- 删除列 ALTER TABLE 表名 DROP COLUMN 列名1, DROP COLUMN 列名2; -- 修改列 ALTER TABLE 表名 MODIFY COLUMN 列名1 新数据类型 [新约束条件], MODIFY COLUMN 列名2 新数据类型 [新约束条件]; -- 重命名列 ALTER TABLE 表名 CHANGE COLUMN 旧列名1 新列名1 新数据类型 [新约束条件], CHANGE COLUMN 旧列名2 新列名2 新数据类型 [新约束条件]; -- 添加主键 ALTER TABLE 表名 ADD PRIMARY KEY (列名); -- 删除主键 ALTER TABLE 表名 DROP PRIMARY KEY; -- 添加唯一约束 ALTER TABLE 表名 ADD UNIQUE (列名); -- 删除唯一约束 ALTER TABLE 表名 DROP INDEX 约束名; -- 添加外键 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (列名) REFERENCES 引用表 (引用列); -- 删除外键 ALTER TABLE 表名 DROP FOREIGN KEY 外键名; -- 添加索引 ALTER TABLE 表名 ADD INDEX 索引名 (列名); -- 删除索引 ALTER TABLE 表名 DROP INDEX 索引名;接下来我以以树结构形式来讲解ALTER TABLE:
方括号中的内容为可选内容(注:正常执行不需要加上方括号)
- ALTER TABLE表名
- ADD【添加】
- 添加列
COLUMN新列名 数据类型 [约束条件]- 新列名:新列的名称
- 数据类型:新列的数据类型
- [约束条件](可选):
- NOT NULL:字段不能为空
- PRIMARY KEY:字段为主键
- FOREIGN KEY:字段为外键
- UNIQUE:字段值必须唯一
- CHECK:字段值必须满足某个条件
- 添加主键
PRIMARY KEY(列名) - 添加外键
CONSTRAINT外键名FOREIGN KEY(列名)REFERENCES引用表 (引用列)
- 添加列
- DROP【删除】
- 删除列
COLUMN列名- 列名:要删除的列的名称
- 删除主键
PRIMARY KEY - 删除外键
FOREIGN KEY外键名- 外键名:要删除的外键的名称
- 删除索引
INDEX索引- 索引:要删除的索引的名称
- 删除列
- MODIFY【修改】
- 修改列
COLUMN列名新数据类型 [新约束条件]- 列名:要修改的列的名称
- 新数据类型:新的数据类型
- [新约束条件](可选):
- NOT NULL:字段不能为空
- PRIMARY KEY:字段为主键
- FOREIGN KEY:字段为外键
- UNIQUE:字段值必须唯一
- CHECK:字段值必须满足某个条件
- 修改列
- CHANGE【改变】
- 重命名列
COLUMN旧列名 新列名 新数据类型 [新约束条件]- 旧列名:要修改的列的名称
- 新列名:新列名称
- 新数据类型:新的数据类型
- [新约束条件](可选):
- NOT NULL:字段不能为空
- PRIMARY KEY:字段为主键
- FOREIGN KEY:字段为外键
- UNIQUE:字段值必须唯一
- CHECK:字段值必须满足某个条件
- 重命名列
- ADD【添加】
聚合函数
COUNT【数量】
-- 记录表中的总的记录行数,不管表字段中是否包含NULL值 COUNT(*) -- 计算表中指定字段的记录行数,统计时忽略NULL值 COUNT(列名)SUM【求和】
-- 求和函数,计算指定列的总值 SUM(列名)AVG【平均值】
-- 平均值函数,计算指定列的平均值 AVG(列名)MAX【最大值】和 MIN【最小值】
-- 最大值函数,求出指定列的最大值 MAX(列名) -- 最小值函数,求出指定列的最大值 MIN(列名)WHERE (条件)
条件列表
| 比较运算符 | 功能 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| = | 等于 |
| <> 或 != | 不等于 |
| BETWEEN ... AND ... | 在某个范围之内(最小值,最大值) |
| IN() | 匹配IN列表中的值 |
| LIKE 占位符 | 模糊匹配( _ 匹配单个字符,% 匹配多个字符) |
IS NULL | NULL |
| 逻辑运算符 | 功能 |
| AND 或 & | 与(多个条件均满足) |
| OR 或 || | 或(多个条件至少一个满足) |
| NOT 或 ! | 非(不满足) |
INNER JOIN
INNER JOIN 是 SQL 中用于从两个或多个表中返回匹配记录的一种连接类型。具体来说,INNER JOIN 只会返回那些在连接条件上匹配的记录
SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列;