標籤:建立 ems 應用 良好的 and sel 條件 設計 維護
學習目標:瞭解什麼是連接,為什麼要使用連接,如何編寫使用連接的SELECT語句。 連接:SQL最強大的功能之一就是能在資料檢索查詢的執行中連接(join)表。 關係表:關係表的設計就是要保證把資訊分解成多個表,一類資料 一個表。各表通過某些常用的值(即關係設計中的關係(relational))互相關聯。 外鍵(foreign key)外鍵為某個表中的一列,它包含零一個表的主索引值,定義了兩個表之間的關係。 延展性(scale)能夠適應不不斷增加的工作量而不失敗。設計良好的資料庫或應用程式稱之為延展性好(scale well)。 為什麼要使用連接:為瞭解決用單條SELECT語句檢索出儲存在多個表中的資料。 維護參考完整性:連接不是物理實體,它在實際的資料庫表中不存在。連接是由MySQL根據需要建立, 它存在於查詢的執行當中。 在使用關係表時,僅在關係列中插入合法的資料非常重要。如果products表中插入擁有非法供應商ID(即沒有在venders表中出現)的供應商生產的產品,則這些產品是不可以訪問的,因為它們沒有關聯到某個供應商。 為了防止這種情況的發生,可指示MySQL只允許在products表的供應商ID列出現合法值(及出現在venders表中的供應商)。這就是維護參考完整性,它是通過表的定義中指定主鍵和外鍵來實現的。 建立連接:連接的建立非常簡單,規定要連接的所有表及它們如何關聯即可。 SELECT vend_name, prod_name,prod_priceFROM vendors, productsWHERE vendors.vend_id = products.vend_id (完全限定列名)ORDER BY vend_name, prod_name; WHERE子句的重要性:WHERE子句作為過濾條件指示MySQL如何對錶進行連接。 笛卡爾積(cartesian product):由沒有連接條件的表關係返回的結果為笛卡爾積。檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數。 SELECT vend_name, prod_name,prod_priceFROM vendors, productsORDER BY vend_name, prod_name; 不要忘了WNERE子句,應該保證所有連接都有WHERE子句,否則MySQL將返回比想要的資料多得多的資料。同理,應該保證WHERE子句的正確性。不正確的過濾條件將導致MySQL返回不正確的資料。 叉連接(cross join) 內部連接(equijoin):目前為止所用的連接稱為等值連接(equijoin),它基於兩個表之間的 相等測試。這種連接也稱為內部連接。 SELECT vend_name, prod_name,prod_priceFROM vendors INNER JOIN productsON vendors.vend_id = products.vend_id; ANSI SQL規範首選INNER JOIN文法。 連接多個表:SQL對一條SELECT語句中可以連接的表的數目沒有限制。建立連接的基本規則也相同。 Q:顯示編號為20005的訂單中的物品。SELECT `prod_name`, vend_name, prod_price, quantityFROM orderitems, products, vendorsWHERE products.vend_id = vendors.vend_idAND orderitems.`prod_id` = products.`prod_id`AND order_num = 20005; 效能考慮:MySQL在運行時關聯指定的每個表以處理連接。這種處理可能是非常耗費資源的,因此應該仔細,不要連接不必要表。連接的表越多,效能下降的越厲害。 ##Q返回訂購產品TNT2的客戶列表;語句的書寫層次,從外到裡。SELECT cust_name, cust_contactFROM customers, orders, orderitemsWHERE customers.cust_id = orders.cust_idAND orderitems.order_num = orders. order_numAND prod_id = ‘TNT2‘;
第十五章 連接表