45道基础sql练习

第一个学生表,五个字段分别为学号,姓名,性别,生日,班级

第二个教师表,分别为职工号,姓名,生日,部门

第三个为课程表,分别为课程号,课程名,授课教师的教师号

第四个为成绩表,三个字段为学号,课程号,成绩

    CREATE TABLE STUDENT
    (SNO VARCHAR(3) NOT NULL, 
    SNAME VARCHAR(4) NOT NULL,
    SSEX VARCHAR(2) NOT NULL, 
    SBIRTHDAY DATE,
    SCLASS VARCHAR(5));
     
    CREATE TABLE TEACHER 
    (TNO VARCHAR(3) NOT NULL, 
    TNAME VARCHAR(4) NOT NULL, TSEX VARCHAR(2) NOT NULL, 
    TBIRTHDAY DATETIME NOT NULL, PROF VARCHAR(6), 
    DEPART VARCHAR(10) NOT NULL);
     
    CREATE TABLE COURSE
    (CNO VARCHAR(5) NOT NULL, 
    CNAME VARCHAR(10) NOT NULL, 
    TNO VARCHAR(10) NOT NULL);
     
    CREATE TABLE SCORE 
    (SNO VARCHAR(3) NOT NULL, 
    CNO VARCHAR(5) NOT NULL, 
    DEGREE NUMERIC(10, 0) NOT NULL); 
     
     
     
    ALTER TABLE student
    ADD CONSTRAINT primary key (sno);
    ALTER TABLE course
    ADD constraint primary key (cno);
    ALTER TABLE score
    ADD constraint primary key (sno, cno);
    ALTER TABLE teacher
    ADD constraint primary key (tno);
    ALTER TABLE course
    ADD constraint foreign key (tno) references teacher (tno);
    ALTER TABLE score
    ADD constraint foreign key (cno) references course (cno);
     
    INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,SCLASS) VALUES (108 ,'曾华' 
    ,'男' ,'1977-09-01',95033);
    INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,SCLASS) VALUES (105 ,'匡明' 
    ,'男' ,'1975-10-02',95031);
    INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,SCLASS) VALUES (107 ,'王丽' 
    ,'女' ,'1976-01-23',95033);
    INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,SCLASS) VALUES (101 ,'李军' 
    ,'男' ,'1976-02-20',95033);
    INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,SCLASS) VALUES (109 ,'王芳' 
    ,'女' ,'1975-02-10',95031);
    INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,SCLASS) VALUES (103 ,'陆君' 
    ,'男' ,'1974-06-03',95031);
     
    INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) 
    VALUES (804,'李诚','男','1958-12-02','副教授','计算机系');
    INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) 
    VALUES (856,'张旭','男','1969-03-12','讲师','电子工程系');
    INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)
    VALUES (825,'王萍','女','1972-05-05','助教','计算机系');
    INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) 
    VALUES (831,'刘冰','女','1977-08-14','助教','电子工程系');
     
    INSERT INTO COURSE(CNO,CNAME,TNO) VALUES ('3-105','计算机导论',825);
    INSERT INTO COURSE(CNO,CNAME,TNO) VALUES ('3-245','操作系统',804);
    INSERT INTO COURSE(CNO,CNAME,TNO) VALUES ('6-166','数据电路',856);
    INSERT INTO COURSE(CNO,CNAME,TNO) VALUES ('9-888','高等数学',831);
     
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (103,'3-245',86);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (105,'3-245',75);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (109,'3-245',68);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (103,'3-105',92);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (105,'3-105',88);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (109,'3-105',76);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (101,'3-105',64);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (107,'3-105',91);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (108,'3-105',78);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (101,'6-166',85);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (107,'6-166',79);
    INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES (108,'6-166',81);
1、 查询Student表中的所有记录的Sname、Ssex和Sclass列。
		SELECT SNAME,SSEX,SCLASS FROM student;
2、 查询教师所有的单位即不重复的Depart列。
		SELECT DISTINCT Depart from teacher;
