用一条SQL语句查询出每门课都大于80分的学生姓名

564 阅读1分钟

数据表结构和数据如下:

CREATE TABLE `grade` (
  `id` int(4) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id主键',
  `username` varchar(255) NOT NULL COMMENT '学生姓名',
  `coursename` varchar(255) NOT NULL COMMENT '课程名称',
  `score` tinyint(4) NOT NULL COMMENT '分数',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COMMENT='grade 学生成绩信息表';

INSERT INTO `grade` VALUES (1, '张三', '语文', 81);
INSERT INTO `grade` VALUES (2, '张三', '数学', 75);
INSERT INTO `grade` VALUES (3, '李四', '语文', 76);
INSERT INTO `grade` VALUES (4, '李四', '数学', 90);
INSERT INTO `grade` VALUES (5, '王五', '语文', 81);
INSERT INTO `grade` VALUES (6, '王五', '数学', 100);
INSERT INTO `grade` VALUES (7, '王五', '英语', 90);
INSERT INTO `grade` VALUES (8, '张三', '数学', 75);

问题1:用一条SQL语句查询出每门课都大于80分的学生姓名 

分析:查询每门课都大于80分,即学生min(score)>80,并且按学生姓名username分组排序  

方法一: 

SELECT username FROM grade GROUP BY username HAVING MIN(score) > 80; 

方法二: 

SELECT DISTINCT username FROM grade WHERE username NOT IN (SELECT DISTINCT username FROM grade WHERE score <= 80); 

问题2::查询平均分大于80的学生的姓名 

SELECT username FROM grade GROUP BY username HAVING AVG(score) > 80;