假设存在两张表 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);
结果如下: