题目如下

查询每门课程分数都大于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,个人觉得初中级面试的这个题目是没问题了。