16 Joining Multiple Tables
- 在单次查询中引入多个表的信息
USE sql_invoicing;
SELECT
p.date,
p.invoice_id,
p.amount,
c.name AS client_name,
c.phone,
pm.name AS payment_method
FROM payments p
JOIN clients c
ON p.client_id = c.client_id
JOIN payment_methods pm
ON p.payment_method = pm.payment_method_id
## A表关联B,A表关联C,这样反复join即可
17 Compound Join Conditions
对于数据库中的元素,有的时候不一定只有一个unique factor。
在查看表格的旁边是“design mode”可以看到可能存在两个primary key..
对于并非唯一确定的key 这时候可以通过连用两个元素的方式达到连接其他表格。
USE sql_store;
SELECT *
FROM order_items oi
JOIN order_item_notes oin
ON oi.order_id = oin.order_id
AND oi.product_id = oin.product_id
## 同时连接order与product
18 Implicit Join Syntax
SELECT *
FROM order_items oi,order_item_notes oin
WHERE oi.order_id = oin.order_id
## 隐性连接,不调用join..on.. 通过where使用。缺点是join会强制打出需要的条件,更容易发现遗漏的错误。
- 推荐使用explicit join
19 Outer Joins
- join类型:outer&inner
两种使用情况
- LEFT JOIN:对应FROM 一侧的table信息全部显示。RIGHT JOIN:对应JOIN 一侧的table信息全部显示。
SELECT
p.product_id,
p.name,
oi.quantity
FROM products p
LEFT JOIN order_items oi
ON p.product_id = oi.product_id
## products 表格中的product_id 全部显示,无论是否在order_items中有无记录
20 Outer Joins Between Multiple Tables
- 类似16章中的多表结合
- 尽量用一种类型的outer join,RIGHT or LEFT
(全用LEFT好了,不觉得更好看些吗。)
SELECT
o.order_date,
o.order_id,
c.first_name,
s.name AS shipper,
os.name AS status
FROM orders o
LEFT JOIN customers c
ON o.customer_id = c.customer_id
LEFT JOIN shippers s
ON o.shipper_id = s.shipper_id
LEFT JOIN order_statuses os
ON o.status = os.order_status_id
##整合四个table,全部用LEFT JOIN 连接。
21 Self Outer Joins
参照 15及19
即可以将自引用信息中存在NULL 的部分表现出来。
22 The Using Clause
Using 可以简化ON 的复杂输入操作
但核心在于两个table之间的grid的名称需要一致
SELECT
p.date,
c.name AS clients,
p.amount,
pm.name AS methods
FROM payments p
JOIN clients c
USING (client_id)
## USING 替代了此处的ON...
JOIN payment_methods pm
ON p.payment_method = pm.payment_method_id