写在前面:不总结就会忘记!
先给个通俗的解释吧
例表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_Bfrom 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_Bfrom 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 bid name id stock
1 a 1 15
2 b 2 503 c
select * from a inner join b on a.id=b.id
这个语法是连接查询中的内连接,它产生的结果是两个表相匹配的记录出现在结果列表中。根据上面的表,出现的结果是这样的a.id name b.id stock1 a 1 152 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 stock1 a 1 152 b 2 503 c null null--------------------------------------------
如果是右外连接的话,它将显示b表的所有记录,select a.*,b.* from a right join b on a.id=b.id查询的结果是这样的:a.id name b.id stock1 a 1 152 b 2 50select a.*,b.* from a left join b on a.k = b.kselect 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没有这种写法,错误的语句.