3、 查询Student表的所有记录。
		SELECT * FROM student;
4、 查询Score表中成绩在60到80之间的所有记录。
		SELECT * 
		FROM score
		WHERE degree>=60 AND degree<=80;
		SELECT * 
		FROM score 
		WHERE degree BETWEEN 60 AND 80;
5、 查询Score表中成绩为85,86或88的记录。
		SELECT * 
		FROM score 
		WHERE degree IN(85,86,88);
6、 查询Student表中“95031”班或性别为“女”的同学记录。
		SELECT * 
		from student 
		WHERE ssex='女' OR sclass='95031';
7、 以Class降序查询Student表的所有记录。
		SELECT * 
		FROM student 
		ORDER BY sclass DESC;
8、 以Cno升序、Degree降序查询Score表的所有记录。
		SELECT * 
		FROM score 
		ORDER BY cno asc, degree DESC;
9、 查询“95031”班的学生人数。
		SELECT COUNT(*) 
		FROM student 
		WHERE sclass='95031';
10、查询Score表中的最高分的学生学号和课程号。
		SELECT sno,cno 
		FROM score 
		WHERE degree= (SELECT Max(degree) FROM score);
11、查询‘3-105’号课程的平均分。
		SELECT avg(degree) 
		FROM score 
		WHERE cno='3-105';
12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。(有点不会)
		SELECT avg(degree) 
		FROM score 
		GROUP BY cno HAVING count(*)>=5 AND cno like '3%';
13、查询最低分大于70,最高分小于90的Sno列。(有点不会)
		SELECT sno 
		FROM score 
		GROUP BY sno HAVING Min(degree)>70 AND Max(degree)<90;
14、查询所有学生的Sname、Cno和Degree列。
		SELECT sname ,cno,degree 
		from student,score 
		WHERE student.sno=score.sno;
15、查询所有学生的Sno、Cname和Degree列。
		SELECT student.sno ,course.cname,score.degree 
		from student,score,course  
		WHERE student.sno=score.sno AND course.CNO=score.CNO;
16、查询所有学生的Sname、Cname和Degree列。
		SELECT student.sname,course.cname,score.degree 
		from student,score,course  
		WHERE student.sno=score.sno AND course.CNO=score.CNO;
17、查询“95033”班所选课程的平均分。
select 
			AVG( DEGREE)
FROM 
			student st,score sc
where 
			st.SCLASS=95033 and st.SNO=sc.SNO
GROUP BY 
			sc.CNO;
