資料庫常用sql語句
Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表
問題:
1、查詢「001」課程比「002」課程成績高的所有學生的學號;
select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
from SC where C#='002') b
where a.score>b.score and a.s#=b.s#;
2、查詢平均成績大於60分的同學的學號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查詢所有同學的學號、姓名、選課數、總成績;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
4、查詢姓「李」的老師的個數;
select count(distinct(Tname))
from Teacher
where Tname like '李%';
5、查詢沒學過「葉平」老師課的同學的學號、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平');
6、查詢學過「001」並且也學過編號「002」課程的同學的學號、姓名;
select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');
7、查詢學過「葉平」老師所教的所有課的同學的學號、姓名;
select S#,Sname
from Student
where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='葉平'));
8、查詢課程編號「002」的成績比課程編號「001」課程低的所有同學的學號、姓名;
Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2
from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2<score;
9、查詢所有課程成績小於60分的同學的學號、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
10、查詢沒有學全所有課的同學的學號、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
11、查詢至少有一門課與學號為「1001」的同學所學相同的同學的學號和姓名;
select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';
12、查詢至少學過學號為「001」同學所有一門課的其他同學學號和姓名;
select distinct SC.S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='001');
13、把「SC」表中「葉平」老師教的課的成績都更改為此課程的平均成績;
SC set score=(select avg(SC_2.score)
from SC SC_2
where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='葉平');
14、查詢和「1002」號的同學學習的課程完全相同的其他同學學號和姓名;
select S# from SC where C# in (select C# from SC where S#='1002')
group by S# having count(*)=(select count(*) from SC where S#='1002');
15、刪除學習「葉平」老師課的SC表記錄;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平';
16、向SC表中插入一些記錄,這些記錄要求符合以下條件:沒有上過編號「003」課程的同學學號、2、
號課的平均成績;
Insert SC select S#,'002',(Select avg(score)
from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');
17、按平均成績從高到低顯示所有學生的「資料庫」、「企業管理」、「英語」三門的課程成績,按如下形式顯示: 學生ID,,資料庫,企業管理,英語,有效課程數,有效平均分
SELECT S# as 學生ID
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 資料庫
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企業管理
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英語
,COUNT(*) AS 有效課程數, AVG(t.score) AS 平均成績
FROM SC AS t
GROUP BY S#
ORDER BY avg(t.score)
18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
SELECT L.C# As 課程ID,L.score AS 最高分,R.score AS 最低分
FROM SC L ,SC AS R
WHERE L.C# = R.C# and
L.score = (SELECT MAX(IL.score)
FROM SC AS IL,Student AS IM
WHERE L.C# = IL.C# and IM.S#=IL.S#
GROUP BY IL.C#)
AND
R.Score = (SELECT MIN(IR.score)
FROM SC AS IR
WHERE R.C# = IR.C#
GROUP BY IR.C#
);
19、按各科平均成績從低到高和及格率的百分數從高到低順序
SELECT t.C# AS 課程號,max(course.Cname)AS 課程名,isnull(AVG(score),0) AS 平均成績
,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分數
FROM SC T,Course
where t.C#=course.C#
GROUP BY t.C#
ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
20、查詢如下課程平均成績和及格率的百分數(用"1行"顯示): 企業管理(001),馬克思(002),OO&UML (003),資料庫(004)
SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企業管理平均分
,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企業管理及格百分數
,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 馬克思平均分
,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 馬克思及格百分數
,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分
,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分數
,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 資料庫平均分
,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 資料庫及格百分數
FROM SC
21、查詢不同老師所教不同課程平均分從高到低顯示
SELECT max(Z.T#) AS 教師ID,MAX(Z.Tname) AS 教師姓名,C.C# AS 課程ID,MAX(C.Cname) AS 課程名稱,AVG(Score) AS 平均成績
FROM SC AS T,Course AS C ,Teacher AS Z
where T.C#=C.C# and C.T#=Z.T#
GROUP BY C.C#
ORDER BY AVG(Score) DESC
22、查詢如下課程成績第 3 名到第 6 名的學生成績單:企業管理(001),馬克思(002),UML (003),資料庫(004)
[學生ID],[學生姓名],企業管理,馬克思,UML,資料庫,平均成績
SELECT DISTINCT top 3
SC.S# As 學生學號,
Student.Sname AS 學生姓名 ,
T1.score AS 企業管理,
T2.score AS 馬克思,
T3.score AS UML,
T4.score AS 資料庫,
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 總分
FROM Student,SC LEFT JOIN SC AS T1
ON SC.S# = T1.S# AND T1.C# = '001'
LEFT JOIN SC AS T2
ON SC.S# = T2.S# AND T2.C# = '002'
LEFT JOIN SC AS T3
ON SC.S# = T3.S# AND T3.C# = '003'
LEFT JOIN SC AS T4
ON SC.S# = T4.S# AND T4.C# = '004'
WHERE student.S#=SC.S# and
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
NOT IN
(SELECT
DISTINCT
TOP 15 WITH TIES
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
FROM sc
LEFT JOIN sc AS T1
ON sc.S# = T1.S# AND T1.C# = 'k1'
LEFT JOIN sc AS T2
ON sc.S# = T2.S# AND T2.C# = 'k2'
LEFT JOIN sc AS T3
ON sc.S# = T3.S# AND T3.C# = 'k3'
LEFT JOIN sc AS T4
ON sc.S# = T4.S# AND T4.C# = 'k4'
ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);
23、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[<60]
SELECT SC.C# as 課程ID, Cname as 課程名稱
,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]
,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]
,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]
,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]
FROM SC,Course
where SC.C#=Course.C#
GROUP BY SC.C#,Cname;
24、查詢學生平均成績及其名次
SELECT 1+(SELECT COUNT( distinct 平均成績)
FROM (SELECT S#,AVG(score) AS 平均成績
FROM SC
GROUP BY S#
) AS T1
WHERE 平均成績 > T2.平均成績) as 名次,
S# as 學生學號,平均成績
FROM (SELECT S#,AVG(score) 平均成績
FROM SC
GROUP BY S#
) AS T2
ORDER BY 平均成績 desc;
25、查詢各科成績前三名的記錄:(不考慮成績並列情況)
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
26、查詢每門課程被選修的學生數
select c#,count(S#) from sc group by C#;
27、查詢出只選修了一門課程的全部學生的學號和姓名
select SC.S#,Student.Sname,count(C#) AS 選課數
from SC ,Student
where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
28、查詢男生、女生人數
Select count(Ssex) as 男生人數 from Student group by Ssex having Ssex='男';
Select count(Ssex) as 女生人數 from Student group by Ssex having Ssex='女';
29、查詢姓「張」的學生名單
SELECT Sname FROM Student WHERE Sname like '張%';
30、查詢同名同性學生名單,並統計同名人數
select Sname,count(*) from Student group by Sname having count(*)>1;;
31、1981年出生的學生名單(註:Student表中Sage列的類型是datetime)
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
from student
where CONVERT(11),DATEPART(year,Sage))='1981';
32、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
33、查詢平均成績大於85的所有學生的學號、姓名和平均成績
select Sname,SC.S# ,avg(score)
from Student,SC
where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;
34、查詢課程名稱為「資料庫」,且分數低於60的學生姓名和分數
Select Sname,isnull(score,0)
from Student,SC,Course
where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname='資料庫'and score<60;
35、查詢所有學生的選課情況;
SELECT SC.S#,SC.C#,Sname,Cname
FROM SC,Student,Course
where SC.S#=Student.S# and SC.C#=Course.C# ;
36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
SELECT distinct student.S#,student.Sname,SC.C#,SC.score
FROM student,Sc
WHERE SC.score>=70 AND SC.S#=student.S#;
37、查詢不及格的課程,並按課程號從大到小排列
select c# from sc where scor e<60 order by C# ;
38、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名;
select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';
39、求選了課程的學生人數
select count(*) from sc;
40、查詢選修「葉平」老師所授課程的學生中,成績最高的學生姓名及其成績
select Student.Sname,score
from Student,SC,Course C,Teacher
where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='葉平' and SC.score=(select max(score)from SC where C#=C.C# );
41、查詢各個課程及相應的選修人數
select count(*) from sc group by C#;
42、查詢不同課程成績相同的學生的學號、課程號、學生成績
select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ;
43、查詢每門功成績最好的前兩名
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
44、統計每門課程的學生選修人數(超過10人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,查詢結果按人數降序排列,若人數相同,按課程號升序排列
select C# as 課程號,count(*) as 人數
from sc
group by C#
order by count(*) desc,c#
45、檢索至少選修兩門課程的學生學號
select S#
from sc
group by s#
having count(*) > = 2
46、查詢全部學生都選修的課程的'課程號和課程名
select C#,Cname
from Course
where C# in (select c# from sc group by c#)
47、查詢沒學過「葉平」老師講授的任一門課程的學生姓名
select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='葉平');
48、查詢兩門以上不及格課程的同學的學號及其平均成績
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score<60 group="" by="" having="">2)group by S#;
49、檢索「004」課程分數小於60,按分數降序排列的同學學號
select S# from SC where C#='004'and score<60 order by score desc;
50、刪除「002」同學的「001」課程的成績
from Sc where S#='001'and C#='001';
一、SQL語言簡介
1、SQL語言簡介
SQL是結構化查詢語言(Structured Query Language),是用於訪問和處理資料庫的標準的計算機語言。
SQL語言的功能如下:
A、SQL面向資料庫執行查詢
B、SQL可從資料庫取回數據
C、SQL可在資料庫中插入新的記錄
D、SQL可更新資料庫中的數據
E、SQL可從資料庫刪除記錄
F、SQL可創建新資料庫
G、SQL可在資料庫中創建新表
H、SQL可在資料庫中創建存儲過程
I、SQL可在資料庫中創建視圖
J、SQL可以設置表、存儲過程和視圖的許可權
SQL是一門ANSI的標准計算機語言,用來訪問和操作資料庫系統。SQL語句用於取回和更新資料庫中的數據。SQL可與資料庫程序協同工作,比如MS Access、DB2、Informix、MS SQL Server、Oracle、MySQL、Sybase以及其他資料庫系統。
每一種資料庫有自己版本的SQL語言,但是為了與ANSI標准相兼容,SQL必須以相似的方式共同地來支持一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE等等)。
除了SQL標准之外,大部分SQL資料庫程序都擁有自己的私有擴展。
2、SQL語言分類
SQL語言分為數據定義語言、數據控制語言、數據操作語言、數據查詢語言,分別實現對資料庫數據操作。
二、SQL語言基礎
1、數據定義語言(DDL)
DDL:Data Definition Language
用於定義和管理數據對象,包括資料庫、數據表、函數、視圖、索引、觸發器等。例如:CREATE、DROP、ALTER等語句。
create table student
(
sid INT,
sname var20)
);
alter table student add age int default 20;
student;
drop database student;
2、數據控制語言(DCL)
DCL:Data Control Language
用來管理資料庫的語言,包含授權用戶訪問、拒絕用戶訪問、撤銷授予的許可權。例如:GRANT、DENY、REVOKE、COMMIT、ROLLBACK等語句。
創建用戶
create user 『wang』@『localhost』 identified by 『a1!』;
許可權設置
grant select on db.student to 『wang』@『localhost』;
撤銷許可權
revoke select on db.student from 『wang』@『localhost』;
3、數據操作語言(DML)
DML:Data Manipulation Language
用於操作資料庫對象中所包含的數據,增、刪、改。例如:INSERT、DELETE、UPDATE語句。
4、數據查詢語言(DQL)
DQL:Data Query Language
用於查詢資料庫對象中所包含的數據,能夠進行單表查詢、連接查詢、嵌套查詢,以及集合查詢等各種復雜程度不同的資料庫查詢,並將數據返回到客戶機中顯示。例如:SELECT語句。
三、常量和變數
1、常量
A、字元常量
字元串常量使用單引號或雙引號,數值常量不用加引號。
如果字元串常量中需要換行、有單引號、雙引號 % _
前面需要加轉義字元
換行
』 一個單引號
」 一個雙引號
一個 如果沒有轉義字元 就認為是一個轉義字元
% 一個% 如果沒有轉義字元就認為這是一個通配符
_ 一個_ 如果沒有轉移字元 就認為是一個通配符
select 『hanli』gang001』
select 『han ligang001』
select 『han ligang001』
select 「han"ligang001」
select 「韓立剛001」
B、數值常量
數值常量不用添加引號,
select 100+100+200
C、布爾常量
布爾型常量取值 true 和 false
在SQL中使用1和0表示
select true,false
在表達式中
select 100>200
select 100<200
2、變數
用戶自定義變數使用@開始,使用set給變數賦值。
set @name=『孫悟空』;
select @name;
select * from student;
into student values (6,『孫悟空』,20);
into student values (8,@name,20);
set @sid=9,@nid=10
into student values (@sid,@name,20);
select @sid+@nid;
set @sid=@sid+1;
select @sid;
set @sname3=(select sname from student where sid=9);
select @sname3;
3、系統變數
系統變數分為全局系統變數和會話系統變數。
全局系統變數:針對所有默認設置
會話系統變數:針對當前用戶生效,用戶登錄MySQL會使用全局系統變數,如果會話中更改了變數值,使用更改後的值,不過只針對當前用戶生效。
show variables 顯示會話系統變數
show global variables 顯示全局系統變數
show session variables 顯示會話系統變數
show global variables like 『sql_select_limit』;使用通配符顯示匹配的變數設置
show session variables like 『sql_select_limit』;系統變數使用@@標識
select @@global.sql_select_limit 查看某個全局系統變數設置
select @@session.sql_select_limit 查看某個會話系統變數設置
set @@session.sql_select_limit=2 設置會話系統變數
全局系統變數需要在/etc/my.cnf配置文件中修改。
❷ SQL 45道題
1.學生表 Student(SId,Sname,Sage,Ssex)
2.課程表 Course(CId,Cname,TId)
3.教師表 Teacher(TId,Tname)
4.成績表 SC(SId,CId,score)
學生表 Student
科目表 Course
教師表 Teacher
成績表 SC
1.查詢" 01 "課程比" 02 "課程成績高的學生的信息及課程分數
1.1 查詢同時存在" 01 "課程和" 02 "課程的情況
1.2 查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時顯示為 null )
1.3 查詢不存在" 01 "課程但存在" 02 "課程的情況
2.查詢平均成績大於等於 60 分的同學的學生編號和學生姓名和平均成績
3.查詢在 SC 表存在成績的學生信息
4.查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績(沒成績的顯示為 null )
4.1 查有成績的學生信息
或
5.查詢「李」姓老師的數量
6.查詢學過「張三」老師授課的同學的信息
*7.查詢沒有學全所有課程的同學的信息
*8.查詢至少有一門課與學號為" 01 "的同學所學相同的同學的信息
*9.查詢和" 01 "號的同學學習的課程 完全相同的其他同學的信息
10.查詢沒學過"張三"老師講授的任一門課程的學生姓名
*11.查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
12.檢索" 01 "課程分數小於 60,按分數降序排列的學生信息
13.按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
14.查詢各科成績最高分、最低分和平均分: 以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率 及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90 要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
*15.按各科成績進行排序,並顯示排名, Score 重復時保留名次空缺
*15.1 按各科成績進行排序,並顯示排名, Score 重復時合並名次
*16.查詢學生的總成績,並進行排名,總分重復時保留名次空缺
*16.1 查詢學生的總成績,並進行排名,總分重復時不保留名次空缺
*17.統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[60-0] 及所佔百分比
*18.查詢各科成績前三名的記錄
19.查詢每門課程被選修的學生數
*20.查詢出只選修兩門課程的學生學號和姓名
21.查詢男生、女生人數
22.查詢名字中含有「風」字的學生信息
*23.查詢同名同性學生名單,並統計同名人數
*24.查詢 1990 年出生的學生名單
25.查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
26.查詢平均成績大於等於 85 的所有學生的學號、姓名和平均成績
27.查詢課程名稱為「數學」,且分數低於 60 的學生姓名和分數
28.查詢所有學生的課程及分數情況(存在學生沒成績,沒選課的情況)
29.查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數
30.查詢不及格的課程
31.查詢課程編號為 01 且課程成績在 80 分以上的學生的學號和姓名
32.求每門課程的學生人數
*33.成績不重復,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
*34.成績有重復的情況下,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
*35.查詢不同課程成績相同的學生的學生編號、課程編號、學生成績
*36.查詢每門功成績最好的前兩名
37.統計每門課程的學生選修人數(超過 5 人的課程才統計)
*38.檢索至少選修兩門課程的學生學號
39.查詢選修了全部課程的學生信息
*40.查詢各學生的年齡,只按年份來算
*41.按照出生日期來算,當前月日 < 出生年月的月日則,年齡減一
*42.查詢本周過生日的學生
*43.查詢下周過生日的學生
*44.查詢本月過生日的學生
*45.查詢下月過生日的學生
❸ sql經典50題
一、查詢課程編號為「01」的課程比「02」的課程成績高的所有學生的學號(重點)
一刷:
excel思路:
觀察原始表格數據,在excel中想得到01比02高,我們需要將原始表格拆分成兩個表,課程01表和課程02表,再進行vlookup得到c表,根據if條件判斷篩出最終數據。
重點是:1.拆表 2.匹配
轉成SQL語言:
1.拆表語言:
2.關聯加匹配語言 :
3.完整語言:
----到這里其實就可以結束了;
4.若想加student的信息,則需要以上所有結果再作為c表再關聯匹配:
若想讓欄位1和2為上下結果,即重復前面的信息,則語言如下:
二刷:
擴展一:查詢成績小於60分的學生的學號和姓名
1、先反向找出大於等於60分的學號 :
2、匹配:
擴展二:查詢平均成績小於60分的學生的學號、姓名和平均成績
第一種
1、先找出小於60分和空的作為c表:
2、匹配:
三、查詢所有學生的學號、姓名、選課數、總成績(不重要)
四、查詢姓「李」的老師的個數(不重要)
五、查詢沒學過「張三」老師課的學生的學號、姓名(重點)
六、查詢學過「張三」老師所教的所有課的同學的學號、姓名(重點)
七、查詢學過編號為「01」的課程並且也學過編號為「02」的課程的學生的學號、姓名(重點)
八、查詢課程編號為「02」的總成績(不重點)
九、查詢成績小於60分的學生的學號和姓名(同題目二)
十、查詢沒有學全所有課的學生的學號、姓名(重點)
十一、查詢至少有一門課與學號為「01」的學生所學課程相同的學生的學號和姓名(重點)
十二、查詢和「01」號同學所學課程完全相同的其他同學的學號(重點)
十五、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績(重點)
十六、檢索"01"課程分數小於60,按分數降序排列的學生信息(和34題重復,不重點
十七、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績(重重點與35一樣)
十八、查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
-- 及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90 (超級重點)
十九、按各科成績進行排序,並顯示排名
二十、查詢學生的總成績並進行排名(不重點)
二十一、查詢不同老師所教不同課程平均分從高到低顯示(不重點)
二十二、查詢所有課程的成績第2名到第3名的學生信息及該課程成績(重要 25類似
二十三、 使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計各分數段人數:課程ID和課程名稱(重點和18題類似)
二十四、查詢學生平均成績及其名次(同19題,重點)
二十五、查詢各科成績前三名的記錄(不考慮成績並列情況)(重點 與22題類似)
二十六、查詢每門課程被選修的學生數(不重點)
二十七、查詢出只有兩門課程的全部學生的學號和姓名(不重點)
二十八、查詢男生、女生人數(不重點)
二十九、查詢名字中含有"風"字的學生信息(不重點)
三十一、 查詢1990年出生的學生名單(重點year)
三十二、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績(不重要)
三十三、查詢每門課程的平均成績,結果按平均成績升序排序,平均成績相同時,按課程號降序排列(不重要)
三十四、查詢課程名稱為"數學",且分數低於60的學生姓名和分數(不重點)
三十五、查詢所有學生的課程及分數情況(重點)
三十六、 查詢任何一門課程成績在70分以上的姓名、課程名稱和分數(重點)
三十七、 查詢不及格的課程並按課程號從大到小排列(不重點)
三十八、 查詢課程編號為03且課程成績在80分以上的學生的學號和姓名(不重要)
三十九、求每門課程的學生人數(不重要)
四十、查詢選修「張三」老師所授課程的學生中成績最高的學生姓名及其成績(重要top)
四十一、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績 (重點)
四十二、查詢每門功課成績最好的前兩名(同22和25題)
四十三、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列(不重要)
四十四、檢索至少選修兩門課程的學生學號(不重要)
四十五、查詢選修了全部課程的學生信息(重點劃紅線地方)
四十六、查詢各學生的年齡(精確到月份)
四十七、 查詢沒學過「張三」老師講授的任一門課程的學生姓名(還可以,自己寫的,答案中沒有)
四十八、 查詢兩門以上不及格課程的同學的學號及其平均成績
四十九、查詢本月過生日的學生(無法使用week、date(now())
五十、 查詢下月過生日的學生
❹ sql面試題50題(mysql版)
--插入學生表測試數據
insert into Student values(༽' , '趙雷' , -01-01' , '男');
insert into Student values(༾' , '錢電' , -12-21' , '男');
insert into Student values(༿' , '孫風' , -05-20' , '男');
insert into Student values(ཀ' , '李雲' , -08-06' , '男');
insert into Student values(ཁ' , '周梅' , -12-01' , '女');
insert into Student values(ག' , '吳蘭' , -03-01' , '女');
insert into Student values(གྷ' , '鄭竹' , -07-01' , '女');
insert into Student values(ང' , '王菊' , -01-20' , '女');
--課程表測試數據
insert into Course values(༽' , '語文' , ༾');
insert into Course values(༾' , '數學' , ༽');
insert into Course values(༿' , '英語' , ༿');
--教師表測試數據
insert into Teacher values(༽' , '張三');
insert into Teacher values(༾' , '李四');
insert into Teacher values(༿' , '王五');
--成績表測試數據
insert into Score values(༽' , ༽' , 80);
insert into Score values(༽' , ༾' , 90);
insert into Score values(༽' , ༿' , 99);
insert into Score values(༾' , ༽' , 70);
insert into Score values(༾' , ༾' , 60);
insert into Score values(༾' , ༿' , 80);
insert into Score values(༿' , ༽' , 80);
insert into Score values(༿' , ༾' , 80);
insert into Score values(༿' , ༿' , 80);
insert into Score values(ཀ' , ༽' , 50);
insert into Score values(ཀ' , ༾' , 30);
insert into Score values(ཀ' , ༿' , 20);
insert into Score values(ཁ' , ༽' , 76);
insert into Score values(ཁ' , ༾' , 87);
insert into Score values(ག' , ༽' , 31);
insert into Score values(ག' , ༿' , 34);
insert into Score values(གྷ' , ༾' , 89);
insert into Score values(གྷ' , ༿' , 98);
-- 1、查詢"01"課程比"02"課程成績高的學生的信息及課程分數
select c.*,a.s_score as 01課程score,b.s_score as 02課程score from
score a,score b
left join student c
on b.s_id = c.s_id
where a.s_id = b.s_id and a.c_id = ༽' and b.c_id = ༾' and a.s_score > b.s_score;
-- 2、查詢"01"課程比"02"課程成績低的學生的信息及課程分數
select a.* ,b.s_score as 01課程,c.s_score as 02課程 from student a
join score b
on a.s_id=b.s_id and b.c_id = ༽'
left join score c
on b.s_id = c.s_id and c.c_id = ༾'
where b.s_score < c.s_score ;
-- 3、查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
select a.s_id,a.s_name,round(avg(b.s_score),2) as 平均成績 from student a
join score b
on a.s_id = b.s_id
group by b.s_id having 平均成績 >= 60;
備註:round[avg(成績),1]里,round是四捨五入函數,1代表保留1位小數
-- 4、查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績
-- (包括有成績的和無成績的)
select b. ,round(avg(a.s_score),2) as 平均成績 from
student b
left join score a on b.s_id = a.s_id group by a.s_id having 平均成績 < 60
union
select b. ,0 as 平衡成績 from student b where b.s_id not in (select s_id from score);
-- 5、查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績
select a.s_id,a.s_name,count(b.c_id) as 選課總數 ,sum(b.s_score) as 總分 from student a
left join score b
on a.s_id = b.s_id group by s_id ;
-- 6、查詢"李"姓老師的數量
select count(*) as 李姓老師數量 from teacher where t_name like '李%'
-- 7、查詢學過"張三"老師授課的同學的信息
select a.* from student a join score b
on a.s_id = b.s_id
where b.c_id in (select c.c_id from course c
join teacher d on c.t_id = d.t_id where d.t_name = '張三');
-- 8、查詢沒學過"張三"老師授課的同學的信息
select a.* from student a left join score b on a.s_id = b.s_id where a.s_id not in
(select s_id from score where c_id =
(select c_id from course where t_id =
(select t_id from teacher where t_name = '張
三'))) group by a.s_id;
-- 9、查詢學過編號為"01"並且也學過編號為"02"的課程的同學的信息
select * from student where s_id in
(select a.s_id from score a join score b on a.s_id = b.s_id
where a.c_id = ༽' and b.c_id = ༾');
-- 10、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的信息
select * from student where s_id in
(select s_id from score where c_id = ༽' )
and s_id not in (select s_id from score where c_id = ༾' );
-- 11、查詢沒有學全所有課程的同學的信息
select * from student where s_id not in
(select s_id from score group by s_id having count(c_id) = 3);
-- 12、查詢至少有一門課與學號為"01"的同學所學相同的同學的信息
select distinct a.* from student a left join score b
on a.s_id = b.s_id where b.c_id in
(select c_id from score where s_id = ༽') and a.s_id != ༽' ;
注意:distinct是去重的
-- 13、查詢和"01"號的同學學習的課程完全相同的其他同學的信息
select * from student where s_id in
(select s_id from score group by s_id having count(c_id) =
(select count(c_id) from score where s_id = ༽') and s_id not in
(select s_id from score where c_id not in
(select c_id from score where s_id = ༽')) and s_id != ༽');
-- 14、查詢沒學過"張三"老師講授的任一門課程的學生姓名
select s_name from student where s_id not in
(select s_id from score where c_id in
(select c_id from course where t_id in
(select t_id from teacher where t_name ='張三')));
-- 15、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
select a.s_id ,b.s_name,round(avg(a.s_score),2) as 平均成績 from score a
left join student b on a.s_id = b.s_id
where s_score < 60 group by s_id having count(1) >=2;
或者試試
select a.s_id ,b.s_name,round(avg(a.s_score),2) as 平均成績 from score a
left join student b on a.s_id = b.s_id
where a.s_score < 60 group by a.s_id having count(*) >=2;
-- 16、檢索"01"課程分數小於60,按分數降序排列的學生信息
select a.* ,b.c_id ,b.s_score from student a
left join score b on a.s_id = b.s_id
where b.c_id = ༽' and b.s_score < 60
order by b.s_score desc;
-- 17、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
select a.s_name ,
sum(case when b.c_id = ༽' then s_score else null end ) as 語文,
sum(case when b.c_id = ༾' then s_score else null end ) as 數學,
sum(case when b.c_id = ༿' then s_score else null end ) as 英語,
round(avg(s_score),2) as 平均成績
from student a left join score b on a.s_id = b.s_id group by a.s_name
order by 平均成績 desc;
-- 18.查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
--及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90
select b.c_id,b.c_name,
max(a.s_score) as 最高分,
min(a.s_score) as 最低分,
round(avg(a.s_score),2) as 平均分,
round(sum(case when a.s_score>= 60 then 1 else 0 end)/count(s_id),2) as 及格率 ,
round(sum(case when a.s_score>= 70 and a.s_score <80 then 1 else 0 end)/count(s_id),2) as 中等率,
round(sum(case when a.s_score>= 80 and a.s_score <90 then 1 else 0 end)/count(s_id),2) as 優良率,
round(sum(case when a.s_score>= 90 then 1 else 0 end)/count(s_id),2) as 優秀率
from score a
left join course b
on a.c_id = b.c_id group by b.c_id;
-- 19、按各科成績進行排序,並顯示排名
第一種:
set @pre_c_id:= ༽'
set @rank:=0;
select tb2.s_id ,tb2.c_id,tb2.s_score,tb2.排名 from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2;
如果看不懂用第二種方法:
SELECT a.c_id,a.s_id,a.s_score,COUNT(b.s_score)+1 AS 排名
FROM score a LEFT JOIN score b ON a.s_score<b.s_score AND a.c_id = b.c_id
GROUP BY a.c_id,a.s_id,a.s_score ORDER BY a.c_id,排名,a.s_id ASC
-- 20、查詢學生的總成績並進行排名
set @rank:=0;
select * ,(@rank:=@rank+1) as rank from
(select s_id ,sum(s_score) as 總成績 from score
group by s_id order by 總成績 desc) tb1;
-- 21、查詢不同老師所教不同課程平均分從高到低顯示
select a.c_id, d.t_name,round(avg(a.s_score)) as 平均分 from score a
left join student b on a.s_id = b.s_id
left join course c on a.c_id = c.c_id
left join teacher d on c.t_id = d.t_id group by a.c_id
order by 平均分 desc;
-- 22、查詢所有課程的成績第2名到第3名的學生信息及該課程成績
set @pre_c_id:= ༽'
set @rank:=0;
select b.s_name,tb2.s_id ,tb2.c_id,tb2.s_score,tb2.排名 from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2 join student b on tb2.s_id = b.s_id where 排名 = 2 or 排名 =3;
-- 23、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],(85-70],(70-60],(0-60]及所佔百分比
select b.c_id,b.c_name ,
sum(case when a.s_score >=85 then 1 else 0 end) as 100-85 ,
concat(round(100 sum(case when a.s_score >=85 then 1 else 0 end)/count( ),2), '%') as 百分比,
sum(case when a.s_score <85 and a.s_score >=70 then 1 else 0 end) as 85-70 ,
concat(round(100 sum(case when a.s_score <85 and a.s_score >=70 then 1 else 0 end)/count( ),2),'%') as 百分比,
sum(case when a.s_score <70 and a.s_score >=60 then 1 else 0 end) as 70-60 ,
concat(round(100 sum(case when a.s_score <70 and a.s_score >=60 then 1 else 0 end)/count( ),2) ,'%')as 百分比,
sum(case when a.s_score <60 and a.s_score >=0 then 1 else 0 end) as 60-0 ,
concat(round(100 sum(case when a.s_score <60 and a.s_score >=0 then 1
else 0 end)/count( ),2),'%') as 百分比
from score a left join course b on a.c_id = b.c_id group by b.c_id;
-- 24、查詢學生平均成績及其名次
select tb1.*,(@rank:=@rank +1 ) as rank from
(select s_id ,round(avg(s_score),2) as 平均成績 from score
group by s_id order by 平均成績 desc) tb1,(select @rank:=0) b;
-- 25、查詢各科成績前三名的記錄
set @pre_c_id:= ༽'
set @rank:=0;
select b.s_name,tb2.s_id ,tb2.c_id,tb2.s_score,tb2.排名 from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2 join student b on tb2.s_id = b.s_id where 排名 <4;
-- 26、查詢每門課程被選修的學生數
select c_id ,count(s_id) as 選修人數 from score group by c_id;
-- 27、查詢出只有兩門課程的全部學生的學號和姓名
select a.s_id ,b.s_name from score a left join student b on a.s_id = b.s_id group by s_id having count(*) = 2;
-- 28、查詢男生、女生人數
select sum(case s_sex when '男' then 1 else 0 end) as 男生人數,
sum(case s_sex when '女' then 1 else 0 end) as 女生人數 from student;
-- 29、查詢名字中含有"風"字的學生信息
select * from student where s_name like '%風%'
-- 30、查詢同名同性學生名單,並統計同名人數
--略,不想寫
-- 31、查詢1990年出生的學生名單
select * from student where s_birth like %'
-- 32、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
select c_id ,round(avg(s_score),2) as 平均成績 from score group by c_id order by 平均成績 desc, c_id asc;
-- 33、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績
select a.s_id,b.s_name ,round(avg(s_score),2) as 平均成績 from score a
left join student b on a.s_id = b.s_id group by a.s_id having 平均成績>=85;
-- 34、查詢課程名稱為"數學",且分數低於60的學生姓名和分數
select b.s_name ,a.s_score from score a
left join student b on a.s_id = b.s_id
where a.c_id=(select c_id from course where c_name = '數學')and a.s_score < 60;
-- 35、查詢所有學生的課程及分數情況;
select b.s_name,
sum(case when a.c_id = ༽' then a.s_score else null end) as 語文,
sum(case when a.c_id = ༾' then a.s_score else null end) as 數學,
sum(case when a.c_id = ༿' then a.s_score else null end) as 英語
from score a right join student b on a.s_id = b.s_id group by b.s_name
-- 36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
select b.s_name,
sum(case when a.c_id = ༽' then a.s_score else null end) as 語文,
sum(case when a.c_id = ༾' then a.s_score else null end) as 數學,
sum(case when a.c_id = ༿' then a.s_score else null end) as 英語
from score a right join student b on a.s_id = b.s_id group by b.s_name having 語文>= 70 or 數學>= 70 or 英語>= 70 ;
-- 37、查詢不及格的課程
select a.s_id,a.c_id,b.c_name,a.s_score from score a
left join course b on a.c_id = b.c_id where a.s_score<60;
--38、查詢課程編號為01且課程成績在80分以上的學生的學號和姓名;
select a.s_id,b.s_name from score a left join student b on a.s_id = b.s_id where a.c_id = ༽' and a.s_score>=80;
-- 39、求每門課程的學生人數
select c_id,count(*) as 學生人數 from score group by c_id ;
-- 40、查詢選修"張三"老師所授課程的學生中,成績最高的學生信息及其成績
select a.*,b.c_id,max(b.s_score) as 最高成績 from student a
right join score b on a.s_id = b.s_id
group by b.c_id
having b.c_id = (select c_id from course
where t_id = (select t_id from teacher where t_name = '張三'));
-- 41、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績
--(這題我搞不清題目是什麼意思,是指查找學生個體參加了的所有課程的成績各不相同的那個學生信息呢?還是所有課程之間做對比呢,我更傾向於理解為前者)
--理解為前者的寫法
select * from
(select * from score group by s_id,s_score) tb1
group by s_id having count(*) = 1;
--理解為後者的寫法
select distinct a.s_id,a.c_id,b.s_score from score a,score b where a.c_id != b.c_id and a.s_score = b.s_score;
-- 42、查詢每門課程成績最好的前兩名
set @pre_c_id:= ༽'
set @rank:=0;
select tb2.s_id ,tb2.c_id,tb2.s_score from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2
join student b on tb2.s_id = b.s_id where 排名 <3;
-- 43、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人相同,按課程號升序排列
select c_id ,count(*) as 選修人數 from score group by c_id having 選修人數>5 order by 選修人數 desc , c_id asc;
-- 44、檢索至少選修兩門課程的學生學號
select s_id from score group by s_id having count(*) >= 2;
-- 45、查詢選修了全部課程的學生信息
select * from student where s_id in
(select s_id from score group by s_id having count(*) = 3)
--46、查詢各學生的年齡
select s_name ,(date_format(now(),'%Y')-date_format(s_birth,'%Y') + (CASE when date_format(now(),'%m%d')>=date_format(s_birth,'%m%d') then 0 else 1 end)) as age
from student
-- 47、查詢本周過生日的學生
---(實現得並不完全,因為例如出生月日為『01-01』在每一年可能會輸入不同周)
select * from student where week(date_format(s_birth,'%m%d'))=week(date_format(now(),'%m%d')) ;
-- 48、查詢下周過生日的學生
select * from student
where week(date_format(s_birth,'%m%d'))=week(date_format(date_add(now(),interval 7-dayofweek(now())+1 day),'%m%d'));
-- 49、查詢本月過生日的學生
select * from student where date_format(s_birth,'%m') = date_format(now(),'%m')
-- 50、查詢下月過生日的學生
select * from student where date_format(s_birth,'%m') = date_format(date_add(now(),interval 1 month),'%m')
❺ 急! SQL 考試合格率查詢怎麼做
SELECT
SUM( case when 理論成績>='60' and 操作成績>='60' then 1 else 0 end)/count(*)
FROM 計算機考試成績201112 WHERE 院系名稱='園林系'
❻ 資料庫常用sql語句有哪些
資料庫常用sql語句有哪些
SQL語句有哪些?SQL語句無論是種類還是數量都是繁多的,很多語句也是經常要用到的,下文我為大家分享的就是SQL的常用語句,僅供參考!
50個常用的sql語句
Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表
問題:
1、查詢“001”課程比“002”課程成績高的所有學生的學號;
select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
from SC where C#='002') b
where a.score>b.score and a.s#=b.s#;
2、查詢平均成績大於60分的同學的學號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查詢所有同學的學號、姓名、選課數、總成績;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
4、查詢姓“李”的老師的個數;
select count(distinct(Tname))
from Teacher
where Tname like '李%';
5、查詢沒學過“葉平”老師課的同學的學號、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平');
6、查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名;
select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');
7、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
select S#,Sname
from Student
where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='葉平'));
8、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;
Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2
from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;
9、查詢所有課程成績小於60分的同學的學號、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
10、查詢沒有學全所有課的同學的學號、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
11、查詢至少有一門課與學號為“1001”的同學所學相同的同學的學號和姓名;
select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';
12、查詢至少學過學號為“001”同學所有一門課的其他同學學號和姓名;
select distinct SC.S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='001');
13、把“SC”表中“葉平”老師教的課的成績都更改為此課程的平均成績;
update SC set score=(select avg(SC_2.score)
from SC SC_2
where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='葉平');
14、查詢和“1002”號的同學學習的課程完全相同的其他同學學號和姓名;
select S# from SC where C# in (select C# from SC where S#='1002')
group by S# having count(*)=(select count(*) from SC where S#='1002');
15、刪除學習“葉平”老師課的SC表記錄;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平';
16、向SC表中插入一些記錄,這些記錄要求符合以下條件:沒有上過編號“003”課程的同學學號、2、
號課的平均成績;
Insert SC select S#,'002',(Select avg(score)
from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');
17、按平均成績從高到低顯示所有學生的“資料庫”、“企業管理”、“英語”三門的課程成績,按如下形式顯示: 學生ID,,資料庫,企業管理,英語,有效課程數,有效平均分
SELECT S# as 學生ID
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 資料庫
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企業管理
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英語
,COUNT(*) AS 有效課程數, AVG(t.score) AS 平均成績
FROM SC AS t
GROUP BY S#
ORDER BY avg(t.score)
18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
SELECT L.C# As 課程ID,L.score AS 最高分,R.score AS 最低分
FROM SC L ,SC AS R
WHERE L.C# = R.C# and
L.score = (SELECT MAX(IL.score)
FROM SC AS IL,Student AS IM
WHERE L.C# = IL.C# and IM.S#=IL.S#
GROUP BY IL.C#)
AND
R.Score = (SELECT MIN(IR.score)
FROM SC AS IR
WHERE R.C# = IR.C#
GROUP BY IR.C#
);
19、按各科平均成績從低到高和及格率的百分數從高到低順序
SELECT t.C# AS 課程號,max(course.Cname)AS 課程名,isnull(AVG(score),0) AS 平均成績
,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分數
FROM SC T,Course
where t.C#=course.C#
GROUP BY t.C#
ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
20、查詢如下課程平均成績和及格率的百分數(用"1行"顯示): 企業管理(001),馬克思(002),OO&UML (003),資料庫(004)
SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企業管理平均分
,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企業管理及格百分數
,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 馬克思平均分
,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 馬克思及格百分數
,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分
,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分數
,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 資料庫平均分
,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 資料庫及格百分數
FROM SC
21、查詢不同老師所教不同課程平均分從高到低顯示
SELECT max(Z.T#) AS 教師ID,MAX(Z.Tname) AS 教師姓名,C.C# AS 課程ID,MAX(C.Cname) AS 課程名稱,AVG(Score) AS 平均成績
FROM SC AS T,Course AS C ,Teacher AS Z
where T.C#=C.C# and C.T#=Z.T#
GROUP BY C.C#
ORDER BY AVG(Score) DESC
22、查詢如下課程成績第 3 名到第 6 名的學生成績單:企業管理(001),馬克思(002),UML (003),資料庫(004)
[學生ID],[學生姓名],企業管理,馬克思,UML,資料庫,平均成績
SELECT DISTINCT top 3
SC.S# As 學生學號,
Student.Sname AS 學生姓名 ,
T1.score AS 企業管理,
T2.score AS 馬克思,
T3.score AS UML,
T4.score AS 資料庫,
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 總分
FROM Student,SC LEFT JOIN SC AS T1
ON SC.S# = T1.S# AND T1.C# = '001'
LEFT JOIN SC AS T2
ON SC.S# = T2.S# AND T2.C# = '002'
LEFT JOIN SC AS T3
ON SC.S# = T3.S# AND T3.C# = '003'
LEFT JOIN SC AS T4
ON SC.S# = T4.S# AND T4.C# = '004'
WHERE student.S#=SC.S# and
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
NOT IN
(SELECT
DISTINCT
TOP 15 WITH TIES
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
FROM sc
LEFT JOIN sc AS T1
ON sc.S# = T1.S# AND T1.C# = 'k1'
LEFT JOIN sc AS T2
ON sc.S# = T2.S# AND T2.C# = 'k2'
LEFT JOIN sc AS T3
ON sc.S# = T3.S# AND T3.C# = 'k3'
LEFT JOIN sc AS T4
ON sc.S# = T4.S# AND T4.C# = 'k4'
ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);
23、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60]
SELECT SC.C# as 課程ID, Cname as 課程名稱
,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]
,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]
,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]
,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]
FROM SC,Course
where SC.C#=Course.C#
GROUP BY SC.C#,Cname;
24、查詢學生平均成績及其名次
SELECT 1+(SELECT COUNT( distinct 平均成績)
FROM (SELECT S#,AVG(score) AS 平均成績
FROM SC
GROUP BY S#
) AS T1
WHERE 平均成績 > T2.平均成績) as 名次,
S# as 學生學號,平均成績
FROM (SELECT S#,AVG(score) 平均成績
FROM SC
GROUP BY S#
) AS T2
ORDER BY 平均成績 desc;
25、查詢各科成績前三名的記錄:(不考慮成績並列情況)
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
26、查詢每門課程被選修的學生數
select c#,count(S#) from sc group by C#;
27、查詢出只選修了一門課程的全部學生的學號和姓名
select SC.S#,Student.Sname,count(C#) AS 選課數
from SC ,Student
where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
28、查詢男生、女生人數
Select count(Ssex) as 男生人數 from Student group by Ssex having Ssex='男';
Select count(Ssex) as 女生人數 from Student group by Ssex having Ssex='女';
29、查詢姓“張”的.學生名單
SELECT Sname FROM Student WHERE Sname like '張%';
30、查詢同名同性學生名單,並統計同名人數
select Sname,count(*) from Student group by Sname having count(*)>1;;
31、1981年出生的學生名單(註:Student表中Sage列的類型是datetime)
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
from student
where CONVERT(char(11),DATEPART(year,Sage))='1981';
32、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
33、查詢平均成績大於85的所有學生的學號、姓名和平均成績
select Sname,SC.S# ,avg(score)
from Student,SC
where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;
34、查詢課程名稱為“資料庫”,且分數低於60的學生姓名和分數
Select Sname,isnull(score,0)
from Student,SC,Course
where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname='資料庫'and score <60;
35、查詢所有學生的選課情況;
SELECT SC.S#,SC.C#,Sname,Cname
FROM SC,Student,Course
where SC.S#=Student.S# and SC.C#=Course.C# ;
36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
SELECT distinct student.S#,student.Sname,SC.C#,SC.score
FROM student,Sc
WHERE SC.score>=70 AND SC.S#=student.S#;
37、查詢不及格的課程,並按課程號從大到小排列
select c# from sc where scor e <60 order by C# ;
38、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名;
select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';
39、求選了課程的學生人數
select count(*) from sc;
40、查詢選修“葉平”老師所授課程的學生中,成績最高的學生姓名及其成績
select Student.Sname,score
from Student,SC,Course C,Teacher
where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='葉平' and SC.score=(select max(score)from SC where C#=C.C# );
41、查詢各個課程及相應的選修人數
select count(*) from sc group by C#;
42、查詢不同課程成績相同的學生的學號、課程號、學生成績
select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ;
43、查詢每門功成績最好的前兩名
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
44、統計每門課程的學生選修人數(超過10人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,查詢結果按人數降序排列,若人數相同,按課程號升序排列
select C# as 課程號,count(*) as 人數
from sc
group by C#
order by count(*) desc,c#
45、檢索至少選修兩門課程的學生學號
select S#
from sc
group by s#
having count(*) > = 2
46、查詢全部學生都選修的課程的課程號和課程名
select C#,Cname
from Course
where C# in (select c# from sc group by c#)
47、查詢沒學過“葉平”老師講授的任一門課程的學生姓名
select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='葉平');
48、查詢兩門以上不及格課程的同學的學號及其平均成績
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;
49、檢索“004”課程分數小於60,按分數降序排列的同學學號
select S# from SC where C#='004'and score <60 order by score desc;
50、刪除“002”同學的“001”課程的成績
delete from Sc where S#='001'and C#='001';
;❼ SQL經典50題題解
本篇文章主要是對SQL經典50題進行詳細解析。
解析包含:1、解題思路,2、考核知識點,3、答案;
首先,表結構用腦圖輸出出來,如下所示:
先進行數據准備,建表以及插入數據。
1.查詢"01"課程比"02"課程成績高的學生的信息及課程分數
解題思路:
第一步:關鍵詞有「課程編號」、「課程成績」、「學生信息」,鎖定使用表:學生表、成績表。
第二步:給出學生信息及課程分數,通過主鍵sid關聯學生表和課程表。
第三步:比較同一個學生不同課程的成績,再關聯一次課程表,利用sid、cid進行關聯。
第四步:根據題目,用where比較分數篩選結果。
考核知識點: join,where
答案:
1.1 查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時顯示為 null )
解題思路:
第一步:關鍵詞有「課程編號」、「學生編號」,鎖定使用表:成績表。
第二步:分別查詢出存在" 01 "課程的學生和存在" 02 "課程的學生。
第三步:對兩個子查詢進行關聯,用sid進行左聯接。
考核知識點: where, 子查詢,left join
答案:
1.2 查詢同時存在01和02課程的情況
解題思路: 同1.1,把left join改為join
考核知識點: where, 子查詢,join
答案:
1.3 查詢選擇了02課程但沒有01課程的情況
解題思路: 類似1.1,把left join改為right join
考核知識點: where, 子查詢,right join
答案:
小結: 上面的題主要考察join、left join、right join。
2.查詢平均成績大於等於 60 分的同學的學生編號和學生姓名和平均成績
解題思路:
第一步:關鍵詞有「平均成績」、「學生編號」、「學生姓名」,鎖定使用表:成績表、學生表。
第二步:給出學生信息及課程分數,通過主鍵sid關聯學生表和課程表。。
第三步:根據題目,用group by聚合計算出平均成績,然後篩選出大於等於60分的學生。
考核知識點: join、group by、avg()
答案:
3.查詢在 SC 表存在成績的學生信息
解題思路:
第一步:關鍵詞有「SC」、「學生信息」,鎖定使用表:成績表、學生表。
第二步:用EXISTS判斷在SC表存在成績的學生信息
考核知識點: EXISTS語句
答案:
4.查詢所有同學的學生編號、學生姓名、選課總數、所有課程的成績總和
解題思路:
第一步:關鍵詞有「學生編號」、「學生姓名」、「選課總數」、「課程成績」,鎖定使用表:成績表、學生表。
第二步:通過主鍵sid關聯學生表成績表,得到學生信息、學生成績的寬表
第三步:根據題目,用group by聚合計算選課總數和總成績
考核知識點: left join、group by、count()、sum()、ifnull()
答案:
5.查詢「李」姓老師的數量
解題思路:
第一步:關鍵詞有「老師的數量」,鎖定使用表:教師表。
第二步:先篩選出「李」姓老師,再匯總統計「李」姓老師的數量
考核知識點: like、where、%、count()
答案:
6.查詢學過「張三」老師授課的同學的信息
解題思路:
第一步:關鍵詞有「老師」、「學生信息」,鎖定使用表:教師表、學生表、成績表、課程表。
第二步:通過sid關聯學生表、成績表,再通過cid關聯課程表,最後通過tid關聯教師表。
第三步:用where篩選出「張三」老師授課的同學的信息。
考核知識點: 多重連接join
答案:
7.查詢沒有學全所有課程的同學的信息。
解題思路:
第一步:關鍵詞有「課程」、「學生信息」,鎖定使用表:學生表、成績表、課程表。
第二步:先統計學生的課程數量,再篩選出小於所有課程數量的學生。
考核知識點: left join、group by、count()
答案:
8.查詢至少有一門課與學號為" 01 "的同學所學相同的同學的信息。
解題思路:
第一步:關鍵詞有「課程」、「學生信息」,鎖定使用表:學生表、成績表。
第二步:先查詢學號「01」的同學學習的課程。
第三步:通過sid關聯學生表和成績表,獲取所有學生信息、課程信息。
第四步:用EXISTS篩選出至少1門課相同的同學信息。
考核知識點: left join、子查詢、EXISTS
答案:
9.查詢和" 01 "號的同學學習的課程完全相同的其他同學的信息
解題思路:
第一步:關鍵詞有「課程」、「學生信息」,鎖定使用表:學生表、成績表。
第二步:用「01」號的同學學習的課程左關聯學生課程表,篩選出關鏈課程數一致的其他同學的sid
第三步:通過sid關聯學生表和成績表,獲取完整的學生信息。
考核知識點: left join、子查詢、group by
答案:
10.查詢沒學過"張三"老師講授的任一門課程的學生姓名
解題思路:
第一步:關鍵詞有「老師」、「學生姓名」,鎖定使用表:學生表、成績表、課程表、教師表。
第二步:反向求解。先查詢至少學過「張三」老師講授的課程的學生sid
第三步:用NOT EXISTS篩選出不在第二步查詢結果的學生信息,。
考核知識點: 多重連接join、NOT EXISTS、子查詢
答案:
11.查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
解題思路:
第一步:關鍵詞有「姓名」、「平均成績」,鎖定使用表:學生表、成績表。
第二步:通過sid關聯學生表和成績表,得到學生成績信息寬表
第三步:用group by聚合統計,having對聚合的結果進行篩選。
考核知識點: join、group by、having、case when語句、avg()
答案:
12.檢索" 01 "課程分數小於 60,按分數降序排列的學生信息
解題思路:
第一步:關鍵詞有「課程分數」、「學生信息」,鎖定使用表:學生表、成績表。
第二步:通過sid關聯學生表和成績表,得到學生成績信息寬表
第三步:用where篩選" 01 "課程分數小於 60的記錄,並按照分數降序排列。
考核知識點: join、where、order by
答案:
13.按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
解題思路:
第一步:關鍵詞有「平均成績」,鎖定使用表:成績表。
第二步:用group by將學生課程的成績由行轉換為列並計算平均成績。
第三步:按照平均成績降序顯示學生的所有課程的成績以及平均成績。
考核知識點: join
答案:
14.查詢各科成績最高分、最低分和平均分,以如下形式顯示:
以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,
優良率,優秀率
及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90
要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
解題思路:
第一步:關鍵詞有「課程name」、「最高分」,鎖定使用表:課程表、成績表。
第二步:用group by聚合計算課程最高分、最低分、平均分。
第三步:用case語句判斷及格、中等、優良、優秀,並結合group by計算。
考核知識點: join、group by、max()、min()、avg()、sum()、case when語句
答案:
15.按各科成績進行排序,並顯示排名, Score 重復時保留名次空缺
解題思路:
第一步:關鍵詞有「各科成績」,鎖定使用表:成績表。
第二步:用rank()排名。
考核知識點: rank() over(partition by)
答案:
15.1 按各科成績進行行排序,並顯示排名, Score 重復時合並名次
解題思路:
第一步:關鍵詞有「各科成績」,鎖定使用表:成績表。
第二步:用dense_rank()排名。
考核知識點: dense_rank() over(partition by)
答案:
16.查詢學生的總成績,並進行排名,總分重復時保留名次空缺
解題思路:
第一步:關鍵詞有「總成績」,鎖定使用表:成績表。
第二步:用group by統計學生的總成績。
第三步:用left join自關聯進行排名。
考核知識點: group by、 left join
答案:
16.1 查詢學生的總成績,並進行排名,總分重復時不保留名次空缺
解題思路:
第一步:關鍵詞有「總成績」,鎖定使用表:成績表。
第二步:用group by統計學生的總成績。
第三步:用變數進行排名。
考核知識點: group by、變數
答案:
17. 統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[60-0] 及所佔百分比
解題思路:
第一步:關鍵詞有「各科成績」、「課程名稱」,鎖定使用表:成績表、課程表。
第二步:通過cid關聯課程表和成績表,得到課程、成績信息寬表。
第三步:用group by聚合統計各分段的人數及百分比。
考核知識點: join、group by、case when條件語句
答案:
18.查詢各科成績前三名的記錄
解題思路:
第一步:關鍵詞有「各科成績」,鎖定使用表:成績表。
第二步:篩選出各科比當前成績高的人數小於3的學生記為各科的前三名。
考核知識點: 子查詢
答案:
19.查詢每門課程被選修的學生數
解題思路:
第一步:關鍵詞有「每門課程」、「學生數」,鎖定使用表:課程表、成績表。
第二步:用left join關聯課程表和成績表,再用group by分組匯總各科的學生數。
考核知識點: left join、group by
答案:
20.查詢出只選修兩門課程的學生學號和姓名
解題思路:
第一步:關鍵詞有「選修課程」、「學生姓名」,鎖定使用表:學生表、成績表。
第二步:用join關聯學生表和成績表,再用group by分組匯總每個學生的選修課程數,最後用having對分組匯總結果篩選出選修兩門課程的學生。
考核知識點: join、group by、having
答案:
21. 查詢男生、女生人數
解題思路:
第一步:關鍵詞有「男生、女生」,鎖定使用表:學生表。
第二步:通過ssex學生表用group by分組匯總男生、女生人數。
考核知識點: group by
答案:
22. 查詢名字中含有「風」字的學生信息
解題思路:
第一步:關鍵詞有「學生信息」,鎖定使用表:學生表。
第二步:用like匹配姓名中含有風」字的學生。
考核知識點: like、%
答案:
23查詢同名同性學生名單,並統計同名人數
解題思路:
第一步:關鍵詞有「學生名單」,鎖定使用表:學生表。
第二步:使用group by,匯總同名同性人數,再用having篩選出大於1的記錄
考核知識點: group by、having
答案:
24.查詢 1990 年出生的學生名單
解題思路:
第一步:關鍵詞有「學生名單」,鎖定使用表:學生表。
第二步:用where篩選出1990年出生的學生名單
考核知識點: where、year
答案:
25.查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編
號升序排列。
解題思路:
第一步:關鍵詞有「平均成績」,鎖定使用表:成績表。
第二步:用group by分組計算各科平均成績,再用order by完成多列排序
考核知識點: group by、order by
答案:
26.查詢平均成績大於等於 85 的所有學生的學號、姓名和平均成績
解題思路:
第一步:關鍵詞有「平均成績」、「學生姓名」,鎖定使用表:成績表、學生表。
第二步:用join關聯學生表和成績表
第三步:用group by分組匯總計算每個學生的平均成績,再用having篩選平均成績>=85的記錄
考核知識點: join、group by、having
答案:
27.查詢課程名稱為「數學」,且分數低於 60 的學生姓名和分數
解題思路:
第一步:關鍵詞有「課程名稱」、「分數」、「學生姓名」,鎖定使用表:課程表、成績表、學生表。
第二步:用join關聯學生表、成績表、課程表,再用where篩選
考核知識點: 多重join、where
答案:
28. 查詢所有學生的課程及分數情況(存在學生沒成績,沒選課的情況)
解題思路:
第一步:關鍵詞有「所有學生」、「分數」,鎖定使用表:學生表、成績表
第二步:用left join關聯學生表、成績表
考核知識點: left join
答案:
29.查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數
解題思路:
第一步:關鍵詞有「課程成績」、「姓名」、「課程名稱」,鎖定使用表:學生表、成績表、課程表
第二步:用join關聯學生表、成績表、課程表,再篩選出課程成績在70分以上的。
考核知識點: 多重join
答案:
30.查詢不及格的課程
解題思路:
第一步:關鍵詞有「不及格的課程」,鎖定使用表:成績表、課程表
第二步:關聯課程表和成績表,再條件篩選出不及格的課程信息。
考核知識點: join、where、去重
答案:
31.查詢課程編號為 01 且課程成績在 80 分以上的學生的學號和姓名
解題思路:
第一步:關鍵詞有「課程編號」、「課程成績」、「姓名」,鎖定使用表:成績表、學生表
第二步:關聯成績表和學生表,再條件篩選出結果。
考核知識點: join、where
答案:
32.求每門課程的學生人數
解題思路:
第一步:關鍵詞有「課程」、「學生人數」,鎖定使用表:成績表
第二步:用group by分組匯總各科的學生人數。
考核知識點: group by
答案:
33.成績不重復,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
解題思路:
第一步:關鍵詞有「成績」、「「張三」老師」、「學生信息」,鎖定使用表:成績表、課程表、學生表、教師表
第二步:關聯所有表,篩選出選修「張三」老師所授課程的學生。
第三步:因為成績不重復,對學生成績由高到低排序,篩選出第一行記錄。
考核知識點: 多重join、order by、limit
答案:
34.成績有重復的情況下,查詢選修「張三」老師所授課程的學生中,成績最高的學生
信息及其成績
解題思路:
第一步:關鍵詞有「成績」、「「張三」老師」、「學生信息」,鎖定使用表:成績表、課程表、學生表、教師表
第二步:關聯所有表,篩選出選修「張三」老師所授課程的學生。
第三步:因為成績有重復,先求出最高成績,再匹配最高成績對應的學生信息。
考核知識點: 多重join、max()
答案:
35.查詢不同課程成績相同的學生的學生編號、課程編號、學生成績
解題思路:
第一步:關鍵詞有「成績」,鎖定使用表:成績表
第二步:自聯接,篩選出不同課程成績相同的記錄
考核知識點: 自聯接join
答案:
36. 查詢每門成績最好的前兩名
解題思路:
第一步:關鍵詞有「成績」,鎖定使用表:成績表
第二步:自聯接,篩選出各科低於自身成績的人數為2的。
考核知識點: left join
答案:
37. 統計每門課程的學生選修人數(超過 5 人的課程才統計)。
解題思路:
第一步:關鍵詞有「選修人數」,鎖定使用表:成績表
第二步:先用group by分組匯總各科的選修人數,再條件篩選出超過5人的課程。
考核知識點: group by、having
答案:
38.檢索至少選修兩門課程的學生學號
解題思路:
第一步:關鍵詞有「兩門課程」,鎖定使用表:成績表
第二步:先用group by分組匯總每個學生的選修課程數,再用having篩選出至少2門課程的學生學號
考核知識點: group by、having
答案:
39.查詢選修了全部課程的學生信息
解題思路:
第一步:關鍵詞有「全部課程」、「學生信息」,鎖定使用表:成績表、課程表、學生表
第二步:關聯學生表和成績表,再用group by分組統計每個學生的選修課程數
第三步:最後用having篩選出等於全部課程數的學生信息。
考核知識點: join、 group by、having、子查詢
答案:
40.查詢各學生的年齡,只按年份來算
解題思路:
第一步:關鍵詞有「學生的年齡」,鎖定使用表:學生表
第二步:用year和now來統計
考核知識點: year、now
答案:
41. 按照出生日期來算,當前月日 < 出生年月的月日則,年齡減一
解題思路:
第一步:關鍵詞有「出生日期」,鎖定使用表:學生表
第二步:用timestampdiff()統計年齡
考核知識點: timestampdiff()
答案:
42.查詢本周過生日的學生
解題思路:
第一步:關鍵詞有「過生日」,鎖定使用表:學生表
第二步:用week函數
考核知識點: week()
答案:
43. 查詢下周過生日的學生
解題思路:
第一步:關鍵詞有「過生日」,鎖定使用表:學生表
第二步:用week函數
考核知識點: week()
答案:
44.查詢本月過生日的學生
解題思路:
第一步:關鍵詞有「過生日」,鎖定使用表:學生表
第二步:用month函數
考核知識點: month()
答案:
45.查詢下月過生日的學生
解題思路:
第一步:關鍵詞有「過生日」,鎖定使用表:學生表
第二步:用month函數
考核知識點: month()
答案:
❽ SQL查詢 統計每門課的選課人數及不及格人數
select a.cnum,a.cname,a.rs,b.bjg_rs
from
(select sec.cnum,c.cname,count(s.snum) as 'rs'
from student s,course c,sc,sections sec
where s.snum = sc.snum and
sc.secnum = sec.secnum and
sec.cnum = c.cnum
group by sec.cnum,c.cname) a
left join
(select sec.cnum,c.cname,count(s.snum) as 'bjg_rs'
from student s,course c,sc,sections sec
where s.snum = sc.snum and
sc.secnum = sec.secnum and
sec.cnum = c.cnum and
sc.score < '60'
group by sec.cnum,c.cname) b
on a.cnum = b.cnum
❾ 資料庫sql語言
我簡單的給你寫幾個T-SQL語句查詢:SELECT * FROM TBL_NAME修改:UPDATE TBL_NAME SET NAME = 'AAAA' WHERE ID = 1刪除:DELETE FROM TBL_NAME WHERE ID = 1添加:INSERT INTO TBL_NAME (NAME) VALUES('AAA')