美文网首页
SQL一张表中查询任意两列大于某个值

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

作者: 燃灯道童 | 来源:发表于2019-07-10 21:31 被阅读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)了,但是每个人都要写一句查询语句,也还是比较麻烦。

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

    相关文章

      网友评论

          本文标题:SQL一张表中查询任意两列大于某个值

          本文链接:https://www.haomeiwen.com/subject/sgckkctx.html