有时为了得到完整的查询结果,我们需要从两个或更多的表中获取结果。这是就需要执行 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在实际开发中还真没应该过,不知道哪些场景会用到这个查询。
大概就是这样,如果描述有错误欢迎大家指正。

