sql是关系型数据库中非常重要的技术,学会写sql是开发人员必备的技术储蓄。
本章重点讲解sql中join,SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
请看 "Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
接下来请看 "Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
请注意,"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用他们的确切姓名。
请留意,"Id_P" 列把上面的两个表联系了起来。
情景一:
查询表A和表B中的并集数据:
表A中的数据与表B中的数据都有才能查询出来,使用inner join。
sql语句如下:
select
*
from
person p
inner join
orde_ o
on
p.id_p = o.id_p
情景二:
包括A或者包括B的数据:
表A中的数据与表B中的数据单独查询出来,且排除非公共的部分数据,使用left/right join。
sql语句如下:
select
*
from
person p
left/right join
orde_ o
on
p.id_p = o.id_p
情景三:
查询A,B中的所有数据,使用full outter join 或者 full join,很遗憾,mysql不支持。笔者测试使用的是mysql,使用union方式实现:
(select
*
from
person p
left join
orde_ o
on
p.id_p = o.id_p)
union
(select
*
from
person p
right join
orde_ o
on
p.id_p = o.id_p)
ps:union可以去除重复的结果集。
情景四:
只查询A,不包括B的集合数据,使用left excluding join。
sql语句如下:
select
*
from
person p
left join
orde_ o
on
p.id_p = o.id_p
where o.id_p is null
情景五:
sql语句如下:
select
*
from
person p
right join
orde_ o
on
p.id_p = o.id_p
where p.id_p is null
情景六:
查询A和B中的数据,但不包含公共的部分。
sql语句查询如下(结合情景4和情景5使用union语句):
(select
*
from
person p
left join
orde_ o
on
p.id_p = o.id_p
where o.id_p is null)
union
(select
*
from
person p
right join
orde_ o
on
p.id_p = o.id_p
where p.id_p is null)