投影查询(只查需要的字段)
只查询指定字段,减少数据传输量,提升效率:
1 2 3
| <code>-- 只查询学生姓名和年龄 SELECT name, age FROM students; </code>
|
限制查询(分页与取前 N 条)
查询前 N 条记录
1 2 3 4
| <code>SELECT * FROM 表名 LIMIT 数量; -- 示例:查询前10条学生记录 SELECT * FROM students LIMIT 10; </code>
|
分页查询
1 2 3 4
| <code>SELECT * FROM 表名 LIMIT 起始位置, 数量; -- 起始位置从0开始 -- 示例:查询第11-20条记录(起始位置=10,数量=10) SELECT * FROM students LIMIT 10, 10; </code>
|
条件查询(精准筛选数据)
逻辑运算符
1 2 3 4
| <code>-- 查询年龄>18且性别为男的学生 SELECT * FROM students WHERE age > 18 AND gender = '男'; </code>
|
1 2 3 4
| <code>-- 查询年龄<18或学历为小学的学生 SELECT * FROM students WHERE age < 18 OR education = '小学'; </code>
|
1 2 3 4
| <code>-- 查询性别不是男的学生 SELECT * FROM students WHERE NOT gender = '男'; </code>
|
NULL 值处理
NULL表示 “未知”,不能用=或!=判断,需用IS NULL或IS NOT NULL:
1 2 3 4 5 6
| <code>-- 查询未填写手机号的用户 SELECT * FROM users WHERE phone IS NULL;
-- 查询已填写手机号的用户 SELECT * FROM users WHERE phone IS NOT NULL; </code>
|
集合查询(IN / NOT IN)
判断字段值是否在指定集合中:
1 2 3 4 5 6 7 8
| <code>-- 查询学历为小学、中学、高中的学生 SELECT * FROM students WHERE education IN ('小学', '中学', '高中');
-- 查询学历不是小学、中学的学生 SELECT * FROM students WHERE education NOT IN ('小学', '中学'); </code>
|
模糊查询(LIKE / REGEXP)
LIKE + 通配符
%:匹配任意多个字符(包括 0 个);
_:匹配单个字符。
1 2 3 4 5 6
| <code>-- 查询姓名中包含“张”的用户 SELECT * FROM users WHERE name LIKE '%张%';
-- 查询姓名为“张X三”的用户(X为任意单个字符) SELECT * FROM users WHERE name LIKE '张_三'; </code>
|
REGEXP + 正则表达式
更灵活的模糊匹配,支持正则语法:
1 2 3 4 5 6
| <code>-- 查询姓名以“张”开头的用户 SELECT * FROM users WHERE name REGEXP '^张';
-- 查询姓名以“三”结尾的用户 SELECT * FROM users WHERE name REGEXP '三$'; </code>
|
排序查询(ORDER BY)
单字段排序
1 2 3
| <code>SELECT * FROM 表名 ORDER BY 字段 [ASC|DESC]; -- ASC:升序(默认,可省略);DESC:降序 </code>
|
示例:按年龄降序查询学生(年龄大的在前)
1 2
| <code>SELECT * FROM students ORDER BY age DESC; </code>
|
多字段排序
当第一个字段值相同时,按第二个字段排序:
1 2 3 4
| <code>-- 先按年龄降序,年龄相同则按姓名升序 SELECT * FROM students ORDER BY age DESC, name ASC; </code>
|
范围查询(BETWEEN AND)
查询字段值在指定范围内的数据(包含边界值):
1 2 3 4 5 6 7 8
| <code>-- 查询年龄在18-25岁之间的学生(等价于age >= 18 AND age <= 25) SELECT * FROM students WHERE age BETWEEN 18 AND 25;
-- 查询年龄不在18-25岁之间的学生 SELECT * FROM students WHERE age NOT BETWEEN 18 AND 25; </code>
|
分组查询(GROUP BY)
结合聚合函数(COUNT、SUM、AVG、MAX、MIN)对数据分组统计,语法:
1 2
| <code>SELECT 分组字段, 聚合函数(字段) FROM 表名 GROUP BY 分组字段; </code>
|
示例
1 2 3 4
| <code>SELECT gender, COUNT(*) AS 人数 FROM students GROUP BY gender; </code>
|
1 2 3 4
| <code>SELECT education, AVG(age) AS 平均年龄 FROM students GROUP BY education; </code>
|
WHERE 与 HAVING 的区别
WHERE:分组前筛选数据,不能使用聚合函数;HAVING:分组后筛选聚合结果,可使用聚合函数。
示例:筛选出人数大于 10 的性别分组
1 2 3 4 5
| <code>SELECT gender, COUNT(*) AS 人数 FROM students WHERE age > 18 -- 先筛选年龄>18的学生 GROUP BY gender HAVING 人数 > 10; -- 再筛选人数>10的分组</code>
|