对SQL文中join、left join、right join的理解

/ 0评 / 0

有时为了得到完整的查询结果,我们需要从两个或更多的表中获取结果。这是就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

join表联接关键字

较为常用

不常用(或者说我很少用甚至没用过比较准确)

使用示例

假设有两张表,数据分别如下

表A记录如下:

A_ID A_NAME
1 a1
2 a2
3 a3
4 a4
5 a5

表B记录如下:

B_ID B_NAME
1 b1
2 b2
3 b3
4 b4
8 b8

left join SQL语句:

select * from A left join B on A.A_ID = B.B_ID

结果如下:

------------------------------
A_ID   A_NAME   B_ID   B_NAME
1      a1       1      b1
2      a2       2      b2
3      a3       3      b3
4      a4       4      b4
5      a5       NULL   NULL
------------------------------

结果说明:

left join是以A表的记录为基础,A表可以看成左表,B可以看成右表,left join是以左表为准的。
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合查询条件(例子中为: A.A_ID = B.B_ID)的记录,B表记录不满足条件的地方均为NULL。

right join SQL语句:

select * from A right join B on A.A_ID = B.B_ID

结果如下:

------------------------------
A_ID   A_NAME   B_ID   B_NAME
1      a1       1      b1
2      a2       2      b2
3      a3       3      b3
4      a4       4      b4
NULL   NULL     8      b8
------------------------------

结果说明:

结果正好与left join相反,原因是right join把右表作为基础表,通过查询条件判左表显示

inner join SQL语句:

select * from A inner join B on A.A_ID = B.B_ID

结果如下:

------------------------------
A_ID   A_NAME   B_ID   B_NAME
1      a1       1      b1
2      a2       2      b2
3      a3       3      b3
4      a4       4      b4
------------------------------

结果说明:

inner join结果只显示符合检索条件的数据,并没有基础表概念,只有两个表完全相等的数据才能显示,它等同于

select * from A,B where A.A_ID = B.B_ID

full join SQL语句:

select * from A full join B on A.A_ID = B.B_ID

查询结果:

------------------------------
A_ID   A_NAME   B_ID   B_NAME
1      a1       1      b1
2      a2       2      b2
3      a3       3      b3
4      a4       4      b4
5      a5       NULL   NULL
NULL   NULL     8      b8
------------------------------

结果说明:

即 left join 和 right join的结果的全集

cross join SQL语句:

select * from A cross join B 

查询结果:

结果为A表数据 * B表数据 = 25 条交叉匹配结果

结果说明:

cross join在实际开发中还真没应该过,不知道哪些场景会用到这个查询。

大概就是这样,如果描述有错误欢迎大家指正。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注