2021-09-24天池SQL训练营Task04

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

集合运算和join

并、交、差

集合运算符

UNION 并
INTERSECT 交
EXCEPT 差

union 集合的加法

实现结果的合并,也就是所谓的加法

--对于不同表
select id ,name from product where ...
union
select id , name from product2 where ....;

对于一张表而言可以使用OR运算符设置where条件,能达到相同效果,但是不同表则必须用uinon连接。
特别的
由于UNION有合并去重功能,当需要将重复列也显示时,使用UNION ALL ,结果就会保留重复结果。

select id ,name from product where ...
union all
select id , name from product2 where ....;

类型转换
对于使用uinon的列,通常保证数据类型的一致。但有时不同数据类型的数据放在同一列也是可行的,会进行隐式的类型转换,比如
:字符串和数字,日期,null,都可兼容

mysql 8.0不支持交运算和差运算

如需使用可通过其他方式进行实现
如:差运算可以使用NOT IN实现、交用AND实现

对称差

对称差就是 A-B并B-A
可以通过UNION和NOT IN实现

select id,name from product
where id not in (select id from product2)
unoin
select id,name from product2 
where id not in (select id from product)

表的连接

内连接(inner join)

select tb1.id,tb1.name,tb2.score
from table1 tb1 inner join table2 tb2 
on tb1.id = tb2.id; 

内连接的三大要点
一.from语句中有多张表
二.必须使用ON来做连接条件
三.select 中的字段用 《表名.字段名》表示

对于含有where筛选条件的内连接查询的执行过程如下

from完成表的连接---->where完成数据的筛选---->select完成数据的查询

更改执行顺序,以达到在复杂SQL时的简化逻辑
通过子查询的方式 先将数据筛选出来作为(虚拟)表进行连接

select tb1.id,tb1.name,tb2.score
from (select * from table1 where id>15) as tb1 
inner join 
(select * from table2 where score >60)as tb2 
on tb1.id = tb2.id; 

关于group by的使用
情况一:连接前使用
情况二:分组的列和聚合列不在一张表尚,且未被用于连接两张表
先连接,后聚合

外连接

外连接分为左右连接和全外连接
左连接(left join),保留了左表中无法通过ON匹配的数据,此时右表对应null
右连接(right join):保留了右表中无法通过ON匹配的数据, 此时左边表对应null
全外连接(full join):两表中所有无法按照ON匹配的行都保留,可以看作左右和合并

mysql8.0仍不支持full join 可通过左右连接+union实现

左右连接就是在确定左右表哪一个是主表,它的数据如果对应副标中为null仍会保留显示。

外连接同where一同使用时

首先 SQL执行的过程是 FROM ----> WHERE---->SELECT

由于这个执行顺序,当进行外连接时,连接后的数据数含有null的那么在数据筛选时就会因为null导致的真值判断问题,从而使得where筛选有缺数据的风险,因此当最好使用子查询先进行where筛选数据,在进行表的连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值