A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张腾达 中级黑马   /  2012-7-27 15:20  /  1929 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张腾达 于 2012-7-28 23:24 编辑


80分为优秀,请查询出所有科目均为优秀的同学

随手写了条反着来的 不在不优秀的名单里的同学
SELECT * FROM Test
WHERE sName NOT IN(SELECT sName FROM Test WHERE sScore<80)

想了想又写了条分组的
SELECT * FROM Test
WHERE sName IN (SELECT sName FROM Test  GROUP BY sName HAVING MIN(sScore)>80)

请问这两条语句在执行速度上有差别吗?老是感觉怪怪的

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

4 个回复

倒序浏览
当in子查询的结果集中包含null时,如: in('a','b',null),父查询只返回非NULL结果集,因为null和null无法比较;

当子查询 not in的结果集中包含null时,父查询永远为空结果集;

当子查询中查询字段不存在时,SQL不会报错

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
1 ,SELECT * FROM Test WHERE sName NOT IN(SELECT sName FROM Test WHERE sScore<80) //通过排除子查询低于80分的学生姓名
2, SELECT * FROM Test WHERE sName IN (SELECT sName FROM Test  GROUP BY sName HAVING MIN(sScore)>80)//通过子查询和having子句判断,过滤出大于80分的学生
3, 两个SQL语句功能相同,都是查找数据库表Test的学生成绩大于80分的学生记录;
4, 第一条SQL语句比第二条SQL语句的执行效率要高,减少了HAVING 语句的判断。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
许庭洲 发表于 2012-7-27 16:27
1 ,SELECT * FROM Test WHERE sName NOT IN(SELECT sName FROM Test WHERE sScore80)//通过子查询和having ...

3Q 又见大神,金牌黑马啊 阿门
回复 使用道具 举报
本帖最后由 王辉 于 2012-7-27 19:14 编辑

1.SELECT * FROM Test
WHERE sName NOT IN(SELECT sName FROM Test WHERE sScore<80)
2.SELECT * FROM Test
WHERE sName IN (SELECT sName FROM Test  GROUP BY sName HAVING MIN(sScore)>80)
在这里两条查询语句结果一样,相对来说第一条查询语句效率高于第二条(因为第二条查询语句多了分组查询)。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马