在使用数据库,进行查询的时候,经常会出现表中信息不全,需要连接另一张表来查询需要的数据。SQL的连接主要分为内连接、外连接。
使用如下两个表进行演示。

  • 学生表(student)

id

name

age

cid

1

张三

23

1

2

李四

23

2

3

李四

34

2

4

赵六

44

4

  • 班级(class)

cid

cname

1

一班

2

二班

3

三班

内连接(INNER JOIN)

单独使用join的话,默认为内连接。内连接会只会查询出两个表匹配到的条目,没有匹配上的条目不会在结果集中出现。使用如下语句进行查询。

select * from student std 
join class cla
on std.cid = cla.cid

查询结果如下,会将匹配到的连接全部查询出来。

id

name

age

cid

cid

cname

1

张三

23

1

1

一班

2

李四

23

2

2

二班

3

王五

34

2

2

二班

外连接

外连接的结果集则不仅仅是匹配到的行,也可以将一些没有关联匹配到的行显示出来。外连接分为左外连接、右外连接和全外连接。

左外连接(LEFT JOIN或LEFT OUTER JOIN)

左外连接可以保证关联时,左表的完整性。会查询出关联中左表(join左边,这里为std)的全部条目,若右表未匹配到关联条目,则为null。

select * from student std 
left join class cla
on std.cid = cla.cid

查询结果如下,会将左表全部查询出来,如果未匹配到连接,则右表为null。

id

name

age

cid

cid

cname

1

张三

23

1

1

一班

2

李四

23

2

2

二班

3

王五

34

2

2

二班

4

赵六

44

4

null

null

右外连接(RIGHT JOIN或RIGHT OUTER JOIN)

右外连接是左外连接的反向连接,可以保证右表的完整性,若左表未匹配到关联条目则为null。因此a left join bb right join a结果集相同,只是左右位置互换。

select * from student std 
right join class cla
on cla.cid = std.cid

查询结果如下,会将右表全部查询出来,如果未匹配到连接,则左表为null。

id

name

age

cid

cid

cname

1

张三

23

1

1

一班

2

李四

23

2

2

二班

3

王五

34

2

2

二班

null

null

null

null

3

三班

全外连接(FULL JOIN 或 FULL OUTER JOIN)

全外连接可以同时保证左表和右表的完整性,查询结果返回两张表的所有行,若某行在另一张表中没有匹配行时,则该行在另一个表中的值为null。

select * from student std 
full join class cla
on cla.cid = std.cid

查询结果如下。

id

name

age

cid

cid

cname

1

张三

23

1

1

一班

2

李四

23

2

2

二班

3

王五

34

2

2

二班

4

赵六

44

4

null

null

null

null

null

null

3

三班

PS:mysql不支持FULL JOIN,可用LEFT JOIN UNION RIGHT JOIN替代

笛卡儿积(CROSS JOIN)

笛卡儿积,又称交叉连接。会返回两张表的每一条数据的所有组合,如果在SQL中关联却没有给出关联条件,会产生笛卡儿积。也可以使用交叉连接,CROSS JOIN来查询笛卡儿积。

select * from student std 
CROSS JOIN class cla

查询结果如下,结果集为两表的乘积。

id

name

age

cid

cid

cname

1

张三

23

1

1

一班

1

张三

23

1

2

二班

1

张三

23

1

3

三班

2

李四

23

2

1

一班

2

李四

23

2

2

二班

2

李四

23

2

3

三班

3

王五

34

2

1

一班

3

王五

34

2

2

二班

3

王五

34

2

3

三班

4

赵六

44

4

1

一班

4

赵六

44

4

2

二班

4

赵六

44

4

3

三班