数据库:区分笛卡儿积、自然连接、内连接、等值连接、外连接

假设存在两张表 c 和 p,这里使用的是MySQL数据库。

数据表 c

course_id title dept_name credits
BIO-301 Genetics Biology 4
CS-190 Game Design Comp.sci 4
CS-315 Robotics Comp.sci 3

数据表 p

course_id prereq_id
BIO-301 BIO-101
CS-190 CS-101
CS-347 CS-101

1. 笛卡儿积

SQL语句如下

select * from c,p;

select * from c cross join p;

结果如下
在这里插入图片描述

2. 自然连接

”natrual join 自然连接”的处理方式:先进行笛卡儿积操作,然后重复的属性只保留一份。

自然连接的步骤是将第一张表的第一条记录和第二张表的每一条记录匹配,如果符合条件就组成一条记录,然后第一张表的第二条记录再和第二张表的每一条记录匹配,这步骤一直循环到第一张表的最后一条记录。

SQL语句如下

select c.course_id, c.title, c.dept_name, c.credits, p.prereq_id from c,p where c.course_id = p.course_id;

select * from c natural join p;

结果如下:
在这里插入图片描述

3. 内连接

“inner join 内连接”的处理方式:虽然重复,但两份都保留。

内连接的结果和自然连接的结果是一样的,只不过是显示的属性不一样而已。内连接会将两张表的重复属性都分别列出来。

SQL语句如下

select * from c,p where c.course_id = p.course_id;

select * from c inner join p on c.course_id = p.course_id;

结果如下
在这里插入图片描述

4. 等值连接

从集合论角度看:等值连接是内连接的子集。

5. 外连接

(1)左连接

left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。左(外)连接,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。其实就是将右边的表的第一项根据条件分别和左边的每一行数据进行对比,如果符合条件,就拼成一条记录。

SQL语句如下

select * from c left join p on c.course_id = p.course_id;

结果如下
在这里插入图片描述

SQL语句如下

select * from c natural left join p;

结果如下
在这里插入图片描述

(2)右连接

right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。与左(外)连接相反,右(外)连接,左表只会显示符合搜索条件的记录,而右表的记录将会全部表示出来。左表记录不足的地方均为NULL。

右连接的匹配步骤是先将左边的表的第一项根据条件分别和右边的每一行数据进行对比,如果符合条件,就拼成一条记录。

SQL语句如下

select * from c right join p on c.course_id = p.course_id;

结果如下
在这里插入图片描述

SQL语句如下

select * from c natural right join p;

结果如下
在这里插入图片描述

(3)全连接

全连接也是属于外连接的一种。但是MySQL里没有全连接的关键字。但是可以通过union来实现。

注意:

UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

SQL语句如下

(select * from c left join p on c.course_id = p.course_id) union (select * from c right join p on c.course_id = p.course_id);

结果如下
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章