📚 目录
- DQL 简介:什么是数据查询语言
- SELECT 基本语法与字段查询
- WHERE 条件筛选详解
- ORDER BY 排序规则
- LIMIT 实现分页查询
- 聚合函数(COUNT, SUM, AVG 等)
- GROUP BY 分组统计与 HAVING 筛选
- 多表连接查询(JOIN 全面解析)
- 子查询(SubQuery)用法详解
- 常见查询优化技巧
- 实战练习:复杂报表查询示例
1. DQL 简介:什么是数据查询语言
DQL(Data Query Language)是 SQL 语言中用于 读取和查询数据 的部分。
主要指:
SELECT ... FROM ... [WHERE ...] [GROUP BY ...] [HAVING ...] [ORDER BY ...] [LIMIT ...]
目标是:从数据库中读取满足条件的数据结果集。
2. SELECT 基本语法与字段查询
基本语法:
SELECT column1, column2, ...
FROM table_name;
示例:
SELECT id, name, email FROM users;
常见用法:
SELECT *
:查询所有字段(注意性能影响)- 字段别名
AS
:SELECT name AS 姓名
- 常量值:
SELECT 'hello' AS greeting;
3. WHERE 条件筛选详解
运算符:
类型 | 示例 |
---|---|
比较运算符 | =, <>, >, <, <=, >= |
范围 | BETWEEN x AND y |
集合 | IN (x, y, z) |
模糊匹配 | LIKE ‘%abc%’、LIKE ‘a%’ |
空值判断 | IS NULL / IS NOT NULL |
多条件 | AND、OR、NOT |
示例:
SELECT * FROM users WHERE age >= 18 AND city = 'Beijing';
4. ORDER BY 排序规则
用于控制查询结果的排序顺序。
SELECT * FROM users ORDER BY age DESC, name ASC;
- 默认
ASC
(升序) - 使用多个字段排序
5. LIMIT 实现分页查询
SELECT * FROM users LIMIT 10; -- 前10条
SELECT * FROM users LIMIT 10 OFFSET 20; -- 第21~30条
分页组合形式:
SELECT * FROM users ORDER BY id LIMIT 20, 10; -- 第21~30条
6. 聚合函数(统计计算)
函数 | 功能 |
---|---|
COUNT() | 统计数量 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
SELECT COUNT(*) FROM orders;
SELECT AVG(score) FROM exam_results WHERE subject='Math';
7. GROUP BY 分组统计与 HAVING 筛选
示例:
SELECT department, COUNT(*) AS total
FROM employees
GROUP BY department
HAVING total > 10;
GROUP BY
先按字段分组HAVING
是对聚合结果的条件过滤(不能用WHERE
)
8. 多表连接查询(JOIN 全面解析)
类型 | 说明 |
---|---|
INNER JOIN | 匹配两表交集 |
LEFT JOIN | 包含左表所有记录,右表匹配填充 |
RIGHT JOIN | 包含右表所有记录,左表匹配填充 |
FULL JOIN | MySQL 不支持,可用 UNION 模拟 |
示例:
SELECT u.name, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id;
9. 子查询(SubQuery)用法详解
子查询可嵌套在 WHERE
、FROM
、SELECT
中。
示例:
-- 查询消费金额高于平均的用户
SELECT * FROM orders
WHERE amount > (SELECT AVG(amount) FROM orders);
子查询也可作为临时表:
SELECT * FROM (
SELECT department, COUNT(*) AS total FROM employees GROUP BY department
) AS dept_count WHERE total > 5;
10. 常见查询优化技巧
- **避免 SELECT ***,只查需要字段
- 索引字段用于 WHERE 和 JOIN
- 用 EXISTS 替代 IN 子查询(当数据量大时)
- 用分页查询 LIMIT 替代全表扫描
- 使用覆盖索引(即查询字段包含在索引中)
11. 实战练习:复杂报表查询示例
-- 查询每个城市的用户数,按数量降序,且只展示数量超过100的城市
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city
HAVING user_count > 100
ORDER BY user_count DESC;
-- 查询每位用户的最新一笔订单
SELECT u.name, o.amount, o.created_at
FROM users u
JOIN (
SELECT user_id, MAX(created_at) AS last_order
FROM orders GROUP BY user_id
) lo ON u.id = lo.user_id
JOIN orders o ON o.user_id = lo.user_id AND o.created_at = lo.last_order;
📖 小结
能力点 | 掌握程度检查 |
---|---|
基础查询 | SELECT、WHERE、ORDER、LIMIT |
分组统计 | GROUP BY + 聚合函数 + HAVING |
多表联查 | INNER / LEFT JOIN,理解 ON 条件 |
子查询 | 嵌套查询语法及优化 |
性能意识 | 索引使用、字段选择、分页、覆盖索引 |
🔗 参考资料
- MySQL 官方文档 – SELECT
- 《高性能 MySQL》第3版
- 菜鸟教程 MySQL DQL 专栏
- LeetCode 数据库练习题(推荐!)
发表回复