資料庫查詢語句詳細例項解析(以mysql為例)
MySQL查詢語句
最近做實驗時寫到了有關查詢語句的詳細使用案例。藉此案例記錄一下包括關聯查詢,子查詢,巢狀查詢在內的查詢語句的用法。
本案例涉及的表如下:
student:
studnet表儲存了學生的基本資訊,其中各欄位含義如下:
Sno:學生學號
Sname:學生姓名
Ssex:學生性別
Sage:學生年齡
Sdept:學生院系
sc:
sc表儲存了有關學生學科和成績的相關資訊,各欄位含義如下:
Sno:學生學號
Sname:學生姓名
Ssex:學生性別
Cno:課程編號
Grade:課程成績
course:
crouse表儲存了課程的編號和課程名稱,個欄位含義如下:
Cno:課程編號
Cname:課程名稱
具體操作
一 單表
1 查詢年齡在 19 至 21 歲之間的女生的學號,姓名,年齡,按年齡從大到小排列。
select sno,sname,sage from student where sage between 19 and 21 and ssex=’女’ order by sage desc
2 查詢姓名中第戎 2 個字為“明”字的學生學號、性別
select sname ,ssex from student where sname like ‘_明%’
3 查詢 1001 課程沒有成績的學生學號、課程號
select sno,cno from sc where grade is null and cno=’1001’
4 查詢 JSJ 、SX、WL 系的學生學號,姓名,結果按系及學號排列
select sno,sname from student where sdept in (‘JSJ’,’SX’,’WL’) order by sdept,sno
5 按 10 分制查詢學生的 sno,cno,10 分製成績 (1-10 分 為 1 ,11-20 分為 2 ,30-39 分為 3,。。。90-100 為 10)
select sno , cno , grade/10.0+1 as level from sc
6 查詢 student 表中的學生共分佈在那幾個系中。(distinct
select distinct sdept from student
7 查詢 0001 號學生 1001,1002 課程的成績
Select cno from sc where sno=’0001’ and (cno=’1001’ or cno=’1002’)
二 統計
1 查詢姓名中有“明”字的學生人數。
select count(*) from student where sname like ‘%明%’
2 計算‘JSJ’系的平均年齡及最大年齡。
Select avg(sage) , max(sage) from student Where sdept=’JSJ’
3 計算每一門課的總分、平均分,最高分、最低分,按平均分由高到低排列
select cno,sum(grade),avg(grade),max(grade),min(grade) from sc group by cno order by avg(grade) desc
4 計算 1001,1002 課程的平均分。
Select cno , avg(grade) from sc where cno in (‘1001’,’1002’) Group by cno
5 查詢平均分大於 80 分的學生學號及平均分
select sc.sno , avg(grade) from sc group by sc.sno having avg(grade)>80
6 統計選修課程超過 2 門的學生學號
select sno from sc group by sno having count(*)>2
7 統計有 10 位成績大於 85 分以上的課程號。
Select cno from sc where grade>85 group by cno having count(*) =10
8 統計平均分不及格的學生學號
select sno from sc group by sno having avg(grade)<60
9 統計有大於兩門課不及格的學生學號
select sno from sc where grade<60 group by sno having count(*) >2
三 連線
1 查詢 JSJ 系的學生選修的課程號 select cno from student,sc where student.sno=sc.sno and sdept=’JSJ’
2 查詢選修 1002 課程的學生的學生姓名 (不用巢狀及巢狀 2 種方法)
a: select sname from student,sc where student.sno = sc.sno and cno=’1002’)
b: select sname from student where sno in (select sno from sc where cno=’1002’)
3 查詢資料庫原理不及格的學生學號及成績
select sno,grade from sc ,course where sc.cno=course.cno and cname=’資料庫原理’
4 查詢選修“資料庫原理”課且成績 80 以上的學生姓名(不用巢狀及巢狀 2 種方法)
a: select sname from student , sc , course where student.sno=sc.sno and sc.cno = course.cno and grade>80 and cname=’資料庫原理’
b: select sname from student where sno in ( select sno from sc where grade>80 and cno in ( select cno from course where cname=’資料庫原理’) )
5 查詢平均分不及格的學生的學號,姓名,平均分。
select sno, max(sname) , avg(grade) as avggrade from sc , student where student.sno=sc.sno group by student.sno having avg(grade) <60
6 查詢女學生平均分高於 75 分的學生姓名。
A: Select sname from student where ssex=’女’ and sno in (Select sno from sc group by sno having avg(grade)>75)
B: Select max(sname ) from sc,student where student.sno=sc.sno and Ssex=’女’ Group by student.sno having avg(grade)>75
7 查詢男學生學號、姓名、課程號、成績。(一門課程也沒有選修的男學生也要列出,不能 遺漏)
select student.sno,sname,cno,grade from student left join sc ON student.sno=sc.sno and ssex=’男’
四 巢狀、相關及其他
1 查詢平均分不及格的學生人數
select count(*) from student where sno in ( select sno from sc group by sno having avg(grade)<60 )
2 查詢沒有選修 1002 課程的學生的學生姓名
select sname from student where sno not in( select sno from sc where cno=’1002’)
3 查詢平均分最高的學生學號及平均分
select sno,avg(grade) from sc group by sno having avg(grade) >=all ( select avg(grade) from sc group by sno )
*4 查詢沒有選修 1001,1002 課程的學生姓名。
Select sname from student where not exists (Select * from course where cno in (‘1001’,’1002’) and Not exists ( select * from sc where sno=student.sno and cno=course.cno ) )
5 查詢 1002 課程第一名的學生學號
select sno from sc where cno=’1002’ and grade >=all (select grade from sc where cno=’1002’)
6 查詢平均分前三名的學生學號
select top 3 sno from sc group by sno order by avg(grade) desc
7 查詢 JSJ 系的學生與年齡不大於 19 歲的學生的差集
a: select * from student where sdept=’JSJ’ and sage>19
b: select * from student where sdept=’JSJ’ except select * from student where sage<19
8 查詢 1001 號課程大於 90 分的學生學號、姓名及平均分大於 85 分的學生學號、姓名
select student.sno,sname from student,sc where cno=’1001’ and grade>90 union select sno,sname from student where sno in ( select sno from sc group by sno having avg(grade)>85 )
9 查詢每門課程成績都高於該門課程平均分的學生學號
select sno from student where sno not in ( select sno from sc X where grade<( select avg(grade)
from sc Y where Y.sno=X.sno) )
select sno from student where sno not in ( select sno from sc X where grade < ( select avg(grade) from sc where cno=X.cno ) )
10 查詢大於本系科平均年齡的學生姓名
select sname from student X where sage > ( select avg(sage) from student y where sdept=x.sdept)
以上為查詢操作的所有內容,如果有錯誤或使用時有問題請在評論指出。