chapter15:聯(lián)結表

聯(lián)結

聯(lián)結(join)是SQL最強大功能之一。

關系表

看一個例子:假如有一個包含產(chǎn)品目錄的數(shù)據(jù)庫表,其中每種類別的物品占一行。對于每種物品要存儲的信息包括產(chǎn)品描述和價格,供應商信息。
現(xiàn)在,假如有同一供應商生產(chǎn)的多種物品,將這些數(shù)據(jù)與產(chǎn)品信息分開存儲的理由如下:

  • 供應商信息相同,對每個產(chǎn)品重復此信息浪費;
  • 如果供應商信息改變,只需改動一次;
  • 如果有重復數(shù)據(jù),很難保證每次輸入該數(shù)據(jù)的方式相同。
    關系表設計就是要保證把信息分解成多個表,一類數(shù)據(jù)一個表,各表通過某些常用的值互相關聯(lián)。

在這個例子中,可以建立兩個表,一個存儲供應商信息,另一個存儲產(chǎn)品信息。

vendors表包含所有供應商信息,每個供應商占一行,每個供應商具有唯一標識。此標識成為主鍵(primary key)。

products表存儲產(chǎn)品信息,除了供應商ID(vendors的主鍵)外不存儲其他供應商信息。

vendors表的主鍵又叫做products的外鍵,將兩表關聯(lián)起來,利用供應商ID能從vendors表中找出相應供應商的詳細信息。

外鍵(foreign key):外鍵為某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關系。

創(chuàng)建聯(lián)結

例:

SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;

!:使用完全限定列名。

WHERE子句的重要性

WHERE子句作為過濾條件,它只包含那些匹配給定條件的行。

笛卡爾積(cartesian product):由沒有聯(lián)結條件的表返回的結果為笛卡爾積。檢索出的行的數(shù)目將是第一個表中的行數(shù)乘以第二個表中的行數(shù)。
例:

SELECT vend_name, prod_name, prod_price
FROM vendors, products
ORDER BY vend_name, prod_name;

內(nèi)部聯(lián)結

以上均為等值聯(lián)結(equijoin),它基于兩個表之間的相等測試。這種聯(lián)結也稱為內(nèi)部聯(lián)結。

聯(lián)結多個表

SQL對一條SELECT語句可以聯(lián)結的表數(shù)目沒有限制。規(guī)則也相同,首先列出所有表,然后定義表之間的關系。例:

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;
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容