數據庫操作總結(三)

《聯結表》
1.聯結
(1)關係表
外鍵(foreign key) 外鍵爲某個表中的一列,它包含另一個表 的主鍵值,定義了兩個表之間的關係。
關係數據可以有效地存儲和方便地處理。因此,關係數據庫 的可伸縮性遠比非關係數據庫要好。
可伸縮性(scale) 能夠適應不斷增加的工作量而不失敗。設 計良好的數據庫或應用程序稱之爲可伸縮性好。
(2)爲什麼要使用聯結表?
分解數據爲多個表能更有效地存儲,更方便地處理,並 且具有更大的可伸縮性。但這些好處是有代價的。
如果數據存儲在多個表中,怎樣用單條SELECT語句檢索出數據?
答案是使用聯結。簡單地說,聯結是一種機制,用來在一條SELECT 語句中關聯表,因此稱之爲聯結。使用特殊的語法,可以聯結多個表返 回一組輸出,聯結在運行時關聯表中正確的行。
創建聯結
下面的聯結方式都稱爲等值聯結內部聯結
聯結的創建非常簡單,規定要聯結的所有表以及它們如何關聯即可。 請看下面的例子:
在這裏插入圖片描述
在這裏插入圖片描述
笛卡兒積(cartesian product) 由沒有聯結條件(沒有使用where子句進行過濾)的表關係返回 的結果爲笛卡兒積。檢索出的行的數目將是第一個表中的行數乘 以第二個表中的行數。
可以看出,笛卡爾積返回的結果行數因爲沒有進行過濾,數量將會增加很多,而且很多信息並不是我們想要的。因此不要忘了WHERE子句 應該保證所有聯結都有WHERE子句,否 則MySQL將返回比想要的數據多得多的數據。同理,應該保 證WHERE子句的正確性。不正確的過濾條件將導致MySQL返回不正確的數據。
爲了防止忘記聯結條件,通常會這樣寫:
在這裏插入圖片描述
在這裏插入圖片描述
兩種方法都可以,但是第二種更加推薦,可以更好的防止忘記寫聯結條件。
聯結多個表
SQL對一條SELECT語句中可以聯結的表的數目沒有限制。創建聯結 的基本規則也相同。首先列出所有表,然後定義表之間的關係。例如:
在這裏插入圖片描述
在這裏插入圖片描述
**性能考慮:**MySQL在運行時關聯指定的每個表以處理聯結。 這種處理可能是非常耗費資源的,因此應該仔細,不要聯結不必要的表。聯結的表越多,性能下降越厲害。

《創建高級聯結》
1.使用表的別名
比較簡單,舉例說明:
在這裏插入圖片描述
2.使用不同類型的聯結
(1)自聯結
假如你發現某物品(其ID爲DTNTR)存在問題,因此想知道生產該物 品的供應商生產的其他物品是否也存在這些問題。此查詢要求首先找到 生產ID爲DTNTR的物品的供應商,然後找出這個供應商生產的其他物品。 下面是解決此問題的一種方法:
在這裏插入圖片描述
在這裏插入圖片描述
2.自然聯結
無論何時對錶進行聯結,應該至少有一個列出現在不止一個表中(被 聯結的列)。標準的聯結(前一章中介紹的內部聯結)返回所有數據,甚 至相同的列多次出現。自然聯結排除多次出現,使每個列只返回一次。
怎樣完成這項工作呢?答案是,系統不完成這項工作,由你自己完 成它。自然聯結是這樣一種聯結,其中你只能選擇那些唯一的列。這一 般是通過對錶使用通配符(SELECT *),對所有其他表的列使用明確的子 集來完成的。下面舉一個例子:
在這裏插入圖片描述
3.外部聯結
許多聯結將一個表中的行與另一個表中的行相關聯。但有時候會需 要包含沒有關聯行的那些行,例如要求輸出:對每個客戶下了多少訂單進行計數,包括那些至今尚未下訂單的 客戶;
簡單的內部聯結:
在這裏插入圖片描述
外部聯結語法類似。爲了檢索所有客戶,包括那些沒有訂單的客戶, 可如下進行:
在這裏插入圖片描述
在這裏插入圖片描述
兩者的區別:
左外聯結 Left OUTER JOIN: 以左邊的表爲標準,找到右邊表中相應的對等元素,然後兩行聯結,如果右邊表不包含相應的對等元素,此行對應的右邊元素全爲NULL。
右外聯結RIGHT OUTER JOIN: 則與左外聯結完全相反。
外部聯結的類型 存在兩種基本的外部聯結形式:左外部聯結 和右外部聯結。它們之間的唯一差別是所關聯的表的順序不 同。換句話說,左外部聯結可通過顛倒FROM或WHERE子句中表的順序轉換爲右外部聯結。因此,兩種類型的外部聯結可互 換使用,而究竟使用哪一種純粹是根據方便而定。
4.使用帶聚集函數的聯結
聚集函數用來彙總數據。雖然至今爲止聚集函數 的所有例子只是從單個表彙總數據,但這些函數也可以與聯結一起使用。爲說明這一點,請看一個例子。如果要檢索所有客戶及每個客戶所 下的訂單數,下面使用了COUNT()函數的代碼可完成此工作:
在這裏插入圖片描述
聚集函數也可以方便地與其他聯結一起使用,這裏不再贅述其他。
使用聯結和聯結條件
在這裏插入圖片描述
《組合查詢》
1.union
UNION指示MySQL執行兩條SELECT語句,並把輸出組 合成單個查詢結果集。簡單一個字“並”。
例:
在這裏插入圖片描述
UNION的使用規則:
<1>.UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關 鍵字UNION分隔(因此,如果組合4條SELECT語句,將要使用3個 UNION關鍵字) 。
<2>.UNION中的每個查詢必須包含相同的列、表達式或聚集函數(不各個列不需要以相同的次序列出)。
<3>.列數據類型必須兼容:類型不必完全相同,但必須是DBMS可以 隱含地轉換的類型(例如,不同的數值類型或不同的日期類型)
2.包含或取消重複的行
UNION從查詢結果集中自動去除了重複的行(換句話說,它的行爲與 單條SELECT語句中使用多個WHERE子句條件一樣)。
這是UNION的默認行爲,但是如果需要,可以改變它。事實上,如果 想返回所有匹配行,可使用UNION ALL而不是UNION.
在這裏插入圖片描述
在這裏插入圖片描述
3. 對組合查詢結果排序
**SELECT語句的輸出用ORDER BY子句排序。在用UNION組合查詢時,只 能使用一條ORDER BY子句,它必須出現在最後一條SELECT語句之後。**對 於結果集,不存在用一種方式排序一部分,而又用另一種方式排序另一 部分的情況,因此不允許使用多條ORDER BY子句。
例:
在這裏插入圖片描述
優點:使用UNION可極大地簡化複雜的WHERE子句。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章