select 訓練


--1、查詢“c001”課程比“c002”課程成績高的所有學生的學號;
SELECT b.sno FROM (SELECT * FROM sc WHERE cno='c001') a,
(SELECT * FROM sc WHERE cno='c002') b
WHERE a.sno=b.sno AND a.score>b.score;

--2、查詢平均成績大於60 分的同學的學號和平均成績;
SELECT AVG(score),sno FROM sc GROUP BY sno
HAVING AVG(score)>60;

--3、查詢所有同學的學號、姓名、選課數、總成績;
SELECT a.sno,a.sname,b.cno,b.score
FROM student a,sc b WHERE a.sno=b.sno;

--4、查詢姓“劉”的老師的個數;
SELECT COUNT(1) FROM teacher WHERE tname LIKE'劉%';

--5、查詢沒學過“諶燕”老師課的同學的學號、姓名;
SELECT sno,sname FROM student
WHERE sno NOT IN(SELECT sno FROM sc
WHERE cno IN (SELECT cno FROM course
WHERE tno IN(SELECT tno FROM teacher WHERE tname='諶燕')));

--6、查詢學過“c001”並且也學過編號“c002”課程的同學的學號、姓名;
SELECT sno,sname FROM student
WHERE sno IN(SELECT sno FROM sc WHERE cno='c001' OR cno='c002');

--7、查詢學過“諶燕”老師所教的所有課的同學的學號、姓名;
SELECT sno,sname FROM student
WHERE sno IN(SELECT sno FROM sc
WHERE cno IN (SELECT cno FROM course
WHERE tno IN(SELECT tno FROM teacher WHERE tname='諶燕')));

--8、查詢課程編號“c002”的成績比課程編號“c001”課程低的所有同學的學號、姓名;
SELECT sno,sname FROM student
WHERE sno IN
(
SELECT b.sno FROM (SELECT * FROM sc WHERE cno='c001') a,
(SELECT * FROM sc WHERE cno='c002') b
WHERE a.sno=b.sno AND a.score>b.score
);
--9、查詢所有課程成績小於60 分的同學的學號、姓名;
SELECT sno,sname FROM student
WHERE sno IN
(
SELECT sno FROM sc WHERE score <60
);

--10、查詢沒有學全所有課的同學的學號、姓名;
SELECT sc.sno,student.sname FROM sc, student  
WHERE sc.sno=student.sno
GROUP BY sc.sno,student.sname
having count(cno)<(SELECT count (cno) FROM course);

--11、查詢至少有一門課與學號為“s001”的同學所學相同的同學的學號和姓名;
SELECT sno,sname FROM student
WHERE sno IN(SELECT sno FROM sc WHERE cno
IN(SELECT course.cno FROM course ,sc
WHERE sc.cno=course.cno AND sc.sno='s001'));

--12、查詢至少學過學號為“s001”同學所有一門課的其他同學學號和姓名;
SELECT sno,sname FROM student
WHERE sno IN(SELECT sno FROM sc WHERE cno
IN(SELECT course.cno FROM course ,sc
WHERE sc.cno=course.cno AND sc.sno='s001') AND sno!='s001');

--13、把“SC”表中“諶燕”老師教的課的成績都更改為此課程的平均成績;
UPDATE sc SET score=AVG(score)
WHERE cno IN(SELECT cno FROM course
WHERE tno=(SELECT tno FROM teacher
WHERE tname='諶燕'));

--14、查詢和“s001”號的同學學習的課程完全相同的其他同學學號和姓名;
SELECT sno,sname FROM student
WHERE sno IN(SELECT sno FROM sc
WHERE cno IN(SELECT cno FROM sc
WHERE sno='s001') AND sno!='s001');

--15、刪除學習“諶燕”老師課的SC 表記錄;
DELETE FROM sc
WHERE cno IN(SELECT cno FROM sc
WHERE cno IN(SELECT cno FROM course
WHERE tno IN(SELECT tno FROM teacher
WHERE tname='諶燕')));
分,最低分

--16、向SC表中插入一些記錄,這些記錄要求符合以下條件:沒有上過編號“c002”課程的同學學號、“c002”號課的平均成績;
INSERT INTO sc
VALUES((SELECT sno FROM sc WHERE cno!='c002'),'c002',
(SELECT AVG(score) FROM sc WHERE cno='c002'));

--17、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
SELECT sno 課程ID,MAX(s.score) 最高分,MIN(s.score) 最低分
FROM SC s GROUP BY sno;
--18、按各科平均成績從低到高和及格率的百分數從高到低順序
SELECT cno,avg(score),sum(case WHEN score>=60 THEN 1 ELSE 0 END)/count(*)
as 及格率
FROM sc GROUP BY cno
ORDER BY avg(score) desc
--19、查詢不同老師所教不同課程平均分從高到低顯示
SELECT MAX(t.tno),MAX(t.tname),MAX(c.cno),MAX(c.cname),c.cno,avg(score) FROM sc , course c,teacher t
WHERE sc.cno=c.cno AND c.tno=t.tno
GROUP BY c.cno
ORDER BY avg(score) desc

