(注:數據均爲自己隨意調節添加!!!)
一、EXISTS子查詢
1.用SQL語句檢測temp表是否已經創建
語法:
DROP TABLE IF EXISTS temp;
CREATE TABLE temp(...#省略建表語句
)
2.EXISTS子查詢語法:
SELECT ......FROM 表名 WHERE EXISTS(子查詢);
子查詢有返回結果:EXISTS子查詢結果爲TRUE
子查詢無返回結果:EXISTS子查詢結果FALSE,外層查詢不執行
例:
檢查“Logic Java”課程最近一次考試成績
如果有 80分以上的成績,顯示分數排在前5名的學員學號和分數
SELECT studentNo AS '學員學號',studentResult AS '成績'
FROM result
WHERE EXISTS(SELECT * #用seists語句檢查是否有80分以上的成績
FROM result
WHERE studentResult>80#條件 成績大於80
AND subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')#條件 成績爲80以上的必須是Logic Java課程
AND examDate=(SELECT MAX(examDate)FROM result WHERE `subjectNO`=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')
))#條件 必須是最近一次考試
AND studentNo IN (
SELECT studentNo
FROM result
WHERE examDate=(SELECT MAX(examDate)
FROM result
WHERE `subjectNO`=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')
)
AND studentNo IN (SELECT studentNo
FROM result
WHERE studentResult>80
AND subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')))
ORDER BY studentResult DESC
LIMIT 5
執行命令得
3.NOT EXISTS子查詢
檢查“Logic Java”課程最近一次考試成績
如果全部未通過考試(60分及格),認爲本次考試偏難,計算的該次考試平均分加5分
SELECT AVG(studentResult)+5
FROM result
WHERE NOT EXISTS(
SELECT studentResult#查詢所有考試成績
FROM result
WHERE studentResult >=60#條件1 成績要 >=60
AND subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')# 條件2 科目必須是Logic Java
AND examDate=(SELECT MAX(examDate)FROM result WHERE `subjectNO`=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')#條件3 必須是近期考試
))
AND 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'))
4.子查詢注意事項
<1>任何允許使用表達式的地方都可以使用子查詢
<2>潛逃在父查詢SEELECT語句的子查詢可包括
SELECT子句
FROM子句
WHERE子句
GROUP BY子句
HAVING子句
<3>只出現在子查詢中而沒有出現在父查詢中的列不能包含在輸出列中
二、分組查詢
1.掌握GROUP BY 字句實現分組查詢
語法:
SELECT ...... FROM 表名
WHERE......
GROUP BY......
例:
查詢每門課程的平均分,並且按照分數由高到低的順序排列顯示
SELECT subjectNo,AVG(studentResult) AS '平均分'
FROM result
GROUP BY subjectNo
ORDER BY 平均分 DESC
執行命令得
注:SELECT裏表只中能包含:
<1>.被分組的列
<2>.爲每分組返回一個值的表達式,如聚合函數
2.多列分組
分組統計每個年級男、女生人數
SELECT `gradeID` AS 年級編號,sex AS 性別,COUNT(*) AS 人數
FROM student
GROUP BY gradeID
執行命令得
3.分組篩選
例:獲取課程平均分及格的課程編號
SELECT subjectNo,AVG(studentResult)AS 平均分
FROM result
GROUP BY subjectNo#分組
HAVING 平均分>=60#篩選
ORDER BY 平均分 DESC#順序
執行命令得
按出生年份分組統計學生人數,將各組中人數達到2人的年份和人數顯示出來
SELECT YEAR(bornDate)AS 年份, COUNT(studentNo) AS 人數
FROM student
GROUP BY 年份
HAVING 人數>2
4.HWERE與HAVING對比
WHERE字句:用來篩選FROM字句中指定的操作所產生的行
GROUP BY子句:用來分組 WHERE字句的輸出
HAVING子句:用來分組的結果中篩選行
三、多表連接查詢
內連接(INNER JOIN)
外連接
左外連接(LEFT JOIN)
右外連接(RIGHT JOIN)
1.內連接使用比較運算符根據每個表的通用列中的值匹配兩個表中的行
語法:
SELECT....
FROM 表1
INNER JOIN 表2
ON ...
直聯語法:
SELECT....
FROM 表1,表2
WHERE ....
例:查詢學生(不包括未考的)的考試成績 顯示學生姓名 科目ID 成績
#內聯
SELECT studentName,subjectNo,studentResult
FROM student AS s
INNER JOIN result AS r
ON r.studentNo=s.studentNo
#直聯
SELECT studentName,subjectNo,studentResult
FROM student AS s ,result AS r
WHERE s.studentNo=r.studentNo
執行命令得
2.三表內連接(多表連接戲法相同)
查詢學生(不包括未考的)的考試成績 顯示學生姓名 學生編號 成績 科目名
(s.studentName 表示獲取student表裏的列 防止獲取不明確報錯)
#三表內連接
SELECT s.studentName,s.studentNo,r.studentResult,sub.subjectName
FROM student AS s
INNER JOIN result AS r
ON r.studentNo=s.studentNo
INNER JOIN `subject` AS sub
ON r.subjectNo=sub.subjectNo
#三表直連接
SELECT s.studentName,sub.subjectNo,r.studentResult
FROM student AS s ,result AS r,`subject` AS sub
WHERE s.studentNo=r.studentNo
AND sub.subjectNo=r.subjectNo
執行命令得
3.左外連接
主表(左表)student中數據逐條匹配表result中的數據
<1>匹配,返回到結果集
<2>無匹配.NULL值返回到結果集
例:查取學生(包括未考試的學生)學生姓名 課程編號 考試成績
SELECT studentName,subjectNo,studentResult
FROM student AS s
LEFT JOIN result AS r
ON r.studentNo=s.studentNo
執行命令得
4.右外連接
右外連接的原理與左外連接相同
右表逐條去匹配記錄;否則NULL填充
SELECT studentName,subjectNo,studentResult
FROM result AS r
LEFT JOIN student AS s
ON r.studentNo=s.studentNo
執行命令得
練習
需求說明
爲每個學生製作在校期間每門課程的成績單,要求每個學生參加每門課程的最後一次考試成績作爲該生本課程的最終成績
成績單的數據項
學生姓名
課程所屬的年級名稱
課程名稱
考試日期
考試成績
SELECT s.studentName,sub.gradeID,sub.subjectName,r.examDate,r.studentResult
FROM student AS s
INNER JOIN result AS r ON r.studentNo=s.studentNo
INNER JOIN `subject` AS sub ON r.subjectNo=sub.subjectNo
WHERE examDate=(
SELECT MAX(examDate) FROM result
WHERE studentNo=s.studentNo#條件 必須同一個學生考同一門課程的最大時間 比較難寫
AND subjectNo=sub.subjectNo)
執行命令得
不加where條件結果爲
加where條件結果爲