本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql;
一、学习知识点
集合运算-表的加减法和join等
二、学习内容
表的加法–UNION
例句:
SELECT product_id, product_name
FROM product
UNION
SELECT product_id, product_name
FROM product2;
效果如下:
相当于并集,并且UNION 等集合运算符通常都会除去重复的记录
包含重复行的集合运算 UNION ALL
SELECT *
FROM product
WHERE sale_price < 1000
UNION ALL
SELECT *
FROM product
WHERE sale_price > 1.5 * purchase_price
MySQL 8.0 不支持交运算INTERSECT
MySQL 8.0 还不支持 EXCEPT 运算
MySQL 8.0 还不支持 表的减法运算符 EXCEPT. 不过, 借助第六章学过的NOT IN 谓词, 我们同样可以实现表的减法
联结.
笔记主要介绍内联结和外联结
内连结(INNER JOIN)
– 内连结
FROM <tb_1> INNER JOIN <tb_2> ON <condition(s)>
在思路上, 关联子查询更像是 vlookup 函数
例句:SELECT SP.shop_id
,SP.shop_name
,SP.product_id
,P.product_name
,P.product_type
,P.sale_price
,SP.quantity
FROMshopproduct AS SP
INNER JOIN product AS P
ON SP.product_id = P.product_id;
要点一: 进行连结时需要在 FROM 子句中使用多张表
要点二:必须使用 ON 子句来指定连结条件
要点三: SELECT 子句中的列最好按照 表名.列名 的格式来使用.
自连结(SELF JOIN).
自连结可以是外连结也可以是内连结, 它是不同于内连结外连结的另一个连结的分类方法.
自然连结(NATURAL JOIN)
它其实是内连结的一种特例–当两个表进行自然连结时, 会按照两个表中都包含的列名来进行等值内连结, 此时无需使用 ON 来指定连接条件.
SELECT * FROM shopproduct NATURAL JOIN product
外连结(OUTER JOIN)
外连结会根据外连结的种类有选择地保留无法匹配到的行.
按照保留的行位于哪张表,外连结有三种形式: 左连结, 右连结和全外连结.
左连结会保存左表中无法按照 ON 子句匹配到的行, 此时对应右表的行均为缺失值; 右连结则会保存右表中无法按照 ON 子句匹配到的行, 此时对应左表的行均为缺失值; 而全外连结则会同时保存两个表中无法按照 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)>
外连结要点 2:使用 LEFT、RIGHT 来指定主表.*
外连结还有一点非常重要,那就是要把哪张表作为主表.最终的结果中会包含主表内所有的数据.指定主表的关键字是 LEFT 和 RIGHT.顾名思义,使用 LEFT 时 FROM 子句中写在左侧的表是主表,使用 RIGHT 时右侧的表是主表.
MySQL8.0 目前还不支持全外连结.
三、学习问题与解答
表的联结不太好理解
联想一下excel表中的vlookup函数的操作方式进行学习
四、学习思考与总结
mysql目前并不支持全外联结,根据以后版本更新情况进行学习
表的联结与数的集合内容类似,多看几遍文氏图
交叉联结比较难理解一些,需要多看例子