定義:
子查詢指乙個查詢語句巢狀在另乙個查詢語句內部的查詢,這個特性從 mysql4.1 開始引入,在 select 子句中先計算子查詢,子查詢結果作為外層另乙個查詢的過濾條件,查詢可以基於乙個表或者多個表。
子查詢中常用的操作符有 any(some)、all、in 和 exists。
子查詢可以新增到 select、update 和 delete 語句中,而且可以進行多層巢狀。子查詢也可以使用比較運算子,如「」、「>=」、「!=」等。
子查詢常用的運算子:
1) in子查詢
結合關鍵字 in 所使用的子查詢主要用於判斷乙個給定值是否存在於子查詢的結果集中。其語法格式為:
《表示式》 [not] in 《子查詢》
語法說明如下。
2) 比較運算子子查詢
比較運算子所使用的子查詢主要用於對表示式的值和子查詢返回的值進行比較運算。其語法格式為:
《表示式》
《子查詢》
語法說明如下。
3) exist子查詢
關鍵字 exist 所使用的子查詢主要用於判斷子查詢的結果集是否為空。其語法格式為:
exist 《子查詢》
若子查詢的結果集不為空,則返回 true;否則返回 false。
應用舉例說明
【例項 1】在 tb_departments 表中查詢 dept_type 為 d 的學院 id,並根據學院 id 查詢該學院學生的名字,輸入的 sql 語句和執行結果如下所示。
tb_students_info資料表內容查詢如下:
tb_departments表內容查詢如下:
例項1條件查詢結果如下:
上述查詢過程可以分步執行,首先內層子查詢查出 tb_departments 表中符合條件的學院 id,單獨執行內查詢,查詢結果如下所示。
可以看到,符合條件的 dept_id 列的值有四個:4、5、6、7。然後執行外層查詢,在 tb_students_info 表中查詢 dept_id 等於 4 或 5或6或7 的學生的名字。巢狀子查詢語句還可以寫為如下形式,可以實現相同的效果。
上例說明在處理 select 語句時,mysql 實際上執行了兩個操作過程,即先執行內層子查詢,再執行外層查詢,內層子查詢的結果作為外部查詢的比較條件。
【例項 2】與前乙個例子類似,但是在 select 語句中使用 not in 關鍵字,輸入的 sql 語句和執行結果如下所示。
【例項 3】在 tb_departments 表中查詢 dept_name 等於「computer」的學院 id,然後在 tb_students_info 表中查詢所有該學院的學生的姓名,輸入的 sql 語句和執行過程如下所示。
例項 4】在 tb_departments 表中查詢 dept_name 不等於「computer」的學院 id,然後在 tb_students_info 表中查詢所有該學院的學生的姓名,輸入的 sql 語句和執行過程如下所示。
【例項 5】查詢 tb_departments 表中是否存在 dept_id=1 的**商,如果存在,就查詢 tb_students_info 表中的記錄,輸入的 sql 語句和執行結果如下所示。
由結果可以看到,內層查詢結果表明 tb_departments 表中存在 dept_id=1 的記錄,因此 exsts 表示式返回 true,外層查詢語句接收 true 之後對錶 tb_students_info 進行查詢,返回所有的記錄。
exists 關鍵字可以和條件表示式一起使用。
【例項 6】查詢 tb_departments 表中是否存在 dept_id=10 的**商,如果存在,就查詢 tb_students_info 表中的記錄,輸入的 sql 語句和執行結果如下所示。
由結果可以看到,內層查詢結果表明 tb_departments 表中不存在 dept_id=10的記錄,因此 exsts 表示式返回 false,外層查詢語句接收 false之後對錶 tb_students_info 進行查詢,返回空。
mysql之子查詢
所謂子查詢,就是指在乙個查詢之中巢狀了其他的若干查詢,通過子查詢可以實現多表查詢,該查詢語句中可能包含in,any,all和exists等關鍵字,除此之外還可以包含比較運算子,子查詢經常出現在where和from字句中。where字句中的子查詢 該位置處的子查詢一般返回單行單列,多行單列,單行多列資...
mysql資料查詢之子查詢
子查詢概念 sub query select select 1 標量子查詢 where 之後寫 確定某乙個值 select from student where c id select idfrom class where grade pm3.1 2 列子查詢 where 之後 寫 in,是一列的所...
Mysql之子查詢和union
在之前的表基礎上建立表 create table price level id int pricelevel int price float description varchar 300 insert into price level id pricelevel price description...