SQL——1、查询执行顺序

这才是完整的SELECT查询

SELECT DISTINCT column, AGG_FUNC(column_or_expression), …       #SELECT 选择;DISTINCT 关键字来指定某个或某些属性列唯一返回;AGG_FUNC统计函数

FROM mytable

JOIN another_table                                                                                           #JOIN ON 连接表 

    ON mytable.column = another_table.column

WHERE constraint_expression

GROUP BY column                                                                                           #GROUP BY进行分组,HAVING对分组结果进行筛选

HAVING constraint_expression

ORDER BY column ASC/DESC                                                                       #ORDER BY对结果进行排序,ASC升序,DESC降序,默认升序

LIMIT count OFFSET count;                                                                             #LIMIT  OFFSET,对排序结果进行截取

 

查询执行顺序

1、 FROM 和 JOIN

FROM或JOIN会第一个执行,确定一个整体的数据范围。如果要JOIN不同表,可能会生成一个临时Table来用于下面的过程。

2、 WHERE

我们确定了数据来源 WHERE 语句就将在这个数据源中按要求进行数据筛选,并丢弃不符合要求的数据行,所有的筛选col属性 只能来自FROM圈定的表。 AS别名还不能在这个阶段使用,因为可能别名是一个还没执行的表达式。

3、 GROUP BY

如果你用了 GROUP BY 分组,那GROUP BY 将对之前的数据进行分组,统计等,并将是结果集缩小为分组数。这意味着 其他的数据在分组后丢弃。

4、 HAVING

如果你用了 GROUP BY 分组, HAVING 会在分组完成后对结果集再次筛选。AS别名也不能在这个阶段使用。

5、 SELECT

确定结果之后,SELECT用来对结果col简单筛选或计算,决定输出什么数据。

6、 DISTINCT

如果数据行有重复DISTINCT 将负责排重。

7、 ORDER BY

在结果集确定的情况下,ORDER BY 对结果做排序。因为SELECT中的表达式已经执行完了。此时可以用AS别名。

8、 LIMIT / OFFSET

最后 LIMIT 和 OFFSET 从排序的结果中截取部分数据。

 

————————————————

版权声明:本文为CSDN博主「风中凌乱的小精灵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shujian_tianya/article/details/81067206

1、基本查询

 1 /*2.1供应商名称、地址、联系电话*/
 2 SELECT name,address,phone
 3 FROM supplier;
 4  
 5 /*2.2最近一周内提交的总价大于1000元的订单编号、顾客编号等订单的所有信息*/
 6 SELECT *
 7 FROM orders
 8 WHERE Datediff(dd,orderdate,GETDATE())<=7
 9       AND totalprice>1000;
10       
11 /*2.3每个顾客的订单金额*/
12 SELECT orders.custkey,name,SUM(totalprice) sumprice
13 FROM customer,orders
14 WHERE customer.custkey=orders.custkey
15 GROUP BY orders.custkey,name 
16 ORDER BY SUM(totalprice) DESC;
17  
18 /*2.4订单平均金额超过元的顾客编号以及姓名*/
19 SELECT orders.custkey,name,AVG(totalprice) avgerage
20 FROM customer,orders
21 WHERE customer.custkey=orders.custkey
22 GROUP BY orders.custkey,name
23 HAVING AVG(totalprice)>1000
24 ORDER BY orders.custkey DESC;
25  
26 /*2.5 查询与“上海黎顺服装经营部”在同一个国家的供应商编号、名称和地址信息*/
27 SELECT suppkey,name,address
28 FROM supplier
29 WHERE nationkey=
30                (
31                  SELECT nationkey
32                  FROM supplier
33                  WHERE name='上海黎顺服装经营部'
34                );
35                
36 SELECT a.suppkey,a.name,a.address
37 FROM supplier a , supplier b
38 WHERE b.nationkey=b.nationkey
39      AND b.name ='上海黎顺服装经营部';
40      
41 /*2.6 供应商价格大于零售价格的零件名、制造商名、零售价格和供应商价格*/
42 SELECT  name,mfgr,retailprice,supplycost
43 FROM part,partsupp
44 WHERE supplycost >retailprice
45     AND part.partkey=partsupp.partkey
46     
47 /*2.8顾客“阿波罗"订单的订单编号、总价、订购的零件编号、数量和明细价格*/
48 SELECT orders.orderkey,totalprice,partkey,quantity,extendedprice
49 FROM orders,lineitem                                                                                                 
50 WHERE orders.orderkey=lineitem.orderkey
51   AND custkey =
52              (
53                 SELECT custkey
54                 FROM customer
55                 WHERE name='阿波罗'
56              );

