1053 字
5 分钟
SQL-DQL语句
AI 摘要
SQL-DQL语句
定义
DQL(Data Query Language):数据查询语言,用来查询数据库表中的记录。查询关键字为 SELECT。在业务系统中,查询是最常用、最重要的操作。
语法/用法
完整语法结构
SELECT 字段列表FROM 表名列表WHERE 条件列表GROUP BY 分组字段列表HAVING 分组后条件列表ORDER BY 排序字段列表LIMIT 分页参数基本查询
-- 查询指定字段SELECT 字段1, 字段2 FROM 表名;
-- 查询所有字段SELECT * FROM 表名;
-- 设置别名SELECT 字段1 [AS] 别名1, 字段2 [AS] 别名2 FROM 表名;
-- 去除重复记录SELECT DISTINCT 字段列表 FROM 表名;示例:
SELECT name, entry_date FROM emp;SELECT name AS 姓名, entry_date AS 入职日期 FROM emp;SELECT DISTINCT job FROM emp;
*号查询所有字段,开发中尽量少用(不直观、影响效率)。
条件查询(WHERE)
SELECT 字段列表 FROM 表名 WHERE 条件列表;比较运算符
| 运算符 | 说明 |
|---|---|
> >= < <= = | 大小比较 |
<> 或 != | 不等于 |
BETWEEN ... AND ... | 在范围内(含边界) |
IN(...) | 多值匹配 |
LIKE | 模糊匹配(% 任意字符,_ 单个字符) |
IS NULL / IS NOT NULL | 空值判断 |
逻辑运算符
| 运算符 | 说明 |
|---|---|
AND 或 && | 逻辑与 |
OR 或 ` | |
NOT 或 ! | 逻辑非 |
示例:
-- 姓名等于SELECT * FROM emp WHERE name = '杨逍';
-- 薪资范围SELECT * FROM emp WHERE salary <= 5000;
-- NULL 判断SELECT * FROM emp WHERE job IS NULL;SELECT * FROM emp WHERE job IS NOT NULL;
-- 不等SELECT * FROM emp WHERE password <> '123456';
-- 日期范围SELECT * FROM emp WHERE entry_date BETWEEN '2000-01-01' AND '2010-01-01';
-- IN 多值SELECT * FROM emp WHERE job IN (2, 3, 4);
-- 模糊匹配SELECT * FROM emp WHERE name LIKE '__'; -- 两个字SELECT * FROM emp WHERE name LIKE '张%'; -- 姓张SELECT * FROM emp WHERE name LIKE '%二%'; -- 包含"二"聚合函数
| 函数 | 功能 |
|---|---|
COUNT(字段) | 统计行数(忽略 NULL) |
SUM(字段) | 求和 |
MAX(字段) | 最大值 |
MIN(字段) | 最小值 |
AVG(字段) | 平均值 |
聚合函数会忽略 NULL 值。
COUNT(*)是统计总行数的推荐写法(MySQL 底层优化)。
示例:
SELECT COUNT(*) FROM emp; -- 员工总数SELECT AVG(salary) FROM emp; -- 平均薪资SELECT MIN(salary) FROM emp; -- 最低薪资SELECT MAX(salary) FROM emp; -- 最高薪资SELECT SUM(salary) FROM emp; -- 薪资总额分组查询(GROUP BY)
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段 [HAVING 分组后条件];示例:
-- 按性别统计人数SELECT gender, COUNT(*) FROM emp GROUP BY gender;
-- 分组前筛选 + 分组后过滤SELECT job, COUNT(*)FROM empWHERE entry_date <= '2015-01-01'GROUP BY jobHAVING COUNT(*) >= 2;WHERE 与 HAVING 的区别
| 对比维度 | WHERE | HAVING |
|---|---|---|
| 执行时机 | 分组前过滤 | 分组后过滤 |
| 能否使用聚合函数 | 不能 | 可以 |
执行顺序:WHERE → 聚合函数 → HAVING
排序查询(ORDER BY)
SELECT 字段列表 FROM 表名 ORDER BY 字段1 [ASC|DESC], 字段2 [ASC|DESC] ...;ASC:升序(默认,可省略)DESC:降序
示例:
-- 按入职时间升序SELECT * FROM emp ORDER BY entry_date;
-- 按入职时间降序SELECT * FROM emp ORDER BY entry_date DESC;
-- 多字段排序:入职时间升序,相同时按更新时间降序SELECT * FROM emp ORDER BY entry_date ASC, update_time DESC;分页查询(LIMIT)
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;- 起始索引从 0 开始。
- 计算公式:
起始索引 = (页码 - 1) × 每页记录数
示例:
-- 第1页,每页5条SELECT * FROM emp LIMIT 0, 5;-- 等价简写SELECT * FROM emp LIMIT 5;
-- 第2页,每页5条SELECT * FROM emp LIMIT 5, 5;
-- 第3页,每页5条SELECT * FROM emp LIMIT 10, 5;常见场景
DQL 是业务系统中最核心的操作,网站/APP 的数据展示、搜索、报表导出等功能均依赖 DQL 实现。
注意事项
NULL判断只能用IS NULL/IS NOT NULL,不能用= NULL。- 分组后
SELECT的字段通常仅限聚合函数和分组字段,查询其他字段无意义。 LIMIT是 MySQL 方言,不同数据库的分页语法不同。- 分页查询第一页时,
LIMIT 5等价于LIMIT 0, 5。
测试数据
-- 创建 emp 表并插入测试数据,详见源文档 3.3.2 节。-- 包含 30 条梁山好汉员工数据,覆盖性别、职位、薪资等多种筛选场景。支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
最后更新于 2026-05-18,距今已过 33 天
部分内容可能已过时
评论区
[ 标签 ]
[ 分类 ]
[ 公告 ]
如果你喜欢,那么欢迎来到我的世界!
了解更多[ 音乐 ]
找不到相关结果。
[ contents ]
[ 全部文章 ]