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

无主题博客 » 数据库 » 对SQL文中join、left join、right join的理解

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

join表联接关键字

较为常用

  • left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
  • right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
  • inner join(等值联接) 只返回两个表中联结字段相等的行

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

  • full join(全联接) 返回两个表中的行:left join + right join
  • cross 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在实际开发中还真没应该过,不知道哪些场景会用到这个查询。

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

发表评论

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