SQL速查 《SQL基础教程》学习笔记不定期更新,记录一些必会的常见SQL语法和易错点。
本文是下篇,主要记录联表查询。
所谓集合运算,就是对满足同一规则的记录进行的加减等四则运算。通过集合运算,可以得到两张表中记录的集合或者公共记录的集合,又或者其中某张表中的记录的集合。像这样用来进行集合运算的运算符称为集合运算符。
以行(记录)为单位对表做集合运算
这一部分就像是集合运算,数据表中的每一条记录不会被打散,每一条记录就像集合中的元素。具体大致包含并集运算(UNION)、交集运算(INTERSECT)、差集运算(EXCEPT),以及一个重要关键字ALL。
UNION(并集运算)—— 表的加法
这就是集合的并集运算。UNION 等集合运算符会除去重复的记录。 例如:
可以看到交集的部分没有重复显示。而UNION ALL会显示重复行,且不会对结果进行排序,因此比 UNION 的性能更好。前两天浦发初筛随口问了这个当时没看不知道,现在真想给自己一棒槌!
集合运算注意事项
注意事项① ——作为运算对象的记录的列数必须相同
注意事项② ——作为运算对象的记录中列的类型必须一致
当必须使用不同数据类型的列进行运算时,可以使用类型转换函数CAST。
注意事项③ —— 可以使用任何 SELECT 语句,但 ORDER BY 子句只能在最后使用一次
ALL 关键字实现保留重复行的集合运算
INTERSECT (交集运算)
EXCEPT(差集运算)
以列(属性)为单位对表联结
联结( JOIN )就是将其他表中的列添加过来,进行“添加列”的集合运算。UNION 是以行(纵向上)为单位进行操作,而联结则是以列(横向上)为单位进行的。
联结大体上分为内联结和外联结两种,交叉联结很少用到。
INNER JOIN
要点1:FROM子句中使用两张表,使用 INNER JOIN 隔开,并且表最好使用别名
FROM ShopProduct AS SP INNER JOIN Product AS P
要点2: ON子句,ON 后面的联结条件
ON SP.product_id = P.product_id
ON 之后指定两张表联结所使用的列(联结键),并且ON 子句要书写在 FROM 和 WHERE 之间。
要点3:SELECT 子句。
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price
使用联结时 SELECT 子句中的列需要按照“ < 表的别名 > . < 列名 > ”的格式进行书写。
可以将联结之后的结果想象为新创建出来的一张表,对这张表再使用WHERE 子句等工具,例如:
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price
FROM ShopProduct AS SP INNER JOIN Product AS P
ON SP.product_id = P.product_id
WHERE SP.shop_id = ‘000A’;
外联结—— OUTER JOIN
内连接只能读取多张表共有的部分。对于外联结来说,只要数据存在于某一张表当中,就能够读取出来。
外联结还有一点非常重要,那就是要把哪张表作为主表。最终的结果中会包含主表内所有的数据。指定主表的关键字是 LEFT 和 RIGHT 。
使用 LEFT 时 FROM 子句中写在左侧的表是主表,使用 RIGHT时右侧的表是主表。例如:
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price
FROM Product AS P LEFT OUTER JOIN ShopProduct AS SP
ON SP.product_id = P.product_id
三张及以上数量表的联结
交叉联结
对满足相同规则的表进行交叉联结的集合运算符是 CROSS JOIN (笛卡儿积)。进行交叉联结时无法使用内联结和外联结中所使用的 ON 子句,这是因为交叉联结是对两张表中的全部记录进行交叉组合,因此结果中的记录数通常是两张表中行数的乘积。