SELECT 中的合并、交集与差集 | 您所在的位置:网站首页 › 空集与其他集合的交集是啥呀 › SELECT 中的合并、交集与差集 |
在学校数据库的课程中还介绍了一种除法运算,虽然感觉没什么用,但还觉得挺有意思,于是记录一下。 通俗地讲(只会通俗描述),除法 A÷B=CA \div B = CA÷B=C 首先要求除表 BBB 的字段是被除表 AAA 的子集,于是将 AAA 的字段分为 FA−BF_{A-B}FA−B 和 FBF_BFB 两个部分,则结果表 CCC 的字段为 FA−BF_{A-B}FA−B。将 AAA 按 FA−BF_{A-B}FA−B 分组,若 FBF_BFB 的集合是 BBB 的超集,则结果表 CCC 包含 FA−BF_{A-B}FA−B。集合除法的现实意义在于筛选满足条件的对象,我们将字段集 FA−BF_{A-B}FA−B 当作一个对象,它通常是主键;而 FBF_BFB 表示该对象的属性,除表 BBB 则表示筛选条件集。例如下面的例子: MovieTickets: 1234567891011121314151617+---- -----+-----------+----------------------+-----------+------------+| ticketId | userName | movieTitle | movieYear | ticketChan |+----------+-----------+----------------------+-----------+------------+| 1 | JamhusTao | My people,My country | 2019 | website |+----------+-----------+----------------------+-----------+------------+| 2 | JamhusTao | Star Wars | 1977 | android |+----------+-----------+----------------------+-----------+------------+| 3 | Mike | My people,My country | 2019 | ios |+----------+-----------+----------------------+-----------+------------+| 4 | Mike | Star Wars | 1977 | website |+----------+-----------+----------------------+-----------+------------+| 5 | John | Star Trek: Nemesis | 2002 | website |+----------+-----------+----------------------+-----------+------------+| 6 | John | Star Wars | 1977 | android |+----------+-----------+----------------------+-----------+------------+| 7 | JamhusTao | Star Trek: Nemesis | 2002 | desktop |+----------+-----------+----------------------+-----------+------------+Filter: 1234567+----------------------+-----------+------------+| movieTitle | movieYear | ticketChan |+----------------------+-----------+------------+| My people,My country | 2019 | website |+----------------------+-----------+------------+| Star Wars | 1977 | android |+----------------------+-----------+------------+现在尝试计算 πuserName, movieTitle, movieYear, ticketChan(MovieTickets) ÷ Filter\pi_{\text{userName},~\text{movieTitle},~\text{movieYear},~\text{ticketChan}}(\text{MovieTickets})~\div~\text{Filter}πuserName, movieTitle, movieYear, ticketChan(MovieTickets) ÷ Filter (π\piπ 是投影(字段选择)的形式化表示) 输出如下: 12345+-----------+| userName |+-----------+| JamhusTao |+-----------+没错,在这个示例中,除表 Filter\text{Filter}Filter 实际起了筛选器的作用。在这个示例中 FA−B={userName}F_{A-B}=\{\text{userName}\}FA−B={userName},FB={movieType, ticketChan}F_B=\{\text{movieType},~\text{ticketChan}\}FB={movieType, ticketChan},该表达式意义就是筛选所有购买了 Filter\text{Filter}Filter 中票的用户,被筛选的用户必须同时满足所有筛选器条件。 在这个示例中,只有 JamhusTao 同时购买过 2019 年 My people,My country 电影来自 website 的票、1977 年 Star Wars 电影来自 android 的票。 除法也是集合运算,但是与上面介绍的三种集合运算都不同的是,除法运算没有其对应的关键字。可以使用下面的方式完成除法运算,还挺复杂的。 123456789101112SELECT {主表字段 - 副表字段}FROM A GROUP BY {主表字段 - 副表字段} HAVING NOT EXISTS ( SELECT * FROM B EXCEPT SELECT {副表字段} FROM A ) AS TM; -- 副表是主表的子集, 即副表与主表的差集为空集 |
CopyRight 2018-2019 实验室设备网 版权所有 |