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