SQL练习题(一)

建表语句
CREATE TABLE STUDENT
(SNO VARCHAR(3) NOT NULL, 
SNAME VARCHAR(4) NOT NULL,
SSEX VARCHAR(2) NOT NULL, 
SBIRTHDAY DATETIME,
CLASS VARCHAR(5));
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, 1) NOT NULL) ;
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);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾华' 
,'男' ,'1977-09-01','95033');
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' 
,'男' ,'1975-10-02','95031');
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王丽' 
,'女' ,'1976-01-23','95033');
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李军' 
,'男' ,'1976-02-20','95033');
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' 
,'女' ,'1975-02-10','95031');
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陆君' 
,'男' ,'1974-06-03','95031');
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' ,'高等数学' ,100);
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-106',79);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81);
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','助教','电子工程系');


course



score



student



teacher



grade



题目:
1、 查询Student表中的所有记录的Sname、Ssex和Class列。
SELECT SNAME, SSEX, CLASS FROM STUDENT;


2、 查询教师所有的单位即不重复的Depart列。
SELECT DISTINCT DEPART FROM TEACHER;


3、 查询Student表的所有记录。
SELECT * FROM STUDENT;


4、 查询Score表中成绩在60到80之间的所有记录。
(1)SELECT * FROM SCORE WHERE DEGREE BETWEEN 60 AND 80;
(2)SELECT * FROM SCORE WHERE DEGREE >= 60 AND DEGREE <= 80;


5、 查询Score表中成绩为85,86或88的记录。
(1)SELECT * FROM SCORE WHERE DEGREE = 85 OR DEGREE = 86 OR DEGREE = 88;
(2)SELECT * FROM SCORE WHERE DEGREE BETWEEN 85 AND 88 AND DEGREE != 87;

6、 查询Student表中“95031”班或性别为“女”的同学记录。
SELECT * FROM STUDENT WHERE CLASS = "95031" OR SSEX = "女";


7、 以Class降序查询Student表的所有记录。
SELECT * FROM STUDENT ORDER BY CLASS DESC;


8、 以Cno升序、Degree降序查询Score表的所有记录。
SELECT * FROM SCORE ORDER BY CNO, DEGREE DESC;


9、 查询“95031”班的学生人数。
SELECT COUNT(*) FROM STUDENT WHERE CLASS = "95031";

10、查询Score表中的最高分的学生学号和课程号。
SELECT SNO, CNO FROM SCORE WHERE DEGREE IN (
SELECT MAX(DEGREE)
FROM SCORE);


11、查询‘3-105’号课程的平均分。
SELECT AVG(DEGREE) FROM SCORE WHERE CNO = "3-105";


**12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
SELECT AVG(DEGREE), CNO FROM SCORE  WHERE CNO LIKE "3%" GROUP BY CNO HAVING COUNT(*) >= 5;


**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 AS ST, SCORE AS SC WHERE ST.SNO = SC.SNO; 


15、查询所有学生的Sno、Cname和Degree列。
SELECT SNO, CNAME, DEGREE FROM SCORE AS SC, COURSE AS CO WHERE SC.CNO = CO.CNO;


**16、查询所有学生的Sname、Cname和Degree列。

SELECT A.SNAME, B.CNAME, C.DEGREE FROM STUDENT AS A JOIN (COURSE AS B, SCORE AS C) ON A.SNO = C.SNO AND B.CNO = C.CNO;


17、查询“95033”班所选课程的平均分。
SELECT ST.CLASS, AVG(SC.DEGREE) FROM STUDENT AS ST JOIN SCORE AS SC ON ST.SNO = SC.SNO WHERE ST.CLASS = "95031";


