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表,例子的原型是乙個人可以有多個郵箱,而乙個郵箱只能屬於乙個人,一對多的資料關係,其...