在说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