从 WHERE 到 OFFSET:SQL 基本查询的核心逻辑

在数据处理与分析的日常工作中,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(合并结果)等语法结合,解锁更复杂的查询能力。

相关推荐
请输入蚊子2 小时前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
ID_180079054732 小时前
淘宝商品详情API请求的全场景,带json数据参考
服务器·数据库·json
troublea2 小时前
Laravel5.x核心特性全解析
数据库·spring boot·后端·mysql
古译汉书2 小时前
【IoT死磕系列】Day 6:工业控制底层大动脉—CAN总线
linux·网络·arm开发·单片机·物联网·tcp/ip
戴西软件2 小时前
PreSys在爆炸与多介质流固耦合中的建模方法:从ALE到SPH的工程实践
linux·python·程序人生·cae
feng68_2 小时前
Web服务基础理论
linux·运维·服务器·web服务
難釋懷2 小时前
Redis消息队列-基于Stream的消息队列
数据库·redis·缓存
GDAL2 小时前
SQLite 与 MySQL 性能深度对比:场景决定最优解
数据库·mysql·sqlite
troublea2 小时前
Laravel 8.x新特性全解析
数据库·mysql·缓存