SQL语句的解析顺序、数据库表的笛卡尔积
sql语句的书写顺序:select ---> from --->where ---> group by ---> having ---> order by
其中where和having是不能同时使用的,并且having和group by 是联合使用的;
这是程序员或DBA写SQL的顺序;
sql语句的解析顺序 :
from --->where ---> group by ---> having ---> select ---> order by
大体的过程如下,我还没完全理解;每一步形成一个虚表,这个虚表又作为下一步骤的输入,这样得到最后的结果;
SQL语句的解析顺序
1. FROM FROM后面的表标识了这条语句要查询的数据源;FROM过程之后会生成一个虚拟表VT1;
FROM又可以包括三个子步骤,如果只是单表查询的话不包括这三个;
1-J1 笛卡尔积 这个步骤会计算两个相关联表的笛卡尔积(CROSS JOIN) ,生成虚拟表VT1-J1;
如果是连接查询,计算关联表的笛卡尔积,得到虚拟表VT1-J1;
1-J2 ON过滤 ,生成虚拟表VT1-J2;
1-J3 如果使用了外连接,添加外部行,生成虚拟表VT1-J3;
2. WHERE 对步骤1生成的临时表进行过滤,得到VT2表;
3. GROUP BY ,对VT2表GROUP BY,生成VT3表;
4. HAVING ,得到VT4表;
5. SELECT 对SELECT子句中的元素进行处理,生成VT5表;
5-1 计算表达式 计算SELECT 子句中的表达式,生成VT5-1;
5-2 DISTINCT 寻找VT5-1中的重复列,并删掉,生成VT5-2;
5-3 TOP 从ORDER BY子句定义的结果中,筛选出符合条件的列,生成VT5-3表;
ORDER BY 从VT5-3中的表中,根据ORDER BY 子句的条件对结果进行排序,生成VC6表;
表的笛卡尔积
笛卡尔积指的是两个集合所有的组合情况;
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)};
那么两个表的笛卡尔积就是指两个表连接的所有组合情况;两个表连接,每个表有5条记录,笛卡尔积是25条记录;
下图大概是百度百科的,
就是连接查询的情况下,如果2个表连接,每个表有100条记录;中间有个计算笛卡尔积的过程,会形成一个一万行记录的集合,再从中筛选,这是在C语言的层面、数据库引擎中实现;
看上去没错,它是先笛卡尔积,再ON过滤;
表的笛卡尔积可参阅此文,
https://blog.csdn.net/weixin_44953658/article/details/127087480
SQL语句的解析顺序、数据库表的笛卡尔积相关推荐
- Oracle数据库查看表空间sql语句、查看Oracle数据库表空间剩余 、修改表空间、库备份
一 Oracle数据库查看表空间sql语句 1.oracle查看表空间当前用户 SQL> select username,default_tablespace from user_use ...
- SQL语句实现两个数据库表直接操作
转自:http://blog.163.com/haitaosong_accp/blog/static/5523025920094222105655/ 原表及数据:(原始表有N个) tb1 id aa ...
- jpa 默认生成sql语句_springboot-jpa自动创建数据库表
第一步创建springboot项目,jpa,mysql, 代码如下: application.yml spring: datasource: url: jdbc:mysql://127.0.0.1:3 ...
- SQL语句的书写顺序和解析顺序
数据库是java开发必经之路,而sql语句的书写和语句的解析也是非常的重要的. sql语句的书写顺序:select ---> from --->where ---> group by ...
- SQL语句的解析过程
SQL语句的解析过程 由于最近需要做一些sql query性能提升的研究,因此研究了一下sql语句的解决过程.在园子里看了下,大家写了很多相关的文章,大家的侧重点各有不同.本文是我在看了各种资料后手机 ...
- SQL语句的书写顺序和执行顺序
sql语句的书写顺序: select >> from >> where >> group by >> having >> order by ...
- 合肥工业大学—SQL Server数据库实验三:SQL语句创建和删除基本表
SQL语句创建和删除基本表 1. 编写6个基本表 2. 修改基本表结构,完整性约束条件 3. 用Drop table 语句删除基本表 1. 编写6个基本表 设有简单教学管理的6个关系模式如下: 系(系 ...
- SQL语句判断指定的数据库、表、字段、存储过程是否存在
SQL语句判断指定的数据库.表.字段.存储过程是否存在 直接上代码,对大家有用就好! 代码 --判断[TestDB]是否存在 if exists(select 1 from master..sysda ...
- 数据库:SQL语句的执行顺序,及每一步的详细解释
一.SQL语句的执行顺序举例(sqlServer版): (8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list&g ...
最新文章
- C#使用log4net记录日志
- *[hackerrank]Maximizing XOR
- STC用PCA测量脉宽_用好手中的频谱仪-无线电信号监测技巧
- 【题解】luogu p1032 字串变换
- leetcode76 最小覆盖子串
- qqkey获取原理_HIT我守护的一切手游电脑版苹果版有吗 HIT我守护的一切iOS电脑版模拟器...
- 数字电路基础知识——锁存器与触发器的建立时间和保存时间(一)
- Unity发布WebGL之后读取StreamingAssets文件路径数据
- Android 手写签名 (图片合成)
- [Servlet] HttpServletRequest
- 嵌入式设备时间同步管理
- Linux(Ubuntu)下使用OneNote
- C++: 生成给定范围内的所有多维索引。 模拟任意数量的嵌套循环的行为(附完整源码)
- Big Faceless Applet PDF阅读器
- 降维算法-LDA线性判别分析实例
- Vultr 教程目录
- 解决单行文本省略号显示问题
- SourceTree报错git -c diff.mnemonicprefix=false fatal: Unable to create ‘D:/xxx/.git/index.lock‘: File
- sincerit little w and Soda(规律题)
- 持续迭代、永久更新的WIN NFT HORSE,具有无穷无尽的生命力
热门文章
- KEA128主芯片的解读(时钟)
- 十大主流集群调度系统大盘点
- linux下sqlplus用法,linux也适用的sqlplus 用法
- Dev-Cpp下载与安装(图文教程)
- 树与二分图-2022RoboCom 世界机器人开发者大赛-本科组(省赛)
- 排名预测(附python代码)
- MFC Windows 程序设计[二十八]之字体样式(附源码)
- 高等教育计算机应用方面的文章,计算机技术在高等教育中的应用
- 推荐一个基于 Vue 的低代码平台
- jsp页面中文 contenttype=text/html;c,JSP中文乱码问题解决