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

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

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

        17
    ebony0319   2017-07-21 08:41:38 +08:00
    第一题略。很多人都能答上来,但是如果问 exists 与 join 的区别才有点深度。
    第二题需要用到 with 一个递归。
    第三题 count ( A ),A 的数量,count (*)全部的数量包括 A,B,C....和 Null 表的全扫描,count ( 1 )全部数量不会表的的全扫描(这里好像是这样,如果错了清指出)。
        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 的含义)
    --
        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, 刚才手贱发了一条,结果还不能删。
        20
    xiaojunjor   2017-07-21 09:09:06 +08:00
    第二个不会,完全没 get 到点。。
        21
    2ME   2017-07-21 10:35:50 +08:00
    第二个不会.. 另外两个原来自己试过区别
        22
    snopy   2017-07-21 12:20:59 +08:00
    ##COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值还是非空值。
    ##COUNT(column)对特定列中具有值的行进行计数,忽略 NULL 值。
    PS:曾看过一篇关于测评 COUNT(column)和 COUNT(1)运行效率孰高孰低的帖子,不知道有人关注过没
        23
    ditel   2017-07-21 12:58:36 +08:00 via Android
    @mxmai 写错吧,count(a) <= count(1) 这样,嘿嘿
        24
    mxmai   2017-07-21 13:51:35 +08:00
    @ditel 哈哈。写完都没检查,真发错了。
        25
    amghost   2017-07-21 18:02:05 +08:00 via iPhone
    第二题不会,只会捞出来在程序里运算
        26
    wenzhoou   2017-07-22 09:45:52 +08:00 via Android
    话说第二题这样的需求在数据库里面计算好吗?不会导致数据库性能出问题吗?比较好奇。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   938 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 19:00 · PVG 03:00 · LAX 12:00 · JFK 15:00
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1