--20、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60]
SELECT sc.cno,c.cname,
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 c
WHERE  sc.cno=c.cno
GROUP BY sc.cno ,c.cname;
--21、查詢各科成績前三名的記錄:(不考慮成績並列情況)
SELECT c.cno 課程編號,c.cname 課程名稱, d.sname 學生名稱,s.r1 名次,s.score 成績
FROM (SELECT sno,cno,score,row_number() OVER(PARTITION BY cno ORDER BY score DESC) r1
FROM sc) s,course c,student d
WHERE s.cno=c.cno AND s.sno=d.sno AND r1<4
ORDER BY c.cno,r1;
--22、查詢每門課程被選修的學生數
SELECT s.sno,COUNT(DISTINCT s.sno) 人數
FROM sc s
GROUP BY s.sno;
--23、查詢出只選修了一門課程的全部學生的學號和姓名
SELECT d.sno,MAX(d.sname)
FROM sc s,student d
WHERE d.sno=s.sno
GROUP BY d.sno
HAVING COUNT(DISTINCT s.cno)=1;
--24、查詢男生、女生人數
SELECT SUM(CASE d.ssex WHEN '男' THEN 1 ELSE 0 END) 男生,
SUM(CASE d.ssex WHEN '女' THEN 1 ELSE 0 END) 女
FROM student d;
--25、查詢姓“張”的學生名單
SELECT * FROM student WHERE sname LIKE '張%';
--26、查詢同名同性學生名單,並統計同名人數
SELECT sname 姓名,ssex 性別,COUNT(1) 人數
FROM student
GROUP BY sname,ssex
HAVING COUNT(1)>1;
--27、1981 年出生的學生名單(注:Student 表中Sage 列的類型是number)
SELECT * FROM student
WHERE to_char(sage,'yyyy')='1981';
--28、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
SELECT cno,ROUND(AVG(score),2) 平均分
FROM sc
GROUP BY cno
ORDER BY AVG(score),cno DESC;
--29、查詢平均成績大於85 的所有學生的學號、姓名和平均成績
SELECT s.sno,MAX(d.sname),AVG(s.score)
FROM sc s,student d
WHERE s.sno=d.sno
GROUP BY s.sno
HAVING AVG(s.score)>85;
--30、查詢課程名稱為“數據庫”,且分數低於60 的學生姓名和分數
SELECT d.sname,s.score
FROM student d,sc s,course c
WHERE d.sno=s.sno AND s.cno=c.cno
AND c.cname='數據庫' AND s.score<60;
--31、查詢所有學生的選課情況;
SELECT d.sno 學號,MAX(d.sname) 姓名,COUNT(DISTINCT s.cno) 選課數
FROM student d,sc s
WHERE d.sno=s.sno
GROUP BY d.sno;
--32、查詢任何一門課程成績在70 分以上的姓名、課程名稱和分數;
SELECT MAX(d.sname) 姓名,MAX(c.cname) 課程名稱,s.score 分數
FROM student d,sc s,course c
WHERE d.sno=s.sno AND s.cno=c.cno
GROUP BY s.sno,s.score
HAVING COUNT(1)=(
SELECT COUNT(cno) FROM sc WHERE sno=s.sno);
--33、查詢不及格的課程,並按課程號從大到小排列
SELECT s.sno,c.cname,s.score
FROM sc s,course c
WHERE s.cno=c.cno AND s.score<60
ORDER BY s.cno DESC;
--34、查詢課程編號為c001 且課程成績在80 分以上的學生的學號和姓名;
SELECT d.sno,d.sname
FROM student d,sc s
WHERE d.sno=s.sno
AND s.cno='c003' AND s.score>80;
--35、求選了課程的學生人數
SELECT COUNT(DISTINCT sno) 人數
FROM sc;
--36、查詢選修“諶燕”老師所授課程的學生中,成績最高的學生姓名及其成績
SELECT sname,score
FROM (SELECT d.sname,s.score,row_number()
OVER(ORDER BY s.score DESC) r1
FROM student d,sc s,course c,teacher t
WHERE d.sno=s.sno AND s.cno=c.cno AND c.tno=t.tno AND t.tname='諶燕')
WHERE r1=1;
--37、查詢各個課程及相應的選修人數
SELECT cno 課程編號,COUNT(DISTINCT sno) 選修人數
FROM sc
GROUP BY cno;
--38、查詢不同課程成績相同的學生的學號、課程號、學生成績
SELECT s.sno,s.cno,s.score FROM sc s,sc s1
WHERE s.cno<>s1.cno
AND s.score=s1.score AND s.sno=s1.sno;
--39、查詢每門功課成績最好的前兩名
SELECT d.sno,d.sname,s.cno,s.score,s.r1
FROM(SELECT s1.sno,s1.cno,s1.score,row_number()
OVER(PARTITION BY s1.cno ORDER BY s1.score DESC) r1 FROM sc s1) s,student d
WHERE s.sno=d.sno AND r1<3
ORDER BY s.cno,s.r1;
--40、統計每門課程的學生選修人數(超過10 人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
SELECT s.cno,COUNT(DISTINCT s.sno) 選修人數
FROM course c,sc s
WHERE c.cno=s.cno
GROUP BY s.cno
HAVING COUNT(DISTINCT s.sno)>10
ORDER BY COUNT(DISTINCT s.sno) DESC,s.cno;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM