查詢數據庫,當查詢條件比較復雜時,常常需要用到子查詢。子查詢(Subquery)是指出現在其他SQL語句內的SELECT子句。本文將詳細介紹子查詢
子查詢(Subquery)是指出現在其他SQL語句內的SELECT子句
SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2);
其中,SELECT * FROM t1,稱為外層查詢(Outer Query/Outer Statement),SELECT col2 FROM t2,稱為子查詢(SubQuery)
在使用子查詢時,需要注意的是
1、子查詢指嵌套在查詢內部,且必須始終出現在圓括號內
2、子查詢語句中可以包含多個關鍵字或條件,如DISTINCT、GROUP BY、ORDER BY、LIMIT、函數等
3、子查詢的外層查詢可以是:SELECT、INSERT、UPDATE、SET或DO
4、子查詢可以返回值:標量、一行、一列或者子查詢
使用比較符是其中一類子查詢
operand comparison_operator subquery
比較運算符包括=、!=、<>、<=> 、>、<、>=、<=
數據准備
下載數據文件,建立數據庫,數據表,並存入相應記錄
求所有電腦產品的平均價格,並且保留兩位小數,AVG、MAX、MIN、COUNT、SUM為聚合函數
[注意]AVG()是一個用來求平均值的函數
查詢所有價格大於平均價格的商品
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > 5391.30;
通過子查詢來實現相同的需求
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > (SELECT ROUND(AVG(goods_price),2) FROM tdb_goods);
查詢類型為“超記本”的商品價格
查詢價格大於或等於"超級本"價格的商品
系統提示錯誤,子查詢返回的多於一行,因為子查詢有3條結果,SELECT無法知道要大於子查詢中3條結果中的哪一個。所以,這時就需要用到接下來要介紹的修飾關鍵字
修飾關鍵字包括ANY、some、all三個,如果子查詢返回多個值時,可以使用它們
operand comparison_operator ANY(子查詢) operand comparison_operator SOME(子查詢) operand comparison_operator ALL(子查詢)
情況處理
1、運算符為>或>=,使用ANY關鍵字時,表示大於子查詢結果中的最小值
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price > ANY (SELECT goods_price FROM tdb_goods WHERE goods_cate = '超級本');
由結果可知,返回的都大於4299的值,即最小值
2、運算符為>或>=,使用ALL關鍵字時,表示大於子查詢結果中的最大值
3、運算符為<或<=,使用ANY或SOME關鍵字時,表示小於子查詢結果中的最大值;使用ALL關鍵字時,表示小於子查詢結果中的最小值
4、運算符為=,使用ANY或SOME關鍵字時,表示等於子查詢結果中的任意值;使用ALL關鍵字時,則返回空
operand comparison_operator [NOT] IN (subquery)
第二種子查詢是由IN 或 NOT IN引發的子查詢,與比較運算符使用的方法基本相同
其中,= ANY 運算符與 IN 等效,!= ALL或 <> ALL運算符與 NOT IN 等效
[NOT] EXISTS
第三種子查詢是由EXISTS 或 NOT EXISTS引發的子查詢。如果子查詢返回任何行,EXISTS將返回TRUE;否則返回FALSE
我們可以把查詢結果統一存儲到一個新的數據表中,而不需要一條一條地錄入
下面,先創建一個“商品分類”空表
然後,查詢tdb_goods表的所有記錄,並且按"類別"分組
將分組結果寫入到“商品分類”數據表中
INSERT [INTO] tbl_name [(col_name),...)] SELECT...;