場景:查找身高最高的學生php
按照身高降序排序,取得第一個ide
select * from select_student order by height desc limit 0,1;
問題是出現等高的學生,問題不能處理!spa
應該,找到最高的身高,而後找到全部符合最高身高的學生3d
select max(height) from select_student;
select * from select_student where height=180.05;
上面兩條語句能夠整合爲一條語句:orm
select * from select_student where height=select max(height) from select_student;
此時,select max() 出如今另外的語句內部,稱之爲子查詢語句!blog
注意:子查詢,應該始終出現括號內!排序
select * from select_student where height=(select max(height) from select_student);
子查詢的分類:get
分類的依據:it
1,依據子查詢出現的位置
io
where型子查詢,出如今where子句內
from型子查詢,出如今from子句內
2,依據子查詢的返回數據的格式
標量子查詢,返回值是一個數據,稱之爲標量子查詢
列子查詢,返回一個列
行子查詢,返回一個行
表子查詢,返回的是一個二維表
from型:
場景:查詢下表每一個班級以內,身高最高的學生
應該先將每一個班最高的放置在班內的第一個位置,再按照班級進行分組
不能使用order by 再使用group by
而須要,先用一個查詢,獲得身高排序結果,再將該結果分組
留意:from須要一個數據仍是一個表,須要將子查詢返回的數據,導出成表便可!爲子查詢起個別名便可!
select * from (select * from select_student order by height desc) as tmp group by class_id;
列子查詢
返回值應該是一列
因爲返回的是一列,是一類數據,當作是一個數據的集合。
查詢全部班內女同窗的男學生信息:
條件:先肯定哪些班級內有女生:
select class_id from select_student where gender='female' group by class_id;
再在該班級以內,找到全部的男生:
select * from select_student where gender='male' and class_id in (select class_id from select_student where gender='female' group by class_id);
典型的列子查詢使用 in or not in 做爲子查詢的條件!
列子查詢,還可使用 =some , !=all 或者其餘的運算符配合 some() 和 all() 語法完成!
some() 表示集合中的一部分! =some()至關於in , !=some()不至關於 not in !
all() 表示集合中的所有!(!=all() 至關於not in)
行子查詢
場景:找到最高,最富有的學生!
select * from select_student where height=(select max(height) from select_student) and money=(select max(money) from select_student);
上面的代碼能夠簡化爲:
select * from select_student where (height,money) = (select max(height),max(money) form select_student;
使用行子查詢能夠,一次性查出來一個行(多個行)使用行進行匹配!上面使用了(),構建了一行!與子查詢的行做比較!
exists型子查詢
判斷依據不是根據子查詢所返回的數據!只是根據子查詢是否存在的返回數據來看;
語法:exists(子查詢);
若是子查詢存在返回數據,則exists返回真,反之返回假!
出如今where條件內:
select * from select_student where exists(select 1);
場景:
檢索出班級已經不存在的學生
select * from select_student where exists(select * from select_class where select_student.class_id=select_class.id);