SQL JOIN子句

当数据库中两张表的内容要按某种规则进行组合时,可以使用JOIN子句进行限定来得到一个结果集。

INNER JOIN

JOIN子句是用来根据两个或多个表之间的相关列,将它们的记录结合起来。

以下面 "Orders"表和“Customers”表中的内容为例:

OrderID

CustomerID

OrderDate

10308

2

1996-09-18

10309

37

1996-09-19

10310

77

1996-09-20

CustomerID

CustomerName

ContactName

Country

1

Alfreds Futterkiste

Maria Anders

Germany

2

Ana Trujillo Emparedados y helados

Ana Trujillo

Mexico

3

Antonio Moreno Taquería

Antonio Moreno

Mexico

注意 "Orders"表中的 "CustomerID "列引用的是 "Customers "表中的 "CustomerID"。上述两个表之间的关系是 "CustomerID "列。

然后,我们可以创建以下SQL语句(包含一个INNER JOIN),选择两个表中关联列的值相匹配的记录:

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate

FROM Orders

INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;

当然也可以这样:

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate

FROM Customers  

INNER JOIN Orders

ON Customers.CustomerID = Orders.CustomerID;

运行结果如下:

OrderID

CustomerName

OrderDate

10308

Ana Trujillo Emparedados y helados

9/18/1996

10365

Antonio Moreno Taquería

11/27/1996

10383

Around the Horn

12/16/1996

10355

Around the Horn

11/15/1996

10278

Berglunds snabbköp

8/12/1996

如果满足条件的记录不只一条的话,在customer id和order id相等的情况下,如果一个customer id对应多个order id,则会生成多条记录,分别是一个customer id所在的customers表的记录和各个orders表的满足条件的记录的组合。

如果是多个customer id对应多个order id,那就是乘法,记录条数是customer id的个数乘以相同的order id的个数,要轮循,每个customer id所在的记录和每个order id所在的记录的组合。

这里使用INNER JOIN,两个表谁在前谁在后都没差别。

但使用其他类型JOIN的话,就不一样了,和顺序就有关系了。

另外,如果使用三个table的话:

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName

FROM ((Orders

INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)

INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);

FROM后面是一个括号括起来的表达式,组合三个表。

共有以下几种类型的JOIN子句:

(INNER) JOIN:返回两个表中的满足匹配条件的记录。

LEFT (OUTER) JOIN:返回左表的所有记录,以及右表的匹配记录。

RIGHT (OUTER) JOIN:返回右表的所有记录,以及左表的匹配记录。

FULL (OUTER) JOIN:返回所有的左表或右表的匹配记录。

这里的图, table1的圆表示全部的table1的记录。table2的圆表示全部的table2的记录。

table1和table2相交的部分,表示满足匹配条件的table1记录和table2记录。

LEFT JOIN

语法:

SELECT column_name(s)

FROM table1

LEFT JOIN table2

ON table1.column_name = table2.column_name;

举例,使用的table的records如下:

Customers table:

CustomerID

CustomerName

ContactName

Address

City

PostalCode

Country

1

Alfreds Futterkiste

Maria Anders

Obere Str. 57

Berlin

12209

Germany

2

Ana Trujillo Emparedados y helados

Ana Trujillo

Avda. de la Constitución 2222

México D.F.

05021

Mexico

3

Antonio Moreno Taquería

Antonio Moreno

Mataderos 2312

México D.F.

05023

Mexico

Orders table:

OrderID

CustomerID

EmployeeID

OrderDate

ShipperID

10308

2

7

1996-09-18

3

10309

37

3

1996-09-19

1

10310

77

8

1996-09-20

2

执行下面SQL语句,

SELECT Customers.CustomerName, Orders.OrderID

FROM Customers

LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID

ORDER BY Customers.CustomerName;

这样的执行结果,就是会显示Customers表里面的所有行的CustomerName,如果这一行里的CustomerID有对应的OrderID,则也显示出来。

如果一个customer id有多个order id,那就会生成多条记录,customer表的记录是同一个,而orders表的记录是不同的。

如果多个对多个,和INNER JOIN一样,条数就是乘法的关系。

所以LEFT JOIN和INNER JOIN的区别就是,LEFT JOIN会把第一个表里面,没有满足条件的记录也加入到结果集中。

而鉴于LEFT JOIN的用法和含义,表的顺序对结果集是有关系的。

RIGHT JOIN关键字

RIGHT JOIN关键字返回右表(table2)的所有记录,以及左表(table1)的匹配记录。如果没有匹配的话,在结果集中没有左边表的记录。

按照定义来说,RIGHT JOIN和LEFT JOIN的区别就在于表的顺序不一样。

SELECT column_name(s)

FROM table1

LEFT JOIN table2

ON table1.column_name = table2.column_name;

就相当于:

SELECT column_name(s)

FROM table2

RIGHT JOIN table1

ON table1.column_name = table2.column_name;

FULL JOIN关键字

与LEFT或RIGHT JOIN不同的是,FULL JOIN将两个表的数据全部显示出来。

table1里不满足匹配条件的记录,table2里不满足匹配条件的记录,以及满足匹配条件的记录,都显示出来。

注意,满足匹配条件的记录,如果是一对多或多对多,就会有多条记录产生。记录个数是满足匹配条件的两个表中的记录数相乘。

语法:

SELECT column_name(s)

FROM table1

FULL OUTER JOIN table2

ON table1.column_name = table2.column_name

WHERE condition;

参考:

SQL Joins

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值