在数据处理与分析的日常工作中,SQL(结构化查询语言)是绕不开的核心工具,而基本查询更是 SQL 的基础中的基础。无论是数据筛选、排序、分组,还是复杂的多表连接,都离不开这些核心语法的灵活运用。本文将从实际应用场景出发,拆解 SQL 基本查询的关键子句(WHERE、ORDER BY、GROUP BY、HAVING 等),结合实例让你彻底掌握这些高频用法。
一、筛选数据的核心:WHERE 子句
WHERE 子句是 SQL 查询中最常用的子句之一,作用是根据指定条件过滤数据行,只返回符合要求的结果。
1. 基础比较运算
WHERE 子句支持常见的比较运算符,满足简单的条件筛选需求:
表格
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 等于 | age = 20 |
| < | 小于 | score < 60 |
| > | 大于 | age > 23 |
| <= | 小于等于 | score <= 80 |
| >= | 大于等于 | age >= 18 |
| <> / != | 不等于 | gender <> '女' |
示例:查询所有性别为男且年龄大于 23 的学生
sql
SELECT * FROM students WHERE sex = '男' and age > 23;
2. 模糊搜索:LIKE & RLIKE
当需要模糊匹配字符串时,LIKE 和 RLIKE(正则匹配)能解决大部分场景:
- LIKE :搭配通配符使用,
%匹配任意多个字符,_匹配单个字符; - RLIKE:支持正则表达式,实现更灵活的多条件匹配。
示例 1:匹配以 "xx" 开头的班级
sql
SELECT * FROM students WHERE clazz like 'xx%';
示例 2:匹配姓名为 "张"+ 单个字符(如 "张三")
sql
SELECT * FROM students WHERE stu_name LIKE '张_';
示例 3:匹配姓名含 "张""李""王" 的学生(正则多关键词)
sql
SELECT * FROM students WHERE name RLIKE '张|李|王';
3. 范围匹配:IN & BETWEEN AND
- IN:匹配指定列表中的任意值,简化多条件 OR 的写法;
- BETWEEN AND:匹配指定区间内的值(包含边界)。
示例 1:查询指定班级的学生
sql
select * from students where clazz in ('一班','二班','三班');
示例 2:查询年龄在 22 到 24 岁之间的学生
sql
sql
select * from students where age BETWEEN 22 AND 24;
二、排序结果:ORDER BY 子句
查询结果默认无序,ORDER BY 子句可按一个或多个列对结果排序,支持ASC(升序,默认)和DESC(降序)。
语法:
sql
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...
示例:按成绩降序、年龄升序查询学生信息
sql
SELECT stu_name, age, score FROM students ORDER BY score DESC, age ASC;
三、分组聚合:GROUP BY 子句
GROUP BY 用于将数据按指定列分组,结合聚合函数(COUNT、SUM、AVG、MAX、MIN 等)实现分组统计。
语法:
sql
SELECT column1, aggregate_function(column_name)
FROM table_name
GROUP BY column1;
示例 1:统计每个班级的学生人数
sql
SELECT clazz, COUNT(stu_id) AS student_count
FROM students
GROUP BY clazz;
示例 2:嵌套 WHERE 过滤分组结果(先分组再筛选)
sql
select * from
(SELECT clazz, AVG(score) AS avg_score
FROM students
GROUP BY clazz) as t1
where t1.avg_score > 80;
四、过滤分组结果:HAVING 子句
HAVING 与 WHERE 功能类似,但WHERE 过滤行,HAVING 过滤分组,且 HAVING 可直接使用聚合函数作为条件(WHERE 不支持)。
语法:
sql
SELECT column1, aggregate_function(column_name)
FROM table_name
GROUP BY column1
HAVING condition;
示例:筛选平均成绩大于 80 的班级(直接过滤分组结果)
sql
SELECT clazz, AVG(score) AS avg_score
FROM students
GROUP BY clazz
HAVING AVG(score) > 80;
五、限制结果行数:LIMIT & OFFSET
在分页查询或只需要部分结果时,LIMIT(限制行数)和 OFFSET(指定偏移量)是必备工具。
1. 基础 LIMIT 用法
sql
-- 返回前10条学生数据
SELECT * FROM students LIMIT 10;
2. 分页查询(LIMIT + OFFSET)
sql
-- 从第11行开始,返回10条数据(第2页,每页10条)
SELECT * FROM students LIMIT 10 OFFSET 10;
-- 简写形式(MySQL支持)
SELECT * FROM students LIMIT 10, 10;
六、总结
SQL 基本查询的核心子句各有分工,掌握它们的组合用法,能解决 80% 的日常数据查询需求:
- WHERE:筛选原始数据行;
- ORDER BY:对结果排序;
- GROUP BY:按列分组并聚合;
- HAVING:过滤分组后的结果;
- LIMIT/OFFSET:限制结果行数,实现分页。
这些语法看似简单,但需要结合实际场景多练多用,才能灵活运用。比如在处理多表数据时,还可以将这些子句与 JOIN(连接)、UNION(合并结果)等语法结合,解锁更复杂的查询能力。