講子查詢之前,我們先來看看視圖,何謂視圖 ? 視圖是基于 SQL 語句的結果集的可視化的表,包含行和列,就像一個真實的表,但只是一張虛擬表,我們可以將其視作為一張普通的表;視圖只供數據查詢,不能進行數據更改,也不能保存數據,查詢數據來源于我們的實體表;說的簡單點,視圖就是復雜 SELECT 語句的一個代號,為查詢提供便利。視圖總是顯示最近的數據,每當我們查詢視圖時,數據庫引擎通過使用 SQL 語句來重建數據。
那何謂子查詢,它與視圖又有何關系 ? 視圖是持久化的 SELECT 語句,而子查詢就是將定義視圖的 SELECT 語句直接用于 FROM 子句當中,它是個一次性的視圖,在 SELECT 語句執行完之后就會消失。光說概念,可能還是不太好理解,我們來看下視圖與子查詢的具體示例,通過示例我們就能更好的理解了
假設我們有如下表
CREATE TABLE t_customer_credit ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主鍵', login_name VARCHAR(50) NOT NULL COMMENT '登錄名', credit_type TINYINT(1) NOT NULL COMMENT '額度類型,1:自由資金,2:凍結資金,3:優惠', amount DECIMAL(22,6) NOT NULL DEFAULT '0.00000' COMMENT '額度值', create_by VARCHAR(50) NOT NULL COMMENT '創建者', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP title="算命中有子多行是什麼意思" alt="算命中有子多行是什麼意思">換成子查詢的方式,SQL 如下
SELECT free.login_name, free.freeAmount, freeze.freezeAmount, promotion.promotionAmountFROM ( SELECT login_name, amount freeAmount FROM t_customer_credit WHERE credit_type = 1) free LEFT JOIN( SELECT login_name, amount freezeAmount FROM t_customer_credit WHERE credit_type = 2) freeze title="算命中有子多行是什麼意思" alt="算命中有子多行是什麼意思">使用標量子查詢時,我們需要注意一點:我們要明確的知道該子查詢返回的結果就是單一值,絕對不能返回多行結果。不然執行會報錯
關聯子查詢關聯子查詢是指一個包含對表的引用的子查詢,該表也顯示在外部查詢中。通俗一點來講,就是子查詢引用到了主查詢的數據數據。在關聯子查詢中,對于外部查詢返回的每一行數據,內部查詢都要執行一次。另外,在關聯子查詢中是信息流是雙向的,外部查詢的每行數據傳遞一個值給子查詢,然后子查詢為每一行數據執行一次并返回它的記錄。然后,外部查詢根據返回的記錄做出決策。光看概念,晦澀難懂,我們結合具體的例子來看關聯子查詢
還是以商品表:t_commodity 為例,如何選取出各商品類別中高于該類別平均出售價格的商品,可能大家還沒明白這個需求,那麼我們具體點
所有商品的類別、出售價格如下
各類別及類別平均出售價格如下
我們得到的正確結果應該是
這個 SQL 我們要如何寫? 像這樣
-- 錯誤的 SQLSELECT * FROM t_commodityWHERE sell_unit_price > ( SELECT AVG(sell_unit_price) FROM t_commodity GROUP BY category)是肯定不行的,那正確的打開方式應該是怎麼樣的了,此時需要關聯子查詢上場了,SQL如下
SELECT * FROM t_commodity t1WHERE sell_unit_price > ( SELECT AVG(sell_unit_price) FROM t_commodity t2 WHERE t1.category = t2.category GROUP BY category)子查詢中的 WHERE 子句(WHERE t1.category = t2.category) 至關重要,它的作用是在同一商品類別中對各商品的出售單價與平均單價進行比較。在對表中某一部分記錄的集合進行比較時,就可以使用關聯子查詢,當出現 “限定” 或 “限制” 這樣的詞匯時,通常會使用關聯子查詢。
在關聯子查詢中,對于外部查詢返回的每一行數據,內部查詢都要執行一次,DBMS 內部的執行結果類似如下
總結1、SQL 執行順序
(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>(1) FROM <left_table>(3) <join_type> JOIN <right_table>(2) ON <join_condition>(4) WHERE <where_condition>(5) GROUP BY <group_by_list>(6) WITH {CUBE | ROLLUP}(7) HAVING <having_condition>(10) ORDER BY <order_by_list>2、書寫位置
子查詢可以在 SELECT、INSERT、UPDATE 和 DELETE 語句中,同 =、<、>、>=、<=、IN、BETWEEN 等運算符一起使用,使用起來也是非常靈活的;標量子查詢出現的位置就更靈活了,并不僅僅局限于 WHERE 子句中,通常任何可以使用單一值的位置都可以使用,SELECE 子句、GROUP BY 子句、HAVING 子句、ORDER BY 子句,也就是說,能夠使用常量或者列名的地方,都可以使用標量子查詢。
3、效率問題
子查詢的效率一直都是一個比較頭疼的問題,加合適的索引能改善效率,但也只是局限于很少的情況;如果數據量大,對性能要求又高,能不用子查詢就盡量別用子查詢,盡量用其他的方式替代,很多情況下,子查詢可以用關聯查詢來替代
本文來自:解夢佬,原地址:https://www.jiemenglao.com/suanming/356417.html