面接問題:SQL文で各授業が80点以上の学生の名前を検索します.

1622 ワード

データテーブルの構造とデータは次のとおりです.
-- ----------------------------
-- Table structure for grade
-- ----------------------------
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        ';


-- ----------------------------
-- Records of 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:1つのSQL文で各授業が80点より大きい学生の名前を検索する
分析:クエリーの各授業は80点より大きく、すなわち学生min(score)>80であり、学生名usernameグループでソートされます.
方法1:
SELECT username FROM grade GROUP BY username HAVING MIN(score) > 80;

方法2:
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;