高級數據操作--子查詢
一.子查詢——標量子查詢
子查詢的概念
思考:
如何得到php_student表中成績最高的學生的記錄?
1 select * from php_student order by score desc limit 1;
但是,存在一個邏輯問題,如果最高分有很多人,怎麽辦!
1 insert into php_student values 2 (null,‘觀世音‘,‘female‘,17,5000,‘南海‘,100), 3 (null,‘如來‘,‘male‘,17,6000,‘西天‘,100);
所以,必須換一個思維方式,分成兩個步驟:
1 -- 1.先得到成績的最高分 2 select max(score) from php_student; 3 -- 2.把成績為最高分的人全部查詢出來 4 select * from php_student where score = (select max(score) from php_student);
所謂的子查詢,其實就是在一條select語句中又出現了另一條select語句!
子查詢有一個最基本的語法要求,就是子查詢語句需要用一對括號括起來!
子查詢的分類
一般的,有兩種不同的分類方式:
分類:
一般的兩種不同的分類方式:
(1)根據子查詢返回值的形式
子查詢依然是一條完整的查詢語句,只要是查詢語句,其返回值就四種形式:
1.單一值
2.一列
3.一行
4.多行多列
上面四條select語句乳溝放在另一條select語句中,都叫做子查詢語句
分別如下:
返回單一值的子查詢叫: 標量子查詢
返回一列的子查詢: 列子查詢
返回一行的子查詢: 行子查詢
返回多行多列的子查詢: 表子查詢
當然以上是人為的邏輯分類,對應mysql服務器,無論返回形式如何都是資源結果集
(2)根據子查詢出現的位置
from型: 子查詢語句出現在from之後,通常作為一個數據源出現
where型: 子查詢語句出現在where之後,通常用來做條件判斷
exists型: 子查詢語句出現在exists之後
標量子查詢
通常,就是把標量子查詢的結果當成是一個值來使用,可以用來參與運算,或者用來做條件判斷!
二.子查詢——列子查詢
概念
子查詢的結果是一列數據的集合!也是一類數據的集合!
所以,通常就是配合in 和not in集合運算符來使用!
案例
找出php_student表中所有已經開班了的學生的信息!
1 --案例: 2 -- 找出php_student表中所有已經開班的學生的信息 3 -- 1、找出所有已經開班的班級號(班級的集合) 4 select class_id from php_class; 5 -- 2、 找出符合條件的學生 6 select * from php_student where class_id in (select class_id from php_class); 7 8 in 就是=any 或=some 9 10 select * from php_student where class_id in (select class_id from php_class); 11 select * from php_student where class_id =any(select class_id from php_class); 12 select * from php_student where class_id =some(select class_id from php_class);
三.子查詢——行子查詢
概念:
子查詢的結果是一行的子查詢叫做行子查詢!
行子查詢使用的不是很多,因為必須在查詢的過程中,構造一個行元素才能與子查詢的結果進行比較!
所謂的構造行元素,就是一個由多個字段組成的元素,形式上就將多個字段用一對小括號括起來!
1 -- 語法 2 select *|字段列表 from 表名 where(字段1,字段2 ...) = (行子查詢語句); 3 4 -- 查詢php_student 總年齡最大並且分數最高的記錄 5 select * from php_student where(age,score) = (select max(age),max(score) from php_student);
四.子查詢——表子查詢
概念
返回的結果是多行多列的子查詢就叫做表子查詢!
表子查詢一般就是用在from語句之後,當成一個數據源來使用,所以最常見的語法格式:
1 select * | 字段列表 from (表子查詢語句) as 別名 where子句等五子句;
/*特別強調: 當子查詢語句出現在from之後作為一個數據源使用的時候,該語句必須起一個別名! 案例: 不使用任何的統計函數找出php_student 表中每個家鄉home中分數score最低的一個學生! */ select * from php_student group by home; -- 無法達到目的 -- 1.先以score字段進行升序排序 select * from php_student order by score asc; -- 2.對排序之後的數據表根據home字段進行分組(分組只拿第一條數據) select * from(select * from php_student order by score asc) as s group by home;
五. 子查詢——exists型子查詢
概念
exists主要是用來判斷的,返回的是一個布爾值:true或者false,1或者0;
判斷依據:
如果子查詢的結果有數據返回(查詢到了結果),用exists去判斷的結果就為true!
如果子查詢的結果沒有數據返回(沒有查詢到結果),用exists去判斷的結果就為false!
案例
1 -- 案例: 2 -- 查詢年齡最大分數最高是否存在 3 select exists(select * from php_student where(age,score) = (select max(age),max(score) from php_student)); 4 5 -- 查詢年齡最小分數最高是否存在 6 select exists(select * from php_student where(age,score) = (select min(age),max(score) from php_student)); 7 8 處理用戶註冊的時候判斷用戶輸入的用戶名是否語句存在! 9 -- 假如用戶輸入的用戶名是flybird,要作如下的判斷 10 select exists(select * from user where user_name = ‘flybird‘);
查詢年齡最大分數最高是否存在
查詢年齡最小分數最高是否存在
高級數據操作--子查詢