黑马程序员技术交流社区

标题: 两条sql语句比较(已解决) [打印本页]

作者: 张腾达    时间: 2012-7-27 15:20
标题: 两条sql语句比较(已解决)
本帖最后由 张腾达 于 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)

请问这两条语句在执行速度上有差别吗?老是感觉怪怪的
作者: 刘旺    时间: 2012-7-27 15:55
当in子查询的结果集中包含null时,如: in('a','b',null),父查询只返回非NULL结果集,因为null和null无法比较;

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

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

作者: 许庭洲    时间: 2012-7-27 16:27
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 语句的判断。
作者: 张腾达    时间: 2012-7-27 16:28
许庭洲 发表于 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:09
本帖最后由 王辉 于 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)
在这里两条查询语句结果一样,相对来说第一条查询语句效率高于第二条(因为第二条查询语句多了分组查询)。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2