问题场景
最近有个朋友去面试,问了我一道面试题。题目如下,在形如下面的数据库表score中,找出每门成绩(grade)都大于等于80分的学生姓名。
----------------------------------------
name
| course | grade
----------------------------------------
zhangsan | Java | 70
----------------------------------------
zhangsan | C++ | 80
----------------------------------------
lisi | Java | 90
----------------------------------------
lisi | C++ | 60
----------------------------------------
wangwu | Java | 85
----------------------------------------
wangwu | C++ | 95
----------------------------------------
期望结果
----------------------------------------
name
----------------------------------------
wangwu
----------------------------------------
本文以MySQL数据库为例,以三种方案一步一步实现面试题要求。
方案一
1、寻求行列转换,也称矩阵转置,将多列数据转为一行,这一步最关键,实现SQL语句如下:
下面的sql是以score为主表来构建多列,构造的从表为每门课程的数据表,通过主表的 name 字段来关联从表的 name 字段。
select s.`name` as name,
(select grade from score where name = s.`name` and course = 'Java')as