一:首先,我们要理解数据库的表连接方式有几种。
- 内连接
- 外连接(左连接、右连接、全连接)
- 交叉连接
二:下面一个一个介绍他们的使用
先建立两个表,一个是学生表,另外一个是成绩表;
学生表:Student
StdNo | StdName | StdAge | StdSex | StdClass |
001 | 小白 | 17 | 女 | 1 |
002 | 小李 | 18 | 女 | 2 |
003 | 小蒋 | 18 | 男 | 1 |
004 | 小陈 | 15 | 女 | 2 |
成绩表:Score
ScoreID | StdNo | StdScore |
1 | 004 | 87 |
2 | 002 | 92 |
3 | 001 | 90 |
5 | 005 | 98 |
1.内连接(inner join)
内连接是指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
内连接查询语法:select * from Student inner join Score on Student.StdNo = Score.StdNo
查询结果:
StdNo | StdName | StdAge | StdSex | StdClass | ScoreID | StdNo | StdScore |
001 | 小白 | 17 | 女 | 1 | 3 | 001 | 90 |
002 | 小李 | 18 | 女 | 2 | 2 | 002 | 92 |
004 | 小陈 | 15 | 女 | 2 | 1 | 004 | 87 |
2.外连接
外连接的连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。分为左外连接、右外连接和全外连接。
(1)左外连接(left join):左边表数据的行全部保留,右边表保留符合连接条件的行。
左外连接查询语法:select Student.*,Score.* from Student left join Score on Student.StdNo = Score.StdNo
查询结果:
StdNo | StdName | StdAge | StdSex | StdClass | ScoreID | StdNo | StdScore |
001 | 小白 | 17 | 女 | 1 | 3 | 001 | 90 |
002 | 小李 | 18 | 女 | 2 | 2 | 002 | 92 |
003 | 小蒋 | 18 | 男 | 1 | NULL | NULL | NULL |
004 | 小陈 | 15 | 女 | 2 | 1 | 004 | 87 |
(2)右外连接(right join):右边表数据的行全部保留,左边表保留符合连接条件的行。
右外连接查询语法:select Student.*,Score.* from Student right join Score on Student.StdNo = Score.StdNo
查询结果:
StdNo | StdName | StdAge | StdSex | StdClass | ScoreID | StdNo | StdScore |
001 | 小白 | 17 | 女 | 1 | 3 | 001 | 90 |
002 | 小李 | 18 | 女 | 2 | 2 | 002 | 92 |
004 | 小陈 | 15 | 女 | 2 | 1 | 004 | 87 |
NULL | NULL | NULL | NULL | NULL | 5 | 005 | 98 |
(3)全外连接(full join):全外连接是在等值连接的基础上将左表和右表的未匹配数据都加上。
全外连接查询语法:select Student.*,Score.* from Student full join Score on Student.StdNo = Score.StdNo
查询结果:
StdNo | StdName | StdAge | StdSex | StdClass | ScoreID | StdNo | StdScore |
001 | 小白 | 17 | 女 | 1 | 3 | 001 | 90 |
002 | 小李 | 18 | 女 | 2 | 2 | 002 | 92 |
003 | 小蒋 | 18 | 男 | 1 | NULL | NULL | NULL |
004 | 小陈 | 15 | 女 | 2 | 1 | 004 | 87 |
NULL | NULL | NULL | NULL | NULL | 5 | 005 | 98 |
3.交叉连接(cross join)
交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
在此例中,Student表有4行,Score表有4行。笛卡尔积返回4*4=16行记录。查询语句没有on条件,可以用where限制。
交叉连接查询语法:select Student.*,Score.* from Student cross join Score
查询结果:
StdNo | StdName | StdAge | StdSex | StdClass | ScoreID | StdNo | StdScore |
001 | 小白 | 17 | 女 | 1 | 1 | 004 | 87 |
001 | 小白 | 17 | 女 | 1 | 2 | 002 | 90 |
001 | 小白 | 17 | 女 | 1 | 3 | 001 | 92 |
001 | 小白 | 17 | 女 | 1 | 5 | 005 | 98 |
002 | 小李 | 18 | 女 | 2 | 1 | 004 | 87 |
002 | 小李 | 18 | 女 | 2 | 2 | 002 | 90 |
002 | 小李 | 18 | 女 | 2 | 3 | 001 | 92 |
002 | 小李 | 18 | 女 | 2 | 5 | 005 | 98 |
003 | 小蒋 | 18 | 男 | 1 | 1 | 004 | 87 |
003 | 小蒋 | 18 | 男 | 1 | 2 | 002 | 90 |
003 | 小蒋 | 18 | 男 | 1 | 3 | 001 | 92 |
003 | 小蒋 | 18 | 男 | 1 | 5 | 005 | 98 |
004 | 小陈 | 15 | 女 | 2 | 1 | 004 | 87 |
004 | 小陈 | 15 | 女 | 2 | 2 | 002 | 90 |
004 | 小陈 | 15 | 女 | 2 | 3 | 001 | 92 |
004 | 小陈 | 15 | 女 | 2 | 5 | 005 | 98 |