我在面试的的时候一般都会问下候选人对sql的掌握情况,其中有一个这样的题目,也是很常见的。
表结构如下:
DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `name` varchar(255) DEFAULT NULL, `category` varchar(255) DEFAULT NULL, `score` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('zhangsan', 'shuxue', '85'); INSERT INTO `student` VALUES ('zhangsan', 'yuwen', '85'); INSERT INTO `student` VALUES ('zhangsan', 'yingyu', '85'); INSERT INTO `student` VALUES ('lisi', 'shuxue', '76'); INSERT INTO `student` VALUES ('lisi', 'yuwen', '85'); INSERT INTO `student` VALUES ('wangwu', 'shuxue', '85');
要求是返回所有成绩都大于80分的学生名单。
总体来看,完全答对的不多。
首先来看下题目,这个里面学生的成绩不是固定的,所以就不能采用固定3科的方式,很多人想这么筛选。下面我就来介绍下这个要求的两种写法
1 分组过滤
select name from student group by name having min(score) >= 80;
分组过滤是所有的人都想到了,基本上上来都能按照那么进行分组,但是很多人写的时候最大的问题是不知道score能不能出现在having语句里面。 这个就令我想到了,当时学习sql的时候,经常说有一些限制,什么group语句里面出现的,可以出现在select里面等等,所以估计是候选人这个地方有点懵了,不知道这个sql到底对不对。
其实很好理解,group 语句会产生一个临时表,只是相同name名称的student是一组,那对组内的数据继续过滤肯定是没有问题的。
那下面的sql可不可以呢?
select name,score from student group by name having min(score) >= 80;
这个sql可以执行,但是score会彻底的乱掉,因为从原来上来说分组后有三条记录,这个地方要score,该给那一条记录的score呢,只能随便返回一个记录的score。
2 采用in语句
select distinct name from student where name not in (select distinct name from student where score < 80);
这个的思路很清晰,将分数小于80分的人员名单拿到,然后再过滤掉这些人。
这个里面可以看到有两个distinct,这个也是候选人写到这个sql的时候,我会继续问下distinct的含义,不加可以不?我们知道,如果外层不加distinct是决定不行的,会产生重复记录,为什么会产生重复记录呢?
这个也得从原来上来说,in语句里层的sql会产生一个临时表,然后外层的sql会去扫描,外层的原表里面出现三个zhangsan,它都不出现在里层的结果集里面,所以当然返回三条记录。那里层sql里面的distinct到底可不可以不加呢,答案是可以不加,但是这个地方要加,in语句里层返回的结果集要尽可能的少,这样比较的次数会比较少。
从这个小题目来看,很多人在面试的时候可能临时看了sql优化的一些技巧,大谈profile、加索引呀、分表分库等,但是sql功底很差,所以大家还是要注重基础,多思考。
相关推荐
一个实例引发的思考.ppt(sql2000) sql200的应用的一个实例详细的分析
p牛在群里面出了一个好玩的题目,正好晚上空虚寂寞冷,做一下暖暖身子,题目是: <?php $link = mysqli_connect('localhost', 'root', 'root'); mysqli_select_db($link, 'code'); $table = addslashes($_...
本书可以指导用户设计数据库解决方案,管理一个或多个SQL Server数据库,以及为优 化数据库操作设计应用程序。本书参考了M i c r o s o f t职员为回答用户经常提出的问题所写的文 章,并给出了深入的分析及思考。 ...
SQL反模式,是一个通过反向来思考我们写的SQL是否安全。
而本文是假设SQL本身合理,从Oracle提供给我们的一些技术手段来简单介绍下Oracle数据库,该如何使用一些现有的技术来优化一个SQL执行的性能。 1、确定需要优化的SQL文本及当前SQL执行计划 2、确定SQL涉及的...
SQL语句在审计的简单应用
课程涵盖了整个实验项目,每个实验都带有具体的任务要求和可行性分析,帮助学生逐步理解数据库应用的设计流程和开发过程,并培养其独立思考和问题解决的能力。让学生了解常用的开发工具和技术,进一步提高其实际开发...
作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL ...
课程涵盖了整个实验项目,每个实验都带有具体的任务要求和可行性分析,帮助学生逐步理解数据库应用的设计流程和开发过程,并培养其独立思考和问题解决的能力。让学生了解常用的开发工具和技术,进一步提高其实际开发...
作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL ...
课程涵盖了整个实验项目,每个实验都带有具体的任务要求和可行性分析,帮助学生逐步理解数据库应用的设计流程和开发过程,并培养其独立思考和问题解决的能力。让学生了解常用的开发工具和技术,进一步提高其实际开发...
作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL ...
几经思考研究,终于制成了这个一键安装版, 安装过程只需要十秒左右(视电脑而定), 与同事们分享,百试百灵,现在已经成功安装了一百次以上,没有不成功的。 原理:其实只是提取了SQL server 2000安装后写入硬盘...
虽然大多数的SQL Server安装都使用了默认的参数,这样的话是一个简单的过程,但是没有理解安装参数的话,也会导致困惑或者将来安全攻击方面的问题。正因为如此,下面我列出了一些关键的思考点,供你在安装SQL Server...
从表的角度来看,每一个表都存储了大量数据,通过表可以查看到表中的数据。但是,从业务数据角度来看,同一种业务数据有可能分散在不同的表中,如何从一个数据库对象中查看这些分散存储的数据呢?从安全角度来看,...
几经思考研究,终于制成了这个一键安装版, 安装过程只需要十秒左右(视电脑而定), 与同事们分享,百试百灵,现在已经成功安装了一百次以上,没有不成功的。 原理:其实只是提取了SQL server 2000安装后写入硬盘...
几经思考研究,终于制成了这个一键安装版, 安装过程只需要十秒左右(视电脑而定), 与同事们分享,百试百灵,现在已经成功安装了一百次以上,没有不成功的。 原理:其实只是提取了SQL server 2000安装后写入硬盘...
几经思考研究,终于制成了这个一键安装版, 安装过程只需要十秒左右(视电脑而定), 与同事们分享,百试百灵,现在已经成功安装了一百次以上,没有不成功的。 原理:其实只是提取了SQL server 2000安装后写入硬盘...
课程涵盖了整个实验项目,每个实验都带有具体的任务要求和可行性分析,帮助学生逐步理解数据库应用的设计流程和开发过程,并培养其独立思考和问题解决的能力。让学生了解常用的开发工具和技术,进一步提高其实际开发...