我在面试的的时候一般都会问下候选人对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)”和【描述】:“一个实例引发的思考.ppt(sql2000)sql200的应用的一个实例详细的分析”虽然提及的是SQL2000,但提供的【部分内容】却与JavaScript框架有关,特别是...
总的来说,【SQL思考题系列一】商场促销问题题目为学习者提供了一个宝贵的实践平台,帮助我们掌握SQL在商业环境中的应用,提升数据库查询和分析技能。通过这些题目,我们可以更好地理解如何利用SQL解决实际的业务...
【SQL思考题系列一】商场促销问题答案 在IT领域,SQL(Structured Query Language)是用于管理和处理关系数据库的强大工具。本系列的思考题聚焦于商场促销问题,这些问题旨在锻炼和提升我们的SQL查询技巧,帮助我们...
超长SQL语句并没有一个明确的长度界限来定义,通常指的是那些结构复杂、包含大量字段或条件的SQL查询语句。这类语句往往难以阅读与维护,且可能存在性能问题。 ##### 常见场景 1. **数据导出/导入**:在进行大批量...
每个SQL Server用户都有一个SID,这是一个内部使用的唯一标识符。当一个用户需要访问数据库中的对象时,数据库管理系统会检查该用户的SID来验证权限。SID的存在可以确保用户权限的唯一性和安全性。 在提及的"Users...
p牛在群里面出了一个好玩的题目,正好晚上空虚寂寞冷,做一下暖暖身子,题目是: <?php $link = mysqli_connect('localhost', 'root', 'root'); mysqli_select_db($link, 'code'); $table = addslashes($_...
- **宏观策略的意义**:通过这些策略,可以构建起一个从宏观到微观的优化思路,帮助读者更好地理解SQL优化的“道”。 #### 4. 解决SQL问题的具体技术 - **体系结构**:了解数据库的整体架构对于优化至关重要。 - **...
一个好的SQL解决方案需要考虑的因素包括但不限于代码的可读性、性能优化、事务处理、并发控制、容错能力等。《SQL解惑》通过展示多种解决方案,帮助程序员理解和掌握这些问题,并指导他们如何灵活运用SQL语言来满足...
触发器的具体实现可以通过编写SQL脚本来完成,比如创建一个触发器来记录被删除表的相关信息,或者阻止对敏感表的修改。 通过上述方法,可以有效提高SQL Server数据库的安全性,减少因安全漏洞导致的数据泄露、数据...
首先是第一个SQL语句执行迅速,随后第二个SQL语句出现长时间的等待,这为深入探究SQL执行计划的不稳定性和不准确性提供了重要线索。 在问题分析部分,乔晓阳利用操作系统命令找到占用资源较多的Oracle服务器进程...
一、SELECT语句的基本组件和描述: * SELECT:指明要检索的数据的列。 * FROM:指明从哪(几)个表中检索行。 * WHERE:指明返回数据必须满足的标准(条件)。 * GROUP BY:对于集合查询,指明返回的列数据通过这些...
例如,针对一个关于查询性能的问题,可能需要编写不同的SQL语句进行比较,分析执行计划,找出最优解。对于安全性问题,需要考虑如何设置合适的用户权限,防止未授权访问。 总之,SQL Server 2005的习题解答和上机...
本书可以指导用户设计数据库解决方案,管理一个或多个SQL Server数据库,以及为优 化数据库操作设计应用程序。本书参考了M i c r o s o f t职员为回答用户经常提出的问题所写的文 章,并给出了深入的分析及思考。 ...
INNER JOIN返回两个表中匹配的行,LEFT JOIN返回左表的所有行和右表匹配的行,RIGHT JOIN反之,而FULL JOIN则返回两个表的所有行,即使在其中一个表中没有匹配的行。 其次,子查询在SQL中扮演着重要的角色。它可以...
标题中的“自动添加引号加号sql文处理利器”指的是一个专门用于简化SQL语句处理的工具,它能够帮助程序员自动完成SQL语句中的引号添加、加号连接等常见操作,极大地提高了编写和处理SQL语句的效率。在编程过程中,...
SQL Server 2000 是一个大型后端数据库系统,支持字符型、整型、浮点型等常规数据类型,能够支持TB级数据量。 在正射影像生产中,ImageStation 和 SQL Server 相结合的应用环节对正射影像的图面质量和精度具有重要...
实习的主要内容是设计并实现一个库存管理系统的数据库,旨在深化学生对数据库设计与开发的理解,掌握SQL Server的应用,以及如何利用SQL语句进行数据的增删改查。 在实习目的上,该报告强调了理论知识与实践的结合...