V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liprais
V2EX  ›  程序员

三道题搞清楚你到底懂不懂 SQL

  •  
  •   liprais · 2017-07-21 00:33:10 +08:00 · 6090 次点击
    这是一个创建于 2687 天前的主题,其中的信息可能已经有所发展或是发生改变。
    26 条回复    2017-07-22 09:45:52 +08:00
    nooper
        1
    nooper  
       2017-07-21 00:37:06 +08:00 via iPad
    答案呢?我就不懂好久不写 sql
    nooper
        2
    nooper  
       2017-07-21 00:44:14 +08:00 via iPad   ❤️ 1
    写文章要写全.写半拉感觉是在装.
    liprais
        3
    liprais  
    OP
       2017-07-21 01:12:12 +08:00 via iPhone
    @nooper 你就当我是在装好了
    litter123
        4
    litter123  
       2017-07-21 01:12:55 +08:00
    都不懂,蛤蛤
    akira
        5
    akira  
       2017-07-21 02:07:11 +08:00
    2 不会
    konakona
        6
    konakona  
       2017-07-21 02:09:33 +08:00
    join 那个 ok
    第二题不会...
    null 那个没看懂在问什么,题目没明白...
    shiji
        7
    shiji  
       2017-07-21 04:23:24 +08:00
    前几天有人问我这么一个 SQL:
    SELECT residents.*,sum(charges.amount) as amount_charged,sum(payments.amount) as amount_paid,(sum(charges.amount) - sum(payments.amount)) as amount_due FROM residents
    LEFT JOIN payments on payments.resident_id=residents.id
    LEFT JOIN charges on charges.resident_id=residents.id
    GROUP BY residents.id
    问我为什么付款总额和账单总额算出来的根本不对
    ericbize
        8
    ericbize  
       2017-07-21 07:28:56 +08:00 via iPhone
    一知半解
    huijiewei
        9
    huijiewei  
       2017-07-21 07:40:11 +08:00 via iPhone
    看完三个题目,发现其实出题人也是一知半解
    odirus
        10
    odirus  
       2017-07-21 07:40:30 +08:00 via Android
    题不完整吧,第三道题应该考察 count(1) 和 count(列) 在没有查询条件和有查询条件情况下的效率问题。
    bin456789
        11
    bin456789  
       2017-07-21 07:45:52 +08:00 via Android
    讲真,第二题能用窗口函数计算?
    这题我可能只会用游标,这算窗口函数吗?
    odirus
        12
    odirus  
       2017-07-21 07:47:23 +08:00 via Android
    另外这三道题都弄懂了,也只能算 《数据库系统概念》中的初级篇,所以意识到问题,就赶紧买书回来学习吧
    liprais
        13
    liprais  
    OP
       2017-07-21 07:49:03 +08:00 via iPhone
    @huijiewei
    @ericbize
    我觉得你们说的对
    liprais
        14
    liprais  
    OP
       2017-07-21 07:53:43 +08:00 via iPhone
    @odirus 这只是在问会不会写 sql,跟数据库有啥关系?
    woshixiaohao1982
        15
    woshixiaohao1982  
       2017-07-21 08:31:35 +08:00   ❤️ 1
    没有意义的题目,SQL 全称是 Structured query language 也就是结构化查询语言,
    关系型数据库 描述的是数据的关系,可惜这些年 SQL 真的是被人用歪了,连业务都写进 SQL 里面了
    简直了..
    woshixiaohao1982
        16
    woshixiaohao1982  
       2017-07-21 08:35:58 +08:00   ❤️ 9
    有时间研究 SQL 不如研究数据库的存储原理跟底层的索引算法特性,
    对这些深层次的东西,有一定程度上的把握,对日常开发实践是非常有帮助的,
    至于 SQL

    ebony0319
        17
    ebony0319  
       2017-07-21 08:41:38 +08:00
    第一题略。很多人都能答上来,但是如果问 exists 与 join 的区别才有点深度。
    第二题需要用到 with 一个递归。
    第三题 count ( A ),A 的数量,count (*)全部的数量包括 A,B,C....和 Null 表的全扫描,count ( 1 )全部数量不会表的的全扫描(这里好像是这样,如果错了清指出)。
    mxmai
        18
    mxmai  
       2017-07-21 08:47:19 +08:00
    三道题如下:

    1.select * from t1 join t2 on t1.a = t2.a and t1.b = t2.b 和 select * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b 这两个在结果集上有什么区别? ( 这个其实就是在问内连接和外连接的区别)

    2.有一张表记录了用户登录的 ID 和时间,怎么找出每一个用户连续登录的天数?(这是个关于窗口函数的问题)

    3.select count(a) from t1 和 select count(1) from t1 有什么区别?(null 的含义)
    --
    mxmai
        19
    mxmai  
       2017-07-21 08:52:10 +08:00
    三道题如下:

    1.select * from t1 join t2 on t1.a = t2.a and t1.b = t2.b 和 select * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b 这两个在结果集上有什么区别? ( 这个其实就是在问内连接和外连接的区别)
    --
    inner join 会返回满足关联条件的记录,而 left join 除了返回满足关联条件的记录外,还会返回基表(t1)中不满足关联条件的记录。

    2.有一张表记录了用户登录的 ID 和时间,怎么找出每一个用户连续登录的天数?(这是个关于窗口函数的问题)
    --
    oracle 中有分析函数还知道大概怎么统计,mysql 刚想了下,是否可以用用户变量来统计(哭笑脸)

    3.select count(a) from t1 和 select count(1) from t1 有什么区别?(null 的含义)
    --
    count、max、sum 等聚合函数会自动过滤 null 值,所以当 a 中含有 null 值时,count(a) != count(1),即 count(a) <= count(a)

    ps, 刚才手贱发了一条,结果还不能删。
    xiaojunjor
        20
    xiaojunjor  
       2017-07-21 09:09:06 +08:00
    第二个不会,完全没 get 到点。。
    2ME
        21
    2ME  
       2017-07-21 10:35:50 +08:00
    第二个不会.. 另外两个原来自己试过区别
    snopy
        22
    snopy  
       2017-07-21 12:20:59 +08:00
    ##COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值还是非空值。
    ##COUNT(column)对特定列中具有值的行进行计数,忽略 NULL 值。
    PS:曾看过一篇关于测评 COUNT(column)和 COUNT(1)运行效率孰高孰低的帖子,不知道有人关注过没
    ditel
        23
    ditel  
       2017-07-21 12:58:36 +08:00 via Android
    @mxmai 写错吧,count(a) <= count(1) 这样,嘿嘿
    mxmai
        24
    mxmai  
       2017-07-21 13:51:35 +08:00
    @ditel 哈哈。写完都没检查,真发错了。
    amghost
        25
    amghost  
       2017-07-21 18:02:05 +08:00 via iPhone
    第二题不会,只会捞出来在程序里运算
    wenzhoou
        26
    wenzhoou  
       2017-07-22 09:45:52 +08:00 via Android
    话说第二题这样的需求在数据库里面计算好吗?不会导致数据库性能出问题吗?比较好奇。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6047 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 02:27 · PVG 10:27 · LAX 18:27 · JFK 21:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.