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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值