Mysql子查詢的概念、分類、語法


wKiom1Zb4xayly9_AABlk1iuVTY168.jpg


場景:查找身高最高的學生php

按照身高降序排序,取得第一個ide

select * from select_student order by height desc limit 0,1;

wKiom1Zb3v6y5JGDAAC1E75UqSs856.jpg

問題是出現等高的學生,問題不能處理!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型:


場景:查詢下表每一個班級以內,身高最高的學生


wKioL1Zb5QPSGvupAABUMQ7zDoo853.jpg


應該先將每一個班最高的放置在班內的第一個位置,再按照班級進行分組

不能使用order by 再使用group by

而須要,先用一個查詢,獲得身高排序結果,再將該結果分組


留意:from須要一個數據仍是一個表,須要將子查詢返回的數據,導出成表便可!爲子查詢起個別名便可!

select * from (select * from select_student order by height desc) as tmp group by class_id;

wKioL1Zb5oXx4iA6AABU2pN0k48116.jpg


  • 列子查詢    

返回值應該是一列

wKioL1Zb553R_Gr8AAAdxXmB9FI533.jpg


因爲返回的是一列,是一類數據,當作是一個數據的集合。


查詢全部班內女同窗的男學生信息:

條件:先肯定哪些班級內有女生:

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);
相關文章
相關標籤/搜索