欢迎关注公众号sqlrmxx获取更多学习资料

想要进一步提高SQL语言能力必须完全理解SQL执行过程

知识回顾

SQL查询逻辑执行顺序

(8)SELECT (9)DISTINCT (11)<Top Num><select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

执行顺序解析

1. FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt12. ON: 对vt1表应用ON筛选器只有满足 join_condition 为真的行才被插入vt2

3. OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2,生成t3,如果from包含两个以上表,则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束。

4. WHERE:对vt3应用 WHERE 筛选器只有使 where_condition 为true的行才被插入vt4

5. GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5

6. CUBE|ROLLUP:把超组(supergroups)插入vt6,生成vt6

7. HAVING:对vt6应用HAVING筛选器只有使 having_condition 为true的组才插入vt7

8. SELECT:处理select列表产生vt8

9. DISTINCT:将重复的行从vt8中去除产生vt9

10. ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10

11. TOP:从vc10的开始处选择指定数量或比例的行生成vt11 并返回调用者

实例分析:

创建实例数据:注:此次使用SQL SERVER书写语句,其他数据库产品可能有些差异

create table SC(SId varchar(10),CId varchar(10),score decimal(18,1))
insert into SC values('01' , '01' , 80)
insert into SC values('01' , '02' , 90)
insert into SC values('01' , '03' , 99)
insert into SC values('02' , '01' , 70)
insert into SC values('02' , '02' , 60)
insert into SC values('02' , '03' , 80)
insert into SC values('03' , '01' , 80)
insert into SC values('03' , '02' , 80)
insert into SC values('03' , '03' , 80)
insert into SC values('04' , '01' , 50)
insert into SC values('04' , '02' , 30)
insert into SC values('04' , '03' , 20)
insert into SC values('05' , '01' , 76)
insert into SC values('05' , '02' , 87)
insert into SC values('06' , '01' , 31)
insert into SC values('06' , '03' , 34)
insert into SC values('07' , '02' , 89)
insert into SC values('07' , '03' , 98)

需求:查询各科成绩前三名的记录

语句如下 :

SELECT
*
FROM
sc
WHERE
( SELECT count( * ) FROM sc t1 WHERE t1.CId = sc.CId AND t1.score > sc.score ) < 3
ORDER BY
cid,
score DESC

查询结果

首先介绍一下

什么是相关子查询语句?许多查询都可以通过执行一次子查询并将得到的值代入外部查询的 WHERE 子句中进行计算。在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。

上述案例SQL语句执行顺序:

1、FROM SC 父查询加载成绩表SC并且指针在第一条记录;

2、FROM SC T1 子查询加载成绩表SC 别名是T1;

3、执行子查询WHERE子句t1.CId =sc.CId and t1.score>sc.score,符合则保留T1表里的记录;

4、执行count(*)数据统计函数,统计符合WHERE子句条件的保留记录;

5、把子查询统计结果返回给到父查询,语句执行父查询的WHERE子句(子查询的结果)<3,如果是true,则保留父查询当前指针所在记录;

6、父查询指针指向第二条记录,执行子查询WHERE子句,步骤重复3-5;一直到父查询所有记录(行)读取完为止。

7、执行SELECT把符合父查询条件的记录显示出来8、执行order by cid , score desc排序,到此整条语句执行完成。

小结:上述案例SQL执行顺序:FROM - WHERE - SELECT - ORDER BY

所有语句不管多复杂,都按照SQL语句各关键字的执行顺序进行。

