`

关于一个sql问题的思考

sql 
阅读更多

     我在面试的的时候一般都会问下候选人对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功底很差,所以大家还是要注重基础,多思考。
  • 大小: 5 KB
0
0
分享到:
评论
1 楼 jinianjun 2014-11-15  
select name,score from student group by name having min(score) >= 80;   
这个语句确定是可以执行吗? sql server中好像是不可以吧。

相关推荐

    一个实例引发的思考.ppt(sql2000)

    【标题】:“一个实例引发的思考.ppt(sql2000)”和【描述】:“一个实例引发的思考.ppt(sql2000)sql200的应用的一个实例详细的分析”虽然提及的是SQL2000,但提供的【部分内容】却与JavaScript框架有关,特别是...

    [SQL思考题系列一]商场促销问题题目

    总的来说,【SQL思考题系列一】商场促销问题题目为学习者提供了一个宝贵的实践平台,帮助我们掌握SQL在商业环境中的应用,提升数据库查询和分析技能。通过这些题目,我们可以更好地理解如何利用SQL解决实际的业务...

    [SQL思考题系列一]商场促销问题答案

    【SQL思考题系列一】商场促销问题答案 在IT领域,SQL(Structured Query Language)是用于管理和处理关系数据库的强大工具。本系列的思考题聚焦于商场促销问题,这些问题旨在锻炼和提升我们的SQL查询技巧,帮助我们...

    SQL 执行超长语句

    超长SQL语句并没有一个明确的长度界限来定义,通常指的是那些结构复杂、包含大量字段或条件的SQL查询语句。这类语句往往难以阅读与维护,且可能存在性能问题。 ##### 常见场景 1. **数据导出/导入**:在进行大批量...

    关于SQL Server数据库的安全问题的思考.pdf

    每个SQL Server用户都有一个SID,这是一个内部使用的唯一标识符。当一个用户需要访问数据库中的对象时,数据库管理系统会检查该用户的SID来验证权限。SID的存在可以确保用户权限的唯一性和安全性。 在提及的"Users...

    收获,不止SQL优化--抓住SQL的本质1

    - **宏观策略的意义**:通过这些策略,可以构建起一个从宏观到微观的优化思路,帮助读者更好地理解SQL优化的“道”。 #### 4. 解决SQL问题的具体技术 - **体系结构**:了解数据库的整体架构对于优化至关重要。 - **...

    关于一个SQL注入题目的思考

    p牛在群里面出了一个好玩的题目,正好晚上空虚寂寞冷,做一下暖暖身子,题目是: &lt;?php $link = mysqli_connect('localhost', 'root', 'root'); mysqli_select_db($link, 'code'); $table = addslashes($_...

    SQL解惑(第2版)

    一个好的SQL解决方案需要考虑的因素包括但不限于代码的可读性、性能优化、事务处理、并发控制、容错能力等。《SQL解惑》通过展示多种解决方案,帮助程序员理解和掌握这些问题,并指导他们如何灵活运用SQL语言来满足...

    提高SQL Server数据库安全性的几点思考.pdf

    触发器的具体实现可以通过编写SQL脚本来完成,比如创建一个触发器来记录被删除表的相关信息,或者阻止对敏感表的修改。 通过上述方法,可以有效提高SQL Server数据库的安全性,减少因安全漏洞导致的数据泄露、数据...

    乔晓阳 - 一个直方图问题引发的思考

    首先是第一个SQL语句执行迅速,随后第二个SQL语句出现长时间的等待,这为深入探究SQL执行计划的不稳定性和不准确性提供了重要线索。 在问题分析部分,乔晓阳利用操作系统命令找到占用资源较多的Oracle服务器进程...

    SQL语句在审计

    一、SELECT语句的基本组件和描述: * SELECT:指明要检索的数据的列。 * FROM:指明从哪(几)个表中检索行。 * WHERE:指明返回数据必须满足的标准(条件)。 * GROUP BY:对于集合查询,指明返回的列数据通过这些...

    SQL Server 2005数据库应用与开发习题解答与上机指导前50面大部分选择题与思考题答案照片

    例如,针对一个关于查询性能的问题,可能需要编写不同的SQL语句进行比较,分析执行计划,找出最优解。对于安全性问题,需要考虑如何设置合适的用户权限,防止未授权访问。 总之,SQL Server 2005的习题解答和上机...

    SQL_SERVER_7 资源指南

    本书可以指导用户设计数据库解决方案,管理一个或多个SQL Server数据库,以及为优 化数据库操作设计应用程序。本书参考了M i c r o s o f t职员为回答用户经常提出的问题所写的文 章,并给出了深入的分析及思考。 ...

    [SQL思考题二] 组合角色题目

    INNER JOIN返回两个表中匹配的行,LEFT JOIN返回左表的所有行和右表匹配的行,RIGHT JOIN反之,而FULL JOIN则返回两个表的所有行,即使在其中一个表中没有匹配的行。 其次,子查询在SQL中扮演着重要的角色。它可以...

    自动添加引号加号sql文处理利器

    标题中的“自动添加引号加号sql文处理利器”指的是一个专门用于简化SQL语句处理的工具,它能够帮助程序员自动完成SQL语句中的引号添加、加号连接等常见操作,极大地提高了编写和处理SQL语句的效率。在编程过程中,...

    利用Geoway ImageStation和SQL Server进行正射影像生产的若干问题思考.pdf

    SQL Server 2000 是一个大型后端数据库系统,支持字符型、整型、浮点型等常规数据类型,能够支持TB级数据量。 在正射影像生产中,ImageStation 和 SQL Server 相结合的应用环节对正射影像的图面质量和精度具有重要...

    SQL 教学实习报告

    实习的主要内容是设计并实现一个库存管理系统的数据库,旨在深化学生对数据库设计与开发的理解,掌握SQL Server的应用,以及如何利用SQL语句进行数据的增删改查。 在实习目的上,该报告强调了理论知识与实践的结合...

Global site tag (gtag.js) - Google Analytics