美文网首页
mysql 查询语句

mysql 查询语句

作者: 苍老师的眼泪 | 来源:发表于2020-09-22 11:37 被阅读0次

    设想一个情景,有一个家庭,他们每个成员都需要买一种商业保险,每个人需要付的保险费是和本人的年龄相关的,那么怎么计算这个家庭需要支付的总费用是多少呢?
    表:

    id  name    age homeno
    1   Edison  25   1
    2   Mother  49   1
    3   Father  51   1
    4   Brother 31   1
    5   Sister  NULL 1
    

    sql:

    select sum(case
    when age < 20 then 0
    when age >=20 and age < 30 then 200
    when age >=30 and age < 40 then 300
    when age >=40 and age < 50 then 400
    when age is null then 0
    else 100 end) as total from test group by homeno;
    

    设想一个情景,有个学校想要招分数高的人,但是被招聘的群体分文理科,type = 0表示文科,type = 1表示理科。现在要对这个招聘群体排名:
    表:

    1   桂华   1   null   44
    2   祝玉英 1   null    75
    3   舒桂英 0   12     null
    4   晏建军 0   84     null
    5   谭亮   1   null   30
    6   隋敏   1   null   69
    7   刘振国 1   null    97
    8   娄超   1   null   71
    9   庞玉梅 1   null    21
    10  楚秀芳 0   79     null
    11  瞿英   1   null   38
    12  霍小红 0   18     null
    13  薄文娟 0   17     null
    14  路华   1   null   100
    15  万慧   0   48     null
    16  银瑜   1   null   77
    

    sql:

    解决方案1:if
    select * from test order by if(type = 0, liberal, science) desc;
    解决方案2:case ... when ... then ... else ... end
    select * from test order by case when type = 0 then liberal when type = 1 then science end desc;
    select * from test order by case when type = 0 then liberal when type = 1 then science else liberal end desc;
    

    设想有一个情景,你拿到一张某个年级的所有班的学生的成绩表,现在要求出每个班成绩最高的人的信息:
    表:

    id  name  class  score
    32  花利   1      46
    76  潘正业 1      46
    86  臧博   1      22
    41  潘建明 2      21
    68  白捷   2      54
    99  熊彬   2      11
    72  宗松   3      88
    78  路秀珍 3      35
    81  查丽娟 3      90
    22  姬洁   4      87
    65  沙丽娟 4      71
    95  邵静   4      72
    

    sql:

    方案1:left join
    select i1.*, i0.* from info as i1 left join info as i0 
    on i1.class = i0.class and i1.score < i0.score where i0.score is null 
    order by i1.class, i1.id;
    
    方案2: 子查询
    select i1.* from info as i1 inner join 
        (select class, max(score) as max_score from info group by class) as i0 
        on i1.class = i0.class and i1.score = i0.max_score 
    order by i1.class, i1.id;
    

    相关文章

      网友评论

          本文标题:mysql 查询语句

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