精华内容
下载资源
问答
  • 关系代数中的传统集合运算、专门关系运算、关系操作
    千次阅读
    2020-04-18 16:21:58

    关系代数中,个人觉得比较容易搞混的有这两个概念:传统集合运算专门关系运算关系操作

    传统集合运算:并(∪)、交(∩)、差(—)、笛卡尔积(×);

    专门关系运算:选择(σ)、投影(Π)、连接(∞)、除(÷);

    传统的集合运算将关系看成元组的集合,其运算是从关系的行角度来进行;
    
    专门的关系运算不仅涉及行、还涉及列;(更高级的操作和查询)
    

    这里区别一下:关系操作

    关系操作:查询、插入、删除、修改;

    其中,查询操作可以细分为5种基本操作:选择、投影、并、差、笛卡尔积;
    除运算、交、连接三种操作也是包含在查询操作里,只是它可以由其他的五种基本操作导出)


    个人觉得:
    传统集合运算专门关系运算加起来其实就是关系操作里面的查询操作

    无论是传统集合运算还是专门关系运算,都是对关系的查询;

    关系操作就是查询+更新(删除、插入、修改);

    (有理解不对的希望可以指出来)

    更多相关内容
  • 传统集合运算 (并,差,交,笛卡尔积)  专门的关系运算 并(Union) R和S 具有相同的目n(即两个关系都n个属性) 相应的属性取自同一个域 R∪S 仍为n目关系,由属于R或属于S的元组组成 R∪S = { t|t ...



    概述 
    传统的集合运算 (并,差,交,笛卡尔积) 
    专门的关系运算

    并(Union)

    R和S
    具有相同的目n(即两个关系都有n个属性)
    相应的属性取自同一个域
    
    R∪S 
    仍为n目关系,由属于R或属于S的元组组成
                 R∪S = { t|t  R∨t S }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    差(Difference)

    R和S
    具有相同的目n
    相应的属性取自同一个域
    
    R - S 
    仍为n目关系,由属于R而不属于S的所有元组组成
                    R -S = { t|tR∧tS }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    交(Intersection)

    R和S
    具有相同的目n
    相应的属性取自同一个域
    
    R∩S
    仍为n目关系,由既属于R又属于S的元组组成
                        R∩S = { t|t  R∧t S }
                  R∩S = R –(R-S)
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    笛卡尔积(Cartesian Product)

    
    R: n目关系,k1个元组
    S: m目关系,k2个元组
    R×S 
    列:(n+m)列元组的集合
    元组的前n列是关系R的一个元组
    后m列是关系S的一个元组
    行:k1×k2个元组
    R×S = {tr ts |tr R ∧ tsS }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    专门的关系运算

    先引入几个记号

    (1) R,tR,t[Ai]
             设关系模式为R(A1,A2,…,An)
             它的一个关系设为R
              tR表示t是R的一个元组
              t[Ai]则表示元组t中相应于属性Ai的一个分量 
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5
    2A,t[A], AA={Ai1,Ai2,…,Aik},其中Ai1,Ai2,…,Aik是A1,A2,…,An中的一部分,则A称为属性列或属性组。
       t[A]=(t[Ai1],t[Ai2],…,t[Aik])表示元组t在属性列A上诸分量的集合。
       A则表示{A1,A2,…,An}中去掉{Ai1,Ai2,…,Aik}后剩余的属性组。 
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5
    3tr ts
        R为n目关系,S为m目关系。
        tr R,tsS, tr ts称为元组的连接。
        tr ts是一个n + m列的元组,前n个分量为R中的一个n元组,后m个分量为S中的一个m元组。 
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5
    4)象集Zx
      给定一个关系R(X,Z),X和Z为属性组。
      当t[X]=x时,x在R中的象集(Images Set)为:
                   Zx={t[Z]|t R,t[X]=x}
        它表示R中属性组X上值为x的诸元组在Z上分量的集合 
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    选择操作:感觉是数据库当中最简单的一种操作了,其定义如下: 
    σF(R)=t|tRF(t)=true  
    F是我们的选择条件,就是选出符合条件的元素。

    投影操作: 
    就是从R中选择出若干属性组成新的关系。 
    πA(R)= {t[A]|t  R }$


    连接

    1)连接也称为θ连接
    2)连接运算的含义
    从两个关系的笛卡尔积中选取属性间满足一定条件的元组
         R         S = {          | tr  R∧ts S∧tr[A]θts[B] }
    
    A和B:分别为R和S上度数相等且可比的属性组
    θ:比较运算符 
        连接运算从R和S的广义笛卡尔积R×S中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较关系θ的元组 
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    3)两类常用连接运算
    等值连接(equijoin) 
    什么是等值连接
    θ为“=”的连接运算称为等值连接 
    等值连接的含义
    从关系R与S的广义笛卡尔积中选取A、B属性值相等的那些元组,即等值连接为:
            R    S = {          | tr R∧ts S∧tr[A] = ts[B] }  
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    自然连接(Natural join) 
    自然连接是一种特殊的等值连接
    两个关系中进行比较的分量必须是相同的属性组(同名同域:必须具有相同的属性名,并且出自相同的域集)
    在结果中把重复的属性列去掉
    自然连接的含义
        R和S具有相同的属性组B
            R   S = {         | tr R∧ts S∧tr[B] = ts[B] }  
    一般的连接操作是从行的角度进行运算。
            自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。 
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    外连接
    在做自然连接时,如果把舍弃的元组也保存在结果关系中,而在其他属性上填空值(Null),这种连接就叫做外连接(OUTER JOIN)。
    左外连接
    在做自然连接时,如果只把左边关系R中要舍弃的元组保留就叫做左外连接(LEFT OUTER JOINLEFT JOIN)
    右外连接
    在做自然连接时,如果只把右边关系S中要舍弃的元组保留就叫做右外连接(RIGHT OUTER JOINRIGHT JOIN)。 
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    除(Division)

    给定关系R (X,Y) 和S (Y,Z),其中X,Y,Z为属性组。
    R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。
    R与S的除运算得到一个新的关系P(X),
    P是R中满足下列条件的元组在 X 属性列上的投影:
    元组在X上分量值x的象集Yx包含S在Y上投影的集合,记作:
           R÷S = {tr [X] | tr  R∧πY (S)  Yx }
           Yx:x在R中的象集,x = tr[X]
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    在关系R中,A可以取四个值{a1,a2,a3,a4}
        a1的象集为 {(b1,c2),(b2,c3),(b2,c1)}
        a2的象集为 {(b3,c7),(b2,c3)}
        a3的象集为 {(b4,c6)}
        a4的象集为 {(b6,c6)}
    S在(B,C)上的投影为
               {(b1,c2),(b2,c1),(b2,c3) }
    只有a1的象集包含了S在(B,C)属性组上的投影
         所以     R÷S ={a1} 

    除法比较难理解点,所以就详细的说说。。

    设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,且T的元组与S的元组的所有组合都在R中。

    所以结合着例子,对于定义进行理解吧:

    首先呢给出关系R和关系S


    1、定义中说,T包含所有在R但不在S中的属性,所以呢 R 所包含的属性有{A,B,C},S中所包含的属性有{B,C,D},显而易见,关系T中应该只包含

     一个属性---A;

    2、及其值,只考虑关系R中A属性的值{a1,a2,a3,a4},关系T属性A的元素应该是{a1,a2,a3,a4}的子集;

    3、且T的元组与S的元组的所有组合都在R中,很明显,S中的需要考虑的只是属性B和属性C,所以


    所以符合定义要求的值只有a1了。

    从而得出:




    展开全文
  • 正文如下: 各种运算符如下: ...数据库的传统集合运算包括:并、差、交、笛卡尔积运算。这四种运算都与数学上的同名运算概念相似。 并: 差: 交: 笛卡尔积: 广义笛卡尔积(Extended Cartes...

    转载https://blog.csdn.net/zgcr654321/article/details/82077809

    正文如下:

    各种运算符如下:

    数据库中每行就是一个元组,每列就是一个属性。

    数据库的传统集合运算包括:并、差、交、笛卡尔积运算。这四种运算都与数学上的同名运算概念相似。

    并:

    差:

    交:

    笛卡尔积:

    广义笛卡尔积(Extended Cartesian Product):两个分别为n目和m目关系R和S的广义笛卡尔积是一个(n+m)列的元组的集合,元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有k1个元组,S有k2个元组,则关系R和关系S的广义笛卡尔积有k1*k2个元组,记作:R×S={tr⌒ts| tr∈R∧ts∈S}或记做R×S={(r1,…,rn ,s1,…,sm)∣((r1,…,rn)∈R∧(s1,…,sm)∈S)。

    r,s为R和S中的相应分量。

    简单来说,就是把R表的第一行与S表第一行组合写在一起,作为一行。然后把R表的第一行与S表第二行依此写在一起,作为新一行。以此类推。当S表的每一行都与R表的第一行组合过一次以后,换R表的第二行与S表第一行组合,以此类推,直到R表与S表的每一行都组合过一次,则运算完毕。如果R表有n行,S表有M行,那么笛卡尔积R×S有n×M行。

    下面举一个例子:

    关系表R和S如下图所示:

    R并S、R减S、R交S、选择、R与S的笛卡尔积结果如下所示:

    选择B>'4'(R),即选择语句的条件,对R的关系做水平分割,选择R中符合条件的元组。

     

    数据库的专门关系运算有:选择(对关系进行水平分割)、投影(对关系进行垂直分割)、连接、自然连接(关系的结合)、除运算等。

    选择(selection):

    选择就是"筛选行"。选择一般要对一张表选择符合条件的行(但包含所有列)。

    举例:

    投影(projection):

    投影就是"筛选列"。一个数据库表,如仅希望得到其一部分的列的内容(但全部行),就是投影。

    举例:

    除法(division):

    记为R÷S,它是笛卡尔积的逆运算。设关系R和S分别有r列和s列(r>s,且s≠0),那么R÷S的结果有(r-s)个列,并且是满足下列条件的最大的表:其中每行与S中的每行组合成的新行都在R中。注意有时关系之间的除法也有"余数",可能S×T的结果为R的一部分(最大的一部分),R中的多余部分为"余数"。

    举例:

    运算过程:

     C, D是关系S中的两个属性, 故在R集合中对除了C, D的属性, 即A, B两属性进行投影, 得到a, b; b, c; e, d;这三组, 然后用这个结果与关系S进行笛卡尔积运算, 发现b c c d这组在关系R中没有, 其余a, b; e, d; 做的运算在R中存在. 因此最后结果为a, b; e, d。

    连接(join):

     

    两表笛卡尔积的结果比较庞大,实际应用中一般仅选取其中一部分的行,选取两表列之间满足一定条件的行,就是关系之间的连接。

    根据连接条件的种类不同,关系之间的连接分为等值连接、大于连接、小于连接、自然连接。

    条件是类似于"B列=D列"的"某列=某列"的条件,就是等值连接;

    条件是"某列>某列"的,就是大于连接;

    条件是"某列<某列"的,就是小于连接。

    自然连接是不提出明确的连接条件,但"暗含"着一个条件,就是"列名相同的值也相同"。在自然连接的结果表中,往往还要合并相同列名的列。当对关系R和S进行自然连接时,要求R和S含有一个或者多个共有的属性。

    举一个等值连接的例子:

    关系R和S如下图所示:

    对关系R、S按条件"R表的B列=S表的B列"进行连接的结果(等值连接):

    小于连接的结果(B<D):

    自然连接的结果(自然连接暗含的条件是R.B=S.B且R.C=S.C,因为R、S中有同名的2列B、C):

    多个条件之间可用"∧"表示"且",即两边的条件必须同时成立。

    如"C>4∧D>3",表示"C列值>4,且D列值>3",二者需同时满足。

    用"∨"表示"或",即两边的条件有一个成立即可。

    例如"性别='女'∨年龄<20"表示"性别为'女'或者年龄在20岁以下"。
    --------------------- 
    作者:一骑走烟尘 
    来源:CSDN 
    原文:https://blog.csdn.net/zgcr654321/article/details/82077809 
    版权声明:本文为博主原创文章,转载请附上博文链接!

     

    展开全文
  • 详解SQL集合运算

    2017-08-27 22:53:40
    SQL集合运算

    本系列【T-SQL基础】主要是针对T-SQL基础的总结。

    【T-SQL基础】01.单表查询-几道sql查询题

    【T-SQL基础】02.联接查询

    【T-SQL基础】03.子查询

    【T-SQL基础】04.表表达式-上篇

    【T-SQL基础】04.表表达式-下篇

    【T-SQL基础】05.集合运算

    【T-SQL基础】06.透视、逆透视、分组集

    【T-SQL基础】07.数据修改

    【T-SQL基础】08.事务和并发

    【T-SQL基础】09.可编程对象

     ----------------------------------------------------------

    【T-SQL进阶】01.好用的SQL TVP~~独家赠送[增-删-改-查]的例子

     ----------------------------------------------------------

    【T-SQL性能调优】01.TempDB的使用和性能问题

    【T-SQL性能调优】02.Transaction Log的使用和性能问题

    【T-SQL性能调优】03.执行计划

    【T-SQL性能调优】04.死锁分析

    持续更新......欢迎关注我!

    概述:

    本篇主要是对集合运算中并集、交集、差集运算基础的总结。

    集合运算包含三种:

      1.并集运算

      2.交集运算

      3.差集运算

    下面是集合运算的思维导图:

     

     为什么使用集合运算:

    1.在集合运算中比联接查询和EXISTS/NOT EXISTS更方便

     

    在阅读下面的章节时,我们可以先把环境准备好,以下的SQL脚本可以帮助大家创建数据库,创建表,插入数据。

    下载脚本文件:TSQLFundamentals2008.zip

    一、集合运算

    1.集合运算

    1)对输入的两个集合或多集进行的运算。

    2)多集:由两个输入的查询生成的可能包含重复记录的中间结果集。

    3T-SQL支持三种集合运算:并集(UNION)、交集(INTERSECT)、差集(EXCEPT

    2.语法

    集合运算的基本格式:

    输入的查询1

    <集合运算符>

    输入的查询2

    [ORDER BY]

    3.要求

    1)输入的查询不能包含ORDER BY字句;

    2)可以为整个集合运算结果选择性地增加一个ORDER BY字句;

    3)每个单独的查询可以包含所有逻辑查询处理阶段(处理控制排列顺序的ORDER BY字句);

    4)两个查询 必须包含相同的列数;

    5)相应列必须具有兼容的数据类型。兼容个的数据类型:优先级较低的数据类型必须能隐式地转换为较高级的数据类型。比如输入的查询1的第一列为int类型,输入的查询2的第一列为float类型,则较低的数据类型int类型可以隐式地转换为较高级float类型。如果输入的查询1的第一列为char类型,输入的查询2的第一列为datetime类型,则会提示转换失败:从字符串转换日期和/或时间时,转换失败

    6)集合运算结果中列名由输入的查询1决定,如果要为结果分配结果列,应该在输入的查询1中分配相应的别名;

    7)集合运算时,对行进行进行比较时,集合运算认为两个NULL相等;

    8UNION支持DISTINCTALL。不能显示指定DISTINCT字句,如果不指定ALL,则默认使用DISTINCT

    9INTERSETEXCEPT默认使用DISTINCT,不支持ALL

    二、UNION(并集)集合运算

    1.并集的文氏图

    并集:两个集合的并集是一个包含集合AB中所有元素的集合。

    图中阴影区域代表集合A与集合B的并集


    2.UNION ALL集合运算

    1)假设Query1返回m行,Query2返回n行,则Query1 UNION ALL Query2返回(m+n)行;

    2UNION ALL 不会删除重复行,所以它的结果就是多集,而不是真正的集合;

    3)相同的行在结果中可能出现多次。

    3.UNION DISTINCT集合运算

    1)假设Query1返回m行,Query2返回n行,Query1Query2有相同的h行,则Query1 UNION Query2返回(m+n-h)行;

    2UNION 会删除重复行,所以它的结果就是集合;

    3)相同的行在结果中只出现一次。

    4)不能显示指定DISTINCT字句,如果不指定ALL,则默认使用DISTINCT

    5)当Query1Query2比较某行记录是否相等时,会认为取值为NULL的列是相等的列。

    三、INTERSECT(交集)集合运算

    1.交集的文氏图

    交集:两个集合(记为集合A和集合B)的交集是由既属于A,也属于B的所有元素组成的集合。

    图中阴影区域代表集合A与集合B的交集


    2.INTERSECT DISTINCT集合运算

    1)假设Query1返回 行,Query2返回 n 行,Query1Query2有相同的 h 行,则Query1 INTERSECT Query2返回 h 行;

    2INTERSECT集合运算在逻辑上首先删除两个输入多集中的重复行(把多集变为集合),然后返回只在两个集合中都出现的行;

    3INTERSECT 会删除重复行,所以它的结果就是集合;

    4)相同的行在结果中只出现一次。

    5)不能显示指定DISTINCT字句,如果不指定ALL,则默认使用DISTINCT

    6)当Query1Query2比较某行记录是否相等时,会认为取值为NULL的列是相等的列。

    7)用内联接或EXISTS谓词可以代替INTERSECT集合运算,但是必须对NULL进行处理,否则这两种方法对NULL值进行比较时,比较结果都是UNKNOWN,这样的行会被过滤掉。

    3.INTERSECT ALL集合运算

    1ANSI SQL支持带有ALL选项的INTERSECT集合运算,但SQL Server2008现在还没有实现这种运算。后面会提供一种用于T-SQL实现的替代方案;

    2)假设Query1返回 行,Query2返回 n 行,如果行RQuery1中出现了x次,在Query2中出现了y次,则行R应该在INTERSECT ALL运算之后出现minimum(xy)次。

    下面提供用于T-SQL实现的INTERSECT ALL集合运算:公用表表达式 + 排名函数

          WITH    INTERSECT_ALL          
          AS (
                    SELECT   ROW_NUMBER() OVER ( PARTITION BY country, region, city ORDER BY ( SELECT
                                                                  0
                                                                  ) ) AS rownum ,
                            country ,
                            region ,
                            city
                   FROM     HR.Employees
                   INTERSECT
                   SELECT   ROW_NUMBER() OVER ( PARTITION BY country, region, city ORDER BY ( SELECT
                                                                  0
                                                                  ) ) AS rownum ,
                            country ,
                            region ,
                            city
                   FROM     Sales.Customers
                 )
          SELECT  country ,
                  region ,
                  city
          FROM    INTERSECT_ALL

    结果如下:

             
             

    其中UK NULL London有四个重复行,

    在排序函数的OVER字句中使用 ORDER BY ( SELECT <常量> )可以告诉SQL Server不必在意行的顺序。

    四、EXCEPT(差集)集合运算

    1.差集的文氏图

    差集:两个集合(记为集合A和集合B)的由属于集合A,但不属于集合B的所有元素组成的集合。

    图中阴影区域代表集合A与集合B的差集


    2.EXCEPT DISTINCT集合运算

    1)假设Query1返回 行,Query2返回 n 行,Query1Query2有相同的 h 行,则Query1 INTERSECT Query2返回 m - h ,Query2 INTERSECT Query1 返回 n - h 

    2EXCEPT集合运算在逻辑上先删除两个输入多集中的重复行(把多集转变成集合),然后返回只在第一个集合中出现,在第二个集合众不出现所有行。

    3EXCEPT 会删除重复行,所以它的结果就是集合;

    4EXCEPT是不对称的,差集的结果取决于两个查询的前后关系。

    5)相同的行在结果中只出现一次。

    6)不能显示指定DISTINCT字句,如果不指定ALL,则默认使用DISTINCT

    7)当Query1Query2比较某行记录是否相等时,会认为取值为NULL的列是相等的列。

    8)用左外联接或NOT EXISTS谓词可以代替INTERSECT集合运算,但是必须对NULL进行处理,否则这两种方法对NULL值进行比较时,比较结果都是UNKNOWN,这样的行会被过滤掉。

    3.EXCEPT ALL集合运算

    1ANSI SQL支持带有ALL选项的EXCEPT集合运算,但SQL Server2008现在还没有实现这种运算。后面会提供一种用于T-SQL实现的替代方案;

    2)假设Query1返回 行,Query2返回 n 行,如果行RQuery1中出现了x次,在Query2中出现了y,x>y,则行R应该在EXCEPT ALL运算之后出现 x - y 次。

    下面提供用于T-SQL实现的EXCEPT ALL集合运算:公用表表达式 + 排名函数   

    WITH    INTERSECT_ALL
    AS (
             SELECT   ROW_NUMBER() OVER ( PARTITION BY country, region, city ORDER BY ( SELECT
                                                                  0
                                                                  ) ) AS rownum ,
                            country ,
                            region ,
                            city
                   FROM     HR.Employees
                   EXCEPT
                   SELECT   ROW_NUMBER() OVER ( PARTITION BY country, region, city ORDER BY ( SELECT
                                                                  0
                                                                  ) ) AS rownum ,
                            country ,
                            region ,
                            city
                   FROM     Sales.Customers
                 )
    SELECT  country ,
                 region ,
                 city
    FROM    INTERSECT_ALL

    结果如下:

               

    五、集合运算的优先级

    1.INTERSECT>UNION=EXCEPT

    2.首先计算INTERSECT,然后从左到右的出现顺序依次处理优先级的相同的运算。

    3.可以使用圆括号控制集合运算的优先级,它具有最高的优先级。

    六、特殊处理

    1.只有ORDER BY能够直接应用于集合运算的结果;

    2.其他阶段如表运算符、WHEREGROUP BYHAVING等,不支持直接应用于集合运算的结果,这个时候可以使用表表达式来避开这一限制。如根据包含集合运算的查询定义个表表达式,然后在外部查询中对表表达式应用任何需要的逻辑查询处理;

    3.ORDER BY字句不能直接应用于集合运算中的单个查询,这个时候可以TOP+ORDER BY字句+表表达式来避开这一限制。如定义一个基于该TOP查询的表表达式,然后通过一个使用这个表表达式的外部查询参与集合运算。 

    七、练习题

    1.写一个查询,返回在20081月有订单活动,而在20082月没有订单活动的客户和雇员。

    期望结果:


    方案一:EXCEPT

    1)先用查询1查询出20081月份有订单活动的客户和雇员

    2)用查询2查询20082月份客户的订单活动的客户和雇员

    3)用差集运算符查询20081月有订单活动而20082月没有订单活动的客户和雇员

    SELECT  custid ,
            empid
    FROM    Sales.Orders
    WHERE   orderdate >= '20080101'
            AND orderdate < '20080201'
    EXCEPT
    SELECT  custid ,
            empid
    FROM    Sales.Orders
    WHERE   orderdate >= '20080201'
            AND orderdate < '20080301'

    方案二:NOT EXISTS

    必须保证custidempid不能为null,才能用NOT EXISTS进行查询,如果custidempid其中有null值存在,则不能用NOT EXISTS进行查询,因为比较NULL值的结果是UNKNOWN,这样的行用NOT EXISTS查询返回的子查询的行会被过滤掉,所以最后的外查询会多出NULL值的行,最后查询结果中会多出NULL值的行。

    SELECT  custid , empid
    FROM    Sales.Orders AS O1
    WHERE   orderdate >= '20080101'
            AND orderdate < '20080201'
            AND NOT EXISTS ( SELECT *
                             FROM   Sales.Orders
                             WHERE  orderdate >= '20080201'
                                    AND orderdate < '20080301'
                                    AND custid = o1.custid
                                    AND empid = o1.empid )
    ORDER BY O1.custid , O1.empid

    如果我往Sales.Orders表中插入两行数据:

    插入cutid=NULL,empid=1,orderdate='20080101'

    插入cutid=NULL,empid=1,orderdate='20080201'


    用方案一查询出来结果为50行,会把cutid=NULL,empid=1的行过滤掉

    用方案二查询出来结果为51行,不会把cutid=NULL,empid=1的行过滤掉

    用下面的方案可以解决上面的问题,需要处理cutid=NULL,或者empid=null的情况。返回50

    SELECT  custid ,
            empid
    FROM    Sales.Orders AS O1
    WHERE   orderdate >= '20080101'
            AND orderdate < '20080201'
            AND NOT EXISTS ( SELECT *
                         FROM   Sales.Orders
                         WHERE  orderdate >= '20080201'
                                AND orderdate < '20080301'
                                AND ( isnull(custid,'') = isnull(o1.custid,'')
                                      AND isnull(empid,'') = isnull(o1.empid,'')
                                    )
                                )

    2.写一个查询,返回在20081月和在20082月都有订单活动的客户和雇员。

    期望结果:

     

    方案一:INTERSECT

    (1)先用查询1查询出2008年1月份有订单活动的客户和雇员

    (2)用查询2查询2008年2月份客户的订单活动的客户和雇员

    (3)用交集运算符查询2008年1月和2008年2月都有订单活动的客户和雇员

    SELECT  custid , empid
    FROM    Sales.Orders
    WHERE   orderdate >= '20080101'
            AND orderdate < '20080201'
    INTERSECT
    SELECT  custid ,
            empid
    FROM    Sales.Orders
    WHERE   orderdate >= '20080201'
            AND orderdate < '20080301'

    方案二:EXISTS

    必须保证custid,empid不能为null,才能用EXISTS进行查询,如果custid或empid其中有null值存在,则不能用EXISTS进行查询,因为比较NULL值的结果是UNKNOWN,这样的行用EXISTS查询返回的子查询的行会被过滤掉,所以最后的外查询会少NULL值的行,最后查询结果中会少NULL值的行。

    SELECT  custid ,
            empid
    FROM    Sales.Orders AS O1
    WHERE   orderdate >= '20080101'
            AND orderdate < '20080201'
            AND EXISTS ( SELECT *
                         FROM   Sales.Orders
                         WHERE  orderdate >= '20080201'
                                AND orderdate < '20080301'
                                AND custid = o1.custid
                                AND empid = o1.empid )
    ORDER BY O1.custid , O1.empid

    如果我往Sales.Orders表中插入两行数据:

    插入cutid=NULL,empid=1,orderdate='20080101'

    插入cutid=NULL,empid=1,orderdate='20080201'

    用方案一查询出来结果为6行,不会把cutid=NULL,empid=1的行过滤掉

    用方案二查询出来结果为5行,会把cutid=NULL,empid=1的行过滤掉

     

    用下面的方案可以解决上面的问题,需要处理cutid=NULL,或者empid=null的情况。返回6行。

    SELECT  custid ,
            empid
    FROM    Sales.Orders AS O1
    WHERE   orderdate >= '20080101'
            AND orderdate < '20080201'
            AND EXISTS ( SELECT *
                         FROM   Sales.Orders
                         WHERE  orderdate >= '20080201'
                                AND orderdate < '20080301'
                                AND ( isnull(custid,'') = isnull(o1.custid,'')
                                      AND isnull(empid,'') = isnull(o1.empid,'')
                                    )                            
                                )

    3.写一个查询,返回在20081月和在20082月都有订单活动,而在2007年没有订单活动的客户和雇员

    期望结果:


    方案一:INTERSECT + EXCEPT

    SELECT  custid ,
            empid
    FROM    Sales.Orders
    WHERE   orderdate >= '20080101'
            AND orderdate < '20080201'
    INTERSECT
    SELECT  custid ,
            empid
    FROM    Sales.Orders
    WHERE   orderdate >= '20080201'
            AND orderdate < '20080301'
    EXCEPT
    SELECT  custid ,
            empid
    FROM    Sales.Orders
    WHERE   orderdate >= '20070101'
            AND orderdate < '20080101'

    方案二:EXISTS + NOT EXISTS

    SELECT  custid , empid
    FROM    Sales.Orders AS O1
    WHERE   orderdate >= '20080101'

    参考资料:

    《SQL2008技术内幕:T-SQL语言基础》

     原文来自:详解SQL集合运算


    作  者: Jackson0714 
    出  处:http://www.cnblogs.com/jackson0714/ 
    关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教! 
    版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。 
    特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我 
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力! 














    展开全文
  • 关系数据库 一、关系数据结构及形式化定义 1.关系 单一的数据结构----关系 现实世界的实体以及实体间的各种联系均用关系来表示 逻辑结构----二维表 ...给定一组域D1,D2,…,Dn,允许其中某些域是相同的。 D1,D
  • 2.4 关系运算

    2021-06-03 20:55:37
    关系代数可以分为基本的集合运算和专门的关系运算两大类。关系代数的运算用关系演算(关系元组演算和关系域演算)表达。 关系代数操作符 (1)基本算符 逻辑运算符(与、或、非:∧、∨、¬) 关系运算符(=,>,<...
  • 算术运算 算术运算:用于各类数值运算.包括加(+)、减(-)、乘(*)、除(/)、求余(或称模...其中加减为一级运算,乘除为二级运算,乘方、开方为三级运算。在一道算式中,如果几级运算存在,则应先进行高级运算,再进行...
  • 一、闭包求法 、 二、求闭包示例 ( 关系图角度 ) 、 三、求闭包示例 ( 关系矩阵角度 ) 、 四、闭包运算与关系性质 、 五、闭包复合运算
  • 知识点总结一、传统集合运算1、并(union) 设两个关系r和s,它们具有相同的结构。r和s的并是由属于r或属于s的元组组成的集合,运算符为∪。记为t=r∪s。2、差(difference) r和s的差是由属于r但不属关系运算关系...
  • 其中加减为一级运算,乘除为二级运算,乘方、开方为三级运算。在一道算式中,如果几级运算存在,则应先进行高级运算,再进行低一级的运算。如:3+22×4=3+4×4=3+16=19; 如果只存在同级运算;则按从左至右的顺序...
  • 人工智能数学基础9:集合相关概念

    千次阅读 2021-01-08 21:36:27
    本文介绍了集合一些相关的基础概念、运算及定律,包括基数、对等集合、单位元以及类似补集、差集、对称差集、偏序集、全序集、良序集等概念,这些知识对于阅读AI、线性代数等相关知识一定的帮助。
  • 数据库 - 关系代数与关系运算

    万次阅读 2015-05-05 09:12:58
    传统集合运算 (并,差,交,笛卡尔积) 专门的关系运算并(Union)R和S 具有相同的目n(即两个关系都n个属性) 相应的属性取自同一个域R∪S 仍为n目关系,由属于R或属于S的元组组成 R∪S = { t|t  R∨t ...
  • 数据库期末复习之例题汇总

    千次阅读 多人点赞 2021-06-11 22:38:33
    例2.2 - P47 关系间的引用 例2.3 - P48 外码 例2.1 - P50 外码 例2.2 - P51 外码 例2.3 - P52 参照完整性规则 延申 - P55 用户定义的完整性 - P60 集合运算 并(Union) - P66 集合运算 差(Difference) - P68 集合运算...
  • 数据库系统期末复习(平时习题)

    千次阅读 2021-09-09 14:57:33
    (单选题)长期存储在计算机内,组织的、可共享的大量数据的集合是 ( B )。 A. 数据(Data) B. 数据库(DataBase) C. 数据库管理系统(DBMS) D. 数据库系统(DBS) 正确答案: B (单选题)在数据管理技术发展过程中,
  • 【数据库原理】关系代数

    万次阅读 多人点赞 2020-08-15 10:22:56
    关系模型中常用的关系操作包括查询操作和更新操作(包括插入、删除和修改)...从计算机语言角度看,后者在前者的基础上工作,前者比后者复杂,但前者理论基础,所以成为了主要的研究对象,也是关系操作中最主要的部分。
  • 数据库关系运算

    2017-03-16 19:18:00
    前面已经说了数据系统的概述了,关系模型是目前用得最多的数据模型,其中一个优点就是:严格的数学理论根据。本文就是来讲解数据库中的各种关系运算的!本文不做数学概念的深入,只要理解相关的概念即可! 为...
  • Hive中集合数据类型Struct,Map和Array

    千次阅读 2018-11-01 15:21:49
    Hive中的列支持使用struct,map和array集合数据类型。下表中的数据类型实际上调用的是内置函数。 Hive集合数据类型 数据类型 描述 字面语法示例 STRUCT 数据类型描述字面语法示例和C语言中的struct或者...
  • 传统集合运算是从关系的“水平”方向即行的角度进行 专门的关系运算不仅涉及行而且涉及列。 1、传统集合运算 常用的关系操作: 查询:选择、投影、连接、除、并、交、差 数据更新:插入、删除、修改 查询的表达...
  • 文字识别(一)--传统方案综述

    万次阅读 多人点赞 2019-02-17 12:48:15
    文字识别是计算机视觉研究领域的分支之一,归属于模式识别和人工智能,是计算机科学的重要组成部分,本文将以上图为主要线索,简要阐述在文字识别领域中的各个组成部分(更侧重传统非深度学习端到端方案)。...
  • 务实java基础之集合总结

    千次阅读 2017-08-06 11:31:32
    集合类”,利用这些集合类,我们可以容纳乃至操纵自己的对象。 声明:本篇博客内容参考自《java编程思想》,代码均来自书中,大部分内容截取自该书数组和第一类对象无论使用的数组属于什么类型,数组标识符实际都...
  • 展开全部一、性62616964757a686964616fe58685e5aeb931333431356638质不同1、选择:在关系R中选择满足给定...其中的条件是以逻辑表达式给出的,值为真的元组将被选取。这种运算是从水平方向抽取元组。 在FOXPRO中的...
  • 【数据库】关系代数基本运算

    千次阅读 2017-09-28 09:00:30
      前言    关系代数是以关系为运算对象的一组高级运算集合。由于关系定义为属性个数相同的...关系代数中的操作可以分为两类:传统集合操作,并、差、交、笛卡尔积(乘)、笛卡尔积的逆运算(除);扩充的...
  • 关系代数运算So Easy

    万次阅读 2013-10-21 15:35:30
    关系代数是以关系为运算的一组高级运算集合。由于定义为属性个数 相同的元组的集合,因此集合代数的操作就可以引入到关系代数中。关系代数也可以看做是一种抽象的查询语言,是对关系的运算来表达查询的。任何一种...
  • 关系数据库-关系代数-数据库习题

    千次阅读 2021-07-12 22:40:07
    关系操作是集合操作,操作对象、操作结果都是关系,一个关系就是一个二维表 22.两个关系R和S如下:则由关系R得到的关系S的操作是( )。 A. 自然连接 B. 投影 C. 并 D. 选择 正确答案: D 专门关系运算中的选择...
  • 安全多方计算之隐私保护集合交集

    千次阅读 2020-02-28 22:58:11
    作为安全多方计算领域具有广泛的应用场景的一类协议,隐私保护集合交集技术在近年来得到了极大的优化,达到了在某些场景下与目前正在使用的非安全交集技术同一量级的运行复杂度。 摘要:隐私保护集合交集...
  • 为什么要用判断双重: 因为可能两个线程都执行完了第一个if语句,如果没有第二重判断,那么当其中有个线程执行完synchronized里面的语句之后,另外一个线程跟着也会执行,这样就达不到单例模式的效果 2....
  • 一、关系数据结构及形式化定义 1、关系 关系模型的数据结构非常简单,只包含单一的数据结构——关系。... 笛卡儿积是域上的一种集合运算。 定义:给定一组域D1,D2,...,Dn,允许其中某些域是相同的,D...
  • 关系代数运算与SQL语句

    千次阅读 2016-11-14 22:50:39
    一、传统集合运算与S Q L 语句实现 传统集合运算包括四种运算:并(∪)、交(∩)、差(—)、广义笛卡尔积(X)。 &lt;!--[if !supportLists]--&gt;(一) &lt;!--[endif]--&gt;并运算...
  • 数据库关系代数详解

    万次阅读 多人点赞 2021-02-26 16:35:55
    传统的关系运算起源于数学的集合论,下面几种: 笛卡尔积运算运算运算运算 1.2 专门的关系运算 选择 投影 连接 除运算 1.2.1 关系运算中的基础概念 在学习关系代数的时候,我们脑海中要时刻拥有一张...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,925
精华内容 18,770
关键字:

其中传统的集合运算有