写在前面:不总结就会忘记!
先给个通俗的解释吧.
例表a
aid |
adate |
1 |
a1 |
2 |
a2 |
3 |
a3 |
表b
bid |
bdate |
1 |
b1 |
2 |
b2 |
4 |
b4 |
问题:两个表a,b相连接,要取出id相同的字段。
select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据。
此时的取出的是:
1 a1 b1
2 a2 b2
那么left join指:
select * from a left join b on a.aid = b.bid
首先取出a表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 a1 b1
2 a2 b2
3 a3 空字符
同样的也有right join
指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 a1 b1
2 a2 b2
4 空字符 b4
================我是分割线=====================
下面是来自官方的解答
SQL LEFT JOIN 关键字
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
LEFT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。
原始的表 (用在例子中的):
"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 |
左连接(LEFT JOIN)实例
现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。
您可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
结果集:
LastName |
FirstName |
OrderNo |
Adams |
John |
22456 |
Adams |
John |
24562 |
Carter |
Thomas |
77895 |
Carter |
Thomas |
44678 |
Bush |
George |
|
LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。
=====================下面还是通俗的说法========================================
A left join B 表示:连接的记录数与A表的记录数同,即A表是主表
A right join B 表示:连接的记录数与B表的记录数同,即B表是主表
A left join B 等价B right join A
table A:
Field_K, Field_A
1 a
3 b
4 c
table B:
Field_K, Field_B
1 x
2 y
4 z
左连接:
select a.Field_K, a.Field_A, b.Field_K, b.Field_B
from a left join b on a.Field_K=b.Field_K
结果为:
Field_K Field_A Field_K Field_B
---------- ---------- ---------- ----------
1 a 1 x
3 b NULL NULL
4 c 4 z
右连接:
select a.Field_K, a.Field_A, b.Field_K, b.Field_B
from a right join b on a.Field_K=b.Field_K
结果为:
Field_K Field_A Field_K Field_B
---------- ---------- ---------- ----------
1 a 1 x
NULL NULL 2 y
4 c 4 z
举个例子:
假设a表和b表的数据是这样的。
a b
id name id stock
1 a 1 15
2 b 2 50
3 c
select * from a inner join b on a.id=b.id
这个语法是连接查询中的内连接,它产生的结果是两个表相匹配的记录出现在结果列表中。
根据上面的表,出现的结果是这样的
a.id name b.id stock
1 a 1 15
2 b 2 50
----------------------------
select * from a,b where a.id=b.id
这个语法是内连接的另外一种写法,其执行结果与inner join 一样
--------------------------------
select * from a left/right join b on a.id=b.id
这个是外连接语法中的左外连接或右外连接
如果是左外连接的话,它将显示a表的所有记录,
select a.*,b.* from a left join b on a.id=b.id
查询的结果是这样的:
a.id name b.id stock
1 a 1 15
2 b 2 50
3 c null null
--------------------------------------------
如果是右外连接的话,它将显示b表的所有记录,
select a.*,b.* from a right join b on a.id=b.id
查询的结果是这样的:
a.id name b.id stock
1 a 1 15
2 b 2 50
select a.*,b.* from a left join b on a.k = b.k
select a.*,b.* from a left outer join b on a.k =b.k
----------上面两种一样left join是left outer join的简写
select a.*,b.* from a left inner join b on a.k = b.k
没有这种写法,错误的语句.