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