18、假设使用如下命令建立了一个grade表:
create table grade(
low   INTEGER,
upp   INTEGER,
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.cno,st.sno,gr.rank
FROM 
				score AS sc JOIN student AS st JOIN grade AS gr
ON 
				(sc.sno=st.sno AND sc.degree BETWEEN gr.low AND gr.upp );
19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
SELECT sc.*
FROM score AS sc JOIN student AS st
ON(sc.sno=st.sno AND sc.cno='3-105'
AND sc.degree>( SELECT score.degree FROM score WHERE sno='109' AND score.CNO='3-105'	) );
20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。
SELECT *
from score sc
where sc.DEGREE !=(select MAX(degree) from score where score.CNO=sc.CNO)
and sc.SNO in (select sc.SNO from score GROUP BY sc.SNO HAVING COUNT(*)>1);
21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
SELECT*
FROM score
WHERE score.CNO='3-105' AND score.DEGREE>(SELECT score.DEGREE FROM score WHERE score.CNO='3-105' AND score.SNO='109');
22、查询和学号为109的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
SELECT sno,sname,sbirthday
FROM student
WHERE YEAR(sbirthday) = (SELECT YEAR(student.sbirthday) FROM student WHERE student.sno='109');
23、查询“张旭“教师任课的学生成绩。
SELECT score.DEGREE
FROM teacher JOIN course JOIN score ON(score.CNO=course.CNO)
WHERE teacher.TNAME='张旭';
24、查询选修某课程的同学人数多于5人的教师姓名。
select t.TNAME
from teacher t
where t.TNO=(
select c.TNO
from course c,score sc
where sc.CNO=c.CNO
GROUP BY sc.cno
HAVING COUNT(*)>5);
25、查询95033班和95031班全体学生的记录。
SELECT * 
FROM student
WHERE sclass='95033'OR sclass='95031';
26、查询存在有85分以上成绩的课程Cno.
SELECT cno
FROM score
WHERE degree>85;
27、查询出“计算机系“教师所教课程的成绩表。
SELECT DEGREE
FROM score JOIN course JOIN teacher ON(score.CNO=course.CNO AND course.TNO=teacher.TNO)
WHERE teacher.DEPART='计算机系';
28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
select te.TNAME,te.PROF
from teacher te , teacher tea
where te.depart=tea.depart and te.prof <>tea.prof;
29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
SELECT 
FROM 
30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
31、查询所有教师和同学的name、sex和birthday.
select st.sname,st.SSEX,st.SBIRTHDAY
from student st
union 
SELECT t.TNAME,t.TSEX,t.TBIRTHDAY
from teacher t;
32、查询所有“女”教师和“女”同学的name、sex和birthday.
SELECT s.sname,s.ssex,s.sbirthday
FROM student s
WHERE SSEX='女'
UNION ALL
SELECT t.tname ,t.tsex,t.TBIRTHDAY
FROM teacher t
WHERE t.TSEX='女';
33、查询成绩比该课程平均成绩低的同学的成绩表。
SELECT *
FROM score sc
WHERE sc.DEGREE<(SELECT avg(score.DEGREE) FROM score WHERE score.CNO=sc.CNO);
34、查询所有任课教师的Tname和Depart.
select Tname,Depart 
from Teacher 
where Tno  in (select Tno from Course where cno in (select cno from score  ));
35  查询所有未讲课的教师的Tname和Depart. 
select Tname,Depart 
from Teacher 
where Tno not in (select Tno from Course where cno in (select cno from score  ));
36、查询至少有2名男生的班号。
SELECT SCLASS
FROM student
WHERE SSEX='男'
GROUP BY SCLASS HAVING count(SSEX)>1;
37、查询Student表中不姓“王”的同学记录。
SELECT *
FROM student
WHERE sname NOT LIKE '王%';
38、查询Student表中每个学生的姓名和年龄。
SELECT sname,YEAR(now()) -YEAR( SBIRTHDAY)
FROM student;
39、查询Student表中最大和最小的Sbirthday日期值。
SELECT Max(SBIRTHDAY),Min(SBIRTHDAY)
FROM student;
40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
SELECT SCLASS,YEAR(now())-YEAR(SBIRTHDAY) AS age
FROM student
ORDER BY SCLASS desc,age DESC;
41、查询“男”教师及其所上的课程。
SELECT teacher.TNAME,teacher.TSEX,course.CNAME
FROM teacher JOIN course ON (teacher.TNO=course.TNO)
where teacher.TSEX='男';
42、查询最高分同学的Sno、Cno和Degree列。
SELECT *
FROM score
WHERE DEGREE=(SELECT max(DEGREE) FROM score);
43、查询和“李军”同性别的所有同学的Sname.
SELECT sname
FROM student
WHERE SSEX=(SELECT SSEX FROM student WHERE sname='李军');
44、查询和“李军”同性别并同班的同学Sname.
SELECT sname
FROM student
WHERE SSEX=(SELECT SSEX FROM student WHERE sname='李军') AND SCLASS=(SELECT SCLASS FROM student WHERE sname='李军');
45、查询所有选修“计算机导论”课程的“男”同学的成绩表
SELECT score.*
FROM score JOIN course JOIN student ON (score.CNO=course.CNO AND score.SNO=student.SNO)
WHERE course.CNAME='计算机导论' AND student.SSEX='男';
	
select  
Sno,Cno,degree from score
where Cno=( select Cno from course where Cname='计算机导论') and Sno in (select Sno from student where Ssex='男')

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值