1. 程式人生 > >04-01-子查詢

04-01-子查詢

子查詢

什麼是子查詢

子查詢概念

子查詢:sub query

子查詢是一種常用的計算機語言SELECT-SQL語言中巢狀查詢下層的程式模組。當一個查詢是另一個查詢的條件時,稱之為子查詢

通俗來講就是:在一條select語句中,嵌入了另外一條select語句,那麼被嵌入的select語句稱之為子查詢語句。

主查詢概念

主要的查詢物件,第一條select語句,確定了使用者所有獲取的資料目標(資料來源),已經要具體得到的欄位資訊

子查詢和主查詢的關係

  1. 子查詢是嵌入到主查詢的
  2. 子查詢是輔助主查詢的:要麼作為條件,要麼作為資料來源
  3. 子查詢可以獨立存在:是一條完整的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(列子查詢)

測試案例

需求:獲取已經有學生在班的所有班級名字

分析:

  1. 找出學生表中所有的班級id
  2. 找出班級表中對應的名字

通過列子查詢實現

select name from my_class where class_id in (select distinct class_id from my_student);

在這裡插入圖片描述

行子查詢

概念

子查詢返回的結果是一行(一行多列)

行元素

欄位元素是指一個欄位對應的值,行元素對應的就是多個欄位:多個欄位合起來作為一個元素參與運算,把這種情況稱之為行元素

語法

主查詢 where 條件[(構造一個行元素)]=(行子查詢);

測試案例

需求:獲取班級上年齡最大且身高最高的學生

分析:

  1. 求出班級年齡最大的值
  2. 求出班級身高最高的值
  3. 求出對應的學生

通過行子查詢實現

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

任意一個

  1. =any(列子查詢):條件在查詢結果中有任意一個匹配即可,等價於in

    1 =any(1,2,3)true

在這裡插入圖片描述

  1. <>any(列子查詢):條件在查詢結果中不等於任意一個

    1 <>any(1,2,3)true

some

any完全一樣:

all

  1. =all(列子查詢):等於裡面所有

  2. <>all(列子查詢):不等於其中所有