图片、部分试题来源网络,侵删,谢谢。

1.SQL 45题

create database  school;
use school;#学生表
create table `Student`
(`Sno` varchar(20) not null COMMENT '人名',`Sname` varchar(20) not null COMMENT '姓名',`Ssex` varchar(20) not null COMMENT '性别',`Sbirthday` datetime COMMENT '出生日期',`Class` varchar(20) COMMENT '班级'
);
#课程表
create table `Course`(`Cno` varchar(20) not null COMMENT '课程号',`Cname` varchar(20) not null COMMENT '课程名称',`Tno` varchar(20) not null COMMENT '教工编号'
);
#成绩表
Create table `Score` (`Sno` varchar(20) not null COMMENT '学号',`Cno` varchar(20) not NULL comment '课程号',`Degree` DECIMAL(4,1) null COMMENT '成绩'
);
#教师表
create table `Teacher` (`Tno` varchar(20) not null COMMENT '教工编号',`Tname` varchar(20) not null COMMENT '教工姓名',`Tsex` varchar(20) not null COMMENT '教工性别',`Tbirthday` datetime null COMMENT '教工出生日期',`Prof` varchar(20) null COMMENT '职称',`Depart` varchar(20) null COMMENT '教工所在部门'
);insert into `Student` value
(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` value
('3-105','计算机导论',825),
('3-245','操作系统',804),
('6-166','数字电路',856),
('9-888','高等数学',831);insert into `Score` value
(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,'2-105',64),
(107,'3-105',91),
(108,'3-105',78),
(101,'6-166',85),
(107,'6-166',79),
(108,'6-166',81);insert into `Teacher` value
(804,'李城','男','1958-12-02','副教授','计算机系'),
(856,'张旭','男','1969-03-12','讲师','电子工程系'),
(825,'王萍','女','1972-05-05','助教','计算机系'),
(831,'刘冰','女','1977-08-14','助教','电子工程系');

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 Sno, Cno, degree from score where degree >= 60 and degree < 80;

5 查询Score表中成绩为85,86或88的记录

select Sno, Cno, degree from score where degree = 85 or degree = 86 or degree = 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 asc, degree desc;
# asc, ascending order(升序排列), desc, descending order(降序排列), 默认按升序排列

9 查询“95031”班的学生人数

select count(Class) as '95031班学生数'  from student where Class = '95031';

10 查询Score表中的最高分的学生学号和课程号。(子查询或者排序)

select * from score where degree = (select max(degree) from score);
# 直接写 select * from score where degree = max(degree)不行,会报错

11 查询每门课的平均成绩。(group by:根据Cno进行分组)  *

select Cno, avg(degree) as '课程平均分' from score group by Cno ; 

12 查询Score表中至少有4名学生选修的并以3开头的课程的平均分数(*需要细究*)

select cno, avg(degree) from score where cno like '3%' group by cno having count(sno) > 4;
#参考网站是5名学生,则查询不到,应为4名学生
#like '3%' 以3开头,或like '%3' 以3结尾, 或包含'%12%'\
#HAVING增加的原因是WHERE关键字无法与合计函数一起使用

13 查询分数大于70,小于90的Sno列

SELECT SNO FROM SCORE WHERE DEGREE BETWEEN 70 AND 90;

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

select student.Sname, score.Cno, score.Degree from student, score where student.Sno = score.Sno;#另一种inner join 写法select student.Sname, score.Cno, score.Degree from student inner join score on student.Sno = score.Sno

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

select score.Sno, course.Cname, score.Degree from  score, course where course.Cno = score.Cno;#或另一种inner join写法select score.Sno, course.Cname, score.Degree from  score INNER JOIN course on course.Cno = score.Cno;

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

select student.Sname, course.Cname, score.Degree from student, course, score WHERE student.Sno = score.Sno and score.Cno = course.Cno;

17 查询“95033”班学生的平均分。(子查询or条件查询)

select avg(degree) as '95033班平均分' from score where sno in (select sno from student where Class = '95033');

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

create table `grade`(`low` int   COMMENT '人名',`upp` int not null COMMENT '课长', `weight` varchar(20) not null COMMENT '等级' ); 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');#网络上的grede,错误, rank关键字不能用,sql存在rank函数,经测试更改为weight可以

19 现查询所有同学的Sno、Cno和weight列。(between选取两个值之间的数据范围)

#select Sno,Cno,Degree,rank from grade join Score on Score.Degree between low and upp;
#select Sno,Cno,Degree,rank from Score, grade where Degree between low and upp;以上为网络上的答案,在Navicat 11.1.13测试错误,实际也是因为rank关键字的原因

select Sno, Cno, weight from Score, grade where (score.Degree > grade.low and score.Degree < grade.upp);或者是select Sno, Cno, weight from Score, grade where Degree between low and upp;或者是select Sno, Cno, weight from Score inner join grade where Degree between low and upp

20 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录

select sno from score where score.cno = '3-105' and score.degree>(select Degree from Score where Cno = '3-105' and Sno = '109');#上面是我的答案,题目要求是查询到所有同学的记录,个人是把所有的同学找出来了,下面是网络上的答案,把满足条件的同学的特征又补全了。select * from Student,Score where Score.Cno = '3-105' and Student.Sno = Score.Snoand Score.Degree>(select Degree from Score where Cno = '3-105' and Sno = '109');

21 查询score中选学多门课程的同学中分数为非最高分成绩的记录(***挺难***)

select * from Score a where Degree<(select MAX(Degree)from  Score b
where a.Cno = b.Cno) and Sno in(select Sno from Score group by  Sno having  count(*) > 1);

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

select * from Student,Score where Student.Sno = Score.Sno and Score.Degree>
(select Degree from Score where Cno='3-105' and Sno = '109');#此为网络上答案,个人感觉不对,第一要求只查询课程号3-105的课程,实际查询少限制条件,第二信息不全select * from student, course, score where score.sno = student.sno and score.cno = course.cno and score.cno = '3-105' and score.degree > (select degree from score where cno = '3-105' and sno = '109')

23 查询和学号为107的同学同年出生的所有学生的Sno、Sname和Sbirthday列

select Sno, Sname, Sbirthday from student where YEAR(Sbirthday) = (select year(Sbirthday) from student where sno = '107');#用到了year()函数

24 查询“张旭“教师任课的学生成绩

select * from student, course, score where student.sno =score.sno and score.cno = course.cno and course.tno = (select tno from teacher where tname = '张旭');#以上为我的答案,将学生的信息补充的较为完整,以下是网络答案,两个where in 跟score.cno = course.cno student.sno = score.sno 等价,也是另一种写法select Sno,Cno,Degree from Score where Cno in(select Cno from Course where Tno in(select Tno from Teacher where Tname = '张旭'));

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

select DISTINCT tname from teacher where tno in (select tno from course where cno in (select cno from score group by cno having count(sno) > 5));#之前的联等的写法行不通,因为没想到group by 与having count和where之间的连接方式

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

select * from student where Class='95033' or Class='95031'

27 查询存在有85分以上成绩的课程Cno

select cno from score where degree >= 85;

28 查询出“计算机系“教师所教课程的成绩表

select * from teacher, student, course, score where score. sno = student.sno and score.cno = course.cno and teacher.tno =course.tno and teacher.depart = '计算机系';#此处有歧义的是成绩表到底包含哪些内容,通常学生姓名、性别、学号包含,所以这里我把信息特征补的较为齐全select sno,Cno ,Degree from Score where Cno in (select Cno from Course where Tno in (select tno from Teacher where Depart='计算机系'))#以上为网络答案

29 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。使用相关子查询

select Tname,Prof from Teacher a where Prof not in(select Prof from Teacher b where a.Depart!=b.Depart);#此处感觉略奇怪,不同职称的应该有遗漏

30 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”课程的同学的Cno、Sno和Degree,并按Degree从高到低次序排序

select Cno,Sno,Degree from Score a where (select Degree from Score b where Cno='3-105' and
b.Sno = a.Sno)>=(select Degree from Score c where Cno='3-245' and c.Sno = a.Sno)order by
Degree desc ;

31 查询选修编号为“3-105”课程且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.

select cno, sno, degree from score a where (select degree from score b where cno = '3-105' and a.sno = b.sno) > (select degree from score c where cno = '3-245' and a.sno = c.sno);

32 查询所有教师和同学的name、sex和birthday

select distinct sname as name, ssex as sex, sbirthday as birthday from student union select distinct tname as name, tsex as sex, tbirthday as birthday from teacher (ORDER BY birthday) ;#这里order by birthday 是自己加的,按生日升序排列,实际不用

33 查询所有“女”教师和“女”同学的name、sex和birthday.

select distinct sname as name, ssex as sex, sbirthday as birthday from student where ssex = '女' union select distinct tname as name, tsex as sex, tbirthday as birthday from teacher where tsex = '女';

34 查询成绩比该课程平均成绩低的同学的成绩表

SELECT sno, cno, degree from score a  where a.degree < (select avg(Degree) from score b where a.sno = b.sno); 

35 查询所有任课教师的Tname和Depart

select tname, depart from teacher where tname in (select distinct tname from teacher, course, score, student where course.tno = teacher.tno and course.cno = score.cno and score.sno =student.sno);

36 查询所有未讲课的教师的Tname和Depart

select tname, depart from teacher where tname not in (select distinct tname from teacher, course, score, student where course.tno = teacher.tno and course.cno = score.cno and score.sno =student.sno);

37 查询至少有2名男生的班号

select Class from student where Ssex='男' group by Class having count(*)>1;

38 查询Student表中不姓“王”的同学记录

select * from Student where Sname not like ('王%');

39 查询Student表中每个学生的姓名和年龄(暂有问题)

select Sname,YEAR(GETDATE())-year(Sbirthday) from student;#getdate函数不可用

40 查询Student表中最大和最小的Sbirthday日期值

select MAX(Sbirthday) as 最大,MIN(Sbirthday) as 最小 from student;

41 以班号和年龄从大到小的顺序查询Student表中的全部记录

select * from Student order by Class desc ,Sbirthday asc;#注意生日数字越大,年龄越小

42 查询“男”教师及其所上的课程

select Tname,Cname from Teacher,Course where teacher.Tsex='男' and Teacher.Tno = Course.Tno;

43 查询最高分同学的Sno、Cno和Degree列

select sno, cno, degree from score where degree = (select max(Degree) from score);

44 查询和“李军”同性别的所有同学的Sname.

select sname from student where ssex = (select ssex from student where sname = '李军') and sname not in ('李军');

45 查询和“李军”同性别并同班的同学Sname

select Sname from Student where Ssex=(select Ssex from Student where Sname='李军')and Sname not in ('李军')and Class=(select Class from Student where Sname='李军');

46 查询所有选修“计算机导论”课程的“男”同学的成绩表

select Sno,Degree from Score where Sno in(select Sno from Student where Ssex='男')and Cno in (select Cno from Course where Cname='计算机导论');

2. SQL 面试题

2.1 row_number

2.2 行列转换

id    学生姓名    课程名称    课程成绩
1    张三         Linux       85
2    张三         MySQL       92
3    张三         Java        87
4    李四         Linux       96
5    李四         MySQL       100
7    王五         Linux       91
8    王五         MySQL       83
9    王五         Java        98

学生姓名    Linux    MySQL    Java
张三          85      92      87
李四          96      89      100
王五          91      83      98

#创建数据表CREATE TABLE tb_lemon_grade (id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,student_name VARCHAR(20) DEFAULT NULL,course VARCHAR(20) DEFAULT NULL,score FLOAT DEFAULT '0');#更改显示形式SELECT  student_name,
MAX(IF(COURSE = 'Linux',SCORE,0)) 'Linux',
MAX(IF(COURSE = 'MySQL',SCORE,0)) 'MySQL',
MAX(IF(COURSE = 'Java',SCORE,0)) 'Java'
FROM lemon_grade
group by student_name;

year   month amount
1991   1     1.1
1991   2     1.2
1991   3     1.3
1991   4     1.4
1992   1     2.1
1992   2     2.2
1992   3     2.3
1992   4     2.4year m1   m2   m3   m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4 select year,
(select amount from   aaa m where month=1   and m.year=aaa.year) as m1,
(select amount from   aaa m where month=2   and m.year=aaa.year) as m2,
(select amount from   aaa m where month=3   and m.year=aaa.year) as m3,
(select amount from   aaa m where month=4   and m.year=aaa.year) as m4
from aaa   group by year

 姓名  类别          花费李  看电影         30李  吃饭           100李  旅游           500王  吃饭           500王  看电影         100王  买衣服         700姓名     TOP1类别        TOP1花费         TOP2类别       TOP2花费            TOP3类别         TOP3花费
李       旅游            500               吃饭            100               看电影            30
王       买衣服          700               吃饭            500               看电影            100

#decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

2.3 索引

索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

2.4 union all 与 union 的区别

union 去重且排序, union all 不去重且不排序

2.5 where 和 having 的区别

WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。GROUP BY 子句用来分组 WHERE 子句的输出。HAVING 子句用来从分组的结果中筛选行

2.6 常用的时间函数

常用的日期提取函数包括 year()/month()/day()/hour()/minute()/second()

日期运算函数包括datediff(enddate,startdate) 计算两个时间的时间差(day);

date_sub(startdate,days) 返回开始日期startdate减少days天后的日期。

date_add(startdate,days) 返回开始日期startdate增加days天后的日期。

2.7 存储过程

存储过程是一个预编译的 SQL 语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次 SQL ,使用存储过程比单纯 SQL 语句执行要快。可以用一个命令对象来调用存储过程。

create proc StuProc
@sname varchar(100)
as
begin
select S#,Sname,Sage,Ssex from student where sname=@sname
end
go

2.8 要求给定数据展示效果

2.9 分组函数使用

2.10 LEFT JOIN、RIGHT JOIN、INNER JOIN、FULL JOIN

2.11 查询某时间段例如0:00-9:00用户登录次数。

给定user_id, login_time(时间戳),表A

3. SQL练习题

4. 参考链接

3.1 https://bbs.csdn.net/topics/392337114

3.2 https://blog.csdn.net/qq_41568597/article/details/84309503

3.3 https://blog.csdn.net/weederss/article/details/78034364

转载于:https://www.cnblogs.com/Jacon-hunt/p/11380508.html

数据分析-SQL练习相关推荐

  1. 数据分析SQL常考题型、大厂例题及面试要点

    文章目录 1. 数据分析岗位技能要求 1.1 哪一个工具是数据分析师的核心工具 1.2 对于数据分析师来说,是否需要建模能力 1.3 数据分析岗位对业务有什么要求 1.4 数据的特点 1.5 优秀数据 ...

  2. 面试题目_数据分析SQL面试题目9套汇总

    金九银十又是找工作的好季节啊,最近不少数据蛙数据分析社群同学,问到一些面试数据分析时的SQL题目,所以就结合大家的面试题目以及工作场景给大家总结了一些经典题目.同时也特别感谢001号同学和002号同学 ...

  3. sql查询每科成绩的最高分_数据分析SQL查询:一文带你入门到掌握

    [背景介绍] 在一家知名电商企业的BI部门实习四个多月,岗位为数据分析.日常工作中打交道最多的就是SQL和EXCEL,在实习之前SQL技能只会简单的增删改查语句,第一周实习经理甩了一份业务常见绩效取数 ...

  4. 财务数据分析sql python_会计转到数据分析值得吗?

    原标题:会计转到数据分析值得吗? 转行数据已接近两年,最近对数据分析岗有了些新的理解,总的来说就是数分不是局限于报告,而是自己能生成能够落地的工具,比如api, web,模型等,让数据产生" ...

  5. 电商数据分析-SQL

    1. 项目背景: 通过对现有用户购物行为的数据进行分析,深度探索用户的消费行为.消费规律.消费偏好,针对不同的用户群体,以便更精细化运营,取得更好的业务: 2. 数据来源 数据来源:https://t ...

  6. 数据分析sql面试必会6题经典_面试数据分析会遇到的SQL题

    「1」说在前面 数据存放在数据库里,以表的形式分门别类. 宜家的商品(数据)放在宜家的仓库(数据库)里,以货位的形式分门别类. 在宜家,可以通过商品上的编号,查到商品在仓库的排号和位号,取到商品. S ...

  7. 基于天池淘宝用户100万条行为数据分析——SQL、Tableau

    目录 一.项目背景和目的 1.1项目背景 1.2项目目的 二.数据来源和数据清洗 2.1数据介绍 2.2数据清洗 2.2.1观察数据添加需要的字段 2.2.2检查是否存在重复值 2.2.3检查是否存在 ...

  8. 财务数据分析sql python_进阶数据分析工具Python和SQL

    进阶数据处理, 常常离不开python和SQL这两个工具.这两个工具SQL擅长在数据库端进行数据的整理.查询.分析,而Python的优势就在于集成了各种数据分析方法,能完成复杂的数据准备.建模工作.所 ...

  9. 财务数据分析sql python_我是如何从会计转行到数据分析

    引言:本文不推荐什么大社群!不推荐课程!只是简明地描述一下我是如何转行到数据分析岗的.先说说自身情况吧: 16年本科毕业,专业财务管理 .在家乡,一个二线城市,做会计做了一年多(包括实习期).这一年多 ...

  10. 数据分析SQL面试_高频73题(实时更新建议收藏)

    数据分析岗位面试的过程中常考的高频73题刷题笔记,不足之处望多多指正. 前言 无论是在数据分析师面试还是数据挖掘等的多数大数据岗位的面试.工作过程中,SQL都是比较重要的一部分,本文主要是笔者刷牛客的 ...

最新文章

  1. Python 上下文管理器和 with 语句
  2. 树形DP——Codeforces Choosing Capital for Treeland
  3. 查询出某个表依赖于某个表的外键,进行遍历删除操作
  4. mysql 类似 user__类似于微博 用户最后一条动态的查询
  5. 强大的,方便编程的vim配置
  6. 《Flask 入门教程》第 6 章:模板优化
  7. Eclipse中,maven工程,pom定义中,版本不匹配时警告提醒---设置方法
  8. 第15天android:使用sqlite
  9. 前后端分离开发,六大方案全揭秘:HTTP API 认证授权术
  10. 小爬需登录的网站之麦子学院
  11. matlab已知斜率画直线,MATLAB 霍夫变换 连接斜率相同的直线
  12. 数独超难题目_世界最难数独游戏 世界上最难数独题目
  13. 销售管理系统数据库设计说明书
  14. 涂上你的脸! 如何创建自定义Photoshop笔刷
  15. 纳兰传奇人生里的情深意短
  16. 『ACM』ACM部分训练日记(以此纪念和队友与FLS一起度过的快乐时光)
  17. DNUICTF反思总结
  18. android 自动加微信群,如何完美实现微信自动发朋友圈自动添加好友等等
  19. 美国软件开发实习生月薪排行榜
  20. 浏览器控制台 console 保存输出文件

热门文章

  1. python2.x 获取网页内容
  2. 文件夹怎么打包压缩?压缩包太大如何缩小?
  3. VMware workstation环境下opnsense的安装
  4. OC5021B降压型恒流驱动控制芯片,关断时间可调
  5. Spring内异常 application exception overridden by commit exception
  6. TOEFL wordlist 26
  7. 如何区分网线是几类的_怎么看网线是几类网线?
  8. uniapp实现退出登录
  9. latex排版:合并表格的多行多列
  10. python 前缀和总结