『数据库』朴实无华的数据库多表查询,连接查询、笛卡尔积
『数据库』 朴实无华且枯燥的数据库教程–入门必看!(不收藏,真的吃亏了)
一、交
(会用到连接运算,固定写法,连接运算在下面不用着急看)
先假设两张表:
Table NSA1:
Name | Sex | Age |
---|---|---|
张三 | 男 | 18 |
李四 | 跨性别者 | 21 |
王五 | 女 | 18 |
韩七 | 男 | 12 |
Table NSA2:
Name | Sex | Age |
---|---|---|
张三 | 男 | 18 |
李四 | 男 | 21 |
王五 | 女 | 18 |
赵六 | 女 | 18 |
韩七 | 女 | 12 |
SELECT a.Name,a.Sex FROM NSA1 a
INNER JOIN
NSA2 b ON a.Name=b.Name AND a.Sex =b.Sex
等价于
SELECT a.Name,a.Sex FROM NSA1 a
INNER JOIN
NSA2 b USING(Name ,Sex )
Name | Sex | Age |
---|---|---|
张三 | 男 | 18 |
王五 | 女 | 18 |
二、并
先假设两张表:
Table NSA1:
Name | Sex | Age |
---|---|---|
张三 | 男 | 18 |
李四 | 男 | 21 |
王五 | 女 | 18 |
韩七 | 男 | 12 |
Table NSA2:
Name | Sex | Age |
---|---|---|
张三 | 男 | 18 |
李四 | 男 | 21 |
王五 | 女 | 18 |
赵六 | 女 | 18 |
韩七 | 男 | 12 |
SELECT Name,Sex FROM NSA1
UNION ALL
SELECT Name,Sex FROM NSA1
Name | Sex | Age |
---|---|---|
张三 | 男 | 18 |
李四 | 男 | 21 |
王五 | 女 | 18 |
韩七 | 男 | 12 |
张三 | 男 | 18 |
李四 | 男 | 21 |
王五 | 女 | 18 |
赵六 | 女 | 18 |
韩七 | 男 | 12 |
如果执行:
SELECT Name,Sex FROM NSA1
UNION
SELECT Name,Sex FROM NSA1
Name | Sex | Age |
---|---|---|
张三 | 男 | 18 |
李四 | 男 | 21 |
王五 | 女 | 18 |
韩七 | 男 | 12 |
赵六 | 女 | 18 |
注释:union自带去重
三、差
(会用到连接运算,固定写法,连接运算在下面不用着急看)
先假设两张表:
Table NSA1:
Name | Sex | Age |
---|---|---|
张三 | 男 | 18 |
李四 | 男 | 21 |
王五 | 女 | 18 |
赵六 | 女 | 18 |
韩七 | 男 | 12 |
Table NSA2:
Name | Sex | Age |
---|---|---|
张三 | 男 | 18 |
李四 | 男 | 21 |
王五 | 女 | 18 |
韩七 | 男 | 12 |
SELECT a.Name, a.Sex FROM NSA1 a
LEFT JOIN NSA2 b
ON a.Name= b.Name
AND a.Sex= b.Sex
WHERE b.Name IS NULL
Name | Sex | Age |
---|---|---|
赵六 | 女 | 18 |
四、笛卡尔积
其实所有的链接运算都是都是建立在笛卡尔积上的,笛卡尔积就是不舍弃任何全外连接,可以这么理解,但是cross join 象征着返回所有的情况,默认不使用 where进行过滤的。
举例:
Table Name :
Name |
---|
朱小明 |
刘小华 |
Table Subject:
Subject |
---|
语文 |
数学 |
法律 |
select * from Name cross join Subject order by Name;
Name | Subject |
---|---|
刘小华 | 数学 |
刘小华 | 法律 |
刘小华 | 语文 |
朱小明 | 法律 |
朱小明 | 语文 |
朱小明 | 数学 |
五、连接查询
连接运算是关系的二目运算.关系R与关系S的连接运算是从两个关系的广义笛卡尔积中选取属性间满足一定条件(称为连接条件,记为AθB)的元组形成一个新关系。
①等值连接
等值连接是从关系R与S的广义笛卡尔积中选取A、B属性相等的那些元组,按照属性相同的行将两(或以上)张表元组匹配连接;
举个例子
ID_Name表
ID | Name |
---|---|
1 | 大好人 |
2 | 大坏蛋 |
3 | 猪八戒 |
4 | 孙悟空 |
5 | 沙和尚 |
7 | 唐三藏 |
8 | 武松 |
ID_MingZhu 表
ID | MingZhu |
---|---|
3 | 西游记 |
4 | 西游记 |
5 | 西游记 |
7 | 西游记 |
8 | 水浒传 |
SELECT * FROM ID_Name N,ID_MingZhu M WHERE N.ID=M.ID;
ID_Name.ID | Name | ID_MingZhu.ID | MingZhu |
---|---|---|---|
3 | 猪八戒 | 3 | 西游记 |
4 | 孙悟空 | 4 | 西游记 |
5 | 沙和尚 | 5 | 西游记 |
7 | 唐三藏 | 7 | 西游记 |
8 | 武松 | 8 | 水浒传 |
② 自然连接
自然连接是特殊的等值连接,要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉。
举个例子:
ID_Name表
ID | Name |
---|---|
1 | 大好人 |
2 | 大坏蛋 |
3 | 猪八戒 |
4 | 孙悟空 |
5 | 沙和尚 |
7 | 唐三藏 |
8 | 武松 |
ID_MingZhu 表
ID | MingZhu |
---|---|
3 | 西游记 |
4 | 西游记 |
5 | 西游记 |
7 | 西游记 |
8 | 水浒传 |
SELECT * FROM ID_Name N natural join ID_MingZhu M ON N.ID=M.ID;
ID_Name.ID | Name | MingZhu |
---|---|---|
3 | 猪八戒 | 西游记 |
4 | 孙悟空 | 西游记 |
5 | 沙和尚 | 西游记 |
7 | 唐三藏 | 西游记 |
8 | 武松 | 水浒传 |
③ 左外连接
将返回右表的所有行。如果左表的某行在右表中没有匹配行,则将为右表返回空值左连接:
例子:
ID_Name表
ID | Name |
---|---|
1 | 大好人 |
2 | 大坏蛋 |
3 | 猪八戒 |
4 | 孙悟空 |
5 | 沙和尚 |
7 | 唐三藏 |
8 | 武松 |
ID_MingZhu 表
ID | MingZhu |
---|---|
3 | 西游记 |
4 | 西游记 |
5 | 西游记 |
7 | 西游记 |
8 | 水浒传 |
9 | 红楼梦 |
SELECT * FROM ID_Name N left join ID_MingZhu M ON N.ID=M.ID;
ID_Name.ID | Name | ID_MingZhu.ID | MingZhuNu |
---|---|---|---|
1 | 大好人 | NULL | NULL |
2 | 大坏蛋 | NULL | NULL |
3 | 猪八戒 | 3 | 西游记 |
4 | 孙悟空 | 4 | 西游记 |
5 | 沙和尚 | 5 | 西游记 |
7 | 唐三藏 | 7 | 西游记 |
8 | 武松 | 8 | 水浒传 |
④ 右外连接
将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值;
例子
ID_Name表
ID | Name |
---|---|
1 | 大好人 |
2 | 大坏蛋 |
3 | 猪八戒 |
4 | 孙悟空 |
5 | 沙和尚 |
7 | 唐三藏 |
8 | 武松 |
ID_MingZhu 表
ID | MingZhu |
---|---|
3 | 西游记 |
4 | 西游记 |
5 | 西游记 |
7 | 西游记 |
8 | 水浒传 |
9 | 红楼梦 |
SELECT * FROM ID_Name N right join ID_MingZhu M ON N.ID=M.ID;
ID_Name.ID | Name | ID_MingZhu.ID | MingZhuNu |
---|---|---|---|
3 | 猪八戒 | 3 | 西游记 |
4 | 孙悟空 | 4 | 西游记 |
5 | 沙和尚 | 5 | 西游记 |
7 | 唐三藏 | 7 | 西游记 |
8 | 武松 | 8 | 水浒传 |
NULL | NULL | 9 | 红楼梦 |
- 全外连接。
左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充
例子
ID_Name表
ID | Name |
---|---|
1 | 大好人 |
2 | 大坏蛋 |
3 | 猪八戒 |
4 | 孙悟空 |
5 | 沙和尚 |
7 | 唐三藏 |
8 | 武松 |
ID_MingZhu 表
ID | MingZhu |
---|---|
3 | 西游记 |
4 | 西游记 |
5 | 西游记 |
7 | 西游记 |
8 | 水浒传 |
9 | 红楼梦 |
SELECT * FROM ID_Name N full join ID_MingZhu M ON N.ID=M.ID;
ID_Name.ID | Name | ID_MingZhu.ID | MingZhuNu |
---|---|---|---|
1 | 大好人 | NULL | NULL |
2 | 大坏蛋 | NULL | NULL |
3 | 猪八戒 | 3 | 西游记 |
4 | 孙悟空 | 4 | 西游记 |
5 | 沙和尚 | 5 | 西游记 |
7 | 唐三藏 | 7 | 西游记 |
8 | 武松 | 8 | 水浒传 |
NULL | NULL | 9 | 红楼梦 |
写在最后:
Name:风骨散人,目前是一名双非在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你!名字的含义:我想有一天我能有能力随心所欲不逾矩,不总是向生活低头,有能力让家人拥有富足的生活而不是为了生计而到处奔波。“世人慌慌张张,不过是图碎银几两。偏偏这碎银几两,能解世间惆怅,可让父母安康,可护幼子成长 …”
文章主要内容:
Python,C++,C语言,JAVA,C#等语言的教程
ACM题解、模板、算法等,主要是数据结构,数学和图论
设计模式,数据库,计算机网络,操作系统,计算机组成原理
Python爬虫、深度学习、机器学习
计算机系408考研的所有专业课内容
目前还在更新中,先关注不迷路。微信公众号,cnblogs(博客园),CSDN同名“风骨散人”
如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文!
感谢大家的阅读!😘你的点赞、收藏、关注是对我最大的鼓励!