Join连接查询
在大多数实际开发情况了,我们需要同时和多个表打交道,多表查询是数据库中使用频率最高和效率攸关的操作了!
多表查询主要有两种方案:
- 连接查询
- 嵌套查询
这里主要介绍一下连接查询!
连接查询
连接查询,主要使用join关键字,建立多个表之间的联系。
连接查询可以分为,内连接和外连接,同时外连接又分为左连接和右连接。
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
- JOIN: 如果表中有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
实例表结构如下:
内连接
INNER JOIN 与 JOIN 是相同的。
在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
SELECT
persons.FirstName,
persons.LastName,
orders.OrderNo
FROM
persons
INNER JOIN orders ON orders.id_P = persons.Id_P
ORDER BY
persons.FirstName
左连接
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
我们想知道所有人的信息,以及他们的订单号,如果有的话!
SELECT
persons.FirstName,
persons.LastName,
orders.OrderNo
FROM
persons
LEFT JOIN orders ON orders.id_P = persons.Id_P
ORDER BY
persons.FirstName
LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。
右连接
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
我们希望列出所有的定单,以及定购它们的人 - 如果有的话。
SELECT
persons.FirstName,
persons.LastName,
orders.OrderNo
FROM
persons
RIGHT JOIN orders ON orders.id_P = persons.Id_P
ORDER BY
persons.FirstName
全连接
只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。
我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。相当于左连接和右连接相加!
SELECT
persons.FirstName,
persons.LastName,
orders.OrderNo
FROM
persons
FULL JOIN orders ON orders.id_P = persons.Id_P
ORDER BY
persons.FirstName
由于Mysql不支持全连接,这里就不写运行结果,可以通过Union关键字组合左右连接得到相同的效果!
自然连接
自然连接,是对数据表进行笛卡尔积操作。
SELECT
persons.FirstName,
persons.LastName,
orders.OrderNo
FROM
persons,orders
where orders.id_P = persons.Id_P
ORDER BY
persons.FirstName
嵌套查询
关于嵌套查询和连接查询的效率问题,下节课讨论