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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/376845

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX