Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表數據庫
問題:c#
--一、查詢「」課程比「」課程成績高的全部學生的學號;
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#;
--二、查詢平均成績大於分的同窗的學號和平均成績;
SELECT S#,
avg(score)
FROM sc
GROUP
BY S# having
avg(score) >
60;
--三、查詢全部同窗的學號、姓名、選課數、總成績;
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
--四、查詢姓「李」的老師的個數;
SELECT
count(distinct(Tname))
FROM Teacher
WHERE Tname
like
'李%';
--五、查詢沒學過「葉平」老師課的同窗的學號、姓名;
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=
'葉平');
--六、查詢學過「」而且也學過編號「」課程的同窗的學號、姓名;
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');
--七、查詢學過「葉平」老師所教的全部課的同窗的學號、姓名;
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=
'葉平'));
--八、查詢課程編號「」的成績比課程編號「」課程低的全部同窗的學號、姓名;
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;
--九、查詢全部課程成績小於分的同窗的學號、姓名;
SELECT S#,Sname
FROM Student
WHERE S#
not
in (
SELECT Student.S#
FROM Student,SC
WHERE S.S#=SC.S#
AND score>
60);
--十、查詢沒有學全全部課的同窗的學號、姓名;
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);
--十一、查詢至少有一門課與學號爲「」的同窗所學相同的同窗的學號和姓名;
SELECT S#,Sname
FROM Student,SC
WHERE Student.S#=SC.S#
AND C#
in
SELECT C#
FROM SC
WHERE S#=
'1001';
--十二、查詢至少學過學號爲「」同窗全部一門課的其餘同窗學號和姓名;
SELECT distinct SC.S#,Sname
FROM Student,SC
WHERE Student.S#=SC.S#
AND C#
in (
SELECT C#
FROM SC
WHERE S#=
'001');
--1三、把「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=
'葉平');
--1四、查詢和「」號的同窗學習的課程徹底相同的其餘同窗學號和姓名;
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');
--1五、刪除學習「葉平」老師課的SC表記錄;
Delect SC
FROM course ,Teacher
WHERE Course.C#=SC.C#
AND Course.T#= Teacher.T#
AND Tname=
'葉平';
--1六、向SC表中插入一些記錄,這些記錄要求符合如下條件:沒有上過編號「」課程的同窗學號、、號課的平均成績;
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');
--1七、按平均成績從高到低顯示全部學生的「數據庫」、「企業管理」、「英語」三門的課程成績,按以下形式顯示:學生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)
--1八、查詢各科成績最高和最低的分:以以下形式顯示:課程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#
);
--1九、按各科平均成績從低到高和及格率的百分數從高到低順序
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行"顯示): 企業管理(),馬克思(),OO&UML (),數據庫()
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
--2一、查詢不一樣老師所教不一樣課程平均分從高到低顯示
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
--2二、查詢以下課程成績第3 名到第6 名的學生成績單:企業管理(),馬克思(),UML (),數據庫()
[學生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);
--2三、統計列印各科成績,各分數段人數:課程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;
--2四、查詢學平生均成績及其名次
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;
--2五、查詢各科成績前三名的記錄:(不考慮成績並列狀況)
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#;
--2六、查詢每門課程被選修的學生數
SELECT c#,
count(S#)
FROM sc
GROUP
BY C#;
--2七、查詢出只選修了一門課程的所有學生的學號和姓名
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;
--2八、查詢男生、女生人數
SELECT
count(Ssex)
as 男生人數FROM Student
GROUP
BY Ssex having Ssex=
'男';
SELECT
count(Ssex)
as 女生人數FROM Student
GROUP
BY Ssex having Ssex=
'女';
--2九、查詢姓「張」的學生名單
SELECT Sname
FROM Student
WHERE Sname
like
'張%';
--30、查詢同名同性學生名單,並統計同名人數
SELECT Sname,
count(*)
FROM Student
GROUP
BY Sname having
count(*)>
1;
--3一、年出生的學生名單(注:Student表中Sage列的類型是datetime)
SELECT Sname, CONVERT(
char (
11),DATEPART(year,Sage))
as age
FROM student
WHERE CONVERT(
char(
11),DATEPART(year,Sage))=
'1981';
--3二、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
SELECT C#,
Avg(score)
FROM SC
GROUP
BY C#
ORDER
BY
Avg(score),C# DESC ;
--3三、查詢平均成績大於的全部學生的學號、姓名和平均成績
SELECT Sname,SC.S# ,
avg(score)
FROM Student,SC
WHERE Student.S#=SC.S#
GROUP
BY SC.S#,Sname having
avg(score)>
85;
--3四、查詢課程名稱爲「數據庫」,且分數低於的學生姓名和分數
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;
--3五、查詢全部學生的選課狀況;
SELECT SC.S#,SC.C#,Sname,Cname
FROM SC,Student,Course
WHERE SC.S#=Student.S#
AND SC.C#=Course.C# ;
--3六、查詢任何一門課程成績在分以上的姓名、課程名稱和分數;
SELECT distinct student.S#,student.Sname,SC.C#,SC.score
FROM student,Sc
WHERE SC.score>=
70
AND SC.S#=student.S#;
--3七、查詢不及格的課程,並按課程號從大到小排列
SELECT c#
FROM sc
WHERE scor e <
60
ORDER
BY C# ;
--3八、查詢課程編號爲且課程成績在分以上的學生的學號和姓名;
SELECT SC.S#,Student.Sname
FROM SC,Student
WHERE SC.S#=Student.S#
AND Score>
80
AND C#=
'003';
--3九、求選了課程的學生人數
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# );
--4一、查詢各個課程及相應的選修人數
SELECT
count(*)
FROM sc
GROUP
BY C#;
--4二、查詢不一樣課程成績相同的學生的學號、課程號、學生成績
SELECT distinct A.S#,B.score
FROM SC A ,SC B
WHERE A.Score=B.Score
AND A.C# <>B.C# ;
--4三、查詢每門功成績最好的前兩名
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#;
--4四、統計每門課程的學生選修人數(超過人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,查詢結果按人數降序排列,若人數相同,按課程號升序排列
SELECT C#
as 課程號,
count(*)
as 人數
FROM sc
group
by C#
order
by
count(*) desc,c#
--4五、檢索至少選修兩門課程的學生學號
SELECT S#
FROM sc
group
by s#
having
count(*) > =
2
--4六、查詢所有學生都選修的課程的課程號和課程名
SELECT C#,Cname
FROM Course
WHERE C#
in (
SELECT c#
FROM sc
group
by c#)
--4七、查詢沒學過「葉平」老師講授的任一門課程的學生姓名
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=
'葉平');
--4八、查詢兩門以上不及格課程的同窗的學號及其平均成績
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#;
--4九、檢索「」課程分數小於,按分數降序排列的同窗學號
SELECT S#
FROM SC
WHERE C#=
'004'
and score <
60
ORDER
BY score desc;
--50、刪除「」同窗的「」課程的成績
delete
FROM Sc
WHERE S#=
'001'
and C#=
'001';