`

关于一个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) sql200的应用的一个实例详细的分析

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

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

    SQL_SERVER_7 资源指南

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

    SQL反模式.pdf

    SQL反模式,是一个通过反向来思考我们写的SQL是否安全。

    Oracle数据库该如何着手优化一个SQL

    而本文是假设SQL本身合理,从Oracle提供给我们的一些技术手段来简单介绍下Oracle数据库,该如何使用一些现有的技术来优化一个SQL执行的性能。  1、确定需要优化的SQL文本及当前SQL执行计划  2、确定SQL涉及的...

    SQL语句在审计

    SQL语句在审计的简单应用

    一个使用Java和SQL语言设计的个人作品管理系统完全可以用于期末作业实现

    课程涵盖了整个实验项目,每个实验都带有具体的任务要求和可行性分析,帮助学生逐步理解数据库应用的设计流程和开发过程,并培养其独立思考和问题解决的能力。让学生了解常用的开发工具和技术,进一步提高其实际开发...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

     作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL ...

    一个使用Java和SQL语言设计的包裹信息管理系统完全可以用于期末作业实现

    课程涵盖了整个实验项目,每个实验都带有具体的任务要求和可行性分析,帮助学生逐步理解数据库应用的设计流程和开发过程,并培养其独立思考和问题解决的能力。让学生了解常用的开发工具和技术,进一步提高其实际开发...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL ...

    一个使用Java和SQL语言设计的超市管理系统完全可以用于期末作业实现

    课程涵盖了整个实验项目,每个实验都带有具体的任务要求和可行性分析,帮助学生逐步理解数据库应用的设计流程和开发过程,并培养其独立思考和问题解决的能力。让学生了解常用的开发工具和技术,进一步提高其实际开发...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL ...

    SQL Server 2000一键10秒极速安装.part1

    几经思考研究,终于制成了这个一键安装版, 安装过程只需要十秒左右(视电脑而定), 与同事们分享,百试百灵,现在已经成功安装了一百次以上,没有不成功的。 原理:其实只是提取了SQL server 2000安装后写入硬盘...

    Sqlserver2005实例安装图解

    虽然大多数的SQL Server安装都使用了默认的参数,这样的话是一个简单的过程,但是没有理解安装参数的话,也会导致困惑或者将来安全攻击方面的问题。正因为如此,下面我列出了一些关键的思考点,供你在安装SQL Server...

    SQLServer2008数据库基础入门教程含思考题练习题 第10章 视图 共25页.ppt

    从表的角度来看,每一个表都存储了大量数据,通过表可以查看到表中的数据。但是,从业务数据角度来看,同一种业务数据有可能分散在不同的表中,如何从一个数据库对象中查看这些分散存储的数据呢?从安全角度来看,...

    SQL Server 2000一键10秒极速安装.part2

    几经思考研究,终于制成了这个一键安装版, 安装过程只需要十秒左右(视电脑而定), 与同事们分享,百试百灵,现在已经成功安装了一百次以上,没有不成功的。 原理:其实只是提取了SQL server 2000安装后写入硬盘...

    SQL Server 2000一键10秒极速安装.part4

    几经思考研究,终于制成了这个一键安装版, 安装过程只需要十秒左右(视电脑而定), 与同事们分享,百试百灵,现在已经成功安装了一百次以上,没有不成功的。 原理:其实只是提取了SQL server 2000安装后写入硬盘...

    SQL Server 2000一键10秒极速安装.part5

    几经思考研究,终于制成了这个一键安装版, 安装过程只需要十秒左右(视电脑而定), 与同事们分享,百试百灵,现在已经成功安装了一百次以上,没有不成功的。 原理:其实只是提取了SQL server 2000安装后写入硬盘...

    一个使用Java和SQL语言设计的报刊销售系统完全可以用于期末作业实现

    课程涵盖了整个实验项目,每个实验都带有具体的任务要求和可行性分析,帮助学生逐步理解数据库应用的设计流程和开发过程,并培养其独立思考和问题解决的能力。让学生了解常用的开发工具和技术,进一步提高其实际开发...

Global site tag (gtag.js) - Google Analytics