什么是集合运算?
分别对检索结果使用 UNION, INTERSECT, EXCEPT 来将检索结果进行并,交和差运算, 像UNION,INTERSECT, EXCEPT这种用来进行集合运算的运算符称为集合运算符。
UNION 等集合运算符通常都会除去重复的记录。
对于同一个表的两个不同的筛选结果集,使用 UNION 对两个结果集取并集, 和把两个子查询的筛选条件用 OR 谓词连接,会得到相同的结果, 但倘若要将两个不同的表中的结果合并在一起,只能使用UNION
在 UNION 的结果中保留重复行时,只需要在 UNION 后面添加 ALL 关键字就可以
通常来说, 我们会把类型完全一致,并且代表相同属性的列使用 UNION 合并到一起显示,但有时候,即使数据类型不完全相同,也会通过隐式类型转换来将两个类型不同的列放在一列里显示
使用 NOT IN 谓词,基本上可以实现和SQL标准语法中的EXCEPT运算相同的效果
于同一个表的两个查询结果而言,他们的交INTERSECT实际上可以等价地将两个查询的检索条件用AND谓词连接来实现
两个集合A,B的对称差是指那些仅属于A或仅属于B的元素构成的集合
FROM <tb_1> INNER JOIN <tb_2> ON <condition(s)>
如果需要在使用内连结的时候同时使用 WHERE 子句对检索结果进行筛选, 则需要把 WHERE 子句写在 ON 子句的后边。
结合 GROUP BY 子句使用内连结, 需要根据分组列位于哪个表区别对待。但是如果分组列和被聚合的列不在同一张表, 且二者都未被用于连结两张表, 则只能先连结, 再聚合。
内连结会丢弃两张表中不满足 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)>
外连结同样可以使用WHERE等筛选语句
通常两张表连结,但并没有限制,因此可以多张表连结查询,语法相同
除了使用相等判断的等值连结, 也可以使用比较运算符来进行连接. 实际上, 包括比较运算符(<,<=,>,>=, BETWEEN)和谓词运算(LIKE, IN, NOT 等等)在内的所有的逻辑运算都可以放在 ON 子句内作为连结条件。
交叉连接(笛卡尔积)是在横向上对表进行扩张, 即增加新的列, 这一点和连结的功能是一致的. 但因为没有了ON子句的限制, 会对左表和右表的每一行进行组合, 这经常会导致很多无意义的行出现在检索结果中. 当然, 在某些查询需求中, 交叉连结也有一些用处。
1、找出 product 和 product2 中售价高于 500 的商品的基本信息。

2、借助对称差的实现方式, 求product和product2的交集。

3、每类商品中售价最高的商品都在哪些商店有售 ?

4、分别使用内连结和关联子查询每一类商品中售价最高的商品。
5、用关联子查询实现:在 product 表中,取出 product_id, product_name, sale_price, 并按照商品的售价从低到高进行排序、对售价进行累计求和。