mysql 從版本4 開始支援 sql 標準要求的所有子查詢格式和操作,同時擴充套件了特有的幾種特性。本文會介紹子查詢的型別以及相關的注意點。
一 什麼是子查詢
子查詢是將乙個 select 語句的查詢結果作為中間結果,供另乙個 sql 語句呼叫。如:
select * from t1 where vid in (select vid from t2);
二 mysql 子查詢分類
根據子查詢的返回資料形式,mysql 子查詢可以分為以下幾類:
a 標量子查詢
標量子查詢是指子查詢返回的是單一值的標量,如乙個數字或乙個字串,也是子查詢中最簡單的返回形式。
select * from article where uid = (select uid from user where status=1 order by uid desc limit 1);
使用子查詢進行比較
可以使用 = > < >= <= <> 這些操作符對子查詢的標量結果進行比較,通常子查詢的位置在比較式的右側:
select * from t1 where vid = (select max(col2) from t2);
b 列子查詢
列子查詢是指子查詢返回的結果集是 n 行一列,該結果通常來自對錶的某個字段查詢返回。
乙個列子查詢的例子如下:
select * from article where uid in(select uid from user where status=1);
c 行子查詢
行子查詢是指子查詢返回的結果集是一行 n 列,該子查詢的結果通常是對錶的某行資料進行查詢而返回的結果集。
乙個行子查詢的例子如下:
select * from table1 where (1,2) = (select vid, col2 from table2)
在該例子中,在保證子查詢返回單一行資料的前提下,如果 vid=1 且 col2=2 ,則該查詢結果為 true。
mysql 行構造符
在上面的例子中,where 後面的 (1,2) 被稱為行構造符,也可以寫為row(1,2)。行構造符通常用於與對能返回兩個或兩個以上列的子查詢進行比較。
d from 子句中的子查詢
mysql from 子查詢是指 from 的子句作為子查詢語句,主查詢再到子查詢結果中獲取需要的資料。from 子查詢語法如下:
select ... from (subquery) as name ...
子查詢會生成乙個臨時表,由於 from 子句中的每個表必須有乙個名稱,因此 as name 是必須的。from 子查詢也稱為衍生資料表子查詢。
注意mysql from 子句中的子查詢可以返回標量、列、行或表,但不能為有關聯的子查詢。
e 錶子查詢
錶子查詢是指子查詢返回的結果集是 n 行 n 列的乙個表資料。
select * from article where (title,content,uid) in (select title,content,uid from blog)
該 sql 的意義在於查詢 article 表中指定的字段同時也存在於 blog 表中的所有的行(注意 = 比較操作符換成了 in),實際上等同於下面的條件語句:select * from article,blogwhere (article.title=blog.title and article.content=blog.content and article.uid=blog.uid)
實際上,很多 in 的子查詢都可以修改為 join方式和關聯查詢,而且相比而言後面的效率更高。
f mysql exists 和 not exists 子查詢
其語法如下:
select ... from table where exists (subquery)
該語法可以理解為:
將主查詢的資料,放到子查詢中做條件驗證,根據驗證結果(true 或 false)來決定主查詢的資料結果是否得以保留。
注意:1 exists (subquery) 只返回 true 或 false,因此子查詢中的 select * 也可以是 select 1 或其他,官方說法是實際執行時會忽略 select 清單,因此沒有區別。
2 exists 子查詢的實際執行過程可能經過了優化而不是我們理解上的逐條對比,如果擔憂效率問題,可進行實際檢驗以確定是否有效率問題。
3 exists 子查詢往往也可以用條件表示式、其他子查詢或者 join 來替代,何種最優需要具體問題具體分析。
g mysql 關聯子查詢
關聯子查詢通俗一點來講,就是子查詢引用到了主查詢的資料資料。
以乙個實際的例子來理解關聯子查詢:
select * from article where uid in (select uid from user where article.uid = user.uid);
但在關聯子查詢中,是無法單獨執行子查詢語句的。其實際流程大致為:
1 先做外部主查詢;
2 將主查詢的值傳入子查詢並執行;
3 子查詢再將查詢結果返回主查詢,主查詢根據返回結果完成最終的查詢。
這個執行流程類似於 exists 子查詢,實際上某些情況下 mysql 就是將關聯子查詢重寫為 exists 子查詢來執行的。
三小結上文簡單介紹了子查詢的常見用法,但是生產環境中僅僅知道用法還是不夠的,mysql 本身的子查詢機制(將在下文介紹)使得dba在生產環境中使用子查詢是必須謹慎。
參考
mysql求和 子查詢 MySQL子查詢
到現在為止,我們已經表明,以select宣告是乙個簡單的查詢。該單個語句從單個資料庫表中檢索資料。sql還同意建立乙個子查詢。即巢狀在其他查詢的查詢。下列實施例給出巢狀查詢。一種表示訂單資訊儲存,包含訂單號,客戶id。訂購日期。例如以下所看到的 一張表示儲存訂單物品資訊,例如以下 另一張表儲存的是客...
mysql子查詢應用案例 MySQL子查詢
mysql子查詢 子查詢 sub query,查詢是在某個查詢結果之上進行的,一條select語句內部包含了另外一條select語句。分類子查詢有兩種分類方式,分別為 按按結果分類和位置分類。按結果分類,即根據子查詢得到的資料進行分類 理論上,任何乙個查詢結果都可以理解為乙個二維表 分別為 標量子查...
mysql子查詢教程 MySQL子查詢詳解
子查詢指乙個查詢語句巢狀在另乙個查詢語句內部的查詢,這個特性從 mysql 4.1 開始引入,在 select 子句中先計算子查詢,子查詢結果作為外層另乙個查詢的過濾條件,查詢可以基於乙個表或者多個表。子查詢中常用的操作符有 any some all in 和 exists。子查詢可以新增到 sel...