


1:内连接
语法:
SELECT
字段1,字段2,字段3……
FROM
表格1
INNER JOIN 表格2 ON 表格1.要和表格2相连的字段=表格2.要和表格1相连的字段;下图为内连接表1和表2的关系图

若上图没看懂,没关系,我们可以通过下面的练习来理解内连接的原理;
练习1:使用内连接对学生表以及成绩表进行连接
select *
from SC c
inner join Student s on s.Sid=c.Sid结果如下:

由上图可以知道,(使用内连接对学生表以及成绩表进行连接)查询到的结果为18条数据。在结果中,(左边)成绩的数据为18条,(右边)学生表的数据也为18条,但在前面我们可以知道学生表的数据为8条,成绩表中的数据为18条,这是为什么呢?
回到用内连接对学生表(Student)以及成绩表(SC)进行连接的语句中
select *
from SC c
inner join Student s on s.Sid=c.Sid在语句中,成绩表和学生表连接的条件是:s.Sid=c.Sid
也就是说查出 成绩表中的学号字段 等于 学生表中的学号字段 的数据
由查询的结果可以知道成绩表和学生表相等的学号为:01,02,03,04,05,06,07
- 成绩表查询出来的数据为18条
- 学生表中查询出来的数据为7条
- 由查询的结果可以知道:学生表中01字段对应成绩表中的数据有3条,为一对多的关系,我们不能把三条数据变成一条数据与学生表对应,但是我们可以让学生表中的1条数据与成绩表中的3条数据一一对应,所以在结果中显示学生中的数据为18条,但是很多是重复的;
- 又因为内连接,所以在结果集中只查询出两张表学号相等的数据,不相等的数据如:学生表中的08学号的数据不会查询出来;
2.左连接
语法:
SELECT
字段1,字段2,字段3……
FROM
表格1
LEFT JOIN 表格2 ON
表格1.要和表格2相连的字段=表格2.要和表格1相连的字段;
下图为左连接表1和表2的关系图

- 左连接查询的结果会返回:左表(表格1)中的所有行以及右表(表格2)中与左表(表格1)的匹配行。
- 左表是‘LEFT JOIN’左边的表,右表是‘LEFT JOIN’右边的表
- 如果在右表中找不到匹配的行,则查询结果使用NULL代替显示。
练习2:使用左连接对学生表以及成绩表进行连接
select *
from Student c
left join SC s on s.Sid=c.Sid查询出来的结果为:

- 由查询语句可以知道Student为左表,SC为右表
- 由连表条件s.Sid=c.Sid,可以知道在查询出学生表中的数据的同时,需要查询出成绩表中的学号与学生表中学号相等的数据,若没有与学生表中学号相等的数据用null表示,如第19条数据:对应成绩表中的数据为null
- 由于学生表中的数据与成绩表中的数据为一对多的关系,但查询出来的结果要为一一对应的关系,所以为成绩表匹配到的每一条数据对应一条学生表的数据,如:查询的结果;
3.右链接
语法:
SELECT
字段1,字段2,字段3……
FROM
表格1
right JOIN 表格2 ON
表格1.要和表格2相连的字段=表格2.要和表格1相连的字段;与左连接相反:

- 右连接查询的结果会返回:左表(表格1)中的所有行以及右表(表格2)中与左表(表格1)的匹配行。
- 左表是‘RIGHT JOIN’左边的表,右表是‘RIGHT JOIN’右边的表
- 如果在左表中找不到匹配的行,则查询结果使用NULL代替显示。
使用与左连接相似,所以下面右连接练习以关键字on和where的用法为重点
练习3,
select *
from Student c
right join SC s on s.Sid=c.Sid 
- 通过右连接查询出sc表的所有数据以及与student表对应的数据
练习4:on用法:
select *
from Student c
right join SC s on s.Sid=c.Sid and s.Cid='01'
- 由上图可以知道满足on中条件的同时,查询到的数据条数是不变的,查到sc中的所有数据,以及student中对应的数据
练习5:where用法:
select *
from Student c
right join SC s on s.Sid=c.Sid
where s.Cid='01'
- 查询到6条数据,为什么呢?
- where前面就相当于练习3中的查询,18条数据。
- 加了where之后就相当于在查出来的18条数据中查询出:s.Cid='01'的数据,也就是6条数据
4.交叉连接
语法:
SELECT
字段1,字段2,字段3……
FROM
表格1
CROSS JOIN 表格2;
或者
SELECT
字段1,字段2,字段3……
FROM
表格1, 表格2;- 交叉连接不会建立表格连接
- 查询出来的数据条数 为表格1中的数据条数乘上表格二中的条数
练习6:教师表和科目表进行交叉连接
select *
from Teacher t,Course o
- 查询出来的数据为9条,由前面可以知道教师表的数据为3条,科目表中的数据为3条;
- 虽然教师表中和科目表中都有tid字段,但是这不算连表,由上面的结果集可以知道,查询出来的教师表数据与科目表的数据中的tid是不相等的;
- 在两个表格数据较小的时候可以用交叉连接,数据较大的时候建议别用交叉连接,应为是两个数据库中的数据相乘,容易造成 笛卡尔积。
5.自连接
- 自连接顾名思义就是自己跟自己连表;
- 常用于 查询分层数据或比较同一个表中的行。
- 使用自联接的查询引用同一个表,因此表别名用于为查询中的表 分配不同的名称。
SELECT
字段1,字段2,字段3……
FROM
表格 t1
[INNER | LEFT] JOIN 表格 t2 ON
t1.字段=t2.字段练习7:通过学号连接的自连接
select *
from SC s
left join SC c on s.Sid=c.Sid
查询出来的数据来48行,因为数据太多,所以我就不全部放出来了,那么这48条数据是怎么来的呢?
如下图所示为成绩表中的数据,我们根据成绩表中的数据分析:

- 首先练习中自连接成立的条件是:s.Sid=c.Sid,所以SC(s)中的数据为sid=01,score=80.0的时候对应的SC(C)中的数据sid字段也等于01,所以有3条数据,同理当SC(s)中的数据为sid=01,score=90.0的时候对应的SC(C)中的数据也有3条,当SC(s)中的数据为sid=01,score=99.0的时候对应的SC(C)中的数据也有3条,则查询出来的sid=01的数据有3+3+3=9条数据,
- 同样的道理,sid=02的时候,查询出来的数据也有9条,sid=03的时候,查询出来的数据也有9条,sid=04的时候,查询出来的数据也有9条
- SC(s)中的数据为sid=05,score=76.0的时候对应的SC(C)中的数据sid字段也等于05,所以有2条数据,同理当SC(s)中的数据为sid=05,score=87.0的时候对应的SC(C)中的数据也有2条,则查询出来的sid=05的数据有2+2=4条数据。同样的,sid=06的时候查询出来4条数据,sid=07的时候查询出来4条数据
- 则:9(sid=01)+9(sid=02)+9(sid=03)+9(sid=04)+4(sid=05)+4(sid=06)+4(sid=07)=48;
6.全外连接
语法:
SELECT
字段1,字段2,字段3……
FROM
表格1
FULL OUTER JOIN 表格2
ON 表格1.字段=表格2.字段
查询出两个表中所有的字段,若没有对应的数据会用null表示;
练习8:
select *
from SC s
full outer join Student c on s.Sid=c.Sid
版权声明:本文为weixin_57726902原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。