1. 程式人生 > >MySQL進階版練習題

MySQL進階版練習題

1、有張表score,內容如下,使用sql語句查詢出每門課程都大於80分的學生姓名
表結構:
name kecheng score
張三 語文 81
張三 數學 75
李四 語文 98
李四 數學 88
提示:每門課程都大於80也就是一個學生他的所有成績裡的最低分大於80,
先按照學生進行分組,查詢所有學生的考試成績裡的最低分,然後再找大於80的,注意這裡使用having,因為是先分組後篩選

參考答案:select name,min(socre) as mi from score group by name having mi >80

2、有如下三個表(面試真題,題目稍微表示不清晰,但是公司出的題就是這樣,需要理解,討論,進入工作之後會遇到大量的專業詞彙,也是需要自己推敲理解含義):


project (id int,name varchar(50))
contract( id int ,project_id int, money int)
pay(id int,contract_id int ,money int)
一個專案可能有多個合同,每個合同會分幾次付款

(1)、寫出sql:列出各個專案的合同金額總數
先要反推個個欄位的含義。contract是合同,合同中的money欄位就是一個合同的金額,其次,一個專案可能有多個合同,那麼我們要求出所有合同的總金額。
我們先可以列出所有專案的所有合同,在這裡發現可能會出現一個專案多條記錄,我們可以對專案進行分組,然後求出每組money的總數
select name ,sub(money) from project left join contract on project.id=contract.project_id group by name
(2)、寫出sql:列出id為1的專案所有已經付款的記錄


select * from contract, pay where contract.id = pay.contract_id and project_id=1
(3)、寫出sql:列出所有已經有付款記錄的合同及對應的專案
select * from project, contract where contract.project_id = project.id
and contract.id in (select contract_id from pay)

3、student表與score表
student(name char,id int,address char,department)
score(c_name char,id int, grade int ,stu_id int)
1)、查詢即參加了計算機又參加了英語考試的學生的資訊


提示:多層子查詢,先查詢參加了計算機的,在其中再篩選參加了英語的
select * from student where id in (
select stu_id from score where c_name=‘計算機’ and id in (
select stu_id from score where c_name=‘英語’ )
)

2)、查詢每個學科的平均成績
提示:按照科目進行分組,然後使用函式求平均值
答案:select c_name,avg(grade) from score group by c_name

3)、查詢平均分最高的科目名字
提示:此題用到了from子查詢,
首先先查詢按照課程進行分組的每門課程的平均分,也就是內層sql:
select avg(grade) as av,c_name from score group by c_name
然後在在結果中尋找平均分數最大的:
from子查詢有要求,要求from的查詢結果集必須有別名,方便在外層sql語句中對其進行使用也就是 max(avgs.av)。avgs表示的是結果集的別名,av是結果集中平均分的列的別名。
答案:select c_name,max(avgs.av), from
(select avg(grade) as av,c_name from score group by c_name )
as avgs

4)、查詢所有成績都及格的學生
提示:
先查詢所有的學生的最低分數,最內層的查詢:
select stu_id,min(grade)
as mi from score group by stu_id
having mi>60
接下里根據stu_id查詢學生資訊
但是這裡需要注意以下的sql語句會報錯。
select * from student where id in(
select student_id,min(grade)
as mi from score group by student_id
having mi>60
)
原因是 id in( student_id ,min(grade))這裡,條件是根據id,但是作比較的有兩列資料。故需要再巢狀一層迴圈只查詢出來stu_id
答案:select * from student where id in (
select stu_id from (
select student_id,min(grade)
as mi from score group by student_id
having mi>60
)as s
)

5)、查詢沒有參加考試的學生資訊
select * from student where id not in(select stu_id from score)

6查詢語文成績比張三高的學生的資訊
提示:
先查詢張三的語文成績:a
再查詢語文成績成績大於a的學生id:b
最後根據b查詢學生資訊
select * from student where id in(
select stu_id from score where grade >
( select grade from student where name =‘張三’ and c_name='語文’)
and c_name=‘語文’)

4、有兩張表:
student(id int ,status char),表示學號和等級(優良中差),
score(s_id int, score int),表示學號和學生成績。
寫出一條sql語句:要求將成績為80以上的學生的狀態改為優秀。
提示:此題其實就是對子查詢的聯絡使用,先查詢成績大於80的學生id,在根據id進行修改
答案:update student set status =‘優秀’ where id in (select s_id from score where score >80)