sql语句查询执行顺序

20 篇文章 3 订阅
订阅专栏

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

sql查询语句的处理步骤如下

--查询组合字段
(5)select (5-2) distinct(5-3) top(<top_specification>)(5-1)<select_list>
--连表
(1)from (1-J)<left_table><join_type> join <right_table> on <on_predicate>
        (1-A)<left_table><apply_type> apply <right_table_expression> as <alias>
        (1-P)<left_table> pivot (<pivot_specification>) as <alias>
        (1-U)<left_table> unpivot (<unpivot_specification>) as <alias>
--查询条件
(2)where <where_pridicate>
--分组
(3)group by <group_by_specification>
--分组条件
(4)having<having_predicate>
--排序
(6)order by<order_by_list>

说明:
1、顺序为有1-6,6个大步骤,然后细分,5-1,5-2,5-3,由小变大顺序,1-J,1-A,1-P,1-U,为并行次序。如果不够明白,接下来我在来个流程图看看。

2、执行过程中也会相应的产生多个虚拟表(下面会有提到),以配合最终的正确查询。

##sql查询语句处理步骤流程图
这里写图片描述

##准备实例,创建表,插入数据,写要分析的实例查询语句

###1.首先创建两个表
这里写图片描述

###2.创建两个表,并插入表数据,脚本如下

