这篇练习题是我在学sql入门的时候做的,应该算是在网上能找到的习题里最基础的一篇,非常适合新手练习,如果你接触sql不超过半个月,建议可以看一下《sql必知必会》或《mysql必知必会》,同时把下面的习题做完,在做习题的过程中你会真实的感受到”SELECT”,”INSERT”,”WHERE”,”AS”等关键字都是做什么的,之后会对sql语言有一个大致的了解。完成这篇练习题,你应该掌握了sql语言的基本逻辑,恭喜你已经入门了。

在本篇文章中讲两方面内容:

1.介绍如何通过Navicat平台来写sql语句

2.sql入门练习及答案

一.如何使用Navicat

1.双击打开在上一章安装的Navicat for MySQL,图标如下图

2.打开后,可以看到左边的new_connection是我们在填写连接时的连接名,双击后下面出现的是系统自带的库,我们右键单击new_connection,选择新建数据库

3.数据库名可以任意取名,取有意义的名字最好,填写如下。

4.在自己的数据库下,单击任务栏”查询”,选择”新建查询”,然后在新建查询的窗口中可以写sql代码

5.例如我把下述代码复制到新建查询的窗口中,单击任务栏运行;或者选中部分代码右键“运行已选择的”

二.MySQL入门练习题,配有答案

以下内容创作于约半年前,如果答案有问题请直接评论或私心,万分感谢。

网上的很多答案都是错的,就连建表和插入错误语句也太多了,既然是查询练习题,所以我会保证建表插入等语句没错误的,拿来直接用是最起码的标准吧,查询语句会尽力做到优化,毕竟能力有限只能说是尽力吧,谢谢。

设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。用SQL语句创建四个表并完成相关题目。

#建学生信息表

