
💡Yupureki:个人主页
✨个人专栏:《C++》 《算法》《Linux系统编程》《高并发内存池》《MySQL数据库》
《个人在线OJ平台》《Linux网络编程》《CMake自动化构建工具》《Redis数据库》
🌸Yupureki🌸的简介:

目录
[1. Create](#1. Create)
[1.1 单行数据和全列插入](#1.1 单行数据和全列插入)
[1.2 多行数据和指定列插入](#1.2 多行数据和指定列插入)
[1.3 存在则更新](#1.3 存在则更新)
[1.4 替换](#1.4 替换)
[2. Retrieve](#2. Retrieve)
[2.1 基本查询](#2.1 基本查询)
[2.1.1 全列查询](#2.1.1 全列查询)
[2.1.2 指定列查询](#2.1.2 指定列查询)
[2.1.3 查询字段为表达式](#2.1.3 查询字段为表达式)
[2.1.4 为查询结果指明别名](#2.1.4 为查询结果指明别名)
[2.1.5 结果去重](#2.1.5 结果去重)
[2.2 WHERE条件](#2.2 WHERE条件)
[2.2.1 比较运算符](#2.2.1 比较运算符)
[2.2.2.1 语文不及格的同学](#2.2.2.1 语文不及格的同学)
[2.2.2.2 语文成绩在[80,90]之间的同学](#2.2.2.2 语文成绩在[80,90]之间的同学)
[2.2.2.3 语文成绩大于80或者数学成绩大于70的同学](#2.2.2.3 语文成绩大于80或者数学成绩大于70的同学)
[2.2.2.3 姓张的同学](#2.2.2.3 姓张的同学)
[2.2.2.4 语文成绩好于英语成绩的同学](#2.2.2.4 语文成绩好于英语成绩的同学)
[2.2.2.5 总分低于240的同学](#2.2.2.5 总分低于240的同学)
[2.2.2.6 姓张的同学,否则成绩大于230](#2.2.2.6 姓张的同学,否则成绩大于230)
[2.3 排序](#2.3 排序)
[2.3.1 按照语文成绩升序排序](#2.3.1 按照语文成绩升序排序)
[2.3.2 按照总分降序排序](#2.3.2 按照总分降序排序)
[2.4 筛选分页](#2.4 筛选分页)
[2.4.1 查询总分最高的同学](#2.4.1 查询总分最高的同学)
[2.4.2 查询总分第二名的同学](#2.4.2 查询总分第二名的同学)
[3. Update](#3. Update)
[3.1 将某同学的语文成绩变更为90](#3.1 将某同学的语文成绩变更为90)
[3.2 将某同学数学成绩变更为80,英文成绩变更为70](#3.2 将某同学数学成绩变更为80,英文成绩变更为70)
[3.3 将成绩倒数第一名的同学的语文成绩加20分](#3.3 将成绩倒数第一名的同学的语文成绩加20分)
[4. Delete](#4. Delete)
[4.1 删除某列](#4.1 删除某列)
[4.2 删除全列](#4.2 删除全列)
1. Create
语法:
sql
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...
案例:创建一张学生表
sql
CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
sn INT NOT NULL UNIQUE COMMENT '学号',
name VARCHAR(20) NOT NULL,
qq VARCHAR(20)
);
1.1 单行数据和全列插入

1.2 多行数据和指定列插入

1.3 存在则更新
由于主键和唯一键的约束,如果两个建冲突则提示报错

因此如果发现键冲突时,可以进行更新
语法:
sql
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...

1.4 替换
- 主键 或者 唯一键 没有冲突,则直接插入;
- 主键 或者 唯一键 如果冲突,则删除后再插入

2. Retrieve
语法:
sql
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
2.1 基本查询
2.1.1 全列查询
通常情况下,不建议全列查询。因为如果数据量过多,将全部的数据都显示出来对性能的开销很大

2.1.2 指定列查询

2.1.3 查询字段为表达式

2.1.4 为查询结果指明别名

2.1.5 结果去重
出现某字段重复的列

对结果去重

2.2 WHERE条件
WHERE条件的本质是筛选,相当于if条件判断
符合条件的数据才会被显示出来
运算符:
| 类别 | 运算符 | 说明 | 示例 |
|---|---|---|---|
| 比较运算符 | = |
等于 | WHERE age = 18 |
<=> |
NULL 安全的等于(NULL <=> NULL 为 1) |
WHERE col <=> NULL |
|
<> / != |
不等于 | WHERE status <> 'closed' |
|
< |
小于 | WHERE price < 100 |
|
<= |
小于等于 | WHERE price <= 100 |
|
> |
大于 | WHERE price > 100 |
|
>= |
大于等于 | WHERE price >= 100 |
|
| 逻辑运算符 | AND / && |
逻辑与 | WHERE a=1 AND b=2 |
OR / ` |
` | ||
NOT / ! |
逻辑非 | WHERE NOT (a=1) |
|
XOR |
逻辑异或(一真一假时为真) | WHERE a=1 XOR b=2 |
|
| 区间判断 | BETWEEN ... AND ... |
在闭区间内(包含边界) | WHERE age BETWEEN 18 AND 30 |
NOT BETWEEN ... AND ... |
不在区间内 | WHERE age NOT BETWEEN 18 AND 30 |
|
| 集合成员 | IN (...) |
等于列表中的任一值(也支持子查询) | WHERE status IN ('open','pending') |
NOT IN (...) |
不等于列表中任何值 | WHERE id NOT IN (1,2,3) |
|
| 空值判断 | IS NULL |
是空值 | WHERE email IS NULL |
IS NOT NULL |
不是空值 | WHERE email IS NOT NULL |
|
| 模式匹配 | LIKE |
通配符匹配(% 任意多字符,_ 单字符) |
WHERE name LIKE 'A%' |
NOT LIKE |
不匹配 | WHERE name NOT LIKE '%test%' |
|
REGEXP / RLIKE |
正则表达式匹配 | WHERE email REGEXP '^[a-z]+@' |
|
NOT REGEXP |
正则不匹配 | WHERE email NOT REGEXP 'spam' |
|
| 布尔值判断 (8.0.16+) | IS TRUE |
值为真 | WHERE active IS TRUE |
IS FALSE |
值为假 | WHERE active IS FALSE |
|
IS UNKNOWN |
值为 NULL(结果等价于 IS NULL) |
WHERE active IS UNKNOWN |
|
| 子查询运算符 | EXISTS (子查询) |
子查询是否返回至少一行 | WHERE EXISTS (SELECT 1 FROM orders WHERE uid=u.id) |
NOT EXISTS (子查询) |
子查询一行都没返回 | WHERE NOT EXISTS (SELECT 1 FROM blacklist WHERE id=u.id) |
|
表达式 比较符 ANY (子查询) |
满足子查询中任一值(比较符可为 >,<,=,<> 等) |
WHERE score > ANY (SELECT score FROM exams) |
|
表达式 比较符 ALL (子查询) |
必须满足子查询得到的所有值 | WHERE score > ALL (SELECT score FROM exams) |
|
| 其他特殊运算符 | MEMBER OF (...) (8.0.17+) |
值是否属于 JSON 数组 | WHERE 'apple' MEMBER OF(fruits_arr) |
SOUNDS LIKE |
发音相似比较(内部调用 SOUNDEX()) |
WHERE name SOUNDS LIKE 'John' |
|
&, ` |
, ^`, `~` |
位运算符(按位与、或、异或、取反) |
2.2.1 比较运算符
案例:
sql
CREATE TABLE `exam` (
`name` varchar(20) DEFAULT NULL,
`chinese` int DEFAULT NULL,
`math` int DEFAULT NULL,
`english` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

2.2.2.1 语文不及格的同学

2.2.2.2 语文成绩在[80,90]之间的同学

2.2.2.3 语文成绩大于80或者数学成绩大于70的同学

2.2.2.3 姓张的同学

2.2.2.4 语文成绩好于英语成绩的同学

2.2.2.5 总分低于240的同学

2.2.2.6 姓张的同学,否则成绩大于230

2.3 排序
- ASC 为升序(从小到大)
- DESC 为降序(从大到小)
- 默认为 ASC
sql
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
2.3.1 按照语文成绩升序排序

2.3.2 按照总分降序排序

2.4 筛选分页
从0开始,筛选n条结果
sql
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n
从s开始,筛选n条结果
sql
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
2.4.1 查询总分最高的同学

2.4.2 查询总分第二名的同学

3. Update
语法:
sql
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
3.1 将某同学的语文成绩变更为90

3.2 将某同学数学成绩变更为80,英文成绩变更为70

3.3 将成绩倒数第一名的同学的语文成绩加20分

4. Delete
语法:
sql
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
4.1 删除某列

4.2 删除全列

