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中。