聯(lián)結(jié)
聯(lián)結(jié)(join)是SQL最強大功能之一。
關(guān)系表
看一個例子:假如有一個包含產(chǎn)品目錄的數(shù)據(jù)庫表饲宛,其中每種類別的物品占一行皆愉。對于每種物品要存儲的信息包括產(chǎn)品描述和價格,供應(yīng)商信息。
現(xiàn)在幕庐,假如有同一供應(yīng)商生產(chǎn)的多種物品久锥,將這些數(shù)據(jù)與產(chǎn)品信息分開存儲的理由如下:
- 供應(yīng)商信息相同,對每個產(chǎn)品重復(fù)此信息浪費异剥;
- 如果供應(yīng)商信息改變瑟由,只需改動一次;
- 如果有重復(fù)數(shù)據(jù)冤寿,很難保證每次輸入該數(shù)據(jù)的方式相同歹苦。
關(guān)系表設(shè)計就是要保證把信息分解成多個表,一類數(shù)據(jù)一個表督怜,各表通過某些常用的值互相關(guān)聯(lián)殴瘦。
在這個例子中,可以建立兩個表号杠,一個存儲供應(yīng)商信息蚪腋,另一個存儲產(chǎn)品信息。
vendors表包含所有供應(yīng)商信息姨蟋,每個供應(yīng)商占一行屉凯,每個供應(yīng)商具有唯一標(biāo)識。此標(biāo)識成為主鍵(primary key)眼溶。
products表存儲產(chǎn)品信息神得,除了供應(yīng)商ID(vendors的主鍵)外不存儲其他供應(yīng)商信息。
vendors表的主鍵又叫做products的外鍵偷仿,將兩表關(guān)聯(lián)起來哩簿,利用供應(yīng)商ID能從vendors表中找出相應(yīng)供應(yīng)商的詳細(xì)信息。
外鍵(foreign key):外鍵為某個表中的一列酝静,它包含另一個表的主鍵值节榜,定義了兩個表之間的關(guān)系。
創(chuàng)建聯(lián)結(jié)
例:
SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;
1鹬恰:使用完全限定列名宗苍。
WHERE子句的重要性
WHERE子句作為過濾條件,它只包含那些匹配給定條件的行薄榛。
笛卡爾積(cartesian product):由沒有聯(lián)結(jié)條件的表返回的結(jié)果為笛卡爾積讳窟。檢索出的行的數(shù)目將是第一個表中的行數(shù)乘以第二個表中的行數(shù)。
例:
SELECT vend_name, prod_name, prod_price
FROM vendors, products
ORDER BY vend_name, prod_name;
內(nèi)部聯(lián)結(jié)
以上均為等值聯(lián)結(jié)(equijoin)敞恋,它基于兩個表之間的相等測試丽啡。這種聯(lián)結(jié)也稱為內(nèi)部聯(lián)結(jié)。
聯(lián)結(jié)多個表
SQL對一條SELECT語句可以聯(lián)結(jié)的表數(shù)目沒有限制硬猫。規(guī)則也相同补箍,首先列出所有表改执,然后定義表之間的關(guān)系。例:
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;