目录
DQL(数据查询语言)语句用于从数据库中检索数据。MySQL 中主要的 DQL 语句是 SELECT
语句。
SELECT
基础语句语法
SELECT [DISTINCT] 列名1, 列名2, ...
FROM 表名 [别名]
[WHERE 条件]
[GROUP BY 列名]
[HAVING 条件]
[ORDER BY 列名 [ASC|DESC]]
[LIMIT n OFFSET m];
- DISTINCT:可选。用于去除重复的记录。
- 列名1, 列名2, ...:要检索的列名。如果要检索所有列,可以使用
*
。 - 表名:要从中检索数据的表名。对于别名是可选操作。
- WHERE 条件:可选。用于过滤记录。
- GROUP BY 列名:可选。用于将结果集按指定列分组。
- HAVING 条件:可选。用于过滤分组后的结果。
- ORDER BY 列名 [ASC|DESC]:可选。用于对结果集排序。
ASC
为升序(默认),DESC
为降序。 - LIMIT n OFFSET m:可选。用于限制返回的记录数量。
n
为返回的记录数量,m
为结果集的起始位置(从0
开始)。
示例
1. 查询所有列
SELECT * FROM employees;
说明:检索 employees
表中的所有列和所有记录。
2. 查询特定列
SELECT id, name, salary FROM employees;
说明:只检索 employees
表中的 id
、name
和 salary
列。
3. 使用 DISTINCT 去重
SELECT DISTINCT department_id FROM employees;
说明:检索 employees
表中所有唯一的 department_id
值。
4. 使用 WHERE 子句过滤
SELECT * FROM employees
WHERE department_id = 101;
说明:检索 employees
表中 department_id
为 101
的所有记录。
5. 使用 ORDER BY 排序
SELECT * FROM employees
ORDER BY salary DESC;
说明:按 salary
列降序排列 employees
表中的所有记录。
6. 使用 GROUP BY 分组
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;
说明:按 department_id
分组,计算每个部门的平均薪资。
7. 使用 HAVING 过滤分组后的结果
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 50000;
说明:检索 employees
表中平均薪资大于 50000
的部门。
8. 使用 LIMIT 和 OFFSET 分页
SELECT * FROM employees
ORDER BY id
LIMIT 10 OFFSET 20;
说明:检索从第 21 条记录开始的 10 条记录,按 id
排序。
执行顺序
执行顺序:FROM
-> WHERE
-> GROUP BY
-> HAVING
-> SELECT
-> ORDER BY
-> LIMIT
1. FROM
子句:
- 首先,数据库系统确定要从哪些表中获取数据。如果涉及到连接(
JOIN
)操作,这一步会处理这些连接,生成一个临时的结果集。
2. WHERE
子句:
- 接下来,应用
WHERE
子句中的条件来过滤数据。只有满足这些条件的记录会被保留在结果集中。
3. GROUP BY
子句:
- 如果存在
GROUP BY
子句,数据库系统会根据指定的列对记录进行分组。此时,记录会被分成多个组,每个组的记录在逻辑上是相同的。
4. HAVING
子句:
HAVING
子句用于过滤分组后的记录。与WHERE
子句类似,但HAVING
是在分组之后应用的,用于筛选满足条件的分组。
5. SELECT
子句:
- 在过滤和分组后,
SELECT
子句从结果集中选择要显示的列。此时可以使用聚合函数(如COUNT
、SUM
、AVG
等)来计算每个分组的统计信息。
6. ORDER BY
子句:
- 数据按
ORDER BY
子句指定的列排序。排序是基于之前筛选和分组后的结果进行的。
7. LIMIT
和 OFFSET
子句:
- 最后,应用
LIMIT
和OFFSET
子句来限制结果集的数量或位置。这用于分页和限制查询结果的条数。
书写顺序
1. SELECT
子句:
- 位置:最开始
- 作用:指定要检索的列或表达式。可以使用
DISTINCT
关键字来去除重复记录。 - 示例:
SELECT DISTINCT column1, column2
2. FROM
子句:
- 位置:
SELECT
子句之后 - 作用:指定数据来源的表。可以包含表的别名。
- 示例:
FROM table_name AS t
3. WHERE
子句:
- 位置:
FROM
子句之后 - 作用:过滤记录,确定哪些记录满足指定条件。
- 示例:
WHERE column1 = value
4. GROUP BY
子句:
- 位置:
WHERE
子句之后 - 作用:对记录进行分组。通常与聚合函数一起使用。
- 示例:
GROUP BY column1
5. HAVING
子句:
- 位置:
GROUP BY
子句之后 - 作用:过滤分组后的记录。用于对分组结果进行条件过滤。
- 示例:
HAVING COUNT(column1) > 5
6. ORDER BY
子句:
- 位置:
HAVING
子句之后 - 作用:对结果集进行排序。可以指定升序(
ASC
)或降序(DESC
)。 - 示例:
ORDER BY column1 DESC
7. LIMIT
和 OFFSET
子句:
- 位置:
ORDER BY
子句之后 - 作用:限制返回的记录数量和结果集的起始位置。
LIMIT
控制返回的记录数,OFFSET
控制从结果集的哪个位置开始。 - 示例:
LIMIT 10 OFFSET 20
写建议
- 一致性:在整个 SQL 代码中保持一致的书写顺序和格式,有助于提高代码的可读性。
- 逻辑顺序:按逻辑顺序书写 SQL 子句,遵循 SQL 的执行顺序可以帮助理解和维护 SQL 语句。
- 注释:在复杂查询中,添加注释解释每个子句的作用或目的,有助于其他开发人员理解代码。