SQL基础练习题

不得不说SQL是数据分析师入门的基础,想开始从事数据分析工作的同学最好将SQL练一练再找工作。大概看了一个月的MYSQL从入门到精通,无奈纸上谈兵,没有实战经验,于是从网上找了一些练习题,整理成下文。这些练习题算是入门SQL比较好的题库,如果觉得这些题目不够过瘾的同学可以参考我的另一篇文章《SQL进阶练习题》,去更深入地学习。

SQL进阶练习题

导入数据表

首先需要建立空白的数据库STUDENT,再导入如下几张表供练习题所用。

# 创建数据库STUDENT
CREATE DATABASE STUDENT;
# 创建表STUDENT
CREATE TABLE STUDENT
(SNO VARCHAR(3) NOT NULL, 
SNAME VARCHAR(4) NOT NULL,
SSEX VARCHAR(2) NOT NULL, 
SBIRTHDAY DATETIME,
CLASS VARCHAR(5));
# 创建表COURSE
CREATE TABLE COURSE
(CNO VARCHAR(5) NOT NULL, 
CNAME VARCHAR(10) NOT NULL, 
TNO VARCHAR(10) NOT NULL);
# 创建表SCORE 
CREATE TABLE SCORE 
(SNO VARCHAR(3) NOT NULL, 
CNO VARCHAR(5) NOT NULL, 
DEGREE NUMERIC(10, 1) NOT NULL);
# 创建表TEACHER
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),
(105 ,'匡明' ,'男' ,'1975-10-02',95031),
(107 ,'王丽' ,'女' ,'1976-01-23',95033),
(101 ,'李军' ,'男' ,'1976-02-20',95033),
(109 ,'王芳' ,'女' ,'1975-02-10',95031),
(103 ,'陆君' ,'男' ,'1974-06-03',95031);
INSERT INTO COURSE(CNO,CNAME,TNO) VALUES 
('3-105' ,'计算机导论',825),
('3-245' ,'操作系统' ,804),
 ('6-166' ,'数据电路' ,856),
('9-888' ,'高等数学' ,100);
INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES
(103,'3-245',86),
(105,'3-245',75),
 (109,'3-245',68),
 (103,'3-105',92),
(105,'3-105',88),
 (109,'3-105',76),
 (101,'3-105',64),
 (107,'3-105',91),
(108,'3-105',78),
 (101,'6-166',85),
 (107,'6-106',79),
 (108,'6-166',81);
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES 
(804,'李诚','男','1958-12-02','副教授','计算机系'),
 (856,'张旭','男','1969-03-12','讲师','电子工程系'),
(825,'王萍','女','1972-05-05','助教','计算机系'),
(831,'刘冰','女','1977-08-14','助教','电子工程系');

题目

1、 查询Student表中的所有记录的Sname、Ssex和Class列。
2、 查询教师所有的单位即不重复的Depart列。
3、 查询Student表的所有记录。
4、 查询Score表中成绩在60到80之间的所有记录。
5、 查询Score表中成绩为85,86或88的记录。
6、 查询Student表中“95031”班或性别为“女”的同学记录。
7、 以Class降序查询Student表的所有记录。
8、 以Cno升序、Degree降序查询Score表的所有记录。
9、 查询“95031”班的学生人数。
10、查询Score表中的最高分的学生学号和课程号。
11、查询‘3-105’号课程的平均分。
12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
13、查询最低分大于70,最高分小于90的Sno列。
14、查询所有学生的Sname、Cno和Degree列。
15、查询所有学生的Sno、Cname和Degree列。
16、查询所有学生的Sname、Cname和Degree列。
17、查询“95033”班所选课程的平均分。
18、假设使用如下命令建立了一个grade表:
create table grade(low varchar(3),upp varchar(3),rank varchar(3));
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列。
19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。
21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
23、查询“张旭“教师任课的学生成绩。
24、查询选修某课程的同学人数多于5人的教师姓名。
25、查询95033班和95031班全体学生的记录。
26、查询存在有85分以上成绩的课程Cno.
27、查询出“计算机系“教师所教课程的成绩表。
28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
31、查询所有教师和同学的name、sex和birthday.
32、查询所有“女”教师和“女”同学的name、sex和birthday.
33、查询成绩比该课程平均成绩低的同学的成绩表。
34、查询所有任课教师的Tname和Depart.
35 查询所有未讲课的教师的Tname和Depart.
36、查询至少有2名男生的班号。
37、查询Student表中不姓“王”的同学记录。
38、查询Student表中每个学生的姓名和年龄。
39、查询Student表中最大和最小的Sbirthday日期值。
40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
41、查询“男”教师及其所上的课程。
42、查询最高分同学的Sno、Cno和Degree列。
43、查询和“李军”同性别的所有同学的Sname.
44、查询和“李军”同性别并同班的同学Sname.
45、查询所有选修“计算机导论”课程的“男”同学的成绩表。

