1. 程式人生 > >高級數據操作--子查詢

高級數據操作--子查詢

weight not som 數據表 運算符 統計 問題 存在 span

一.子查詢——標量子查詢

子查詢的概念

思考:

如何得到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);
查詢年齡最大分數最高是否存在

技術分享

查詢年齡最小分數最高是否存在

技術分享

高級數據操作--子查詢