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