MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā)祟辟,目前屬于 Oracle 旗下產(chǎn)品医瘫。MySQL 最流行的關系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應用方面MySQL是最好的 RDBMS (Relational Database Management System旧困,關系數(shù)據(jù)庫管理系統(tǒng)) 應用軟件之一醇份。
MySQL是一種關聯(lián)數(shù)據(jù)庫管理系統(tǒng)稼锅,關聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi)僚纷,這樣就增加了速度并提高了靈活性矩距。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL 軟件采用了雙授權政策怖竭,它分為社區(qū)版和商業(yè)版锥债,由于其體積小、速度快痊臭、總體擁有成本低赞弥,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫趣兄。由于其社區(qū)版的性能卓越绽左,搭配 PHP 和 Apache 可組成良好的開發(fā)環(huán)境。
一艇潭、使用不同類型的聯(lián)結
1.自聯(lián)結
自聯(lián)結通常作為外部語句來替代從相同表中檢索數(shù)據(jù)時使用的子查詢語句拼窥。雖然最終的結果是相同的,但有時候處理聯(lián)結比處理子查詢快得多蹋凝。
例如:假如發(fā)現(xiàn)某物品(其ID為DTNTR)存在問題鲁纠,因此想知道生產(chǎn)該物品的供應商生產(chǎn)的其他物品是否也存在這些問題。此查詢要求首先找到生產(chǎn)ID為DTNTR的物品的供應商鳍寂,然后找出這個供應商生產(chǎn)的其他物品改含。
方法一:
SELECT prod_id, prod_name FROM products WHERE vend_id = (SELECT vend_id FROM products WHERE prod_id = 'DTNTR');
此語句的輸出如下圖所示:
方法二(使用聯(lián)結):
SELECT p1.prod_id, p1.prod_name FROM products AS p1,products AS p2 WHERE p1.vend_id = p2.vend_id AND P2.prod_id = 'DTNTR';
此語句的輸出如下圖所示:
2.自然聯(lián)結
無論何時對表進行聯(lián)結,應該至少有一個列出現(xiàn)在不止一個表中(被聯(lián)結的列)迄汛。標準的聯(lián)結返回所有數(shù)據(jù)捍壤,甚至相同的列多次出現(xiàn)。自然連接排除多次出現(xiàn)鞍爱,使每個列只返回一次鹃觉。
自然聯(lián)結是這樣一種聯(lián)結,其中你只能選擇那些唯一的列睹逃。這一般是通過對表使用通配符(SELECT *)盗扇,對所有其他表的列使用明確的子集來完成的。示例如下:
SELECT c.*, o.order_num,o.order_date,oi.prod_id,oi.quantity,oi.item_price FROM customers AS c,orders AS o,orderitems AS oi WHERE c.cust_id=o.cust_id AND oi.order_num=o.order_num AND prod_id='FB';
3.外部聯(lián)結
許多聯(lián)結將一個表中的行與另一個表中的行相關聯(lián)沉填。但有時候會需要包含沒有關聯(lián)行的那些行疗隶。
內(nèi)部聯(lián)結如下:
SELECT customers.cust_id,orders.order_num FROM customers INNER JOIN orders ON customers.cust_id=orders.cust_id;
此語句的輸出如下圖所示:
外部聯(lián)結如下:
SELECT customers.cust_id,orders.order_num FROM customers LEFT OUTER JOIN orders ON customers.cust_id=orders.cust_id;
此語句的輸出如下圖所示:
二、使用帶聚集函數(shù)的聯(lián)結
例如:檢索所有客戶以及每個客戶所下的訂單數(shù)翼闹。
SELECT customers.cust_name,customers.cust_id, COUNT(orders.order_num) AS num_ord FROM customers INNER JOIN orders ON customers.cust_id=orders.cust_id GROUP BY customers.cust_id;
此語句的輸出如下圖所示:
三斑鼻、使用聯(lián)結和聯(lián)結條件
(1)注意所使用的聯(lián)結類型。一般我們使用內(nèi)部聯(lián)結橄碾,但使用外部聯(lián)結也是有效的卵沉。
(2)保證使用正確的聯(lián)結條件颠锉,否則將返回不正確的數(shù)據(jù)。
(3)應該總是提供聯(lián)結條件史汗,否則會得出笛卡爾積琼掠。
(4)在一個聯(lián)結中可以包含多個表,甚至對于每個聯(lián)結可以采用不同的聯(lián)結類型停撞。雖然這樣做是合法的瓷蛙,一般也很有用,但應該在一起測試他們前戈毒,分別測試每個聯(lián)結艰猬。這將使故障排除更為簡單。