集合运算:练习题

本文内容

7.1 请说出下述 SELECT 语句的结果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
-- 使用本章中的Product表
SELECT *
  FROM Product
UNION
SELECT *
  FROM Product
INTERSECT
SELECT *
  FROM Product
ORDER BY product_id;

答:如下所示,会将 Product 表中的 8 行记录原封不动地选取出来。

执行结果

 product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-----------
 0001       | T恤衫        | 衣服         |       1000  |            500 | 2009-09-20
 0002       | 打孔器       | 办公用品     |        500  |            320 | 2009-09-11
 0003       | 运动T恤      | 衣服         |       4000  |           2800 |
 0004       | 菜刀         | 厨房用具     |       3000  |           2800 | 2009-09-20
 0005       | 高压锅       | 厨房用具     |       6800  |           5000 | 2009-01-15
 0006       | 叉子         | 厨房用具     |        500  |                | 2009-09-20
 0007       | 擦菜板       | 厨房用具     |        880  |            790 | 2008-04-28
 0008       | 圆珠笔       | 办公用品     |        100  |                | 2009-11-11

» 解答

可能有些读者会对此感到惊讶:“同时使用 UNIONINTERSECT 时,不是 INTERSECT 会优先执行吗?”当然,从执行顺序上来说确实是从 INTERSECT 开始的,但是在此之前,由于对同一张表使用了 UNION 或者 INTERSECT,因此结果并不会发生改变。也就是说,由于 UNION 或者 INTERSECT 未使用 ALL,会排除掉重复的记录,因此对同一张表来说,无论执行多少次操作,原表也不会发生改变。

7.2 SQL 联结 中的代码清单 11 中列举的外联结的结果中,高压锅和圆珠笔 2 条记录的商店编号(shop_id)和商店名称(shop_name)都是 NULL。请使用字符串“不确定”替换其中的 NULL。期望结果如下所示。

执行结果

执行结果

答:SELECT 语句如下所示。

1
2
3
4
5
6
7
8
SELECT COALESCE(SP.shop_id, '不确定') AS shop_id,
       COALESCE(SP.shop_name, '不确定') AS shop_name,
       P.product_id,
       P.product_name,
       P.sale_price
  FROM ShopProduct SP RIGHT OUTER JOIN Product P
    ON SP.product_id = P.product_id
ORDER BY shop_id;

» 解答

大家想起这个名字有点奇怪的 COALESCE 函数了吗?该函数可以将 NULL 变换为其他的值。虽然名字有些古怪,但使用却很频繁。特别是在希望改变外部连接结果中的 NULL 时,该函数是唯一的选择,因此希望大家能够牢记。

请参阅#

(完)

comments powered by Disqus

本文内容