本笔记为阿里云天池龙珠计划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筛选数据,在进行表的连接