04-01-子查詢
子查詢
什麼是子查詢
子查詢概念
子查詢:sub query
子查詢是一種常用的計算機語言SELECT-SQL
語言中巢狀查詢下層的程式模組。當一個查詢是另一個查詢的條件時,稱之為子查詢
通俗來講就是:在一條select
語句中,嵌入了另外一條select
語句,那麼被嵌入的select
語句稱之為子查詢語句。
主查詢概念
主要的查詢物件,第一條select
語句,確定了使用者所有獲取的資料目標(資料來源),已經要具體得到的欄位資訊
子查詢和主查詢的關係
- 子查詢是嵌入到主查詢的
- 子查詢是輔助主查詢的:要麼作為條件,要麼作為資料來源
- 子查詢可以獨立存在:是一條完整的
select
子查詢分類
按功能分
- 標量子查詢:子查詢返回的結果是一個數據(一行一列)
- 列子查詢:子查詢返回的結果是一列(一列多行)
- 行子查詢:子查詢返回的結果是一行(一行多列)
- 表子查詢:子查詢返回的結果是多行多列
exists
子查詢:子查詢返回的結果是0
或者1
(類似布林操作)
按位置分
where
子查詢:子查詢的位置出現在where
條件中from
子查詢:子查詢的位置出現在from
資料來源中
標量子查詢
概念
子查詢返回的結果是一個數據(一行一列)
語法
select * from 資料來源 where 判斷條件 =/<> (select 欄位名 from 資料來源 where 判斷條件);
//子查詢得到的結果只有一個值
測試案例
需求:知道一個學生的名字 想知道他在哪個班級(班級的名字)
分析:
1.通過學生表獲取他所在班級id
2.根據班級id獲取班級名字
通過標量子查詢實現
select * from my_class where class_id = (select class_id from my_student where stu_name='小豬');
列子查詢
概念
子查詢返回的結果是一列(一列多行)
語法
主查詢 where 條件 in(列子查詢)
測試案例
需求:獲取已經有學生在班的所有班級名字
分析:
- 找出學生表中所有的班級id
- 找出班級表中對應的名字
通過列子查詢實現
select name from my_class where class_id in (select distinct class_id from my_student);
行子查詢
概念
子查詢返回的結果是一行(一行多列)
行元素
欄位元素是指一個欄位對應的值,行元素對應的就是多個欄位:多個欄位合起來作為一個元素參與運算,把這種情況稱之為行元素
語法
主查詢 where 條件[(構造一個行元素)]=(行子查詢);
測試案例
需求:獲取班級上年齡最大且身高最高的學生
分析:
- 求出班級年齡最大的值
- 求出班級身高最高的值
- 求出對應的學生
通過行子查詢實現
select * from my_student where (stu_age,stu_height)=(select max(stu_age),max(stu_height) from my_student);
總結
對於標量子查詢、列子查詢、行子查詢都屬於where
子查詢
表子查詢
概念
子查詢返回的結果是多行多列(一行一列),表子查詢和行子查詢非常相似,只是行子查詢需要產生行元素而表子查詢沒有。
行子查詢用於where
子查詢,而表子查詢用於from
子查詢
語法
select 欄位列表 from (表子查詢) as 別名 [where] [group by] [having] [order by] [limit];
exists
子查詢
概念
子查詢返回的結果是0
或者1
(類似布林操作)
語法
where exists (子查詢)
測試案例
需求:求出有學生在的所有班級
select * from my_class as c where exists (select * from my_student as s where s.class_id=c.class_id);
子查詢特定關鍵字的使用
in
主查詢 where 條件 in(列子查詢);
any
任意一個
-
=any(列子查詢)
:條件在查詢結果中有任意一個匹配即可,等價於in
1 =any(1,2,3)
:true
-
<>any(列子查詢)
:條件在查詢結果中不等於任意一個1 <>any(1,2,3)
:true
some
與any
完全一樣:
all
-
=all(列子查詢)
:等於裡面所有 -
<>all(列子查詢)
:不等於其中所有