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

2021-10-17 18:18:21 字數 3673 閱讀 7644

mysql子查詢

子查詢:sub query,查詢是在某個查詢結果之上進行的,一條select語句內部包含了另外一條select語句。

分類子查詢有兩種分類方式,分別為:按按結果分類和位置分類。

按結果分類,即根據子查詢得到的資料進行分類(理論上,任何乙個查詢結果都可以理解為乙個二維表),分別為:

標量子查詢:子查詢得到的結果是一行一列,出現的位置在where之後;

列子查詢:子查詢得到的結果是一列多行,出現的位置在where之後;

行子查詢:子查詢得到的結果是多行一列(多行多列),出現的位置在where之後;

錶子查詢:子查詢得到的結果是多行多列,出現的位置在from之後。

按位置分類,即根據子查詢(select語句)在外部查詢(select語句)**現的位置進行分類,分別為:

from子查詢:子查詢出現在from之後;

where子查詢:子查詢出現在where條件之中;

exists子查詢:子查詢出現在exists裡面。

標量子查詢

需求:現知道班級名稱為pm3.1,想要獲取該班的全部學生。

思路:先確定資料來源,學生表。

select * from student where c_id = ?;

然後獲取班級 id,可以通過(班級表)班級名稱來確定。

select id from class where grade = "pm3.1";

執行如下 sql 語句,進行測試:

-- 標量子查詢

select * from student where c_id = (select id from class where grade = "pm3.1");

列子查詢

需求:查詢所有在讀班級(學生表中存在的班級)的學生。

思路:先確定資料來源,學生表。

select * from student where c_id in ?;

然後確定全部有效的班級 id。

select id from class;

執行如下 sql 語句,進行測試:

-- 列子查詢

select * from student where c_id in (select id from class);

如上圖所示,我們完成了列子查詢。在列子查詢的結果為一行多列時,我們需要使用in作為條件進行匹配;此外,在 mysql 中還有三個類似的條件,分別為:all、some和any。

any等價於in,表示其中乙個;

any等價於smoe,而any和some用於否定時卻有些區別;

all表示等於全部。

值得注意的是,在我們使用上面三個關鍵字中任何乙個的時候,都需要搭配=使用,例如:

-- 列子查詢

select * from student where c_id = any (select id from class);

select * from student where c_id = some (select id from class);

select * from student where c_id = all (select id from class);

如上圖所示,為any、some和all的肯定用法,下面我們來測試其否定用法:

-- 列子查詢

select * from student where c_id != any (select id from class);

select * from student where c_id != some (select id from class);

select * from student where c_id != all (select id from class);

觀察上圖,我們會發現any、some和all在用於否定時,其會將null值排除掉。實際上,在真正的開發中,這三個關鍵字並不常用。

行子查詢

行子查詢,返回的結果可以使一行多列或者多行多列。

需求:查詢學生表中,年齡最大且身高最高的學生。

思路:先確定資料來源,學生表。

select * from student where age = ? and height = ?;

然後確定最大年齡和最大身高。

select max(age), max(height) from student;

執行如下 sql 語句,進行測試:

-- 列子查詢

select * from student where

-- 其中,(age, height) 稱之為行元素

(age, height) = (select max(age), max(height) from student);

錶子查詢

錶子查詢,返回的結果是多行多列二維表(將子查詢的結果當做二維表來使用),實際上,任何查詢返回的結果都可以稱之為二維表。

需求:找出每個班身高最高的學生。

思路:先確定資料來源,將學生按身高進行降序排序。

select * from student order by height desc;

從每個班級選出第乙個學生。

select * from student group by c_id;

在這裡,我們可能會有些疑問:為什麼要將學生表降序排序?為什麼從每個班級選出第乙個學生就可以?這是因為group by(分組)只會取表中分組欄位的第一條記錄,而當我們將學生表按身高降序排序時,(每組)身高最高的學生就會出現在第一位。

執行如下 sql 語句,進行測試:

-- 錶子查詢

select * from

-- 關鍵字 from 後面接表名

(select * from student order by height desc) as student

-- 按 c_id 進行分組

group by c_id;

由上面的 sql 語句可知,錶子查詢也是from子查詢,即有select語句位於from之後。

exists子查詢

exists:表示是否存在的意思,因此exists子查詢就是用來判斷某些條件是否滿足(跨表),exists是接在where之後,其返回的結果為1或0,滿足條件為1,反之為0.

需求:在班級存在的前提下,查詢所有的學生。

思路:先確定資料來源。

select * from student where ?;

然後確定條件是否滿足。

exists(select * from class);

執行如下 sql 語句,進行測試:

-- exists 子查詢

select * from student where

exists(select * from class);

-- 新增限定條件,滿足條件

select * from student where

exists(select * from class where id = 3);

-- 新增限定條件,不滿足條件

select * from student where

exists(select * from class where id = 100);

至此,我們已經將子查詢學習完啦!也許大家還會有些疑惑,那就是到底在什麼時候用什麼子查詢?對於這個問題,我們不用過於糾結,因為這根本就是我們要用什麼子查詢的問題,而是根據實際需求,我們將查詢返回的結果按形式命名的稱呼而已。

**查詢class表 ***

查詢student表:

SQL子查詢案例

為管理崗位業務培訓資訊,建立3個表 s sid,sn,sd,sa sid,sn,sd,sa 分別代表學號,學員姓名,所屬單位,學員年齡 c cid,cn cid,cn 分別代表課程編號,課程名稱 sc sid,cid,g sid,cid,g分別代表學號,所選修的課程編號,學習成績 三張表之間的聯絡 ...

mysql求和 子查詢 MySQL子查詢

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

mysql from 子查詢 mysql 子查詢

簡單的解釋下幾個資料庫概念以幫助理解子查詢的內容 1 什麼是建標 答 就是宣告列的過程。2 什麼是列答 列可以理解為變數,可以運算3 什麼是取出結果 答 可以理解為零時表 接下來建立2個表,email表和person表,例子的原型是乙個人可以有多個郵箱,而乙個郵箱只能屬於乙個人,一對多的資料關係,其...