表的记录是没有顺序的,而且SQL也没有排序的运算符。SQL会将多条记录作为一个集合来处理。
寻找缺失的编号
假设现有一张带有“连续编号”列的表,如表SeqTbl所示。查询这张表里是否存在数据丢失。
如果将表整体看作一个集合,就可以像下面这样解决这个问题。
1 | SELECT '存在缺失的编号' AS gap |
如果这个查询结果有1行,说明存在缺失的编号;如果1行都没有,说明不存在缺失的编号。
接下来,再来查询一下缺失编号的最小值。像下面这样写SQL语句。
1 | SELECT MIN(seq + 1) AS gap |
如果没有缺失的编号,则查询到的结果是最大编号8的下一个编号9。
然而这两个查询还不够周全,并不能涵盖所有的情况。
用HAVING子句进行子查询:求众数
就上面的表Graduates来说,众数就是10000和20000这两个值。接下来思考一下如何用SQL求众数。
1 | -- 谓词 |
可以用极值函数来代替。
1 | -- 极值函数 |
用HAVING子句进行自连接:求中位数
前面的表Graduates里有10行数据,所以取“史密斯,20000”和“劳伦斯,15000”的平均值17500作为中位数。来思考一下如何来查询位于集合正中间的元素。
做法是,将集合里的元素按照大小分为上半部分和下半部分两个子集,同时让这2个子集共同拥有集合正中间的元素。这样,共同部分的元素的平均值就是中位数。
1 | SELECT AVG(DISTINCT income) |
查询不包含NULL的集合
这里有一张存储了学生提交报告的日期的表Students,如下所示。
现在需要从这张表里找出哪些学院的学生全部都提交了报告。
1 | -- COUNT函数 |
当然使用CASE表达式也可以实现同样的功能。
1 | -- CASE表达式 |
用关系除法运算进行购物篮分析
假设有这样两张表:全国连锁折扣店的商品表Items,以及各个店铺的库存管理表ShopItems。
要查询的是囊括了表Items中所有商品的店铺。SQL语句可以像下面这样写。
1 | SELECT SI.shop |
接下来把条件变一下,只选择没有剩余商品的店铺。解决这个问题需要使用外连接。
1 | SELECT SI.shop |