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,NOTSELECT * 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 = '男';