详解SQL查询语句关键字执行顺序

在编写 SQL 查询时,了解 SQL 语句的执行顺序非常重要。SQL 语句的书写顺序和实际执行顺序并不一致,掌握执行顺序有助于我们写出高效、正确的查询语句,并更好地理解查询的底层逻辑。本文将详细总结 SQL 语句关键字的执行顺序,并解释每个步骤的作用。


1. SQL 语句的书写顺序

在编写 SQL 查询时,我们通常按照以下顺序书写关键字:

vbnet 复制代码
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT

例如:

sql 复制代码
SELECT name, COUNT(*) as count
FROM users
WHERE age > 18
GROUP BY name
HAVING count > 1
ORDER BY count DESC
LIMIT 10;

2. SQL 语句的实际执行顺序

SQL 语句的实际执行顺序与书写顺序不同,以下是 SQL 查询的执行顺序:

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. SELECT
  8. DISTINCT
  9. ORDER BY
  10. LIMIT/OFFSET

3. 各关键字的执行顺序详解

1. FROM

  • 作用:确定查询的数据来源(表或子查询)。

  • 执行顺序:首先执行,从指定的表或子查询中加载数据。

  • 示例

    bash 复制代码
    FROM users

2. ON

  • 作用 :在 JOIN 操作中指定连接条件。

  • 执行顺序 :在 FROM 之后执行,用于过滤 JOIN 的结果。

  • 示例

    vbnet 复制代码
    FROM users
    JOIN orders ON users.id = orders.user_id

3. JOIN

  • 作用:将多个表的数据连接在一起。

  • 执行顺序 :在 ON 之后执行,根据连接条件合并数据。

  • 示例

    vbnet 复制代码
    FROM users
    JOIN orders ON users.id = orders.user_id

4. WHERE

  • 作用:过滤数据,保留满足条件的行。

  • 执行顺序 :在 FROMJOIN 之后执行,对加载的数据进行过滤。

  • 示例

    sql 复制代码
    FROM users
    WHERE age > 18

5. GROUP BY

  • 作用:将数据按指定列分组。

  • 执行顺序 :在 WHERE 之后执行,对过滤后的数据进行分组。

  • 示例

    vbnet 复制代码
    GROUP BY name

6. HAVING

  • 作用:对分组后的数据进行过滤。

  • 执行顺序 :在 GROUP BY 之后执行,类似于 WHERE,但用于分组数据。

  • 示例

    scss 复制代码
    HAVING COUNT(*) > 1

7. SELECT

  • 作用:选择需要返回的列或表达式。

  • 执行顺序 :在 GROUP BYHAVING 之后执行,确定最终返回的数据。

  • 示例

    scss 复制代码
    SELECT name, COUNT(*) as count

8. DISTINCT

  • 作用:去除重复的行。

  • 执行顺序 :在 SELECT 之后执行,对结果集去重。

  • 示例

    sql 复制代码
    SELECT DISTINCT name

9. ORDER BY

  • 作用:对结果集进行排序。

  • 执行顺序 :在 SELECT 之后执行,对最终结果进行排序。

  • 示例

    sql 复制代码
    ORDER BY count DESC

10. LIMIT/OFFSET

  • 作用:限制返回的行数或跳过指定的行数。

  • 执行顺序:最后执行,对排序后的结果进行分页。

  • 示例

    复制代码
    LIMIT 10

4. 示例分析

以下是一个完整的 SQL 查询示例及其执行顺序:

vbnet 复制代码
SELECT name, COUNT(*) as count
FROM users
JOIN orders ON users.id = orders.user_id
WHERE age > 18
GROUP BY name
HAVING count > 1
ORDER BY count DESC
LIMIT 10;

执行顺序

  1. FROM users :加载 users 表的数据。
  2. JOIN orders ON users.id = orders.user_id :将 users 表和 orders 表连接。
  3. WHERE age > 18 :过滤出 age > 18 的行。
  4. GROUP BY name :按 name 列分组。
  5. HAVING count > 1 :过滤出分组后 count > 1 的组。
  6. SELECT name, COUNT(*) as count :选择 namecount 列。
  7. ORDER BY count DESC :按 count 列降序排序。
  8. LIMIT 10:返回前 10 行。

5. 总结

  • SQL 语句的执行顺序与书写顺序不同,理解执行顺序有助于优化查询性能。
  • 关键字的执行顺序为:FROMONJOINWHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT/OFFSET
  • 在实际开发中,应尽量避免在 WHEREHAVING 中使用复杂的计算,以减少查询的开销。

通过掌握 SQL 语句的执行顺序,我们可以更好地编写高效、可维护的查询语句,并深入理解 SQL 查询的底层逻辑。

相关推荐
令狐少侠20114 小时前
centos7安装MySQL8.4手册
linux·mysql
Elastic 中国社区官方博客5 小时前
AI 驱动的仪表板:从愿景到 Kibana
大数据·数据库·人工智能·elasticsearch·搜索引擎·全文检索·kibana
midsummer_woo5 小时前
基于springboot+vue+mysql的中药实验管理系统设计与实现(源码+论文+开题报告)
vue.js·spring boot·mysql
Franciz小测测5 小时前
MariaDB 10.4.34 安装配置文档(Windows 版)
数据库·windows·mariadb
WINDHILL_风丘科技6 小时前
VisualXML全新升级 | 新增BusLoad计算
数据库·汽车电子·数据编辑
没有口袋啦6 小时前
Redis 介绍和部署
数据库·redis·缓存
为什么要内卷,摆烂不香吗6 小时前
LVS部署DR模式集群
服务器·数据库·lvs
Mr_Xuhhh6 小时前
Qt窗口(2)-工具栏
java·c语言·开发语言·数据库·c++·qt·算法
wanglingli956 小时前
HBase2.5.4单机模式与伪分布式的安装与配置(Ubuntu系统)
大数据·数据库·hbase
ai小鬼头6 小时前
AIStarter教你快速打包GPT-SoVITS-v2,解锁AI应用市场新玩法
前端·后端·github