sql中的连接

 

一些关于sql语句的连接的小知识

为什么要用连接

查询例子

下面我举个例子

有这样两张表

student

id name class_id
1 mian 1
2 mki

class

id name
1 cs
2

如果我们需要查询每个学生选的课,按照传统的方法我们可以

1
2
3
select student.name,class.name
from student,class
where student.class_id = class.id

但是如果熟悉sql原理的同学就会知道这样的 from student,class 这样的语句本质上是求
$$
student \times class
$$
(笛卡尔积)

生成了这样一张表

id name class_id id name
1 mian 1 1 cs
1 mian 1 2
2 mki 1 cs
2 mki 2

再从中选择
$$
\sigma _{student.class_id=class.id}
$$
这样子显然当student和class非常大时,查询效率太低。

连接

数学

既然笛卡尔迪行不通,我们就想到了我们的老朋友连接(join
$$
student\Join class
$$
这样子就可以衍生出一张不比代查询的两张表大的表的。

用法

此处我们就应该用 join 这种sql语法

join跟据匹配生成元组的方式分为四种

  • 内连接 inner join
  • 左连接 left join
  • 右连接 right join
  • 全连接 full join

内连接

定义

生成的行数为左表右表全部匹配的行

用法

1
2
3
from sdudent
inner join class
on student.class_id = class.id

结果

id name class_id id name
1 mian 1 1 cs

左连接

定义

左表的所有元组加上匹配的右表元组

用法

1
2
3
from sdudent
left join class
on student.class_id = class.id

结果

id name class_id id name
1 mian 1 1 cs
2 mki

右连接

定义

右表的所有元组加上匹配的左表元组

用法

1
2
3
from sdudent
right join class
on student.class_id = class.id

结果

id name class_id id name
1 mian 1 1 cs
2

全连接

定义

所有左右表的元组相互匹配

用法

1
2
3
from sdudent
full join class
on student.class_id = class.id

结果

id name class_id id name
1 mian 1 1 cs
2 mki
2

后话

Typora 真香

Latex 真香