题目如下
查询每门课程分数都大于80的学生姓名
先准备好数据
建表语句
CREATE TABLE `test4mianshi` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`u_name` varchar(32) DEFAULT NULL,
`subject` varchar(16) DEFAULT NULL,
`score` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
初始化数据脚本
INSERT INTO `test4mianshi` VALUES ('1', 'zhangsan', '语文', '78');
INSERT INTO `test4mianshi` VALUES ('2', 'zhangsan', '数学', '82');
INSERT INTO `test4mianshi` VALUES ('3', 'zhangsan', '英语', '82');
INSERT INTO `test4mianshi` VALUES ('4', 'zhangsan', '化学', '84');
INSERT INTO `test4mianshi` VALUES ('5', 'zhangsan', '生物', '81');
INSERT INTO `test4mianshi` VALUES ('6', 'zhangsan', '政治', '87');
INSERT INTO `test4mianshi` VALUES ('7', 'lisi', '语文', '90');
INSERT INTO `test4mianshi` VALUES ('8', 'lisi', '数学', '88');
INSERT INTO `test4mianshi` VALUES ('9', 'lisi', '英语', '84');
INSERT INTO `test4mianshi` VALUES ('10', 'lisi', '化学', '81');
INSERT INTO `test4mianshi` VALUES ('11', 'lisi', '生物', '83');
INSERT INTO `test4mianshi` VALUES ('12', 'wangwu', '语文', '85');
INSERT INTO `test4mianshi` VALUES ('13', 'wangwu', '数学', '83');
INSERT INTO `test4mianshi` VALUES ('14', 'wangwu', '英语', '82');
INSERT INTO `test4mianshi` VALUES ('15', 'wangwu', '化学', '84');
INSERT INTO `test4mianshi` VALUES ('16', 'xiaoliu', '语文', '70');
INSERT INTO `test4mianshi` VALUES ('17', 'xiaoliu', '数学', '85');
INSERT INTO `test4mianshi` VALUES ('18', 'xiaoliu', '英语', '82');
INSERT INTO `test4mianshi` VALUES ('19', 'xiaoliu', '化学', '86');
INSERT INTO `test4mianshi` VALUES ('20', 'wangwu', '生物', '83');
INSERT INTO `test4mianshi` VALUES ('21', 'xiaoliu', '生物', '86');
这是一道比较经典的数据库方面的面试题,经常出现在各种面试笔试中,主要考察应试者数据库功底。
第一种方式
用not in 或者 not exists 实现 第一种的写法 不过DISTINCT关键字尽量少用,效率太低
第二种方式
使用group by+having
另外网上有网友说可以使用子查询来做,前面我尝试着使用子查询来做,觉得没必要,sql不易维护。
建议使用第二种方式
基础复习
GROUP BY语句用来与聚合函数(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX.)联合使用来得到一个或多个列的结果集。
注意:
因为聚合函数通过作用于一组数据而只返回一个单个值,因此,在SELECT语句中出现的元素要么为一个聚合函数的输入值,要么为GROUP BY语句的参数,否则会出错。
HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。
另外也有面试现场写一个sql,查询所有三好生(至少三门课大于80分的学生)
我们针对上面这个表进行操作:
把前面数据调整一下
把xiaoliu这个学生分数调整为不是三好生,执行sql的语句
结果
看完上面的这几个sql,个人觉得初中级面试的这个题目是没问题了。