千家信息网

SQL查询语句执行顺序的示例分析

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍SQL查询语句执行顺序的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!SQL查询语句执行顺序如下:(7) SELECT (8) DISTINCT (1)
千家信息网最后更新 2026年11月01日SQL查询语句执行顺序的示例分析

这篇文章主要介绍SQL查询语句执行顺序的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

SQL查询语句执行顺序如下:

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

前期准备工作

1、新建一个测试数据库

create database testData;

2、创建测试表,并插入数据如下:

用户表


订单表


准备SQL逻辑查询测试语句

SELECT a.user_id,COUNT(b.order_id) as total_ordersFROM user as aLEFT JOIN orders as bON a.user_id = b.user_idWHERE a.city = 'beijing'GROUP BY a.user_idHAVING COUNT(b.order_id) < 2ORDER BY total_orders desc

使用上述SQL查询语句来获得来自北京,并且订单数少于2的客户;

在这些SQL语句的执行过程中,都会产生一个虚拟表,用来保存SQL语句的执行结果

一、执行FROM语句

第一步,执行FROM语句。我们首先需要知道最开始从哪个表开始的,这就是FROM告诉我们的。现在有了和两个表,我们到底从哪个表开始,还是从两个表进行某种联系以后再开始呢?它们之间如何产生联系呢?--笛卡尔积

经过FROM语句对两个表执行笛卡尔积,会得到一个虚拟表,VT1(vitual table 1),内容如下:


总共有28(user的记录条数 * orders的记录条数)条记录。这就是VT1的结果,接下来的操作就在VT1的基础上进行

二、执行ON过滤

执行完笛卡尔积以后,接着就进行ON a.user_id = b.user_id条件过滤,根据ON中指定的条件,去掉那些不符合条件的数据,得到VT2如下:

select * from user as a inner JOIN orders as b ON a.user_id = b.user_id;


三、添加外部行

这一步只有在连接类型为OUTER JOIN时才发生,如LEFT OUTER JOIN、RIGHT OUTER JOIN和FULL OUTER JOIN。在大多数的时候,我们都是会省略掉OUTER关键字的,但OUTER表示的就是外部行的概念。

LEFT OUTER JOIN把左表记为保留表:即左表的数据会被全部查询出来,若右表中无对应数据,会用NULL来填充:


RIGHT OUTER JOIN把右表记为保留表:即右表的数据会被全部查询出来,若左表中无对应数据,则用NULL补充;


FULL OUTER JOIN把左右表都作为保留表,但在Mysql中不支持全连接,可以通过以下方式实现全连接:

由于我在准备的测试SQL查询逻辑语句中使用的是LEFT JOIN,得到的VT3表如下:


四、执行where条件过滤

对添加了外部行的数据进行where条件过滤,只有符合条件的记录会被筛选出来,执行WHERE a.city = 'beijing' 得到VT4如下:


但是在使用WHERE子句时,需要注意以下两点:

1、由于数据还没有分组,因此现在还不能在where过滤条件中使用where_condition=MIN(col)这类对分组统计的过滤;

2、由于还没有进行列的选取操作,因此在select中使用列的别名也是不被允许的,如:select city as c from table1 wherec='beijing' 是不允许的

五、执行group by分组语句

GROU BY子句主要是对使用WHERE子句得到的虚拟表进行分组操作,执行GROUP BY a.user_id得到VT5如下:


六、执行having

HAVING子句主要和GROUP BY子句配合使用,对分组得到VT5的数据进行条件过滤,执行 HAVING COUNT(b.order_id) < 2,得到VT6如下:


七、select列表

现在才会执行到SELECT子句,不要以为SELECT子句被写在第一行,就是第一个被执行的。

我们执行测试语句中的SELECT a.user_id,user_name,COUNT(b.order_id) as total_orders,从VT6中选择出我们需要的内容,得到VT7如下:


八、执行distinct去重复数据

如果在查询中指定了DISTINCT子句,则会创建一张内存临时表(如果内存放不下,就需要存放在硬盘了)。这张临时表的表结构和上一步产生的虚拟表是一样的,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来除重复数据。测试SQL中没有DISTINCT字句,所以不会执行

九、执行order by字句

对虚拟表VT7中的内容按照指定的列进行排序,然后返回一个新的虚拟表,我们执行测试SQL语句中的ORDER BY total_orders DESC ,得到结果如下:

DESC倒序排序,ASC升序排序


十、执行limit字句

LIMIT子句从上一步得到的虚拟表中选出从指定位置开始的指定行数据,常用来做分页;

MySQL数据库的LIMIT支持如下形式的选择:limit n,m

表示从第n条记录开始选择m条记录。对于小数据,使用LIMIT子句没有任何问题,当数据量非常大的时候,使用LIMIT n, m是非常低效的。因为LIMIT的机制是每次都是从头开始扫描,如果需要从第60万行开始,读取3条数据,就需要先扫描定位到60万行,然后再进行读取,而扫描的过程是一个非常低效的过程。

以上是"SQL查询语句执行顺序的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

数据 语句 子句 查询 条件 测试 内容 分组 就是 顺序 两个 字句 结果 过程 笛卡尔 准备 排序 选择 示例 分析 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 深圳恒合互联网络科技有限公司 互联网科技社 唐信互联网科技 未来的互联网科技 天津摩尔互联网科技 善班互联网科技有限公司 互联网前沿科技 互联网科技博客 互联网养老 桔豆科技 科技伦理 互联网公司 哈尔滨屹滨互联网科技有限公司 想开互联网科技公司怎么样 华夏恒生互联网科技013171 朱啸虎曾投资哪些互联网科技企业 银行科技岗属于互联网吗 中天科技中国工业互联网 领航科技大厦互联网公司 版纳互联网科技选哪家 科技美学互联网 艺术 互联网科技公司起名 湖南永感互联网科技有限公司 火传媒上海互联网科技 新华互联网科技2019 银川新华互联网科技职业技术培训学校图片 美国互联网科技实力 上海京穆互联网科技有限公司 浙南科技城互联网大厦招聘 上海创道互联网络科技有限公司 互联网科技博主张洲
0