create table student(

sno varchar(20) not null primary key,

sname varchar(20) not null,

ssex varchar(20) not null,

sbirthday datetime,

class varchar(20)

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

#建立教师表

create table teacher

(

tno varchar(20) not null primary key,

tname varchar(20) not null,

tsex varchar(20) not null,

tbirthday datetime,

prof varchar(20),

depart varchar(20) not null

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

#建立课程表

create table course

(

cno varchar(20) not null primary key,

cname varchar(20) not null,

tno varchar(20) not null,

foreign key(tno) references teacher(tno)

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

#建立成绩表

create table score

(

sno varchar(20) not null,

foreign key(sno) references student(sno),

cno varchar(20) not null,

foreign key(cno) references course(cno),

degree decimal

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

#插入学生表数据

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 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','助教','电子工程系');

#note:这里提醒大家一下,请按照我的顺序插入数据,因为被定义为外键的字段在插入数据的前提是主表的主键有相对应的值才可以插入否则会报错1452 - Cannot add or update a child row: a foreign key constraint fails ,所以主外键表先插主键表

#插入课程表数据

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,'9-888',79);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81);

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 number(3,0),upp number(3),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列。

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、 查询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之间的所有记录。

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 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 class,count(*) AS StuNum FROM student WHERE class = 95031;

*10、查询Score表中的最高分的学生学号和课程号。

SELECT sno,cno,degree FROM score ORDER BY degree DESC LIMIT 0,1;

11、查询‘3-105’号课程的平均分。

SELECT cno,AVG(degree) as meanDeg FROM score WHERE cno = '3-105';

*12、查询Score表中至少有3名学生选修的并以3开头的课程的平均分数。

SELECT cno,AVG(degree) as avgDeg FROM score WHERE cno LIKE '3%' GROUP BY cno HAVING count(sno) >= 3;

13、查询最低分大于70,最高分小于90的Sno列。

SELECT sno,degree FROM score WHERE degree > 70 AND degree < 90;

14、查询所有学生的Sname、Cno和Degree列。

#大多数人应该会给出这个答案

SELECT sname,cno,degree FROM score INNER JOIN student ON score.sno = student.sno

#但是我觉得应该考虑到有同学未参加考试,所以应该student做主表或者用cross join来连接,能力有限,可能不对

SELECT sname,cno,degree FROM student LEFT JOIN score ON student.sno = score.sno

15、查询所有学生的Sno、Cname和Degree列。

SELECT sno,cname,degree FROM score INNER JOIN course ON score.cno = course.cno;

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

SELECT sname,cname,degree FROM score INNER JOIN student ON score.sno = student.sno INNER JOIN course ON score.cno = course.cno;

17、查询“95033”班所选课程的平均分。

SELECT cname,AVG(degree) as meanAvg FROM score INNER JOIN course ON score.cno = course.cno WHERE sno IN (SELECT sno FROM student WHERE class = 95033) GROUP BY cname;

18、假设使用如下命令建立了一个grade表:

CREATE TABLE rank(

low_number INT(3) ,

high_number INT(3),

rank VARCHAR(1)

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into rank values(90,100,'A');

insert into rank values(80,89,'B');

insert into rank values(70,79,'C');

insert into rank values(60,69,'D');

insert into rank values(0,59,'E');

现查询所有同学的Sno、Cno和rank列。

SELECT sno,cno,rank FROM score INNER JOIN rank ON degree BETWEEN low_number AND high_number

19、在选修“3-105”课程中的成绩高于“109”号同学成绩 的所有同学的记录。

#score中的所有记录

SELECT * FROM score WHERE degree >

(SELECT degree FROM score WHERE sno = 109 AND cno = "3-105")

AND cno = "3-105";

#sno1如何使它消失

SELECT * FROM score INNER JOIN student ON score.sno = student.sno

WHERE score.sno IN

(

SELECT sno FROM score

WHERE degree > (SELECT degree FROM score WHERE cno = '3-105' AND sno = 109) AND cno = '3-105'

)

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

SELECT * FROM score

GROUP BY sno

HAVING count(cno) > 1

AND degree <> MAX(degree)

ORDER BY degree

#补充limit问题

21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。

SELECT * FROM student INNER JOIN score ON score.sno = student.sno WHERE degree >

(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 sname,temTable.degree FROM(

SELECT sno,degree FROM score WHERE cno =

(SELECT cno FROM course WHERE tno = (SELECT tno FROM teacher WHERE tname = '张旭'))

) AS temTable

INNER JOIN student ON temTable.sno = student.sno

24、查询选修某课程的同学人数多于5人的教师姓名。

SELECT tname FROM teacher WHERE tno = (

SELECT tno FROM course WHERE cno IN

(SELECT cno FROM score GROUP BY cno HAVING count(*) > 5)

)

25、查询95033班和95031班全体学生的记录

SELECT * FROM student WHERE class IN (95033,95031) ORDER BY class

#大概看了一眼后20道题也不是很难,这里就不一一写出答案了,准备再开一个比入门级sql查询高端一点的,最起码得需要动脑的了。这套题可以给没接触过sql的小伙伴入门的,短时间内熟悉语句还是不错的。入门习题,推荐~

PS 如果语句有错误希望看到的伙伴可以提醒我修改,多谢。有更好的写法欢迎分享,共同学习。

完结

补充:

这里补充一下 取交集并集差集

CREATE TABLE A(

cus_id VARCHAR(5) NOT NULL PRIMARY KEY

)ENGINE = INNODB DEFAULT CHARSET = utf8

CREATE TABLE B(

cus_id VARCHAR(5) NOT NULL PRIMARY KEY

)ENGINE = INNODB DEFAULT CHARSET = utf8

INSERT INTO A VALUES(1);

INSERT INTO A VALUES(2);

INSERT INTO A VALUES(3);

INSERT INTO A VALUES(4);

INSERT INTO B VALUES(2);

INSERT INTO B VALUES(3);

INSERT INTO B VALUES(5);

INSERT INTO B VALUES(6);

#取并集

SELECT cus_id FROM A UNION SELECT cus_id FROM B

#取交集

SELECT cus_id FROM

(SELECT cus_id FROM B

UNION ALL

SELECT cus_id FROM A)TEMPORARY GROUP BY cus_id HAVING COUNT(*) = 2

#取对称差集

SELECT cus_id FROM

(SELECT DISTINCT cus_id FROM B

UNION ALL

SELECT DISTINCT cus_id FROM A)TEMPORARY GROUP BY cus_id HAVING COUNT(*) = 1

#取左差集

SELECT cus_id FROM A WHERE cus_id NOT IN (SELECT cus_id FROM B)

#但由于数据量较大时效率低,于是可以用以下方式增加效率

SELECT A.cus_id FROM A LEFT JOIN (SELECT B.cus_id FROM B) AS tep ON tep.cus_id = A.cus_id WHERE tep.cus_id IS NULL

#查询每个应还月份,逾期1天以上(<=x<30),大于等于30天(30<=x<60),大于等于60天(60<=x)的数量。

CREATE TABLE xianjiayi(

ID INT(3) NOT NULL auto_increment PRIMARY KEY,

应还时间 datetime,

逾期天数 VARCHAR(30)

)ENGINE=INNODB DEFAULT CHARSET = utf8

INSERT INTO xianjiayi(应还时间,逾期天数)

VALUES("2017-8-1",1),("2017-6-3",6),

("2017-4-1",7),("2017-8-2",30),

("2017-5-4",62),("2017-3-2",78),

("2017-4-5",45);

SELECT date_format(应还时间,'%Y-%m') AS 应还年月,

SUM(CASE WHEN 1<=逾期天数 AND 逾期天数 < 30 THEN 1 ELSE 0 END) AS 逾期1天以上,

SUM(CASE WHEN 30<=逾期天数 AND 逾期天数 < 60 THEN 1 ELSE 0 END) AS 逾期30天以上,

SUM(CASE WHEN 60<=逾期天数 THEN 1 ELSE 0 END) AS 逾期60天以上 FROM xianjiayi

GROUP BY Month(应还时间)

ORDER BY Month(应还时间) DESC;

mysql怎么分组计算逾期率_转行数据分析第三篇:mysql查询入门练习题相关推荐

  1. MySQL代做题_转行数据分析第三篇:mysql查询入门练习题

    这篇练习题是我在学sql入门的时候做的,应该算是在网上能找到的习题里最基础的一篇,非常适合新手练习,如果你接触sql不超过半个月,建议可以看一下<sql必知必会>或<mysql必知必 ...

  2. mysql怎么分组计算逾期率_用sql统计vintage,滚动率,迁移率,逾期率

    风险统计分析,离不开vintage,滚动率,迁移率,逾期率等指标的统计,贴一段递延率的Mysql代码,仅做参考. #create view overdue_list2 #as #逾期(递延)表 SEL ...

  3. mysql怎么分组计算逾期率_Tableau分享第一篇:如何计算分组留存率(Cohort Analysis)!...

    衡量一款产品是否健康,用户的留存率是一个关键的指标,常见的有7日留存率,14天留存率,30天留存率,60天留存率等等.今天Tay哥先讲一下如何用Tableau做Cohort Analysis ,中文一 ...

  4. python分组统计标准化_分组计算和汇总_Python数据分析实战应用_数据挖掘与分析视频-51CTO学院...

    为什么学Python: 重要:数据分析是职业技能必备,Python是大数据分析** 趋势:Python是目前非常火的编程语言,使用人多 好学:学习简单,容易上手,使用灵活,可扩展强 **:会Pytho ...

  5. 转行学python 数据分析统计服_转行数据分析,你准备好了吗?

    前言 笔者从去年5月份下定决心离开汽车制造行业,6月份开始学习Udacity的DAND(Data Analysis Nano Degree, 数据分析纳米学位)课程至今.历经10个月挑灯苦读和1个月四 ...

  6. 通达信公式转python为什么很难_转行数据分析为什么这么难?

    怎么说呢,转行不是一件容易的事情!!! 不像前几年,学个SQL和Python就可以出去找数据分析相关的工作了,那时候企业对大数据的需求旺盛,稍微找个跟大数据沾边的人都可以来应聘,那段时期可以说是一个比 ...

  7. mysql程序员面试题_程序员面试备战篇:18个经典MySQL面试专题解析(干货分享答案)...

    欢迎关注专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. 微信公众号:慕容千语的架构笔记.欢迎关注一起进步. 1.数据库三范式是什么? 第一范式(1 ...

  8. mysql数据库的环境搭建_数据库学习(一)MySql环境搭建

    一.下载安装包并解压 官网下载地址: https://dev.mysql.com/downloads/windows/installer/ 记住解压目录 二.设置环境变量 打开计算机--属性--高级系 ...

  9. mysql设置用户永不过期_在Navicat Premium中管理MySQL用户 - 第2部分:创建新用户

    第2部分:创建新用户 在第1部分中,我们学习了如何使用Navicat Premium用户管理工具保护MySQL root帐户.本篇文章将讨论设置新用户的帐户详细信息,帐户限制和SSL设置. The G ...

最新文章

  1. Qt中文手册 之 QApplication
  2. 算法 - 时间复杂度
  3. Transformer和自注意力机制Self-Attention详解和时间复杂度计算+Image Transformer简介
  4. 值得mark的11个开源机器学习项目 .
  5. Lesson 4.5 梯度下降优化基础:数据归一化与学习率调度
  6. CommonJS,AMD,CMD区别 - 郑星阳 - ITeye博客
  7. 按网络中计算机所处的,按照网络中计算机所处的地位划分,计算机网络包括
  8. django-后台管理-笔记
  9. windows 2008 r2 AD域控服务器部署
  10. 极兔正式入股百世快递
  11. 2021了,你还不能玩转js正则表达式?
  12. css flex布局
  13. Java语言和C语言相比,为什么C语言的运算速度会更快,是因为vjm的性能不行么?
  14. 调试裕泰微yt8521s的phy芯片流程记录
  15. 计算机数值方法知识点,数值分析 全部 知识点.docx
  16. TongWeb和Tomcat的区别
  17. KSZ9897 switch 交换机
  18. plsql手动修改数据
  19. 网页游戏外挂辅助AMF模拟通讯必备
  20. 使用QQ推广作为客服或留言

热门文章

  1. centos 7配置rsync源服务器
  2. informix多张表UPDATE时不能用别名
  3. 阿里安全的“自动逆向机器人”TimePlayer 究竟是什么
  4. SQL Server 2014新功能 -- 内存中OLTP(In-Memory OLTP)
  5. 《工业控制网络安全技术与实践》一2.2 分布式控制系统
  6. 移动应用占美国人移动设备使用时长80%
  7. [转载] AUML——Supplement Documents
  8. ORA-19504,乌龙处理
  9. 第六章 实验报告(函数与宏定义)
  10. python实现关键词提取