从 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(合并结果)等语法结合,解锁更复杂的查询能力。

相关推荐
这个DBA有点耶4 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶6 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技6 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend7 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence10 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
orion571 天前
Missing Semester Class1:course overview and introduction of shell
linux
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
用户120487221611 天前
Linux驱动编译与加载
linux·嵌入式
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent