前言

关系代数是以关系为运算对象的一组高级运算的集合。由于关系定义为属性个数相同的元组的集合,因此集合代数的操作就可以引入到关系代数中。关系代数中的操作可以分为两类:传统的关系操作,并、差、交、笛卡尔积。

他们的图示可以表示为:

python 列表笛卡尔积 数据库笛卡尔积代码_SQL

但是这样看可能不好理解,下面举例说明一下这些运算的用途。
**注:**这些运算都是对关系进行运算,就是离散中的关系表示为<a , b>,表示 a 关系 b ,关系是严格有序的,即<a , b>和<b , a>是不同的关系。所有运算的对象必须有相同的结构(先记忆,举例时说明)。

1. 并运算(UNION)

和离散中的并运算含义相同,即返回所有至少符合一个查询条件的部分。

python 列表笛卡尔积 数据库笛卡尔积代码_python 列表笛卡尔积_02


下面举例说明:

python 列表笛卡尔积 数据库笛卡尔积代码_SQL_03


python 列表笛卡尔积 数据库笛卡尔积代码_python 列表笛卡尔积_04

它可以对多个表进行查询也可以对单个表进行查询。
例如

(SELECT  学号, 姓名 FROM 学生表1 WHERE  性别 = '男' and 年龄 = 20)
 UNION
(SELECT  学号, 姓名 FROM 学生表1 WHERE  性别 = '女' and 年龄 = 19)

这段代码的含义是:在表(学生表1)中查询所有20岁的男生和所有19岁的女生的学号和姓名。

结果应如下:

python 列表笛卡尔积 数据库笛卡尔积代码_sqlserver_05


它也可以对多个表查询。

(SELECT  学号, 姓名 FROM 学生表1 WHERE  性别 = '男')
 UNION
(SELECT  学号, 姓名 FROM 学生表2 WHERE  性别 = '男')

这段代码的含义是:查出两个表(学生表1,学生表2)中所有的男生。

结果应如下:

python 列表笛卡尔积 数据库笛卡尔积代码_SQL_06


它也可以多个语句进行交运算。

例如:

(SELECT  学号, 姓名 FROM 学生表1 WHERE  性别 = '男')
 UNION
(SELECT  学号, 姓名 FROM 学生表2 WHERE  性别 = '男')
 UNION
(SELECT  学号, 姓名 FROM 学生表2 WHERE  年龄 = 18 and 性别 = '女')

同理,这个结果应为上次的结果加上(学生表2)中18岁的女生,这里就不画图了。感兴趣可以自己用DBMS软件调试。

2. 交运算(INTERSECT)

返回同时满足所有条件的结果。

python 列表笛卡尔积 数据库笛卡尔积代码_数据库_07


它也是可以对多个表进行查询也可以对单个表进行查询。

还是用上个图举例

对单个表查询:

(SELECT  学号, 姓名 FROM 学生表1 WHERE  性别 = '男')
INTERSECT
(SELECT  学号, 姓名 FROM 学生表1 WHERE  年龄 = 18)

这段代码的含义是:查询表(学生表1)中所有18岁的男生的学号和姓名。

结果应如下:

python 列表笛卡尔积 数据库笛卡尔积代码_数据库_08


对两个表查询:

(SELECT  年龄 FROM 学生表1 WHERE  性别 = '男')
INTERSECT
(SELECT  年龄 FROM 学生表2 WHERE  性别 = '女')

由于两个表中没有相交的学号和姓名,故查询年龄代替,含义为:表1中男生的年龄和表2中女生的年龄有哪些重叠的。

结果为下:

python 列表笛卡尔积 数据库笛卡尔积代码_数据库_09


(测试环境:SQL server 2008 R2)

3. 差运算(EXCEPT)

查询在第一个条件里面但是不在后面的条件里面。

python 列表笛卡尔积 数据库笛卡尔积代码_数据库_10


python 列表笛卡尔积 数据库笛卡尔积代码_python 列表笛卡尔积_11


它也是可以对多个表进行查询也可以对单个表进行查询。


一个小插曲

python 列表笛卡尔积 数据库笛卡尔积代码_SQL_12


在实验代码的时候发现minus一直报错,找了好久才知道minus是Oracle里面的语法,SQL server 应用 EXCEPT。


他也可以多语句同时使用,举例:

SELECT  学号 FROM 学生表1 WHERE  性别 = '男'
except
SELECT  学号 FROM 学生表1 WHERE  年龄 = 17
except
SELECT  学号 FROM 学生表1 WHERE  年龄 = 18

结果:

python 列表笛卡尔积 数据库笛卡尔积代码_数据库_13

4. 笛卡尔积运算

笛卡尔积运算就是把两个集合中的元素重组一个大的一一对应的集合。

python 列表笛卡尔积 数据库笛卡尔积代码_python 列表笛卡尔积_14


例如,A={a,b}, B={0,1,2},则

A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

代码我暂时还不会写。多举两个例子助理解吧:
l表:

lid

name

101

北京

102

太原

101

NULL

102

NULL

II表:

matid

qty

lid

mname

10011

1

101

北京

20012

1

102

太原

10011

1

102

太原

10011

1

102

太原

结果:

lid

name

matid

qty

lid

mname

101

北京

10011

1

101

北京

102

太原

10011

1

101

北京

101

NULL

10011

1

101

北京

102

NULL

10011

1

101

北京

101

北京

20012

1

102

太原

102

太原

20012

1

102

太原

101

NULL

20012

1

102

太原

102

NULL

20012

1

102

太原

101

北京

10011

1

102

太原

102

太原

10011

1

102

太原

101

NULL

10011

1

102

太原

102

NULL

10011

1

102

太原

101

北京

10011

1

102

太原

102

太原

10011

1

102

太原

101

NULL

10011

1

102

太原

102

NULL

10011

1

102

太原