前言
关系代数是以关系为运算对象的一组高级运算的集合。由于关系定义为属性个数相同的元组的集合,因此集合代数的操作就可以引入到关系代数中。关系代数中的操作可以分为两类:传统的关系操作,并、差、交、笛卡尔积。
他们的图示可以表示为:
但是这样看可能不好理解,下面举例说明一下这些运算的用途。
**注:**这些运算都是对关系进行运算,就是离散中的关系表示为<a , b>,表示 a 关系 b ,关系是严格有序的,即<a , b>和<b , a>是不同的关系。所有运算的对象必须有相同的结构(先记忆,举例时说明)。
1. 并运算(UNION)
和离散中的并运算含义相同,即返回所有至少符合一个查询条件的部分。
下面举例说明:
它可以对多个表进行查询也可以对单个表进行查询。
例如
(SELECT 学号, 姓名 FROM 学生表1 WHERE 性别 = '男' and 年龄 = 20) UNION (SELECT 学号, 姓名 FROM 学生表1 WHERE 性别 = '女' and 年龄 = 19)
这段代码的含义是:在表(学生表1)中查询所有20岁的男生和所有19岁的女生的学号和姓名。
结果应如下:
它也可以对多个表查询。
(SELECT 学号, 姓名 FROM 学生表1 WHERE 性别 = '男') UNION (SELECT 学号, 姓名 FROM 学生表2 WHERE 性别 = '男')
这段代码的含义是:查出两个表(学生表1,学生表2)中所有的男生。
结果应如下:
它也可以多个语句进行交运算。
例如:
(SELECT 学号, 姓名 FROM 学生表1 WHERE 性别 = '男') UNION (SELECT 学号, 姓名 FROM 学生表2 WHERE 性别 = '男') UNION (SELECT 学号, 姓名 FROM 学生表2 WHERE 年龄 = 18 and 性别 = '女')
同理,这个结果应为上次的结果加上(学生表2)中18岁的女生,这里就不画图了。感兴趣可以自己用DBMS软件调试。
2. 交运算(INTERSECT)
返回同时满足所有条件的结果。
它也是可以对多个表进行查询也可以对单个表进行查询。
还是用上个图举例
对单个表查询:
(SELECT 学号, 姓名 FROM 学生表1 WHERE 性别 = '男') INTERSECT (SELECT 学号, 姓名 FROM 学生表1 WHERE 年龄 = 18)
这段代码的含义是:查询表(学生表1)中所有18岁的男生的学号和姓名。
结果应如下:
对两个表查询:
(SELECT 年龄 FROM 学生表1 WHERE 性别 = '男') INTERSECT (SELECT 年龄 FROM 学生表2 WHERE 性别 = '女')
由于两个表中没有相交的学号和姓名,故查询年龄代替,含义为:表1中男生的年龄和表2中女生的年龄有哪些重叠的。
结果为下:
(测试环境:SQL server 2008 R2)
3. 差运算(EXCEPT)
查询在第一个条件里面但是不在后面的条件里面。
它也是可以对多个表进行查询也可以对单个表进行查询。
一个小插曲
在实验代码的时候发现minus一直报错,找了好久才知道minus是Oracle里面的语法,SQL server 应用 EXCEPT。
他也可以多语句同时使用,举例:
SELECT 学号 FROM 学生表1 WHERE 性别 = '男' except SELECT 学号 FROM 学生表1 WHERE 年龄 = 17 except SELECT 学号 FROM 学生表1 WHERE 年龄 = 18
结果:
4. 笛卡尔积运算
笛卡尔积运算就是把两个集合中的元素重组一个大的一一对应的集合。
例如,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 | 太原 |
今天的文章
数据库笛卡尔积举例_SQL经典50题答案分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80176.html