SELECT 中的合并、交集与差集 您所在的位置:网站首页 空集与其他集合的交集是啥呀 SELECT 中的合并、交集与差集

SELECT 中的合并、交集与差集

2024-07-16 16:47| 来源: 网络整理| 查看: 265

在学校数据库的课程中还介绍了一种除法运算,虽然感觉没什么用,但还觉得挺有意思,于是记录一下。

通俗地讲(只会通俗描述),除法 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 实验室设备网 版权所有