1. 程式人生 > >資料庫查詢語句詳細例項解析(以mysql為例)

資料庫查詢語句詳細例項解析(以mysql為例)

MySQL查詢語句

最近做實驗時寫到了有關查詢語句的詳細使用案例。藉此案例記錄一下包括關聯查詢,子查詢,巢狀查詢在內的查詢語句的用法。
本案例涉及的表如下:

student:
studnet表儲存了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)

以上為查詢操作的所有內容,如果有錯誤或使用時有問題請在評論指出。