SQL进阶教程1-4 HAVING子句 总结和练习题

本节要点总结:

1.表不是文件,记录也没有顺序,所以SQL不进行排序;

2.SQL不是面向过程语言,没有循环、条件分支、赋值操作;

3.SQL通过不断生成子集来求得目标集合。SQL不像面向过程语言那样通过画流程图来思考问题,而是通过画集合的关系图来思考。

4.GROUP BY子句可以用来生成子集,例如求一个集合中的众数,通过求两个子集合的交集来获取整个集合的中位数。

5.WHERE子句用来调查集合元素的性质,而HAVING子句用来调查集合本身的性质。

 

练习题:

 1. 修改编号缺失的检查逻辑,使结果总是返回一行数据。存在缺失的编号的时候返回“存在缺失的编号”,不存在缺失的编号的时候返回“不存在缺失的编号。

SELECT 
CASE WHEN  COUNT(*) = MAX(seq) THEN '不存在缺失的编号' ELSE '存在缺失的编号' END
FROM  SeqTb1

  

  2. 练习特征函数

  针对下表查询:“全体学生都在9月份提交了报告的学院”。

  

  

SELECT s1.dpt 
FROM new_students s1
WHERE sbmt_date like '%-09-%'
GROUP BY dpt
HAVING COUNT(*)    = (SELECT COUNT(*) 
             FROM new_students s2
             WHERE s2.dpt = s1.dpt)

  这样写好像不太好,但是暂时没有更好的办法。

  

  3. 购物篮分析问题的一般化

  在“用关系除法运算进行购物篮分析”的部分,返回结果只是选择了满足条件的店铺。但是有时候会有不同的需求,必须对于没有备齐全部商品类型的店铺,我们也希望返回的一览表能够展示这些店铺缺少多少种商品。

  针对下表shopitem和items表进行搜索,

       

  使程序能够返回下面这样展示了全部店铺的结果的一览表。my_item_cnt是店铺的现有库存商品种类数,diff_cnt是不足的商品种类数。

   

SELECT si.shop, COUNT(si.item) AS my_item_cnt, ((SELECT COUNT(*) FROM items)  - COUNT(si.item)) AS diff_cnt
FROM items i LEFT JOIN shopitems si ON i.item = si.item
GROUP BY si.shop

这个SQL左拼右拼终于拼接好了,但是并不好,该怎么获得每个shop缺失的商品呢,也就是商品在items中但是不在shopitems中。

 

posted @ 2019-07-11 10:08  Garcia11  阅读(488)  评论(0)    收藏  举报