天池龙珠计划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 左连结与右连接
- 查询主表中所有的记录,如果从表中有匹配项,则显示,没有则显示为null
- 功能:一般用于主表有,但从表没有的记录
- 特点:外连接分主从,两表顺序不能换
- 左连接:left join 左边为主表
- 右连接:right join 右边为主表
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