参考答案

  1. SELECT SNAME,SSEX,CLASS FROM STUDENT;
  2. SELECT DISTINCT DEPART FROM TEACHER;
  3. SELECT * FROM STUDENT;
  4. SELECT * FROM SCORE WHERE DEGREE BETWEEN 60 AND 80;
  5. SELECT * FROM SCORE WHERE DEGREE IN (85,86,88);
  6. SELECT * FROM STUDENT WHERE CLASS=95031 OR SSEX=’女’;
  7. SELECT * FROM STUDENT ORDER BY CLASS DESC;
  8. SELECT * FROM SCORE ORDER BY CNO,DEGREE DESC;
  9. SELECT COUNT(*) NUMBER FROM STUDENT WHERE CLASS=95031;
  10. SELECT SNO,CNO FROM SCOREWHERE DEGREE=(SELECT MAX(DEGREE) FROM SCORE);
  11. SELECT AVG(DEGREE) FROM SCORE WHERE CNO=’3-105’;
  12. SELECT AVG(DEGREE),CNO FROM SCORE WHERE CNO LIKE ‘3%’
    GROUP BY CNO HAVING COUNT(SNO)>=5;
  13. SELECT CNO FROM SCORE WHERE DEGREE>70&&DEGREE<90;
  14. SELECT P.SNAME,Q.CNO,Q.DEGREE
    FROM STUDENT P INNER JOIN SCORE Q ON P.SNO=Q.SNO;
  15. SELECT A.CNO,A.CNAME,B.DEGREE
    FROM COURSE A INNER JOIN SCORE B
    ON A.CNO=B.CNO;
    A.CNAME,B.DEGREE,C.SNAME
    FROM COURSE A INNER JOIN (SCORE B,STUDENT C)
    ON A.CNO=B.CNO AND B.SNO=C.SNO;
  16. SELECT AVG(DEGREE)
    FROM STUDENT A INNER JOIN SCORE B
    ON A.SNO=B.SNO
    WHERE A.CLASS=95033;
  17. SELECT AVG(DEGREE)
    FROM STUDENT A INNER JOIN SCORE B
    ON A.SNO=B.SNO
    WHERE A.CLASS=95033;
  18. SELECT A.SNO,A.CNO,B.rank from score A ,grade B
    WHERE A.DEGREE>=B.low && A.DEGREE<=B.upp;
  19. SELECT * FROM SCORE
    WHERE CNO=’3-105’ AND DEGREE>
    ALL(SELECT DEGREE FROM SCORE WHERE SNO=109 AND CNO=’3-105’);
  20. SELECT * FROM SCORE
    WHERE DEGREE NOT IN
    (SELECT MAX(DEGREE) FROM SCORE
    GROUP BY SNO )
    AND SNO IN
    (SELECT SNO FROM SCORE
    GROUP BY SNO HAVING COUNT(SNO)>1);
  21. SELECT * FROM SCORE
    WHERE DEGREE>(SELECT DEGREE FROM SCORE
    WHERE SNO=109 AND CNO=’3-105’);
  22. SELECT * FROM STUDENT
    WHERE YEAR(SBIRTHDAY)=(
    SELECT YEAR(SBIRTHDAY) FROM STUDENT WHERE SNO=108)
  23. SELECT A.SNO,A.DEGREE
    FROM SCORE A JOIN (TEACHER B,COURSE C)
    ON A.CNO=C.CNO AND B.TNO=C.TNO
    WHERE B.TNAME=’张旭’;
  24. SELECT B.TNAME
    FROM SCORE A JOIN (TEACHER B,COURSE C)
    ON (A.CNO=C.CNO AND B.TNO=C.TNO)
    GROUP BY A.CNO HAVING COUNT(A.CNO)>5;
  25. SELECT * FROM STUDENT WHERE CLASS IN (95033,95031);
  26. SELECT DISTINCT CNO FROM SCORE WHERE DEGREE>85;
  27. SELECT A.SNO,A.CNO,A.DEGREE
    FROM SCORE A JOIN (TEACHER B,COURSE C);
    ON A.CNO=C.CNO AND B.TNO=C.TNO
    WHERE DEPART=’计算机系’;
  28. SELECT TNAME,PROF FROM TEACHER
    WHERE DEPART=’计算机系’ AND PROF NOT IN (
    SELECT PROF FROM TEACHER WHERE DEPART=’电子工程系’);
  29. SELECT * FROM SCORE
    WHERE CNO=’3-105’ AND DEGREE>ANY(
    SELECT DEGREE FROM SCORE WHERE CNO=’3-245’)
    ORDER BY DEGREE DESC;
  30. SELECT * FROM SCORE
    WHERE CNO=’3-105’ AND DEGREE>ALL(
    SELECT DEGREE FROM SCORE WHERE CNO=’3-245’);
  31. SELECT SNAME,SSEX,SBIRTHDAY FROM STUDENT
    UNION
    SELECT TNAME,TSEX,TBIRTHDAY FROM TEACHER;
  32. SELECT SNAME NAME,SSEX SEX,SBIRTHDAY BIRTHDAY FROM STUDENT
    WHERE SSEX=’女’
    UNION
    SELECT TNAME,TSEX,TBIRTHDAY FROM TEACHER
    WHERE TSEX=’女’;
  33. SELECT A.* FROM SCORE A INNER JOIN
    (SELECT CNO,AVG(DEGREE) AVG
    FROM SCORE GROUP BY CNO) B
    ON A.CNO=B.CNO
    WHERE DEGREE<AVG;

  34. SELECT A.TNAME,A.DEPART FROM TEACHER A JOIN COURSE B ON A.TNO=B.TNO;

  35. SELECT TNAME,DEPART FROM TEACHER
    WHERE TNO NOT IN (SELECT TNO FROM COURSE);
  36. SELECT CLASS FROM STUDENT
    WHERE SSEX=’男’
    GROUP BY CLASS HAVING COUNT(SSEX)>1;
  37. SELECT CLASS FROM STUDENT WHERE SSEX=’女’
    GROUP BY CLASS HAVING COUNT(SSEX)>1;
  38. SELECT * FROM STUDENT WHERE NOT SNAME LIKE ‘王%’;
  39. SELECT SNAME,YEAR(NOW())-YEAR(SBIRTHDAY) AGE FROM STUDENT;SELECT * FROM student ORDER BY CLASS DESC,SBIRTHDAY;
  40. SELECT * FROM student ORDER BY CLASS DESC,SBIRTHDAY;
  41. SELECT CNO,CNAME FROM COURSE
    WHERE TNO IN (SELECT TNO FROM TEACHER WHERE TSEX=’男’);
  42. SELECT SNO,CNO,DEGREE
    FROM SCORE WHERE DEGREE=(SELECT MAX(DEGREE) FROM SCORE);
  43. SELECT SNAME FROM student WHERE SSEX=
    (SELECT SSEX FROM STUDENT WHERE SNAME=’李军’);
  44. SELECT SNAME FROM student WHERE (SSEX,CLASS)=
    (SELECT SSEX,CLASS FROM STUDENT WHERE SNAME=’李军’);
  45. SELECT A.* FROM SCORE A JOIN(STUDENT B,COURSE C)
    ON A.SNO=B.SNO AND A.CNO=C.CNO
    WHERE B.SSEX=’男’ AND C.CNAME=’计算机导论’;

