先建表:
mysql> create table student(
-> name varchar(32) comment '姓名',
-> course varchar(32) comment '课程',
-> score int comment '分数'
-> );
Query OK, 0 rows affected (5.22 sec)
mysql> insert into student (name,course,score) values ('张三','语文',81),
('张三','数学',75),('李四','语文',76),('李四','数学',90),('王五','语文',81),
('王五','数学',100),('王五','英语',90);
Query OK, 7 rows affected (0.69 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> select * from student;
+------+--------+-------+
| name | course | score |
+------+--------+-------+
| 张三 | 语文 | 81 |
| 张三 | 数学 | 75 |
| 李四 | 语文 | 76 |
| 李四 | 数学 | 90 |
| 王五 | 语文 | 81 |
| 王五 | 数学 | 100 |
| 王五 | 英语 | 90 |
+------+--------+-------+
7 rows in set (0.01 sec)
建好表之后,开始查询表中每门功课都大于80分的同学姓名
1.在having后面使用min 聚合
select name from student group by name having min(score)> 80;
2.逆向思维 先查出有课程成绩小于80分的学生姓名,然后用not in 或 not exists 方法进行排除。
select name from student group by name having name not in(select name from student where score < 80);
3.count 聚合 求出一共有多少行
sum用于求和
case when then else end是按条件返回值
select name from student group by name having count(score) =
sum(case when score > 80 then 1 else 0 end);