1. 程式人生 > >子查詢和分組查詢

子查詢和分組查詢

一、子查詢

什麼是子查詢?

一個查詢語句裡面巢狀一個查詢。外層的叫做符查詢,內層裡面巢狀的叫做子查詢。

語法:

select  ....... from 表名 where 欄位 比較運算子 (子查詢);

#其中,在查詢過程中,先執行子查詢部分,求出子查詢部分的值,再執行整個父查詢,返回最後的結果。

 

注意:將子查詢和比較運算子聯合使用時,必須保證子查詢返回的值只有一個,否則比較運算子必須用 IN。

使用 IN 關鍵字可以使父查詢匹配子查詢返回多個單欄位值,也就是可以返回多個值。

示例:


#使用IN子查詢
SELECT studentNo,studentName FROM student
WHERE studentNo IN (
	SELECT studentNo FROM result WHERE subjectNo=(
	SELECT subjectNo FROM `subject`
	WHERE subjectName ='Logic Java'
)AND examDate =(
	SELECT  MAX(examDate) FROM result 
	WHERE subjectNo=(
	SELECT subjectNo FROM `subject`
	WHERE subjectName ='Logic Java'
	)
   )
);

二、分組查詢

1.使用group by 分組查詢:

示例:

#使用group by 子句實現查詢
select subjectNo,avg(studentResult) as 課程平均成績
from result
group by subjectNo;

多列分組查詢:

#統計每個學期的男,女人數
select count(*) as 人數,gradeId AS 年級,sex as 性別 
from  student 
group by grade ,sex
order by grade;

注意:在使用group by分組查詢時,在select 後面的列的是限制的,一般允許如下:

  • group by 子句後的列
  • 聚合函式計算出的列

2.使用HAVING 子句進行分則查詢

#使用having子句對分組後的資料進行篩選
select count(*) as 人數,gradeId AS 年級 from student 
group by gradeId
having  count(*) >3;

#注意:having 子句必須是寫在分組後面的

使用子句查詢的順序:

where > group by > having > order by > limit ;

如下所示:

#分組查詢
select 列  from 表 where 分組前條件
group by 分組列 having 分組後條件
order by 排序列
limit 分頁;