暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

提高SQL语言能力必会的知识点

1432
想要进一步提高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子句中前两个表执行笛卡尔积生成虚拟表vt1
2. 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书写语句,其他数据库产品可能有些差异


成绩表SC

    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语句各关键字的执行顺序进行。


      欢迎加入QQ学习交流群讨论


      如果觉得对您有一丢丢帮助,请点击右下角在看,让更多人看到该文章。

      长按识别二维码

      关注获取视频资料





      本文分享自微信公众号 - SQL数据库入门学习,如有侵权,请联系 service001@enmotech.com 删除。
      文章转载自SQL数据库入门学习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论