mysql子查詢教程 MySQL子查詢詳解

2021-10-18 08:33:01 字數 4343 閱讀 2733

子查詢指乙個查詢語句巢狀在另乙個查詢語句內部的查詢,這個特性從

mysql 4.1 開始引入,在 select 子句中先計算子查詢,子查詢結果作為外層另乙個查詢的過濾條件,查詢可以基於乙個表或者多個表。

子查詢中常用的操作符有 any(some)、all、in 和 exists。

子查詢可以新增到 select、update 和 delete 語句中,而且可以進行多層巢狀。子查詢也可以使用比較運算子,如「」、「>=」、「!=」等。

子查詢中常用的運算子

1) in子查詢 結合關鍵字 in 所使用的子查詢主要用於判斷乙個給定值是否存在於子查詢的結果集中。其語法格式為:

[not] in 語法說明如下。

:用於指定表示式。當表示式與子查詢返回的結果集中的某個值相等時,返回 true,否則返回 false;若使用關鍵字 not,則返回的值正好相反。

:用於指定子查詢。這裡的子查詢只能返回一列資料。對於比較複雜的查詢要求,可以使用 select 語句實現子查詢的多層巢狀。

2) 比較運算子子查詢 比較運算子所使用的子查詢主要用於對表示式的值和子查詢返回的值進行比較運算。其語法格式為:

語法說明如下。

:用於指定子查詢。

:用於指定要進行比較的表示式。

all、some 和 any:可選項。用於指定對比較運算的限制。其中,關鍵字 all 用於指定表示式需要與子查詢結果集中的每個值都進行比較,當表示式與每個值都滿足比較關係時,會返回 true,否則返回 false;關鍵字 some 和 any 是同義詞,表示表示式只要與子查詢結果集中的某個值滿足比較關係,就返回 true,否則返回 false。

3) exist子查詢 關鍵字 exist 所使用的子查詢主要用於判斷子查詢的結果集是否為空。其語法格式為:

exist 若子查詢的結果集不為空,則返回 true;否則返回 false。

子查詢的應用 【例項 1】在 tb_departments 表中查詢 dept_type 為 a 的學院 id,並根據學院 id 查詢該學院學生的名字,輸入的 sql 語句和執行結果如下所示。

mysql> select name from tb_students_info

-> where dept_id in

-> (select dept_id

-> from tb_departments

-> where dept_type= 'a' );

| name |

| dany |

| henry |

| jane |

| jim |

| john |

5 rows in set (0.01 sec) 上述查詢過程可以分步執行,首先內層子查詢查出 tb_departments 表中符合條件的學院 id,單獨執行內查詢,查詢結果如下所示。

mysql> select dept_id

-> from tb_departments

-> where dept_type='a';

| dept_id |

| 1 |

| 2 |

2 rows in set (0.00 sec) 可以看到,符合條件的 dept_id 列的值有兩個:1 和 2。然後執行外層查詢,在 tb_students_info 表中查詢 dept_id 等於 1 或 2 的學生的名字。巢狀子查詢語句還可以寫為如下形式,可以實現相同的效果。

mysql> select name from tb_students_info

-> where dept_id in(1,2);

| name |

| dany |

| henry |

| jane |

| jim |

| john |

5 rows in set (0.03 sec) 上例說明在處理 select 語句時,mysql 實際上執行了兩個操作過程,即先執行內層子查詢,再執行外層查詢,內層子查詢的結果作為外部查詢的比較條件。

【例項 2】與前乙個例子類似,但是在 select 語句中使用 not in 關鍵字,輸入的 sql 語句和執行結果如下所示。

mysql> select name from tb_students_info

-> where dept_id not in

-> (select dept_id

-> from tb_departments

-> where dept_type='a');

| name |

| green |

| lily |

| susan |

| thomas |

| tom |

5 rows in set (0.04 sec)

mysql> select name from tb_students_info

-> where dept_id =

-> (select dept_id

-> from tb_departments

-> where dept_name='computer');

| name |

| dany |

| jane |

| jim |

3 rows in set (0.00 sec) 【例項 4】在 tb_departments 表中查詢 dept_name 不等於「computer」的學院 id,然後在 tb_students_info 表中查詢所有該學院的學生的姓名,輸入的 sql 語句和執行過程如下所示。

mysql> select name from tb_students_info

-> where dept_id <>

-> (select dept_id

-> from tb_departments

-> where dept_name='computer');

| name |

| green |

| henry |

| john |

| lily |

| susan |

| thomas |

| tom |

7 rows in set (0.00 sec) 【例項 5】查詢 tb_departments 表中是否存在 dept_id=1 的**商,如果存在,就查詢 tb_students_info 表中的記錄,輸入的 sql 語句和執行結果如下所示。

mysql> select * from tb_students_info

-> where exists

-> (select dept_name

-> from tb_departments

-> where dept_id=1);

| id | name | dept_id | age | *** | height | login_date |

| 1 | dany | 1 | 25 | f | 160 | 2015-09-10 |

| 2 | green | 3 | 23 | f | 158 | 2016-10-22 |

| 3 | henry | 2 | 23 | m | 185 | 2015-05-31 |

| 4 | jane | 1 | 22 | f | 162 | 2016-12-20 |

| 5 | jim | 1 | 24 | m | 175 | 2016-01-15 |

| 6 | john | 2 | 21 | m | 172 | 2015-11-11 |

| 7 | lily | 6 | 22 | f | 165 | 2016-02-26 |

| 8 | susan | 4 | 23 | f | 170 | 2015-10-01 |

| 9 | thomas | 3 | 22 | m | 178 | 2016-06-07 |

| 10 | tom | 4 | 23 | m | 165 | 2016-08-05 |

10 rows in set (0.00 sec) 由結果可以看到,內層查詢結果表明 tb_departments 表中存在 dept_id=1 的記錄,因此 exsts 表示式返回 true,外層查詢語句接收 true 之後對錶 tb_students_info 進行查詢,返回所有的記錄。

exists 關鍵字可以和條件表示式一起使用。

【例項 6】查詢 tb_departments 表中是否存在 dept_id=7 的**商,如果存在,就查詢 tb_students_info 表中的記錄,輸入的 sql 語句和執行結果如下所示。

mysql> select * from tb_students_info

-> where exists

-> (select dept_name

-> from tb_departments

-> where dept_id=7);

empty set (0.00 sec)

mysql教程查詢子節點 mysql如何查詢子節點

mysql查詢子節點的方法 首先建立menu表,並插入資料 然後使用語句進行查詢,為 select id from select t1.id,if find in set parent id,pids 0.mysql查詢子節點的方法 建立menu表 create table menu id int ...

mysql求和 子查詢 MySQL子查詢

到現在為止,我們已經表明,以select宣告是乙個簡單的查詢。該單個語句從單個資料庫表中檢索資料。sql還同意建立乙個子查詢。即巢狀在其他查詢的查詢。下列實施例給出巢狀查詢。一種表示訂單資訊儲存,包含訂單號,客戶id。訂購日期。例如以下所看到的 一張表示儲存訂單物品資訊,例如以下 另一張表儲存的是客...

mysql子查詢應用案例 MySQL子查詢

mysql子查詢 子查詢 sub query,查詢是在某個查詢結果之上進行的,一條select語句內部包含了另外一條select語句。分類子查詢有兩種分類方式,分別為 按按結果分類和位置分類。按結果分類,即根據子查詢得到的資料進行分類 理論上,任何乙個查詢結果都可以理解為乙個二維表 分別為 標量子查...