SQL 基础教程 Chapter 7


typora-copy-images-to: SQL basic

SQL 基础教程 Chapter 7 集合运算

前面几章我们学习了使用一张表的SQL 语句的书写方法,本章将会和大家一起学习使用2 张以上的表的SQL 语句。通过以行方向(竖)为单位的集合运算符和以列方向(横)为单位的联结,就可以将分散在多张表中的数据组合成为期望的结果。


7.1 表的加减法

  • 集合运算就是对满足同一规则的记录进行的加减等四则运算
  • 使用UNION(并集)、INTERSECT(交集)、EXCEPT(差集)等集合运
    算符来进行集合运算
  • 集合运算符可以去除重复行
  • 如果希望集合运算符保留重复行,就需要使用ALL选项

  • 表的加法——UNION(并集)

在这里插入图片描述

  • UNION 等集合运算符通常会除去重复的记录

  • 集合运算的注意事项

# 作为运算对象的记录的列数必须相同
-- 列数不一致时会发生错误
SELECT product_id, product_name
FROM Product
UNION
SELECT product_id, product_name, sale_price
FROM Product2;

#作为运算对象的记录中列的类型必须一致
-- 数据类型不一致时会发生错误
SELECT product_id, sale_price
FROM Product
UNION
SELECT product_id, regist_date
FROM Product2;
#可使用CAST转换函数

#可以使用任何select语句,但是ORDER BY只能在最后使用一次
SELECT product_id,product_name
from product 
where product_type = '厨房用具'
UNION
SELECT product_id,product_name
from product2
where product_type = '厨房用具'
ORDER BY product_id

在这里插入图片描述

  • 包含重复行的集合运算——ALL选项
# 保留重复行
SELECT product_id, product_name
FROM Product
UNION ALL
SELECT product_id, product_name
FROM Product2;

在这里插入图片描述

  • 选取表中公共部分——INTERSECT
# 交集
SELECT product_id, product_name
FROM Product
INTERSECT
SELECT product_id, product_name
FROM Product2
ORDER BY product_id;
# 不适用于MySQL
  • 记录的减法——EXCEPT
# 语法同UNION相同
SELECT product_id, product_name
FROM Product
EXCEPT
SELECT product_id, product_name
FROM Product2
ORDER BY product_id;

## 注意点:EXCEPT 有一点与UNION 和INTERSECT 不同,需要注意一下。
## 那就是在减法运算中减数和被减数的位置不同,所得到的结果也不相同。

7.2 联结(以列为单位对表进行联结)

  • 联结(JOIN)就是将其他表中的列添加过来,进行“添加列”的集合运算。
    UNION是以行(纵向)为单位进行操作,而联结则是以列(横向)为单位
    进行的
  • 联结大体上分为内联结和外联结两种。首先请大家牢牢掌握这两种联结的
    使用方法
  • 请大家一定要使用标准SQL的语法格式来写联结运算,对于那些过时的
    或者特定SQL 中的写法,了解一下即可,不建议使用。

  • 什么是联结

    • 集合运算特征是以行方向为单位进行操作。导致记录行数的增减
    • 联结(JOIN)运算,该操作用于多张表中选取数据
    • 分为内联结和外联结
  • 内联结(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;

# 内联结的注意点:
# 1、FROM 子句 使用了两张表,而且使用了别名
# 2、注意ON 后面是联结的联结条件,同样可以使用AND、OR
# ON必须写在FROM和WHERE之间
# 3、SELECT子句,在联结中按照“< 表的别名>.< 列名>”的格式来
# 书写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';

在这里插入图片描述

  • 我们可以将联结之后的结果想象为新创建出来的一张表(表7-4),对这张表使用WHERE 子句等工具,这样理解起来就容易多了

  • 外联结

# 将两张表进行外联结
SELECT SP.shop_id, SP.shop_name, SP.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;

# 选取出单张表中全部的信息
# 内联结只能选取出同时存在于两张表中的数据,相反,对于外联结来说,只要数据存在于某一张表当中,就能够读取出来
# 使用外联结行数不会改变
# 指定主表的关键字是LEFT 和 RIGHT。顾名思义。
  • 3张以上表的联结
# 创建InventoryProduct(库存商品)表
SELECT sp.shop_id,sp.shop_name,sp.product_id,p.product_name,p.sale_price,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';

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 交叉联结——CROSS JOIN
# 将Product 表和ShopProduct 表进行交叉联结
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name
FROM ShopProduct AS SP CROSS JOIN Product AS P;

# 对满足相同规则的表进行交叉联结的集合运算符是CROSS JOIN(笛卡儿积)
# 对两张表中的全部记录进行交叉组合
# 因为ShopProduct表存在13 条记录,Product 表存在8 条记录,所以结果中就包含了13 × 8 = 104 条记录
  • 使用过时语法的内联结
    • 使用这样的语法无法马上判断出到底是内联结还是外联结
    • 由于联结条件都写在WHERE 子句之中,因此无法在短时间内
      分辨出哪部分是联结条件,哪部分是用来选取记录的限制条件
    • 我们不知道这样的语法到底还能使用多久

APPENDIX

法则7.1 集合运算符会除去重复的记录
法则7.2 在集合运算符中使用ALL选项,可以保留重复行
法则7.3 进行联结时需要在FROM子句中使用多张表
法则7.4 进行内联结时必须使用ON子句,并且要书写在FROM和WHERE之间
法则7.5 使用联结时SELECT子句中的列需要按照“<表的别名>.<列名>”的格式进行书写
法则7.6 外联结中使用LEFT、RIGHT来指定主表。使用二者所得到的结果完全相同
法则7.7 对于联结的过时语法和特定语法,虽然不建议使用,但还是希望大家能够读懂
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值