我正在阅读每个出色的.Net开发人员都应该能回答的问题,并对这个问题的内容和方法印象深刻,所以本着同样的精神,我提出了这个针对数据库/SQL开发人员的问题。
你认为一个好的数据库/SQL程序员应该能够回答哪些问题?
我正在阅读每个出色的.Net开发人员都应该能回答的问题,并对这个问题的内容和方法印象深刻,所以本着同样的精神,我提出了这个针对数据库/SQL开发人员的问题。
你认为一个好的数据库/SQL程序员应该能够回答哪些问题?
不同类型的JOIN:
请参阅Jeff Atwood的JOIN可视化解释
什么是索引,它如何帮助你的数据库?
有哪些可用的数据类型,什么时候使用哪些?
这是我在这里的答案再版,作为涵盖主题的通用指南。
COUNT
, SUM
, MAX
/MIN
DISTINCT
, GROUP BY
, HAVING
JOIN
: ANSI-89和ANSI-92语法UNION
vs UNION ALL
NULL
处理: COALESCE
和本地NULL处理IN
, EXISTS
, 和内联视图WITH
语法: 子查询分解/CTE以下是几个问题:
什么是SQL注入,如何预防?
什么是光标,何时使用它(或不使用),为什么?
我会提供一些糟糕的查询语句,并询问他们如何进行性能调优。
我会询问关于集合论的问题。如果你不理解集合操作,就无法有效地查询关系型数据库。
我会给他们一些游标示例,并询问他们如何重写这些示例以使它们基于集合。
如果工作涉及导入和导出,我会询问有关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'
在我们公司,我们不会问很多任何一个记忆好的人都能回答的SQL问题,而是创建了一个SQL开发者测试。该测试旨在让候选人设计一个具有规范化和RI考虑因素、检查约束等的可靠模式,并能够创建一些查询来生成我们所需的结果集。他们根据我们给他们的简要设计规范来完成所有这些工作。他们被允许在家里完成这项任务,并在合理范围内需要多少时间就可以用多少时间。
聚集索引和非聚集索引有什么区别?
另一个我想问的问题不针对特定服务器:
死锁是什么?
不要使用的原因及原因:
SELECT *
select *
是完全有效的。一些开发人员在这种情况下使用 select 1
,但是关系型数据库管理系统将同样进行优化。因此,select 1
是一种初步(且错误)的优化方式。 - Jordãonot exists
子句。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种编程语言的问题中接受了答案的堆栈溢出用户。
(假设有一个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
)
)