SQL 查询语法笔记
SQL 查询语法笔记
一、基础查询
-
查询所有列
SELECT * FROM t_student;
-
指定列查询
SELECT id, stu_id, name, pinyin, sex, birthday FROM t_student;
-
列与表别名
- 列别名:
AS
可省略 - 表别名:用于简化前缀(无歧义时可省略表名前缀)
SELECT t.id AS 编号, t.stu_id AS 学号, t.name 姓名, -- 省略AS t.pinyin 拼音 FROM t_student t; -- 表别名
- 列别名:
-
列运算
SELECT id, stu_id, name, height + 10 AS 修正身高, weight - 10 AS 修正体重 FROM t_student;
-
分页查询(
LIMIT
)-- 前10条 SELECT * FROM t_student LIMIT 10; -- 从第10行开始取10条(行号从0开始) SELECT * FROM t_student LIMIT 10, 10; -- 等效写法 SELECT * FROM t_student LIMIT 10 OFFSET 10;
-
条件筛选(
WHERE
)- 比较运算符:
=
,<>
,!=
,>
,>=
,<
,<=
SELECT * FROM t_student WHERE id > 5; SELECT * FROM t_student WHERE birthday > '2000-01-01'; -- MySQL支持日期比较
- 逻辑运算符:
AND
,OR
,NOT
SELECT * FROM t_student WHERE height >= 175 AND sex = '女';
- 空值判断:
SELECT * FROM t_student WHERE class_id IS NULL; -- 空值 SELECT * FROM t_student WHERE class_id IS NOT NULL; -- 非空
- 模糊查询(
LIKE
):%
:匹配0个或多个字符_
:匹配1个字符
SELECT * FROM t_student WHERE name LIKE '张%'; -- 姓张 SELECT * FROM t_student WHERE name LIKE '%晓%'; -- 包含"晓" SELECT * FROM t_student WHERE name LIKE '张__'; -- 姓张且3个字
- 正则查询:
SELECT * FROM t_student WHERE name REGEXP '\\w{4,}'; -- 匹配4+位字符 SELECT * FROM t_student WHERE wechat NOT RLIKE '\\d{11}'; -- 非11位数字
- 比较运算符:
-
结果去重(
DISTINCT
)SELECT DISTINCT sex FROM t_student; -- 慎用(影响性能)
-
结果排序(
ORDER BY
)ASC
:升序(默认),DESC
:降序
SELECT * FROM t_student ORDER BY height; -- 身高升序 SELECT * FROM t_student ORDER BY weight DESC; -- 体重降序 -- 多列排序:先按身高升序,再按体重降序 SELECT * FROM t_student ORDER BY height ASC, weight DESC;
二、分组查询(GROUP BY
)
-
基本分组
SELECT sex, AVG(height) FROM t_student GROUP BY sex; SELECT class_id, MAX(height), MIN(weight), COUNT(*) FROM t_student GROUP BY class_id;
-
多列分组
SELECT class_id, sex, MAX(height), MAX(weight) FROM t_student GROUP BY class_id, sex;
-
聚合函数注意事项
COUNT(*)
:统计所有行(包括NULL
)COUNT(列名)
:统计非NULL
值COUNT(DISTINCT 列名)
:去重统计
SELECT COUNT(*) FROM t_student; -- 总行数 SELECT COUNT(class_id) FROM t_student; -- 非NULL的class_id数量 SELECT COUNT(DISTINCT class_id) FROM t_student; -- 去重统计
-
分组后筛选(
HAVING
)WHERE
:分组前筛选HAVING
:分组后筛选(可引用聚合结果)
SELECT class_id, sex, MAX(height) AS max_height FROM t_student WHERE height > 180 -- 分组前条件 GROUP BY class_id, sex HAVING max_height > 183; -- 分组后条件
三、子查询
-
标量子查询(SELECT子句)
SELECT id, name, (SELECT class_name FROM t_class WHERE id = t_student.class_id) FROM t_student;
-
表子查询(FROM子句)
SELECT * FROM (SELECT * FROM t_student WHERE sex = '女') AS women_students; -- 必须起别名
-
WHERE子查询
- 单值比较:
SELECT * FROM t_student WHERE class_id = (SELECT id FROM t_class WHERE class_name = '080503-JAVA');
- 多值比较:
-- 大于所有子查询结果(> ALL) SELECT * FROM t_student WHERE class_id > ALL(SELECT id FROM t_class WHERE class_name LIKE '%JAVA%'); -- 大于任意子查询结果(> ANY) SELECT * FROM t_student WHERE class_id > ANY(SELECT id FROM t_class WHERE class_name LIKE '%JAVA%');
- 成员判断(
IN
/NOT IN
):SELECT * FROM t_student WHERE id IN (1, 2, 3); SELECT * FROM t_student WHERE class_id IN (SELECT id FROM t_class WHERE class_name LIKE '%JAVA%');
- 存在性判断(
EXISTS
):SELECT * FROM t_student WHERE EXISTS (SELECT 1 FROM t_class WHERE class_name LIKE '%JAVA%');
- 单值比较:
-
相关子查询
-- 查询身高高于班级平均身高的学生 SELECT * FROM t_student t1 WHERE height > ( SELECT AVG(height) FROM t_student t2 WHERE t2.class_id = t1.class_id -- 引用外层表字段 );
四、表连接
-
内连接(
INNER JOIN
)- 仅返回匹配的行
SELECT s.id, s.name, c.class_name FROM t_student s INNER JOIN t_class c ON s.class_id = c.id;
-
左外连接(
LEFT JOIN
)- 左表全部显示 + 右表匹配(不匹配则为
NULL
)
SELECT s.id, s.name, c.class_name FROM t_student s LEFT JOIN t_class c ON s.class_id = c.id;
- 左表全部显示 + 右表匹配(不匹配则为
-
右外连接(
RIGHT JOIN
)- 右表全部显示 + 左表匹配(不匹配则为
NULL
)
SELECT s.id, s.name, c.class_name FROM t_student s RIGHT JOIN t_class c ON s.class_id = c.id;
- 右表全部显示 + 左表匹配(不匹配则为
-
全外连接(MySQL通过
UNION
实现)(SELECT * FROM t_student s LEFT JOIN t_class c ON s.class_id = c.id) UNION (SELECT * FROM t_student s RIGHT JOIN t_class c ON s.class_id = c.id);
五、联合查询(UNION
)
- 注意事项:
- 各查询的列数必须一致
- 数据类型需兼容
UNION
去重,UNION ALL
不去重
-- 合并男学生记录(去重)
SELECT id, name FROM t_student WHERE sex = '男'
UNION
SELECT id, name FROM t_student WHERE sex = '男'; -- 合并男学生记录(不去重)
SELECT id, name FROM t_student WHERE sex = '男'
UNION ALL
SELECT id, name FROM t_student WHERE sex = '男';