SQL必知必會 筆記 第十二章 連接表,sql必知
12.1連接
SQL最強大的功能之一即是在資料查詢的執行中連接(join)表。
12.1.1關係表
相同資料出現多次絕不是一件好事,此因素是關聯式資料庫設計的基礎。關係表的設計就是要保證把資訊分解成多個表,一類資料一個表。各表通過某些常用的值(即關係設計中的關係(relational))互相關聯。
延展性(scale):能夠適應不斷增加的工作量而不失敗。設計良好的資料庫或應用程式稱之為延展性好(scale well)。
12.1.2為什麼要使用連接
如果資料存放區在多個表中,怎樣用單條SELECT語句檢索出資料?
答案是使用連接。簡單的說,連接是一種機制,用來在一條SELECT語句中關聯表,因此稱之為連接。
12.2建立連接
SELECT vend_name,prod_name,prod_priceFROM Vendors,ProductsWHERE Vendors.vend_id = Products.vend_id;
12.2.1WHERE子句的重要性
笛卡爾積(cartesian product):由沒有連結條件的表關係返回的結果為笛卡爾積。檢測出的行的數目將是第一個表中的行數乘以第二個表中的行數。
不要忘了WHERE子句:應該保證所有連接都有WHERE子句,否則DBMS將返回比想要的資料多得多的資料。
12.2.2內部連接
目前為止所用的連接稱為等值連接(equijoin),它基於兩個表之間的相等測試。這種連接也稱為內部連接。
SELECT vend_name,prod_name,prod_priceFROM Vendors INNER JOIN ProductsON Vendors.vend_id = Priducts.vend_id;
12.2.3連接多個表
SQL對一條SELECT語句中可以連接的表的數目沒有限制。建立連接的基本規則也相同。
SELECT prod_name,vend_name,prod_price,quantityFROM OrderItems,Products,VendorsWHERE Products.vend_id = Vendors.vend_id AND OrderItems.prod_id = Products.prod_id AND order_num = 20007;
顯示編號為20007的訂單中的物品。
效能考慮:DBMS在運行時關聯指定的每個表以處理連接。這種處理可能是非常耗費資源的,因此應該仔細,不要連接不必要的表。連接的表越多,效能下降越厲害。
子查詢並不總是執行複雜SELECT操作的最有效方法,也可用連接進行相同的查詢。
SELECT cust_name,cust_contactFROM Customers,Orders,OrderItemsWHERE Customers.cust_id = Order.cust_id AND OrderItems.order_num = Order.order_num AND prod_id = 'RGAN01';