📚 目录

  1. DQL 简介:什么是数据查询语言
  2. SELECT 基本语法与字段查询
  3. WHERE 条件筛选详解
  4. ORDER BY 排序规则
  5. LIMIT 实现分页查询
  6. 聚合函数(COUNT, SUM, AVG 等)
  7. GROUP BY 分组统计与 HAVING 筛选
  8. 多表连接查询(JOIN 全面解析)
  9. 子查询(SubQuery)用法详解
  10. 常见查询优化技巧
  11. 实战练习:复杂报表查询示例

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 *:查询所有字段(注意性能影响)
  • 字段别名 ASSELECT 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 JOINMySQL 不支持,可用 UNION 模拟

示例:

SELECT u.name, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id;

9. 子查询(SubQuery)用法详解

子查询可嵌套在 WHEREFROMSELECT 中。

示例:

-- 查询消费金额高于平均的用户
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 条件
子查询嵌套查询语法及优化
性能意识索引使用、字段选择、分页、覆盖索引

🔗 参考资料