SQL 集合运算

发布于 2020-07-23 04:54:40   阅读量 49  点赞 0  

一、表的加减法

 具体而言,表、视图和查询的执行结果都是记录的集合。通过集合运算,可以得到两张表中记录的并集或公共记录的集合。且通过集合运算,能够使得结果具有集合的一些特点(唯一性)。

集合运算的注意事项

  1. 作为运算对象的列数必须相同

  2. 作为运算对象的记录中列的类型必须一致(若必须使用不同数据类型的列时,可以使用CAST函数)

  3. 可以使用任何的SELECT语句,但ORDER BY语句只能在最后使用一次(即只有在最后取集合操作之后才可以排序)。


ALL 使集合可以包含重复记录

 由于集合的唯一性,结果集合运算后的结果都是没有重复记录的。若要求保留重复的记录,只需在集合操作后面加上关键字ALL

SELECT ...
UNION ALL
SELECT ...


1. UNION 并集

 使用UNION能够获取两个集合的并集。

SELECT ...
UNION
SELECT ...


2. INTERSECT 交集

 即选取两个集合中的公共记录。


3. EXCEPT 补集

EXCEPT进行集合的减法,获取集合的相对补集。



二、联结

 联结操作简单来说,就是将其他表中的列添加过来。我们期望的数据(字段)往往会分散在不同的表中,使用联结就可以从多张表中获取额外的数据了。

 联结一般分为两种:内联结与外联结。

1. 联结 INNER JOIN

 所谓联结运算,就是以表 A 中的列作为桥梁,将 B 中满足同样条件的列汇集到同一结果中。

例:

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;

 关于内联结的注意事项有:

① FROM 子句中有两张表

 进行内联结时,FROM子句中有两张表,且需要使用INNER JOIN将两张表联结在一起。

FROM ShopProduct AS SP INNER JOIN Product AS P

 且可以为表起别名,但别名并不是必须的,直接使用原名也可以,但有些原名太长会影响 SQL 语句的可读性。


② ON 指定联结键

ON后面紧跟着联结条件,即ON子句之后指定两张表联结所使用的列(联结键)。

ON SP.product_id = P.Product_id

ON后面指定的是联结条件,它起到的作用与WHERE相同,都是指定联结的条件。当需要指定多个键时,同样可以使用AMDOR。在进行内联结的时候,ON是必不可少的,并且ON必须写在FROMWHERE之间。

联结条件可以使用=来记述,在语法上还可以使用<=BETWEEN等谓词。但实际情况中基本都可以使用=进行联结。


③ SELECT 中用<表名>.<列名>指定列

 在SELECT子句中需要使用<表名>.<列名>来指定列。由于多表联结时,某个列属于哪个表容易混乱,故需使用这样的形式指定。

 从语法上来说,只有同时存在与两张表中的列需要这样指定,对于其他的列直接书写列名也不会发生错误。但就如上述所说的,为了避免混乱,还是推荐在使用联结时使用<表名>.<列名>的格式书写SELECT子句中全部的列。


④ WHERE 等子句能够正常使用

 当使用联结运算将满足相同规则的表联结起来时,WHEREORDER BYGROUP BYHAVING等工具都可以正常使用。我们可以将联结之后的结果想象为新创建出一张表,然后再对这张表使用WHERE子句等工具。


2. 联结 OUTER JOIN

 外联结也是通过ON子句的联结键将两张表进行联结,从两张表同时选取相应的列。基本的使用方法并没有什么不同,只是结果有所不同。

 内联结与外联结的区别在于:内联结只能选出同时存在于两张表中的数据;而对于外联结而言,只要数据存在于某一张表(主表)中,就能够读取出来。

 外联结只会包含所有主表中的记录,而并非包含两张表中所有的记录。

SELECT SP.shop_id,SP.shop_name,P.product_id,P.product_name,P.sale_price
FROM ShopProduct AS SP RIGHT OUTER JOIN Product AS P
ON SP.product_id = P.product_id;

① 主表

 外联结对于主表的选定很重要。最终的结果只会包含主表内所有的数据。指定主表的关键字的为LEFTRIGHT。顾名思义,使用LEFTFROM子句中写在左侧的表是主表,使用RIGHT时右侧的表是主表。



3. 联结多张表

 原则上连接表的数量并没有限制。通常联结只设计两张表,但有时也会出现须联结三张以上表的情况。

 若想联结多张表,只需同时使用多个INNER JOINOUTER JOIN即可。

SELECT SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.sale_price,IP.inventory,IP.inventory_quantity
FROM ShopProduct AS SP INNER JOIN Product AS P
    ON SP.product_id = P.product_id
        INNER JOIN InventoryProduct AS IP
            ON SP.product_id = IP.product_id
WHERE IP.inventory_id = "P001";


Last Modified : 2020-08-05 19:35:35