15.1 聯結
15.1.1 關係表
外鍵(foreign key) 外鍵爲某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關係。
15.2 創建聯結
mysql> SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id=products.vend_id ORDER BY vend_name, prod_name;
+-------------+----------------+------------+
| vend_name | prod_name | prod_price |
+-------------+----------------+------------+
| ACME | Bird seed | 10.00 |
| ACME | Carrots | 2.50 |
| ACME | Detonator | 13.00 |
| ACME | Safe | 50.00 |
| ACME | Sling | 4.49 |
| ACME | TNT (1 stick) | 2.50 |
| ACME | TNT (5 sticks) | 10.00 |
| Anvils R Us | .5 ton anvil | 5.99 |
| Anvils R Us | 1 ton anvil | 9.99 |
| Anvils R Us | 2 ton anvil | 14.99 |
| Jet Set | JetPack 1000 | 35.00 |
| Jet Set | JetPack 2000 | 55.00 |
| LT Supplies | Fuses | 3.42 |
| LT Supplies | Oil can | 8.99 |
+-------------+----------------+------------+
- 分析:這裏,最大的差別是所指定的兩個列(
prod_name
和prod_price
)在一個表中,而另一個列(vend_name
)在另一個表中。現在來看FROM
子句。與以前的SELECT
語句不一樣,這條語句的FROM
子句列出了兩個表,分別是vendors
和products
。它們就是這條SELECT
語句聯結的兩個表的名字。這兩個表用WHERE
子句正確聯結,WHERE
子句指示MySQL匹配vendors
表中的vend_id
和products
表中的vend_id
。
不要忘了WHERE子句 應該保證所有聯結都有WHERE子句,否則MySQL將返回比想要的數據多得多的數據。同理,應該保證WHERE子句的正確性。不正確的過濾條件將導致MySQL返回不正確的數據。
15.2.2 內部聯結
mysql> SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id=products.vend_id ORDER BY vend_name, prod_name;
+-------------+----------------+------------+
| vend_name | prod_name | prod_price |
+-------------+----------------+------------+
| ACME | Bird seed | 10.00 |
| ACME | Carrots | 2.50 |
| ACME | Detonator | 13.00 |
| ACME | Safe | 50.00 |
| ACME | Sling | 4.49 |
| ACME | TNT (1 stick) | 2.50 |
| ACME | TNT (5 sticks) | 10.00 |
| Anvils R Us | .5 ton anvil | 5.99 |
| Anvils R Us | 1 ton anvil | 9.99 |
| Anvils R Us | 2 ton anvil | 14.99 |
| Jet Set | JetPack 1000 | 35.00 |
| Jet Set | JetPack 2000 | 55.00 |
| LT Supplies | Fuses | 3.42 |
| LT Supplies | Oil can | 8.99 |
+-------------+----------------+------------+
- 分析:此語句中的
SELECT
與前面的SELECT
語句相同,但FROM
子句不同。這裏,兩個表之間的關係是FROM
子句的組成部分,以INNER JOIN
指定。在使用這種語法時,聯結條件用特定的ON
子句而不是WHERE
子句給出。傳遞給ON
的實際條件與傳遞給WHERE的相同。
15.2.3 聯結多個表
mysql> SELECT prod_name, vend_name, prod_price, quantity FROM orderitems, products, vendors WHERE products.vend_id=vendors.vend_id AND orderitems.prod_id=products.prod_id AND order_num=20005;
+----------------+-------------+------------+----------+
| prod_name | vend_name | prod_price | quantity |
+----------------+-------------+------------+----------+
| .5 ton anvil | Anvils R Us | 5.99 | 10 |
| 1 ton anvil | Anvils R Us | 9.99 | 3 |
| TNT (5 sticks) | ACME | 10.00 | 5 |
| Bird seed | ACME | 10.00 | 1 |
+----------------+-------------+------------+----------+
- 分析:此例子顯示編號爲20005的訂單中的物品。訂單物品存儲在
orderitems
表中。每個產品按其產品ID存儲,它引用products
表中的產品。這些產品通過供應商ID聯結到vendors
表中相應的供應商,供應商ID存儲在每個產品的記錄中。這裏的FROM子句列出了3個表,而WHERE
子句定義了這兩個聯結條件,而第三個聯結條件用來過濾出訂單20005中的物品。