use test/*一个项目涉及到的50个Sql语句问题及描述:--1.学生表Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程表 Course(C#,Cname,T#) --C# --课程编号,Cname 课程名称,T# 教师编号--3.教师表 Teacher(T#,Tname) --T# 教师编号,Tname 教师姓名--4.成绩表 SC(S#,C#,score) --S# 学生编号,C# 课程编号,score 分数select * from Studentselect * from Courseselect * from Teacherselect * from SC*/--创建测试数据create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男')insert into Student values('02' , N'钱电' , '1990-12-21' , N'男')insert into Student values('03' , N'孙风' , '1990-05-20' , N'男')insert into Student values('04' , N'李云' , '1990-08-06' , N'男')insert into Student values('05' , N'周梅' , '1991-12-01' , N'女')insert into Student values('06' , N'吴兰' , '1992-03-01' , N'女')insert into Student values('07' , N'郑竹' , '1989-07-01' , N'女')insert into Student values('08' , N'王菊' , '1990-01-20' , N'女')create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))insert into Course values('01' , N'语文' , '02')insert into Course values('02' , N'数学' , '01')insert into Course values('03' , N'英语' , '03')create table Teacher(T# varchar(10),Tname nvarchar(10))insert into Teacher values('01' , N'张三')insert into Teacher values('02' , N'李四')insert into Teacher values('03' , N'王五')create table SC(S# varchar(10),C# varchar(10),score decimal(18,1))insert into SC values('01' , '01' , 80)insert into SC values('01' , '02' , 90)insert into SC values('01' , '03' , 99)insert into SC values('02' , '01' , 70)insert into SC values('02' , '02' , 60)insert into SC values('02' , '03' , 80)insert into SC values('03' , '01' , 80)insert into SC values('03' , '02' , 80)insert into SC values('03' , '03' , 80)insert into SC values('04' , '01' , 50)insert into SC values('04' , '02' , 30)insert into SC values('04' , '03' , 20)insert into SC values('05' , '01' , 76)insert into SC values('05' , '02' , 87)insert into SC values('06' , '01' , 31)insert into SC values('06' , '03' , 34)insert into SC values('07' , '02' , 89)insert into SC values('07' , '03' , 98)go--1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数--1.1、查询同时存在"01"课程和"02"课程的情况--1.2、查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释)--2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数--2.1、查询同时存在"01"课程和"02"课程的情况--2.2、查询同时存在"01"课程和"02"课程的情况和不存在"01"课程但存在"02"课程的情况--3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩--4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩--4.1、查询在sc表存在成绩的学生信息的SQL语句。--4.2、查询在sc表中不存在成绩的学生信息的SQL语句。--5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩--5.1、查询所有有成绩的SQL。--5.2、查询所有(包括有成绩和无成绩)的SQL。--6、查询"李"姓老师的数量 --7、查询学过"张三"老师授课的同学的信息 --8、查询没学过"张三"老师授课的同学的信息 --9、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息--10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息--11、查询没有学全所有课程的同学的信息 --12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息 --13、查询和"01"号的同学学习的课程完全相同的其他同学的信息 --14、查询没学过"张三"老师讲授的任一门课程的学生姓名 --15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 --16、检索"01"课程分数小于60,按分数降序排列的学生信息--17、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩--17.1 SQL 2000 静态 --17.2 SQL 2000 动态 --17.3 有关sql 2005的动静态写法参见我的文章《普通行列转换(version 2.0)》或《普通行列转换(version 3.0)》。--18、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90--19、按各科成绩进行排序,并显示排名--19.1 sql 2000用子查询完成--Score重复时保留名次空缺--Score重复时合并名次--19.2 sql 2005用rank,DENSE_RANK完成--Score重复时保留名次空缺(rank完成)--Score重复时合并名次(DENSE_RANK完成)--20、查询学生的总成绩并进行排名--20.1 查询学生的总成绩--20.2 查询学生的总成绩并进行排名,sql 2000用子查询完成,分总分重复时保留名次空缺和不保留名次空缺两种。--20.3 查询学生的总成绩并进行排名,sql 2005用rank,DENSE_RANK完成,分总分重复时保留名次空缺和不保留名次空缺两种。--21、查询不同老师所教不同课程平均分从高到低显示 --22、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩--22.1 sql 2000用子查询完成--Score重复时保留名次空缺--Score重复时合并名次--22.2 sql 2005用rank,DENSE_RANK完成--Score重复时保留名次空缺(rank完成)--Score重复时合并名次(DENSE_RANK完成)--23、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比 --23.1 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]--23.2 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[<60]及所占百分比 --24、查询学生平均成绩及其名次 --24.1 查询学生的平均成绩并进行排名,sql 2000用子查询完成,分平均成绩重复时保留名次空缺和不保留名次空缺两种。--24.2 查询学生的平均成绩并进行排名,sql 2005用rank,DENSE_RANK完成,分平均成绩重复时保留名次空缺和不保留名次空缺两种。--25、查询各科成绩前三名的记录--25.1 分数重复时保留名次空缺--25.2 分数重复时不保留名次空缺,合并名次--sql 2000用子查询实现--sql 2005用DENSE_RANK实现--26、查询每门课程被选修的学生数 --27、查询出只有两门课程的全部学生的学号和姓名 --28、查询男生、女生人数 --29、查询名字中含有"风"字的学生信息--30、查询同名同性学生名单,并统计同名人数 --31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime) --32、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列 --33、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩 --34、查询课程名称为"数学",且分数低于60的学生姓名和分数 --35、查询所有学生的课程及分数情况; --36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数; --37、查询不及格的课程--38、查询课程编号为01且课程成绩在80分以上的学生的学号和姓名; --39、求每门课程的学生人数 --40、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩--40.1 当最高分只有一个时--40.2 当最高分出现多个时--41、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 --42、查询每门功成绩最好的前两名 --43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 --44、检索至少选修两门课程的学生学号 --45、查询选修了全部课程的学生信息 --46、查询各学生的年龄--46.1 只按照年份来算--46.2 按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一--47、查询本周过生日的学生--48、查询下周过生日的学生--49、查询本月过生日的学生--50、查询下月过生日的学生 只需要两个积分就能下载答案喽,50个问题都做一遍你的SQL基础就过关了。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值