一张成绩表中查询出任意两门成绩大于60分的同学的名字。
我的内心有点慌乱,“任意”两个字在我听来就像“随便”“无所谓”一样令人烦躁。
我不知道怎么搞,但是总要理出来几条路吧。脑海中蹦出来的想法是要跟去重的联系到一块,用group by 再加上having进行处理,但是具体怎么写没有想出来。
随便搞张表填充下数据(令狐冲,岳灵珊,劳德诺三个人,语文、数学、自然、社会四门功课)。或许写着写着就能理清自己的思路了。
每当想不出来解决办法的时候,就用自己能想到的方法(所谓的笨方法)先写出来再说。
就想到如下图这种,实在是“任意”两个字太折磨人了。
但是这样做的话,如果有几十门的功课怎么办?我要写多少个and(or)。再想想有没有改进的办法吧。
把表中的行转成列之后,看哪一列有两个数据大于60就把那一列的姓名拿出来就行了。
于是开始上网搜索SQL的行转列,发现并不是我想要的结果。我想要的是把整张表逆时针旋转90度,或许叫行列转置比较恰当一些。
要实现这种旋转,新建一张表。用存储过程写或者查询相关的元素信息进行插入。(这个过程比较麻烦,其实是自己懒),索性我直接建表后把数据插入进去了。
DROP TABLE IF EXISTS `test_scorez`;
CREATE TABLE `test_scorez` (
`a`varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`b`varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`c`varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8COLLATE = utf8_general_ci ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;
结果信息显示如下,
查询大于大于60的个数的时候,显示的结果中也有名字,因为字段类型设置的是varchar类型。筛选出任意两门功课大于60的人员姓名如下。
回过头来看这两种方法。第一种功课种类多的话写起来太麻烦,第二种方法行和列导致比较麻烦(可能是我没有找到简单的方法),行和列转换后,写的查询语句也不少,虽说不用排列组合用and(or)了,但是每个人都要写一句查询语句,也还是比较麻烦。
心里告诉自己,应该还会有更简单的方法。但是就是想不起来了,大家有什么好的解决方案吗?
网友评论