数据库
首页 > 数据库> > 天池龙珠计划SQL_TASK4

天池龙珠计划SQL_TASK4

作者:互联网

Task04:集合运算-表的加减法和join等

本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql

-小总结:
Select        查询列表
From          表名
Where         筛选条件
Group by      分组列表
Having        分组后筛选
Order by      排序列表
Limit         选取前几名
-执行顺序:
From-where-group by-having-select-order by

4.1表的加减法

4.1.1 集合运算

在 SQL 中, 分别对检索结果使用 UNION, INTERSECT, EXCEPT 来将检索结果进行并,交和差运算.
UNION,INTERSECT, EXCEPT这种用来进行集合运算的运算符称为集合运算符。

4.1.2 表的加法–UNION

4.1.2.1 UNION

当查询结果来自于多场表,且表之间没有关联,这时候就需要联合查询,也称union查询

SELECT product_id, product_name
  FROM product
 UNION
SELECT product_id, product_name
  FROM product2;

UNION 等集合运算符通常都会除去重复的记录.
UNION ALL: Union 会自动去重,而union all则不会

在这里插入图片描述

4.1.2.2 隐式类型转换

通常来说, 我们会把类型完全一致, 并且代表相同属性的列使用 UNION 合并到一起显示, 但有时候, 即使数据类型不完全相同, 也会通过隐式类型转换来将两个类型不同的列放在一列里显示

4.1.4 差集,补集与表的减法

-找出只存在于product表但不存在于product2表的商品.
- 使用 IN 子句的实现方法
SELECT * 
  FROM product
 WHERE product_id NOT IN (SELECT product_id 
                            FROM product2)

对称差
首先使用UNION求两个表的并集, 然后使用INTERSECT求两个表的交集, 然后用并集减去交集, 就得到了对称差.

-使用product表和product2表的对称差来查询哪些商品只在其中一张表
-使用 NOT IN 实现两个表的差集
SELECT * 
  FROM product
 WHERE product_id NOT IN (SELECT product_id FROM product2)
UNION
SELECT * 
  FROM product2
 WHERE product_id NOT IN (SELECT product_id FROM product)

交集运算 INTERSECT
两个集合的交可以看作是两个集合的并去掉两个集合的对称差。

4.2连结(JOIN)

UNION和INTERSECT 等集合运算, 这些集合运算的特征就是以行方向为单位进行操作. 通俗地说, 就是进行这些集合运算时, 会导致记录行数的增减. 使用 UNION 会增加记录行数,而使用 INTERSECT 或者 EXCEPT 会减少记录行数.
而连结:
在这里插入图片描述

4.2.1 内连结(INNER JOIN)

FROM <tb_1> INNER JOIN <tb_2> ON <condition(s)>
SELECT SP.shop_id ,SP.shop_name,SP.product_id ,P.product_name
FROM shopproduct AS SP
INNER JOIN product AS P
ON SP.product_id = P.product_id;

SELECT 子句中的列最好按照 表名.列名 的格式来使用.

4.2.2 外连结(OUTER JOIN)

内连结会丢弃两张表中不满足 ON 条件的行,和内连结相对的就是外连结.
外连结会根据外连结的种类有选择地保留无法匹配到的行.
按照保留的行位于哪张表,外连结有三种形式: 左连结, 右连结和全外连结.
在这里插入图片描述

-左连结     
FROM <tb_1> LEFT  OUTER JOIN <tb_2> ON <condition(s)>
- 右连结     
FROM <tb_1> RIGHT OUTER JOIN <tb_2> ON <condition(s)>
- 全外连结
FROM <tb_1> FULL  OUTER JOIN <tb_2> ON <condition(s)>

4.2.2.1 左连结与右连接

4.2.2.2 全外连结

全外连结本质上就是对左表和右表的所有行都予以保留, 能用 ON 关联到的就把左表和右表的内容在一行内显示, 不能被关联到的就分别显示, 然后把多余的列用缺失值填充。

4.2.3多表连结

4.2.3.1 多表进行内连结

SELECT SP.shop_id,SP.shop_name ,SP.product_id,P.product_name
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';

4.2.3.2多表进行外连结

SELECT P.product_id ,P.product_name,P.sale_price,SP.shop_id
FROM product AS P
LEFT OUTER JOIN shopproduct AS SP
	ON SP.product_id = P.product_id
LEFT OUTER JOIN Inventoryproduct AS IP
	ON SP.product_id = IP.product_id

4.2.4 非等值连结

select * from 表1 inner join 表2  on 表1.字段名 <> 表2.字段名

比较运算符(<,<=,>,>=, BETWEEN)和谓词运算(LIKE, IN, NOT 等等)在内的所有的逻辑运算都可以放在 ON 子句内作为连结条件.

4.2.5 交叉连结—— CROSS JOIN(笛卡尔积)

之前的无论是外连结内连结, 一个共同的必备条件就是连结条件–ON 子句, 用来指定连结的条件. 如果你试过不使用这个连结条件的连结查询, 你可能已经发现, 结果会有很多行. 在连结去掉 ON 子句, 就是所谓的交叉连结(CROSS JOIN), 交叉连结又叫笛卡尔积

标签:product,SP,TASK4,龙珠,连结,SQL,JOIN,id,SELECT
来源: https://blog.csdn.net/xiaobaizsj/article/details/115520384