USE [test]
GO
/****** Object:  Table [dbo].[Member]    Script Date: 2014/12/22 14:05:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Member](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](30) NULL,
    [phone] [varchar](15) NULL,
 CONSTRAINT [PK_MEMBER] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Order]    Script Date: 2014/12/22 14:05:17 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Order](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [member_id] [int] NULL,
    [status] [int] NULL,
    [createTime] [datetime] NULL,
 CONSTRAINT [PK_ORDER] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET IDENTITY_INSERT [dbo].[Member] ON 

GO
INSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (1, N'张龙豪', N'18501733702')
GO
INSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (2, N'Jim', N'15039512688')
GO
INSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (3, N'Tom', N'15139512854')
GO
INSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (4, N'Lulu', N'15687425583')
GO
INSERT [dbo].[Member] ([id], [Name], [phone]) VALUES (5, N'Jick', N'13528567445')
GO
SET IDENTITY_INSERT [dbo].[Member] OFF
GO
SET IDENTITY_INSERT [dbo].[Order] ON 

GO
INSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (1, 1, 3, CAST(0x0000A40900B3BBFB AS DateTime))
GO
INSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (2, 2, 1, CAST(0x0000A40900B3CEF2 AS DateTime))
GO
INSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (3, 3, 4, CAST(0x0000A40900B3D2D0 AS DateTime))
GO
INSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (4, 4, 0, CAST(0x0000A40900B3D660 AS DateTime))
GO
INSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (5, 5, 1, CAST(0x0000A40900B3D9B9 AS DateTime))
GO
INSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (6, 6, 2, CAST(0x0000A40900B3DFEA AS DateTime))
GO
INSERT [dbo].[Order] ([id], [member_id], [status], [createTime]) VALUES (7, NULL, 0, CAST(0x0000A40900E34971 AS DateTime))
GO
SET IDENTITY_INSERT [dbo].[Order] OFF
GO
ALTER TABLE [dbo].[Order] ADD  DEFAULT (getdate()) FOR [createTime]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'编号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Member', @level2type=N'COLUMN',@level2name=N'id'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'姓名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Member', @level2type=N'COLUMN',@level2name=N'Name'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'电话' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Member', @level2type=N'COLUMN',@level2name=N'phone'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'会员表' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Member'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'编号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Order', @level2type=N'COLUMN',@level2name=N'id'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'会员编号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Order', @level2type=N'COLUMN',@level2name=N'member_id'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'订单状态' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Order', @level2type=N'COLUMN',@level2name=N'status'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'下单日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Order', @level2type=N'COLUMN',@level2name=N'createTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'订单表' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Order'
GO

###3.编写咱们要解析的查询语句,即本篇要查询的实例语句。

select top(4)  status , max(m.id) as maxMemberID
from [dbo].[Member] as m right outer join [dbo].[Order] as o 
on m.id=o.member_id 
where m.id>0
group by status 
having status>=0
order by maxMemberID asc

##实例语句分步骤分析

###1.从from开始

1.1 加载左表

from [dbo].[Member] as m 

查询结果:member表中的所有数据

1.2 这里应该是 right outer join ,但是这里在sql中被定义分解为2个步骤,即join ,right outer join 。表达式关键字从左到右,依次执行。

join [dbo].[Order] as o 

查询结果:存入虚拟表vt1,为两个表的笛卡尔集合。这里你或许不明白什么叫笛卡尔集合,我打个比方给说说,还望不要嫌弃,就是小朋友握手问题,A班里有3个学生(看作一个表的三条数据),B班里有2个学生(看作另外一个表的2条数据).B班小朋友跟A班小朋友搞联欢晚会,首先要每个人都要确保跟另外一个班的同学我一下手,那么交叉出来的集合就是(2*3=6)有6条不同的轨迹。这个轨迹的集合就是笛卡尔集合。如果你还不明白,我再说下,就是m(5条数据)表中的第一条数据跟o(7条数据)表中的所有数据握下手,有7条,然后依次类推共有35条不同的数据。这里的null值也是要加进来的。

1.3、on 筛选器

on m.id=o.member_id 

查询结果如下:
这里写图片描述

从上一步的笛卡尔集中的35条数据中删除掉不匹配的行,得到5条数据,存入虚拟表Vt2。

1.4 、添加外部行(outer row)

right outer join [dbo].[Order] as o 

查询结果如下:
这里写图片描述

右表(order)作为保留表,把剩余的数据重新添加到上一步的虚拟表vt2中,生成虚拟表vt3。

###2. where 阶段

where m.id>0

查询结果:存入虚拟表vt4,为筛选的条件为true的结果集,这里加入一个记忆点,就是,where的筛选删除为永久的,而on的筛选删除为暂时的,因为on筛选过后,有可能会经过outer添加外部行,重新把数据加载回来,而where则不能。

###3.group by分组

group by status

查询结果:存入vt5,以status列的数值开始分组,即status列,值一样的分为一组,这里的两个null在三值逻辑中被视为true。三值逻辑:true,false,null。此三值,null为未知,是数据的逻辑特色,有的地方两个null相等为ture,在有些地方则为false。这个你百度下看看有很多讲解。

###4.having 筛选

having status>=0

查询结果:筛选分好组的组数据,把不满足条件的删除掉

###5.select 查询挑拣计算列
5.1、计算表达式

select status , max(m.id)

查询结果:从分过组的数据中计算各个组中的最大m.id,列出要筛选显示的列。

5.2、distinct过滤重复
5.3、top 结合order by 筛选 多少行,但这里的数据没有排序只是把多少行数据列出来而已。

###6.order by
排序显示

至此,一个完整的sql查询执行完毕。
希望能对大家有所帮助

从零开始学习SQL查询语句执行顺序
09-09
sql语言中的查询执行顺序,以前不是很了解,最近查阅了相关资料,在sql语言中,第一个被处理的字句总是from字句,最后执行的limit操作,现在小编来和大家一起学习一下
T-SQL 查询语句执行顺序解析
09-11
查询语句大家用的很多,但是知道语句执行的顺序和各各阶段的作用的人却很少。这里给大家简单介绍一下
SQL语句执行顺序图文介绍
09-11
本文将详细介绍数据库总结--SQL语句执行顺序,需要了解更多的朋友可以参考下
sql语句的顺序是怎么执行的
01-17
Sql语句执行顺序Sql语句执行顺序Sql语句执行顺序Sql语句执行顺序Sql语句执行顺序Sql语句执行顺序Sql语句执行顺序
SQL语句执行顺序详解
12-15
我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,由于SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。       每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。如果没有在查询中指定某一子句,将跳过相应的步骤。下面是对应用于SQL server 2000和SQL Server 200
SQL查询原理及执行顺序
09-13
SQL查询原理及执行顺序,对数据库优化有一定的帮助。
mysql--5
weixin_30575309的博客
09-13 142
mysql五补充部分:SQL逻辑查询语句执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 回到顶部 一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <...
SQL查询语句执行顺序
阿斯达克
05-17 640
在写SQL的时候发现select语句的执行顺序和写的顺序不一样,遂做出记录一探究竟 SQL查询语句的编写顺序是 SELECT FROM WHERE GROUP BY HAVING UNION ORDER BY 但实际上SQL语句执行顺序为 FROM WHERE GROUP BY HAVING SELECT UNION ORDER BY 1、SQL会首先选择我的表从哪里选,这其中包括表的限...
SQL逻辑查询语句执行顺序
GarfieldEr007的专栏
09-22 926
高效使用索引的首要条件是知道什么样的查询会使用到索引,这个问题和B+Tree中的“最左前缀原理”有关,下面通过例子说明最左前缀原理。 这里先说一下联合索引的概念。在上文中,我们都是假设索引只引用了单个的列,实际上,MySQL中的索引可以以一定顺序引用多个列,这种索引叫做联合索引,一般的,一个联合索引是一个有序元组,其中各个元素均为数据表的一列,实际上要严格定义索引需要用到关系代数,但是这里我不想
高频面试题:复杂SQL之select执行顺序
HHK9455的博客
07-19 188
复杂SQL之高频面试:select执行顺序
SQL Select语句完整的执行顺序
12-15
1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算; 5、使用having子句筛选分组; 6、计算所有的表达式; 7、使用order by对结果集进行排序。 举例说明: 在学生成绩表中 (暂记为 tb_Grade), 把 “考生姓名”内容不为空的记录按照 “考生姓名” 分组, 并且筛选分组结果, 选出 “总成绩” 大于 600 分的. 标准顺序的 SQL 语句为: Select 考生姓名, max(总成绩) as max总成绩 from tb_Grade where 考生姓名
SQLServer中SELECT语句的执行顺序
09-11
关于Sql中Select语句的执行顺序,一直很少注意这个问题,对于关键字的使用也很随意,至于效率问题,因为表中的数据量都不是很大,所以也不是很在意。
你所不知道的 SQL 查询执行顺序(转载)
分享型博主
01-12 808
当我发现 SQL 查询语句的这种执行顺序时,我其实是非常惊讶的。通过探究 SQL 查询语句执行顺序,把我之前遇到的问题明明白白地搞清楚了。也希望本文能帮助到更多的人理解 SQL执行顺序以及如何正确编写 SQL 查询语句
SQL基础查询和排序
wenqi
12-14 1748
所需数据表dataw: 2.1 SELECT 语句基础 2.1.1 SELECT语句 查询功能的实现可以使用SELECT语句来完成 语法: #SELECT子句指定了从表中选取的数据列,FROM子句指定了选取数据的表 SELECT 列名,FROM 表名; 直接上代码: #查询dataw表中的username和date字段 SELECT username,date FROM dataw; 2.1.2 WHERE语句从表中选取符合条件数据 有时候我们不需要将整个表中的数据全部取出来,而是选取一部分数据精确
navicat的基本使用技巧
热门推荐
笨小蛋的博客
01-30 1万+
一、Navicat常用快捷键 1,Ctrl+q就会弹出一个sql输入窗口 2,Ctrl+r就执行sql了 3,按f6会弹出一个命令窗口 4,Ctrl+/ 注释 5,Ctrl +Shift+/ 解除注释 6,Ctrl+R 运行选中的SQL语句 7,Ctrl+Shift+R 只运行选中的sql语句 8,Ctrl+L 删除选中行内容 9,
sql查询原理和Select执行顺序
09-24 849
sql语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。 3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。 4)表达式转换, 将复杂的 SQL 表达式转换为较简单的等效连接表达式。 5)选择优化器,不同的优化器一般产生不同的“执行计划” 6)选择连接方式, OR
SQL 查询语句执行顺序
俊峰博文
08-21 1037
Select 查询语句是实际工作最常用的SQL语句了,下面是Select的语句的执行顺序,大家可以参考Select语句的执行顺序来优化高效SQL语句。个人觉得写出高效查询语句的一个指导方针是:尽可能优先缩小查询范围。 (8)SELECT (9) [DISTINCT] (11) [Top n] 传回结果列表[INTO 新数据表名称] (1) FROM 数据表 (3
sql语句执行顺序
最新发布
03-03
SQL语句执行顺序可以分为以下几个步骤: 1. 解析:数据库管理系统(DBMS)首先会对SQL语句进行解析,检查语法的正确性,并确定执行计划。 2. 优化:DBMS会根据查询的复杂度和表的大小等因素,选择最优的执行计划。这个过程称为查询优化。 3. 编译:DBMS将优化后的查询计划编译成可执行的代码。 4. 执行:DBMS执行编译后的代码,从数据库中读取数据,并进行相应的操作,如插入、更新、删除或查询。 5. 返回结果:如果是查询语句,DBMS将返回查询结果给用户;如果是更新语句,DBMS会返回相应的执行结果。 需要注意的是,SQL语句执行顺序并不一定按照上述步骤严格执行,具体的执行方式可能会因为DBMS的实现方式和优化策略而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 入门级都能看懂的softmax详解 629631
  • 初学者都能看懂的95%置信区间 366015
  • 最容易理解的对卷积(convolution)的解释 300700
  • 初学者都能看懂的蒙特卡洛方法以及python实现 284184
  • 普通正态分布如何转换到标准正态分布 243130

分类专栏

  • 大模型 2篇
  • High Freq Interview 11篇
  • autodrive 3篇
  • tensorflow深度学习算法 21篇
  • text classifier 3篇
  • 小白都能看懂算法系列 17篇
  • 推荐系统 8篇
  • service 2篇
  • hive 28篇
  • hadoop 26篇
  • spark 43篇
  • flink 6篇
  • hbase 8篇
  • storm 3篇
  • kylin azkaban sqoop 3篇
  • convex optimization 7篇
  • ml foundation 15篇
  • ml algorithm 44篇
  • mllib 2篇
  • design pattern 3篇
  • pattern recognition 2篇
  • dl tensorflow 28篇
  • dm 2篇
  • compute ad 4篇
  • feature select 3篇
  • matrix 10篇
  • probability statistics 12篇
  • math case 18篇
  • bigdata other 3篇
  • nlp 5篇
  • python 81篇
  • java 57篇
  • spring serial 3篇
  • scala 35篇
  • c/c++ 38篇
  • leetcode 13篇
  • redis 9篇
  • data struct 15篇
  • network 7篇
  • geek coding 1篇
  • lbs poi 4篇
  • linux shell 36篇
  • crawler 2篇
  • mac ios 5篇
  • awk sed grep 10篇
  • vim sublime ide 22篇
  • git 15篇
  • mongo 2篇
  • storage 5篇
  • db dw 20篇
  • os 11篇
  • dataVisual web 2篇
  • is cryptography 7篇
  • interview 26篇
  • cs interests 3篇
  • sentiment 4篇

最新评论

  • 使用xgboost进行文本分类

    weixin_63191714: 找到主函数了吗? 怎么改?

  • 共轭梯度法(Conjugate gradient)详解

    ai4110: 是的,应该是2ab^Td。后面有一步,对每一项求最小值,关于a求导后,两个2就能约掉了。

  • sympy模块解指数方程

    有温度的AI: 如何只输出实数解呢

  • 在python3.8安装tensorflow 1.14.0

    镇长1998: 感觉是 没有刚好对齐python版本的tensorflow版本, 因为你的python版本是3.8,而我这里是3.7.16,直接用pip install tensorflow==1.14 就行了,用的也是清华源,我有个python 3.12的版本就和你的错误一样了。

  • sql计算占比

    Eddie 张华艺: 牛比 高质量、高效

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • macos解压rar文件
  • 各种距离相似度量及计算
  • python初始化二维数据
2024年3篇
2023年36篇
2022年96篇
2021年59篇
2020年69篇
2019年57篇
2018年66篇
2017年129篇
2016年264篇

目录

目录

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源如何起英文名字嘉铭宝宝起名取名破解版水果店起名带木字起名男孩大师起名字好中里结菜生辰八字属鸡起名郑州区号姓包男孩起名大全香槟酒是什么酒服装品牌起名字大全免费蔚字起名风犬少年的天空全集资源写给孩子起名的网站2018狗宝宝取名起名大全你却爱着一个sb面馆起什么名字好词组起名给园林公司起名大全集下载怎么起名字结合生辰八字2019起名大全姓张的用逸字怎么起名字柳残阳小说下载柯文哲敲桌子一指禅事件美容养生店铺起名大全给店铺起名用属木的字起名2018起名字什么叫年线淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化