**18、假设使用如下命令建立了一个grade表:
create table grade(low TINYINT,up TINYINT,rank varchar(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");
现查询所有同学的Sno、Cno和rank列。
SELECT A.SNO,A.CNO,B.RANK FROM SCORE A,GRADE B WHERE A.DEGREE BETWEEN B.LOW AND B.UP;

19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
SELECT SNO, DEGREE FROM SCORE WHERE CNO = "3-105" AND DEGREE > (
SELECT DEGREE
FROM SCORE
WHERE SNO = "109" AND CNO = "3-105");


**20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。

SELECT * FROM SCORE WHERE DEGREE < (SELECT MAX(DEGREE) FROM SCORE) GROUP BY SNO HAVING COUNT(*) > 1;


21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
SELECT * FROM SCORE WHERE CNO = "3-105" AND DEGREE > ALL(SELECT DEGREE FROM SCORE WHERE SNO = "109" AND CNO = "3-105");


**22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。

SELECT SNO,SNAME,SBIRTHDAY FROM STUDENT WHERE YEAR(SBIRTHDAY)=(SELECT YEAR(SBIRTHDAY) FROM STUDENT WHERE SNO='108');


23、查询“张旭“教师任课的学生成绩。
SELECT SC.SNO, SC.DEGREE FROM SCORE AS SC JOIN (COURSE AS CO, TEACHER AS TH) ON CO.TNO = TH.TNO AND SC.CNO = CO.CNO WHERE TH.TNAME = '张旭';


24、查询选修某课程的同学人数多于5人的教师姓名。
SELECT TE.TNAME FROM TEACHER AS TE 
JOIN (COURSE AS CO, SCORE AS SC)
ON CO.TNO = TE.TNO AND SC.CNO = CO.CNO
GROUP BY TE.TNO
HAVING COUNT(*) > 5;


25、查询95033班和95031班全体学生的记录。
SELECT * 
FROM STUDENT AS ST
JOIN (SCORE AS SC, COURSE AS CO)
ON (ST.SNO = SC.SNO AND SC.CNO = CO.CNO)
WHERE ST.CLASS = '95033' OR ST.CLASS = '95031'
ORDER BY ST.CLASS;


26、查询存在有85分以上成绩的课程Cno.
SELECT DISTINCT CNO FROM SCORE WHERE DEGREE >= 85;


27、查询出“计算机系“教师所教课程的成绩表。
SELECT SC.* 
FROM SCORE AS SC 
JOIN (COURSE AS CO, TEACHER AS TE) 
ON (CO.CNO = SC.CNO AND CO.TNO = TE.TNO)
WHERE TE.DEPART = '计算机系';


28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
SELECT TNAME, PROF 
FROM TEACHER 
WHERE DEPART = '计算机系' AND PROF NOT IN (SELECT PROF FROM TEACHER WHERE DEPART = '电子工程系');


29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
SELECT CNO, SNO, DEGREE FROM SCORE WHERE CNO = '3-105' AND DEGREE > ANY(SELECT DEGREE FROM SCORE WHERE CNO = '3-245') ORDER BY DEGREE DESC;


30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
SELECT CNO, SNO, DEGREE FROM SCORE WHERE CNO = '3-105' AND DEGREE > ALL(SELECT DEGREE FROM SCORE WHERE CNO = '3-245') ORDER BY DEGREE DESC;



**31、查询所有教师和同学的name、sex和birthday.

SELECT SNAME AS NAME, SSEX AS SEX, SBIRTHDAY AS BIRTHDAY FROM STUDENT
UNION
SELECT TNAME AS NAME, TSEX AS SEX, TBIRTHDAY AS BIRTHDAY FROM TEACHER;


32、查询所有“女”教师和“女”同学的name、sex和birthday.
SELECT SNAME AS NAME, SSEX AS SEX, SBIRTHDAY AS BIRTHDAY FROM STUDENT WHERE SSEX = '女'
UNION
SELECT TNAME AS NAME, TSEX AS SEX, TBIRTHDAY AS BIRTHDAY FROM TEACHER WHERE TSEX = '女';


**33、查询成绩比该课程平均成绩低的同学的成绩表。
SELECT A.* FROM SCORE A WHERE DEGREE<(SELECT AVG(DEGREE) FROM SCORE B WHERE A.CNO=B.CNO);

//错误:Unknown column 'DEGREE' in 'having clause'
//SELECT SNO, CNO FROM SCORE GROUP BY CNO HAVING DEGREE < AVG(DEGREE);


34、查询所有任课教师的Tname和Depart.
SELECT TNAME, DEPART FROM TEACHER AS TE INNER JOIN COURSE AS CO ON TE.TNO = CO.TNO


**35  查询所有未讲课的教师的Tname和Depart. 

//NOT IN效率差
SELECT TNAME, DEPART FROM TEACHER WHERE TNO NOT IN (SELECT TE.TNO FROM TEACHER AS TE INNER JOIN COURSE AS CO ON TE.TNO = CO.TNO);

//另一种
SELECT TNAME, DEPART FROM TEACHER A WHERE NOT EXISTS (SELECT * FROM COURSE B WHERE A.TNO = B.TNO);

36、查询至少有2名男生的班号。
SELECT CLASS FROM STUDENT WHERE SSEX = '男' GROUP BY CLASS HAVING COUNT(*) > 1;


37、查询Student表中不姓“王”的同学记录。
SELECT * FROM STUDENT WHERE SNAME NOT LIKE "王%";


38、查询Student表中每个学生的姓名和年龄。
SELECT SNAME, (YEAR(NOW()) - YEAR(SBIRTHDAY)) AS AGE FROM STUDENT;


39、查询Student表中最大和最小的Sbirthday日期值。
SELECT MAX(SBIRTHDAY) AS SBIRTHDAY FROM STUDENT
UNION
SELECT MIN(SBIRTHDAY) AS SBIRTHDAY FROM STUDENT;


40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
SELECT * FROM STUDENT ORDER BY CLASS DESC, (YEAR(NOW()) - YEAR(SBIRTHDAY)) DESC;


41、查询“男”教师及其所上的课程。
SELECT TNAME, TSEX, CNAME FROM TEACHER JOIN COURSE USING(TNO) WHERE TSEX = '男';


42、查询最高分同学的Sno、Cno和Degree列。
SELECT SNO, CNO, DEGREE 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 CLASS = (SELECT CLASS FROM STUDENT WHERE SNAME = '李军');


45、查询所有选修“计算机导论”课程的“男”同学的成绩表
SELECT ST.SNAME, SC.DEGREE FROM STUDENT AS ST 
JOIN (COURSE AS CO, SCORE AS SC) 
ON (SC.CNO = CO.CNO AND SC.SNO = ST.SNO) 
WHERE CO.CNAME = '计算机导论' AND ST.SSEX = '男';

猜你喜欢

转载自blog.csdn.net/vip97yigang/article/details/78085237