在说join之间,我们必须对where有一个清晰的认识。
WHERE 子句
有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
如果只希望选取居住在城市 “Beijing” 中的人,我们需要向 SELECT 语句添加 WHERE 子句:
LastName | FirstName | Address | City | Year |
Adams | John | Oxford Street | London | 1970 |
Bush | George | Fifth Avenue | New York | 1975 |
Carter | Thomas | Changan Street | Beijing | 1980 |
Gates | Bill | Xuanwumen 10 | Beijing | 1985 |
SELECT * FROM Persons WHERE City='Beijing'
注:SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
SELECT * FROM Persons WHERE FirstName='Bush'
SELECT * FROM Persons WHERE Year>1965
Join
join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
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 |
Id_O | OrderNo | Id_P |
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
谁订购了产品,并且他们订购了什么产品?
1. 我们可以通过引用两个表的方式,从两个表中获取数据:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
2.使用join
常用的join有四种,inner join, left outer join, right outer join, full outer join,关键字OUTER是可选择的,取决于具体语言,在实现上它们都是遵循标准的,因此FULL JOIN和FULL OUTER JOIN是一样的。我们一一介绍。
INNER JOIN
INNER JOIN跟JOIN是一样的,一般INNER关键字可以省略。
INNER JOIN将只会返回相匹配的元素项,即不会返回结果为NULL的数据项。
在表中存在至少一个匹配时,inner join 返回行。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
为了方便理解,我们可以把表当成类,行当成一个对象。
总的来说,四种JOIN的使用/区别可以描述为:
left join 会从左表那里返回所有的记录,即使在右表中没有匹配的行。
right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配
full outer join 全连接,返回左右表中的所有记录
Set "A" Set "B"
AA BB
-------- --------
Item 1 Item 3
Item 2 Item 4
Item 3 Item 5
Item 4 Item 6
LEFT OUTER JOIN
SELECT * FROM A LEFT OUTER JOIN B ON AA = BB
AA BB
-------- --------
Item 1
Item 2
Item 3 Item 3
Item 4 Item 4
左连接(LEFT OUTER JOIN)会输出左边的表中的所有结果,如果右边的表中有相应项,则会输出,否则为NULL。
RIGHT OUTER JOIN
如果使用右连接,结果将会输出BB中所有的数据项和AA中相应的匹配项(注意你现在是获取了右边的表中的所有数据项):
SELECT * FROM A RIGHT OUTER JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
Item 5
Item 6
FULL OUTER JOIN
如果想要取得所有的元素项,则可以使用FULL JOIN:
SELECT * FROM A FULL JOIN B ON AA = BB
AA BB
-------- --------
Item 1 <-----+
Item 2 |
Item 3 Item 3 |
Item 4 Item 4 |
Item 5 +--- empty holes are NULL's
Item 6 |
^ |
| |
+---------------------+
缺失的数据项的值是NULL。
INNER JOIN
INNER JOIN跟JOIN是一样的,一般INNER关键字可以省略。INNER JOIN将只会返回相匹配的元素项,即不会返回结果为NULL的数据项。
SELECT * FROM A INNER JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4