SQL一张表中查询任意两列大于某个值

2019-07-10  本文已影响0人  燃灯道童

一张成绩表中查询出任意两门成绩大于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)了,但是每个人都要写一句查询语句,也还是比较麻烦。

心里告诉自己,应该还会有更简单的方法。但是就是想不起来了,大家有什么好的解决方案吗?

上一篇下一篇

猜你喜欢

热点阅读