關係型數據庫的威力在於它能將兩種東西關聯起來,即能把多個表中查詢出來的數據結合在一塊兒解答單個數據表不足以解答的問題。sql
聯結查詢(join)數據庫
把多張表查詢到的同類數據進行匹配獲得的查詢結果。code
子查詢event
多表操做的另外一種方法是將SELECT 語句嵌套到另外一個SELECT 語句中,稱之爲子查詢。class
如下用實例分別說明。效率
給定日期查詢分數。容器
首先在grave_event表中找到特定日期的行,原理
獲得對應行號的event_id和score的event_id進行匹配。輸出對應列。sql語句
FROM,要檢索的表。數據類型
ON,兩張表的聯結條件,表裏的值必須匹配。
注意使用(表名.列名)的語法。最好是在使用聯結查詢時候,每一個列名以前都要附帶表名。
而後上面的SQL變成了下面的形式:
簡潔明瞭!
三張表查詢:
內聯結搭配統計:
內聯結原理。
SELECT COUNT(*) FROM `hi_wtgl_wtjl` AS a
最後獲得166 條數據。
SELECT COUNT(*) FROM `hi_wtgl_wtxx` AS a
147個數據。
SELECT COUNT(*) FROM `hi_wtgl_wtxx` AS a, `hi_wtgl_wtjl` AS b
竟然查處24402條數據。166*147=24402。
換聯結查詢試試。
SELECT COUNT(*) FROM `hi_wtgl_wtxx` AS a JOIN `hi_wtgl_wtjl` AS b
結果相同。在查詢時間方面,這兩條語句也是相同的。
當執行
SELECT COUNT(*) FROM `hi_wtgl_wtxx` AS a, `hi_wtgl_wtjl` AS b, `hi_wtgl_fjxx` AS c
以後,結果有14W條。如今你知道那個垃圾系統一條SQL查詢300多億條數據是怎麼來的了吧。
如今揣測如下sql語句操做步驟,首先執行的是FROM後面的語句,看有多少張表,假設有這麼一個容器(每次查詢新建一張表),當只有一張表的時候,新表直接指向舊錶,而後作WHERE後面的操做(過濾知足條件的數據,把不知足條件的數據剔除)。最終在全部知足條件的表中執行SELECT 後面的數據。並返回。(多表聯結查詢實質就是拼接全部行,每一表中的行都要對應另一張表的全部數據。)連接表越多,數據擴大倍數越大,內連接查詢,全部表均可看做是主表的一部分。裏面的每張表都同等重要。
假如每張表重要程度不同,看看下面的
左查詢(LEFT JOIN)
使用左查詢的時候,必須加入限定條件 on假如像如下這樣的話
SELECT COUNT(*) FROM `hi_wtgl_wtxx` AS a LEFT JOIN `hi_wtgl_wtjl` AS b
會報錯!
SELECT COUNT(*) FROM `hi_wtgl_wtxx` AS a LEFT JOIN `hi_wtgl_wtjl` AS b ON a.`wtid` = b.`wtid`
以上語句輸出 221
反過來的話
SELECT COUNT(*) FROM `hi_wtgl_wtjl` AS a LEFT JOIN `hi_wtgl_wtxx` AS b ON a.`wtid` = b.`wtid`
輸出166 .
從這看,使用左聯結比使用子聯結效率不知道高了多少!
假設一下左查詢的實現原理。首先得到左查詢 FROM後面的表爲‘主表‘,讀取ON 後面的檢索條件,整隊主表中的每條數據,都執行一次查詢語句,而後把知足條件的副表中的數據和主表進行整合成一條新數據。
最後返回。
從這個原理看,彷佛這些跨表查詢的效率的差很少。。。只是最後顯示的東西有區別。顯示的少,執行的步驟多,顯示的多,執行的步驟少。
多表LEFT JOIN
一個表是另外一個表的左查詢。原理應該同兩表查詢。猜測下步驟,首先得到主表,而後經過主表得到副表,再經過副表得到副副表。最後整合成一張大表。
子查詢
第一個SELECT 的查詢結果做爲第二個查詢語句的條件。
子查詢不單單能用 IN 或者 NOT IN。
子查詢:是錯誤的。
才正確。
高級一點的子查詢。
IN 、NOT IN
對應一列數據去狀況。
多列查詢狀況:
ALL,ANY,SOME的子查詢
只有一條知足條件, ALL 集合裏面全部日期都要和要查詢的birth作比較,有一條不知足都要捨去。
ANY 意義就不大了。
有一條知足就行。
EXISTS ,NOT EXISTS
這個值返回 true 或者False
UNION 進行多數據檢索:
用於合併兩個或多個 SELECT 語句的結果集,並消去表中任何重複行。使用第一個SELECT做爲結果集字段。全部有效信息存放在第一個SELECT的字段中。這裏的重複數據是指結果集中全部數據都相同。
而UNION ALL 進行數據檢索的時候,會合併全部數據而不進行消除重複行。
注意: UNION 的結果集列的名字來源於第一個SELECT語句中列的名字,後面跟着的SELECT必須有相同數目的列,但有關列沒必要有相同的名字和數據類型。
一圖看懂: