美文网首页
数据库专题四

数据库专题四

作者: 闭门造折 | 来源:发表于2018-10-10 00:10 被阅读0次

    601.体育馆的人流量

    X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (date)、 人流量 (people)。
    请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于100。
    例如,表 stadium:

    id date people
    1 2017-01-01 10
    2 2017-01-02 109
    3 2017-01-03 150
    4 2017-01-04 99
    5 2017-01-05 145
    6 2017-01-06 1455
    7 2017-01-07 199
    8 2017-01-08 188

    对于上面的示例数据,输出为:

    id date people
    5 2017-01-05 145
    6 2017-01-06 1455
    7 2017-01-07 199
    8 2017-01-08 188

    Note:
    每天只有一行记录,日期随着 id 的增加而增加。
    三个stadium表,使用TO_DAYS做判断,输出三种情况下的s1信息
    ①s1, s2, s3
    ②s2, s1, s3
    ③s2, s3, s1
    但是这道题有问题,领扣上的正确样例中,时间并不是以绝对时间连续,即不是一号二号三号这样判断,而是使用表中id记录为准,只要三个连续记录之间满足均大于100,就需要输出

    正确理解代码(无法AC)
    SELECT DISTINCT s1.id, s1.date, s1.people        -- 选取不同的s1
    FROM stadium s1, stadium s2, stadium s3
    WHERE         -- 三种排序可能
    (    -- 以date的日期为准,找到昨天 今天 明天
        ( -- s1 s2 s3
            TO_DAYS(s2.date) = TO_DAYS(s1.date) + 1
        AND TO_DAYS(s3.date) = TO_DAYS(s1.date) + 2
        )
    OR  ( -- s2 s1 s3
            TO_DAYS(s1.date) = TO_DAYS(s2.date) + 1
        AND TO_DAYS(s3.date) = TO_DAYS(s2.date) + 2
        )
    OR  ( -- s2 s3 s1
            TO_DAYS(s3.date) = TO_DAYS(s2.date) + 1
        AND TO_DAYS(s1.date) = TO_DAYS(s2.date) + 2
        )
    )
    AND s1.people >= 100     -- 均大于100
    AND s2.people >= 100
    AND s3.people >= 100
    ORDER BY s1.id           -- 以s1为序
    
    可以AC代码
    SELECT DISTINCT s1.id, s1.date, s1.people        -- 选取不同的s1
    FROM stadium s1, stadium s2, stadium s3
    WHERE         -- 三种排序可能
    (  -- 以id为准,找到最小的id,id+1,id+2
        ( -- s1 s2 s3
            s1.id + 1 = s2.id
        AND s1.id + 2 = s3.id
        )
    OR  ( -- s2 s1 s3
            s2.id + 1 = s1.id
        AND s2.id + 2 = s3.id
        )
    OR  ( -- s2 s3 s1
            s2.id + 1 = s3.id
        AND s2.id + 2 = s1.id
        )
    )
    AND s1.people >= 100     -- 均大于100
    AND s2.people >= 100
    AND s3.people >= 100
    ORDER BY s1.id           -- 以s1为序
    

     
     
     
     
     
     
     
     
     
     

    620.有趣的电影

    某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。
    作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。
    例如,下表 cinema:

    id movie description rating
    1 War great 3D 8.9
    2 Science fiction 8.5
    3 irish boring 6.2
    4 Ice song Fantacy 8.6
    5 House card Interesting 9.1

    对于上面的例子,则正确的输出是为:

    id movie description rating
    5 House card Interesting 9.1
    1 War great 3D 8.9

    原样输出,所以SELECT *
    筛选条件一:不为boring
    筛选条件二:id为奇数
    筛选条件三:按rating排序

    SELECT *
    FROM cinema
    WHERE description != 'boring'
    AND mod(id,2) = 1
    ORDER BY rating DESC
    

     
     
     
     
     
     
     
     
     
     

    626.换座位

    小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。
    其中纵列的 id 是连续递增的
    小美想改变相邻俩学生的座位。
    你能不能帮她写一个 SQL query 来输出小美想要的结果呢?
    示例:

    id student
    1 Abbot
    2 Doris
    3 Emerson
    4 Green
    5 Jeames

    假如数据输入的是上表,则输出结果如下:

    id student
    1 Doris
    2 Abbot
    3 Green
    4 Emerson
    5 Jeames

    注意:
    如果学生人数是奇数,则不需要改变最后一个同学的座位。
    两两交换,采用union分成三种情况处理

    SELECT s.id, s.student
    FROM(
        -- 偶数位置   seat1为偶数位,seat2 = seat1-1为对应的奇数位
        SELECT seat1.id, seat2.student
        FROM seat seat1, seat seat2
        WHERE seat1.id = seat2.id + 1
        AND MOD(seat1.id, 2) = 0
    
        UNION
    
        -- 奇数非末尾  seat1为偶数位,seat2 = seat1-1为对应的奇数位
        SELECT seat2.id, seat1.student
        FROM seat seat1, seat seat2
        WHERE seat1.id = seat2.id + 1
        AND MOD(seat1.id, 2) = 0
        -- count(*)为计算总条目数
        AND seat2.id != (SELECT COUNT(*) FROM seat)
    
        UNION
    
        -- 奇数末尾  判断是否存在奇数末尾
        SELECT *
        FROM seat
        WHERE id = (SELECT COUNT(*) FROM seat)
        AND MOD(id, 2) = 1
    ) s
    ORDER BY s.id    -- 按最终的id排序
    

     
     
     
     
     
     
     
     
     
     

    627.交换工资

    给定一个 salary表,如下所示,有m=男性 和 f=女性的值 。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。
    例如:

    id name sex salary
    1 A m 2500
    2 B f 1500
    3 C m 5500
    4 D f 500

    运行你所编写的查询语句之后,将会得到以下表:

    id name sex salary
    1 A f 2500
    2 B m 1500
    3 C f 5500
    4 D m 500

    这题不应该叫交换工资,应该叫交换性别。
    使用case when做判断,如果是f变成m,如果是m变成f
    直接update更新一下salary表即可
    参考资料《【LeetCode】627.交换工资》

    -- 采用IF(A,B,C)的形式,相当于一个三目
    UPDATE salary
    SET sex = IF((sex = 'm'), 'f', 'm')
    
    -- 采用CASE WHEN  A THEN B ELSE C END,就是个三目
    UPDATE salary
    SET sex = (CASE WHEN sex = 'm' THEN 'f' ELSE 'm' END)
    

    相关文章

      网友评论

          本文标题:数据库专题四

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