数据库练习1

时间:2023-02-13 22:03:08
--37、查询Student表中不姓“王”的同学记录。
SELECT
* FROM student s WHERE sname NOT LIKE ('%王%')

不用加is

--35、查询所有未讲课的教师的Tname和Depart.
SELECT t.tname,t.depart FROM teacher t WHERE tno NOT IN (SELECT c.tno FROM course c JOIN teacher t ON c.tno
=t.tno)
多行子查询 用
in any all
SELECT t.tname,t.depart FROM teacher t WHERE tno NOT IN (SELECT c.tno FROM course c JOIN teacher t ON c.tno
=t.tno)

 

SELECT * FROM student s;
SELECT * FROM teacher t;
SELECT * FROM score sc ;
SELECT * FROM course c ;
SELECT * FROM grade g ;
--1、 查询Student表中的所有记录的Sname、Ssex和Class列。
SELECT s.sname,s.ssex,s.class FROM student s
--2、 查询教师所有的单位,即不重复的Depart列。
SELECT DISTINCT t.depart FROM teacher t
--3、 查询Student表的所有记录。
SELECT * FROM student s
--4、 查询Score表中成绩在60到80之间的所有记录。
SELECT * FROM score sc WHERE sc.degree BETWEEN 60 AND 80
--5、 查询Score表中成绩为85,86或88的记录。
SELECT * FROM score sc WHERE sc.degree IN (85,86,88)
--6、 查询Student表中“95031”班或性别为“女”的同学记录。
SELECT * FROM student s WHERE s.class=95031 OR s.ssex='女'
--7、 以Class降序查询Student表的所有记录。
SELECT * FROM student s ORDER BY s.class DESC
--8、 以Cno升序、Degree降序查询Score表的所有记录。
SELECT * FROM score sc ORDER BY sc.cno ASC,sc.degree DESC
--9、 查询“95031”班的学生人数。
SELECT COUNT(s.class) FROM student s WHERE s.class=95031
--10、查询Score表中的最高分的学生学号和课程号。
SELECT * FROM score sc WHERE sc.degree=(SELECT MAX(sc.degree) FROM score sc )
--11、查询‘3-105’号课程的平均分。
SELECT AVG(sc.degree) FROM score sc WHERE sc.cno='3-105'
--12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
SELECT AVG(sc.degree) FROM score sc WHERE sc.cno LIKE('%3%') GROUP BY sc.cno HAVING COUNT(sc.sno)>=5
--13、查询最低分大于70,最高分小于90的Sno列。
SELECT sc.sno,sc.degree FROM score sc WHERE sc.degree>70 AND sc.degree<90
--14、查询所有学生的Sname、Cno和Degree列。
SELECT s.sname,sc.cno,sc.degree FROM student s,score sc WHERE s.sno=sc.sno
--15、查询所有学生的Sno、Cname和Degree列。
SELECT s.sno,c.cname,sc.degree FROM student s,course c,score sc WHERE s.sno=sc.sno AND c.cno=sc.cno
--16、查询所有学生的Sname、Cname和Degree列。
SELECT s.sname,c.cname,sc.degree FROM student s,course c,score sc WHERE s.sno=sc.sno AND c.cno=sc.cno
--17、查询“95033”班所选课程的平均分。
SELECT AVG(sc.degree) FROM score sc JOIN student s ON sc.sno=s.sno WHERE s.class=95033
--18、假设使用如下命令建立了一个grade表:
--create table grade
--(low number,
--upp number,
--rank char(1));
--insert into grade values(90,100,'A');
--insert into grade values(80,89,'B');
--insert into grade values(70,79,'C');
--insert into grade values(60,69,'D');
--insert into grade values(0,59,'E');
--commit;
--现查询所有同学的Sno、Cno和rank列。
SELECT sc.sno,sc.cno,
CASE WHEN sc.degree >90 AND sc.degree<100 THEN 'A'
WHEN sc.degree >80 AND sc.degree<89 THEN 'B' WHEN sc.degree >70 AND sc.degree<79 THEN 'C'
WHEN sc.degree >60 AND sc.degree<69 THEN 'D' ELSE 'E' END rank
FROM score sc
--19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
SELECT * FROM score sc WHERE sc.cno='3-105' AND sc.degree > (SELECT sc.degree FROM score sc WHERE sc.sno=109 AND sc.cno='3-105')
--20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录
SELECT sc2.* FROM score sc2
WHERE sc2.cno IN (SELECT sc.cno FROM score sc GROUP BY sc.cno HAVING COUNT(*)>1 )
AND sc2.degree!=(SELECT MAX(sc1.degree) FROM score sc1 )
--21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
SELECT * FROM score sc WHERE sc.cno='3-105' AND sc.degree > (SELECT sc.degree FROM score sc WHERE sc.sno=109 AND sc.cno='3-105')
--22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
SELECT s.sno,s.sname,s.sbirthday FROM student s WHERE s.sbirthday=(SELECT s.sbirthday FROM student s WHERE s.sno=108)
--23、查询“张旭“教师任课的学生成绩。
SELECT sc.*FROM score sc JOIN course c ON sc.cno =c.cno JOIN teacher t ON c.tno=t.tno WHERE t.tname='张旭'
--24、查询选修某课程的同学人数多于5人的教师姓名。
SELECT t.tname FROM teacher t
WHERE t.tno=(SELECT c.tno FROM course c
WHERE c.cno=(SELECT sc.cno FROM score sc GROUP BY sc.cno HAVING COUNT(sc.sno)>5))
--25、查询95033班和95031班全体学生的记录。
SELECT * FROM student s JOIN score sc ON s.sno = sc.sno JOIN course c ON c.cno=sc.cno
--26、查询存在有85分以上成绩的课程Cno.
SELECT c.cno,sc.degree FROM score sc JOIN course c ON sc.cno=c.cno WHERE sc.degree>85
--27、查询出“计算机系“教师所教课程的成绩表。
SELECT sc.degree,t.depart FROM score sc JOIN course c ON sc.cno=c.cno JOIN teacher t ON c.tno=t.tno WHERE t.depart='计算机系'
--28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
SELECT t.tname,t.prof,t.depart FROM teacher t ORDER BY t.depart
--29、查询选修编号为“3-105“且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
SELECT * FROM score sc
WHERE sc.cno='3-105' AND sc.degree >(SELECT MIN (sc.degree) FROM score sc WHERE sc.cno='3-245') ORDER BY sc.degree
--30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”的同学的Cno、Sno和Degree.
SELECT * FROM score sc
WHERE sc.cno='3-105' AND sc.degree >(SELECT MAX (sc.degree) FROM score sc WHERE sc.cno='3-245')
--31、查询所有教师和同学的name、sex和birthday.
--SELECT DISTINCT s.sname,s.ssex,s.sbirthday , t.tname,t.tsex,t.tbirthday
--FROM student s JOIN score sc ON s.sno=sc.sno JOIN course c ON c.cno=sc.cno right JOIN teacher t ON c.tno=t.tno
SELECT s.sname,s.ssex,s.sbirthday FROM student s
union--链接两个查询结果,要求必须含有相同字段和相同的字段类型
SELECT t.tname,t.tsex,t.tbirthday FROM teacher t
--32、查询所有“女”教师和“女”同学的name、sex和birthday.
--SELECT s.sname,s.ssex,s.sbirthday , t.tname,t.tsex,t.tbirthday
--FROM student s JOIN score sc ON s.sno=sc.sno JOIN course c ON c.cno=sc.cno
--JOIN teacher t ON c.tno=t.tno WHERE t.tsex='女' AND s.ssex='女'
SELECT s.sname,s.ssex,s.sbirthday FROM student s WHERE s.ssex='女'
union
SELECT t.tname,t.tsex,t.tbirthday FROM teacher t WHERE t.tsex='女'
--33、查询成绩比该课程平均成绩低的同学的成绩表。
SELECT * FROM score sc1 WHERE sc1.degree < (SELECT AVG(sc2.degree) FROM score sc2 WHERE sc1.cno=sc2.cno GROUP BY sc2.cno)
--34、查询所有任课教师的Tname和Depart.
SELECT t.tname,t.depart FROM teacher t JOIN course c ON t.tno=c.tno
--35、查询所有未讲课的教师的Tname和Depart.
SELECT t.tname,t.depart FROM teacher t WHERE tno NOT IN (SELECT c.tno FROM course c JOIN teacher t ON c.tno=t.tno)
--36、查询至少有2名男生的班号。
SELECT DISTINCT s.class FROM student s
WHERE s.ssex='男' AND s.class IN (SELECT s.class FROM student s HAVING COUNT(s.sno)>2 GROUP BY s.class)
--37、查询Student表中不姓“王”的同学记录。
SELECT * FROM student s WHERE sname NOT LIKE ('%王%')
--38、查询Student表中每个学生的姓名和年龄。
SELECT s.sname,(to_char(SYSDATE,'yyyy') - to_char(s.sbirthday,'yyyy'))年龄 FROM student s
--39、查询Student表中最大和最小的Sbirthday日期值。
SELECT MAX (s.sbirthday) , MIN (s.sbirthday) FROM student s
--40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
SELECT s.*,(to_char(SYSDATE,'yyyy') - to_char(s.sbirthday,'yyyy'))年龄 FROM student s
ORDER BY s.class DESC,(to_char(SYSDATE,'yyyy') - to_char(s.sbirthday,'yyyy')) DESC
--41、查询“男”教师及其所上的课程。
SELECT t.tname,t.tno,c.cname FROM teacher t JOIN course c ON t.tno=c.tno WHERE t.tsex='男'
--42、查询最高分同学的Sno、Cno和Degree列。
SELECT sc.sno,sc.cno,sc.degree FROM score sc WHERE sc.degree=(SELECT MAX(sc.degree) FROM score sc )
--43、查询和“李军”同性别的所有同学的Sname.
SELECT s.sname FROM student s WHERE s.ssex=(SELECT s.ssex FROM student s WHERE s.sname='李军') AND s.sname<>'李军'
--44、查询和“李军”同性别并同班的同学Sname.
SELECT s.sname FROM student s
WHERE s.ssex=(SELECT s.ssex FROM student s WHERE s.sname='李军')
AND s.class=(SELECT s.class FROM student s WHERE s.sname='李军') AND s.sname<>'李军'
--45、查询所有选修“计算机导论”课程的“男”同学的成绩表
SELECT sc.degree FROM score sc
WHERE sc.cno=(SELECT c.cno FROM course c WHERE c.cname='计算机导论') AND sc.sno IN (SELECT s.sno FROM student s WHERE s.ssex='男')