MySQL必知必會十五:聯結表

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_nameprod_price)在一個表中,而另一個列(vend_name)在另一個表中。現在來看FROM子句。與以前的SELECT語句不一樣,這條語句的FROM子句列出了兩個表,分別是vendorsproducts。它們就是這條SELECT語句聯結的兩個表的名字。這兩個表用WHERE子句正確聯結, WHERE子句指示MySQL匹配vendors表中的vend_idproducts表中的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中的物品。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章