sql left join on 多条件_提高SQL语言能力必会的知识点相关推荐

  1. groovy怎样从sql语句中截取表名_《SQL基础教程》学习笔记

    第1章 数据库和SQL 1-3 SQL概要 SQL语句及其种类 DDL-CREATE,DROP,ALTER DML-SELECT,INSERT,UPDATE,DELETE DCL-COMMIT,ROL ...

  2. sql 查询手动创建的表_学习SQL:使用SQL查询手动创建报告

    sql 查询手动创建的表 In the previous two articles, we've practiced SQL queries and went through a few more e ...

  3. sql组合键设置外键_学习SQL:外键

    sql组合键设置外键 In the previous article, we talked about the primary key (PK). In this one, we'll check w ...

  4. sql语句集合里有集合_学习SQL:集合论

    sql语句集合里有集合 The set theory is very important in order to understand data and databases. While you co ...

  5. inner join on 加条件和where加条件_图解 SQL 中各种连接 JOIN

    先用文字来捋一下思路,数据库操作中无非就是「 增删查改 」,其中「 查」用得最多且最复杂,变化多端.查询的时候,我们可以只是单表查询,也可以是多表连接查询,单表查询中的学问也很大,但限于篇幅,本次主要 ...

  6. sql server 中获取前一天日期_图解SQL面试题:如何比较日期数据?

    ​[题目] 下面是某公司每天的营业额,表名为"日销"."日期"这一列的数据类型是日期类型(date). 请找出所有比前一天(昨天)营业额更高的数据.(前一天的意 ...

  7. sql 如何查询上次的记录_学会SQL并不难,小白学习记录之五(多表查询)

    1.表的加法 加法(union) 将两个表的数据按行合并在一起 两个表中重合部分会删除 union all 会保留重复行 2.表的联结 联结(join) 通过表和表之间的关系,将两个表合并在一起: 交 ...

  8. sql外键需要输入吗_关于sql:为什么在没有连接的情况下可以联接,为什么需要主-外键关系?...

    如果我们可以从两个表中获取数据而又没有主键和外键关系,那为什么我们需要这个规则? 你能用合适的例子清楚地解释我吗? 这是一个测试数据库,不要介意不良的结构. 表的结构: ** TABLE - 'tes ...

  9. 用SQL语句添加删除修改字段_常用SQL

    1.增加字段      alter table docdsp     add dspcode char(200) 2.删除字段      ALTER TABLE table_NAME DROP COL ...

最新文章

  1. LeetCode中等题之无重复字符的最长字串
  2. 如何理解react中的super(),super(props)
  3. springcloud 微服务鉴权_我对微服务、SpringCloud、k8s、Istio的一些杂想
  4. 收藏 | 一文带你深入理解深度学习最新进展
  5. 字节跳动全资收购北京麦田?回应称只收购了麦田旗下一家公司
  6. 一台手机苹果含泪赚4000?iPhone 12硬件成本曝光
  7. [swift] LeetCode 96. Unique Binary Search Trees
  8. ASC加密解密(笔记)
  9. 申请开通支付宝当面付、电脑网站、手机网站、APP、刷脸支付
  10. 运用计算机技术和语文教学,计算机信息技术与小学语文教学整合的优势
  11. 商场管理系统原创代码
  12. 设计一个长方形类。成员变量包括:长度和宽度,成员函数除包括计算周长和计算面积外, 还包括用set方法来设置长方形的长度和宽度,以及用get的方法来获得长方形的长度和宽度 最后,编写一个测试程序来测试所
  13. 【通信原理】#19 基于matlab的交织与解交织
  14. C语言简单计算器报告5000字,c语言简单计算器报告.docx
  15. Tranformer模型与Softmax函数
  16. 微信小商店经验个人收集
  17. 免安装Android Studio使用adb连接手机设备或模拟机进行真机调试
  18. QPBOC规范——GPO流程
  19. HTML添加图像和超链接
  20. 能在路由器里挂载阿里云盘的aliyundrive-webdav

热门文章

  1. CRL校验与OCSP套封
  2. 【警告】chunk base [mini-css-extract-plugin] Conflicting order between:
  3. Django生成MySQL表的字段注释
  4. vue 使用百度地图api_使用百度地图api来实现ip高精度定位
  5. esp8266-01s 不能连接华为路由器解决方法
  6. 圆的周长在java中怎么表示_Java基础之计算圆的周长
  7. python list函数使用总结_python list(函数list用法)
  8. [Win32]纯资源DLL
  9. 元胞自动机-森林火灾模拟
  10. 微信小程序真机不显示图片【三个解决方案】