2、高级查询

  1 /*3.1订购“沈阳市新民高中压阀门厂”制造“竹炭黄土按摩皂”的顾客*/
  2 SELECT custkey,name /* 找出订购的顾客的编号和姓名*/
  3 FROM customer
  4 WHERE custkey IN
  5 (
  6    SELECT custkey/*含有该订单编号的顾客编号*/
  7    FROM orders
  8    WHERE orderkey IN
  9               (
 10               SELECT orderkey /*含有该零件编号的的订单编号*/
 11               FROM lineitem
 12               WHERE partkey=
 13                            (
 14                             SELECT partkey/* 找出零件编号*/
 15                             FROM part
 16                             WHERE name='竹炭黄土按摩皂'
 17                              AND  mfgr='沈阳市新民高中压阀门厂'
 18                            )         
 19               )
 20    );
 21    
 22 /*3.2 没有购买过“沈阳市新民高中压阀门厂”制造的“竹炭黄土按摩皂”的顾客*/
 23 SELECT custkey,name /* 找出订购的顾客的编号和姓名*/
 24 FROM customer
 25 WHERE custkey NOT IN
 26 (
 27    SELECT custkey/*含有该订单编号的顾客编号*/
 28    FROM orders
 29    WHERE orderkey IN
 30               (
 31               SELECT orderkey /*含有该零件编号的的订单编号*/
 32               FROM lineitem
 33               WHERE partkey=
 34                            (
 35                             SELECT partkey/* 找出零件编号*/
 36                             FROM part
 37                             WHERE name='竹炭黄土按摩皂'
 38                              AND  mfgr='沈阳市新民高中压阀门厂'
 39                            )         
 40               )
 41    );
 42  
 43 /*3.3 至少购买过顾客“董浩川”购买过的全部零件的顾客姓名*/
 44  
 45 SELECT name FROM customer WHERE custkey IN 
 46 (
 47   SELECT custkey FROM orders WHERE orderkey IN
 48   (
 49     SELECT orderkey FROM lineitem WHERE partkey IN
 50       ( 
 51         SELECT partkey  FROM lineitem WHERE orderkey IN
 52          (
 53             SELECT orderkey FROM orders WHERE custkey=
 54              (
 55                 SELECT custkey FROM customer WHERE name='董浩川'
 56              )
 57           )
 58        )
 59     )
 60  );
 61  
 62 GROUP BY name
 63 HAVING(COUNT(*)=
 64 (
 65    SELECT count ( DISTINCT partkey) FROM lineitem WHERE orderkey IN
 66    (
 67      SELECT orderkey FROM orders  WHERE custkey=
 68      (
 69         SELECT custkey FROM customer WHERE name='董浩川'
 70      )
 71    )
 72   )
 73 );
 74  
 75 /*3.4查询订单平均金额超过万元的顾客的中国国籍顾客信息*/
 76 SELECT *
 77 FROM customer
 78 WHERE customer.custkey IN
 79              (
 80                SELECT orders.custkey
 81                FROM customer,orders
 82                WHERE customer.custkey=orders.custkey
 83                GROUP BY orders.custkey
 84                HAVING AVG(totalprice)>10000
 85                          )
 86 AND nationkey=
 87               (
 88                 SELECT nationkey
 89                 FROM nation
 90                 WHERE name='中国'
 91               );
 92  
 93 /*3.5“董浩川”和“戴美竹”都订购过的全部零件信息*/
 94 SELECT *
 95 FROM part
 96 WHERE partkey IN
 97          (
 98             SELECT partkey  FROM lineitem WHERE orderkey IN
 99                       (
100                         SELECT orderkey FROM orders WHERE custkey=
101                                     (
102                                      SELECT custkey FROM customer WHERE name='董浩川'
103              )
104           );
105    
106 
107   INTERSECT
108   SELECT partkey  FROM lineitem WHERE orderkey IN
109          (
110             SELECT orderkey FROM orders WHERE custkey=
111              (
112                 SELECT custkey FROM customer WHERE name='戴美竹'
113              )
114           )
115   
116 );
117  
118 /*3.6“董浩川”和“戴美竹”订购过的全部零件信息*/
119 SELECT *
120 FROM part
121 WHERE partkey IN
122 (
123   SELECT partkey  FROM lineitem WHERE orderkey IN
124          (
125             SELECT orderkey FROM orders WHERE custkey=
126              (
127                 SELECT custkey FROM customer WHERE name='董浩川'
128              )
129           )
130    
131 
132   UNION
133   SELECT partkey  FROM lineitem WHERE orderkey IN
134          (
135             SELECT orderkey FROM orders WHERE custkey=
136              (
137                 SELECT custkey FROM customer WHERE name='戴美竹'
138              )
139           )
140   
141 );
142 
143 /*3.8“董浩川”订购过而且“戴美竹”没有订购过的全部零件信息*/
144 SELECT *
145 FROM part
146 WHERE partkey IN
147 (
148   SELECT partkey  FROM lineitem WHERE orderkey IN
149          (
150             SELECT orderkey FROM orders WHERE custkey=
151              (
152                 SELECT custkey FROM customer WHERE name='董浩川'
153              )
154           )
155    
156   EXCEPT
157   SELECT partkey  FROM lineitem WHERE orderkey IN
158          (
159             SELECT orderkey FROM orders WHERE custkey=
160              (
161                 SELECT custkey FROM customer WHERE name='戴美竹'
162              )
163           )
164   
165 );

 

posted @ 2022-04-26 16:41  七月安生里  阅读(339)  评论(0)    收藏  举报