【笔试必备】常见sql笔试题

最新原文:https://www.cnblogs.com/uncleyong/p/14758383.html

sql是测试从业者必备的技能之一,基本上也是笔试必考内容。

金三银四已过,部分微信好友反馈,sql拖了后腿,一遇到多表关联查询就犯晕,甚至连单表的执行顺序都没搞懂,下面简单介绍下,顺便给一些题供大家练习。

单表执行顺序

select distinct 字段1,...,字段n from 库.表
where 条件
group by 分组字段
having 过滤
order by 排序字段
limit n;

执行顺序

from
where
group by
having
select
distinct
order by
limit

多表关联

几个概念:

交叉连接:无任何匹配条件,生成笛卡尔积

内连接:共同部分

左连接:在内连接的基础上保留左表的记录

右连接:在内连接的基础上保留右表的记录

全外连接:在内连接的基础上保留左右两表没有对应关系的记录

表结构

创建表

班级表

DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`caption` varchar(255) NOT NULL,
`grade_id` int(11) NOT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

年级表

DROP TABLE IF EXISTS `class_grade`;
CREATE TABLE `class_grade` (
`gid` int(11) NOT NULL AUTO_INCREMENT,
`gname` varchar(255) NOT NULL,
PRIMARY KEY (`gid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

课程表

DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`cid` int(11) NOT NULL,
`cname` varchar(255) NOT NULL,
`teacher_id` int(11) NOT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

成绩表

DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`sid` int(11) NOT NULL AUTO_INCREMENT,
`student_id` int(11) NOT NULL,
`course_id` int(11) NOT NULL,
`score` varchar(255) DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

学生表

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int(11) NOT NULL AUTO_INCREMENT,
`sname` varchar(255) NOT NULL,
`gender` enum('女','男') NOT NULL DEFAULT '男',
`class_id` int(11) NOT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

老师表

DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`tid` int(11) NOT NULL,
`tname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

班级任职表

DROP TABLE IF EXISTS `teacher2cls`;
CREATE TABLE `teacher2cls` (
`tcid` int(11) NOT NULL AUTO_INCREMENT,
`tid` int(11) NOT NULL,
`cid` int(11) NOT NULL,
PRIMARY KEY (`tcid`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; 

关于表数据,建议自己造,加深对表结构的理解。

常见笔试题

01、查询同时选修了物理课和生物课的学生id和姓名


02、查询“2”课程分数小于60,按分数降序排列的同学学号


03、查询有两门及以上课程超过60分的学生id及其平均成绩


04、查询没有带过任何班级的老师id和姓名


05、查询没有学生选修的课程的课程号和课程名


06、查询至少选修两门课程的学生学号


07、查询各个课程及相应的选修人数


08、查询课程编号为“2”且课程成绩在80分以上的学生的学号和姓名


09、查询课程名称为“生物”,且分数低于60的学生姓名和分数


10、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列


11、查询同名同姓学生名单,并统计同名人数


12、查询男生、女生的人数,按倒序排列;


13、查询选修了2门以上课程的全部学生的学号和姓名


14、查询每门课程被选修的学生数


15、查询至少学过学号为“1”同学所选课程中任意一门课的其他同学学号和姓名


16、查询没有学全所有课的同学的学号、姓名


17、查询有课程成绩小于60分的同学的学号、姓名


18、查询所带班级数最多的老师id和姓名


19、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名


20、查询带过超过2个班级的老师的id和姓名


21、查询没有带过高年级的老师id和姓名


22、查询学过编号‘1’课程和编号‘2’课程的同学的学号、姓名


23、查询教授课程超过2门的老师的id和姓名


24、查询学过‘张老师’老师2门课以上的同学的学号、姓名


25、查询班级信息,包括班级id、班级名称、年级、年级级别(12为低年级,34为中年级,56位高年级)


26、查询班级数小于5的年级id和年级名


27、查询每位学生的学号,姓名,选课数,平均成绩


28、查询每个年级的学生人数


29、查询每个年级的班级数,取出班级数最多的前三个年级


30、查询“生物”课程和“物理”课程成绩都及格的学生id和姓名

补充:查询成绩表里不同课程的成绩倒数5名

参考答案

01:

select s.sid,s.sname from student s
where s.sid in(
	select s.student_id from score s
	join course c on c.cid = s.course_id
	where c.cname in ('体育','生物')
	group by s.student_id
	having count(s.student_id)=2
);

...

最好先自己做一遍,如需要参考答案,请联系作者。

更多练习:https://www.cnblogs.com/uncleyong/p/14757684.html

最新原文:https://www.cnblogs.com/uncleyong/p/14758383.html

============================= 好好学习 ==========================
> > > 1、咨询问题,请加作者微信: ren168632201
> > > 2、性能测试从0到实战: https://www.cnblogs.com/uncleyong/p/12311432.html
> > > 3、自动化测试实战: https://www.cnblogs.com/uncleyong/p/12016690.html
> > > 4、测试基础汇总: https://www.cnblogs.com/uncleyong/p/10530261.html
> > > 5、声明:如有侵权,请联系删除。
============================= 升职加薪 ==========================
原文地址:https://www.cnblogs.com/uncleyong/p/14758383.html