本笔记为阿里云天池龙珠计划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
在 SQL 中, 分别对检索结果使用 UNION, INTERSECT, EXCEPT 来将检索结果进行并,交和差运算.
UNION,INTERSECT, EXCEPT这种用来进行集合运算的运算符称为集合运算符。
当查询结果来自于多场表,且表之间没有关联,这时候就需要联合查询,也称union查询
SELECT product_id, product_name FROM product UNION SELECT product_id, product_name FROM product2;
UNION 等集合运算符通常都会除去重复的记录.
UNION ALL: Union 会自动去重,而union all则不会
通常来说, 我们会把类型完全一致, 并且代表相同属性的列使用 UNION 合并到一起显示, 但有时候, 即使数据类型不完全相同, 也会通过隐式类型转换来将两个类型不同的列放在一列里显示
-找出只存在于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
两个集合的交可以看作是两个集合的并去掉两个集合的对称差。
UNION和INTERSECT 等集合运算, 这些集合运算的特征就是以行方向为单位进行操作. 通俗地说, 就是进行这些集合运算时, 会导致记录行数的增减. 使用 UNION 会增加记录行数,而使用 INTERSECT 或者 EXCEPT 会减少记录行数.
而连结:
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 子句中的列最好按照 表名.列名 的格式来使用.
内连结会丢弃两张表中不满足 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)>
全外连结本质上就是对左表和右表的所有行都予以保留, 能用 ON 关联到的就把左表和右表的内容在一行内显示, 不能被关联到的就分别显示, 然后把多余的列用缺失值填充。
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';
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
select * from 表1 inner join 表2 on 表1.字段名 <> 表2.字段名
比较运算符(<,<=,>,>=, BETWEEN)和谓词运算(LIKE, IN, NOT 等等)在内的所有的逻辑运算都可以放在 ON 子句内作为连结条件.
之前的无论是外连结内连结, 一个共同的必备条件就是连结条件–ON 子句, 用来指定连结的条件. 如果你试过不使用这个连结条件的连结查询, 你可能已经发现, 结果会有很多行. 在连结去掉 ON 子句, 就是所谓的交叉连结(CROSS JOIN), 交叉连结又叫笛卡尔积