【发布时间】:2011-01-08 08:34:49
【问题描述】:
我正在查看Questions every good .Net developer should be able to answer,并对这个问题的内容和方法印象深刻,因此本着同样的精神,我向 Database/SQL Developer 提出这个问题。
您认为优秀的数据库/SQL 程序员应该能够回答哪些问题?
【问题讨论】:
我正在查看Questions every good .Net developer should be able to answer,并对这个问题的内容和方法印象深刻,因此本着同样的精神,我向 Database/SQL Developer 提出这个问题。
您认为优秀的数据库/SQL 程序员应该能够回答哪些问题?
【问题讨论】:
不同类型的 JOIN:
查看 Jeff Atwood 的Visual Explanation of JOINs
什么是索引,它对您的数据库有何帮助?
有哪些可用的数据类型以及何时使用哪些数据类型?
【讨论】:
转载my answer here,作为主题的一般指南。
SELECTing 表中的列COUNT、SUM、MAX/MIN
DISTINCT、GROUP BY、HAVING
JOINs,ANSI-89 和 ANSI-92 语法UNION 与 UNION ALL
NULL 处理:COALESCE & 原生 NULL 处理IN、EXISTS 和内联视图WITH 语法:子查询分解/CTECOMMIT、ROLLBACK、错误处理【讨论】:
这里有几个:
【讨论】:
什么是sql注入,如何预防?
什么是游标,什么时候使用(或不使用),为什么?
【讨论】:
我放置这个答案是因为 Erwin Smout 发布了一个错误的 answer,它强调了可能需要特别防范它。
欧文建议:
“为什么每个 SELECT 都应该包含 DISTINCT ?”
一个更合适的问题是:如果有人声称:“每个 SELECT 总是包含 DISTINCT”;您如何评论该声明?
如果候选人无法在火焰中击落索赔,他们要么:
记录在案
【讨论】:
在我们公司,我们没有提出很多记忆力好的人都能回答的 SQL 问题,而是创建了一个 SQL Developers 测试。该测试旨在让候选人将具有规范化和 RI 考虑、检查约束等的可靠模式放在一起。然后能够创建一些查询以生成我们正在寻找的结果集。他们根据我们提供给他们的简短设计规范创建所有这些。他们可以在家里这样做,并且可以根据需要(在合理范围内)花费尽可能多的时间。
【讨论】:
我会给出一个写得很糟糕的查询,并询问他们将如何进行性能调整。
我想问一下集合论。如果不了解集合操作,就无法有效地查询关系数据库。
我会给他们一些游标示例,并询问他们将如何重写它们以使其基于集合。
如果工作涉及导入和导出,我会询问有关 SSIS(或其他数据库使用的其他工具)的问题。如果涉及编写报告,我想知道他们了解聚合和分组(以及 Crystal Reports 或 SSRS 或您使用的任何电子报告工具)。
我会问这三个查询的结果差异:
select a.field1
, a.field2
, b.field3
from table1 a
join table2 b
on a.id = b.id
where a.field5 = 'test'
and b.field3 = 1
select a.field1
, a.field2
, b.field3
from table1 a
left join table2 b
on a.id = b.id
where a.field5 = 'test'
and b.field3 = 1
select a.field1
, a.field2
, b.field3
from table1 a
left join table2 b
on a.id = b.id and b.field3 = 1
where a.field5 = 'test'
【讨论】:
和有什么区别 聚集索引和非聚集索引 索引?
我要问的另一个不针对特定服务器的问题是:
什么是死锁?
【讨论】:
知道不使用,为什么不使用:
SELECT *
【讨论】:
SELECT * 将阻止使用覆盖索引的高效索引操作?这是最重要的原因!
一个有趣的问题将涉及relational division,或者如何表达“for all”关系,这需要嵌套not exists 子句。
问题来自this link。
给定下表,代表可以驾驶飞机和机库中飞机的飞行员:
create table PilotSkills (
pilot_name char(15) not null,
plane_name char(15) not null
)
create table Hangar (
plane_name char(15) not null
)
选择可以驾驶机库中每架飞机的飞行员的名字。
答案:
select distinct pilot_name
from PilotSkills as ps1
where not exists (
select * from hangar
where not exists (
select * from PilotSkills as ps2 where
ps1.pilot_name = ps2.pilot_name and
ps2.plane_name = hangar.plane_name
)
)
或者……
选择所有已接受带有10 most popular programming languages 标记的问题的答案的堆栈溢出用户。
(可能的)答案(假设有一个Accepted_Answers 视图和一个带有所需标签的Target_Language_Tags 表):
select distinct u.user_name
from Users as u
join Accepted_Answers as a1 on u.user_id = a1.user_id
where not exists (
select * from Target_Language_Tags t
where not exists (
select *
from Accepted_Answers as a2
join Questions as q on a2.question_id = q.question_id
join Question_Tags as qt on qt.question_id = q.question_id
where
qt.tag_name = t.tag_name and
a1.user_id = a2.user_id
)
)
【讨论】:
当我们有一个复杂的应用程序使用经过适当优化的 ORM 并实现缓存系统(例如 memcached)时,为什么要雇用您?
这是一个严肃的问题,他们应该能够证明自己的存在。正如 Jeff Atwood 喜欢说的“Hardware is Cheap, Programmers are Expensive”
【讨论】:
比较和对比 sql/rdbms 解决方案和 nosql 解决方案之间的差异。在不了解与竞争对手相比的优势和劣势的情况下,您不能声称自己是任何技术的专家。
【讨论】:
举一个去规范化更可取的例子。
(我喜欢这个,因为人们从大学毕业后就想把所有东西都变成第三范式)
【讨论】:
作为开发人员,哪些数据库类型给您带来了更多的理解和调试麻烦? 预期的答案,恕我直言,使用不同日期/时间戳类型和 BLOB 遇到问题的经验。
什么时候使用位图索引比较方便?
【讨论】:
explain plan 做什么以及如何解释您从中获得的结果。
【讨论】:
还有以下特定于平台(SQL Server)的问题:
【讨论】:
该应用程序每天 24 小时都在使用。您的维护/更新窗口是每月 2 小时,您打算如何最大限度地减少中断?
【讨论】:
这里几乎提到了所有内容。我想分享一个数据库高级经理问我的问题。我发现这个问题很有趣,如果你深入思考它,它就会有很多意义。
问题是 - 你会如何向你 5 岁的孩子描述数据库?
【讨论】:
【讨论】:
【讨论】:
该区域会对数据库的性能和安全性产生巨大影响。搞错了,你可能会陷入痛苦的世界。
因为规则总是有例外:)
【讨论】:
“为什么每个 SELECT 都应该包含 DISTINCT ?”
【讨论】: