查看需要"高级SQL"的职位描述.我可以和任何人一起编写基本查询,并且在专业环境中使用MySQL数据库,但是如果我被录用,我将从这些工作中得到什么?高级SQL的示例是什么?我在SQL noob到SQL master的范围内的位置是什么?
SELECT
从表中的列
骨料第1部分:COUNT
,SUM
,MAX
/MIN
骨料第2部分:DISTINCT
,GROUP BY
,HAVING
JOIN
s,ANSI-89和ANSI-92语法
UNION
VS UNION ALL
NULL
处理:COALESCE
&Native NULL处理
子查询:IN
,EXISTS
,和内嵌的意见
子查询:相关
WITH
语法:子查询Factoring/CTE
查看
功能,存储过程,包
透视数据:CASE和PIVOT语法
分层查询
游标:隐式和显式
触发器
动态SQL
物化观点
查询优化:索引
查询优化:解释计划
查询优化:分析
数据建模:普通表格,1到3
数据建模:主键和外键
数据建模:表约束
数据建模:链接/索引表
全文搜索
XML
隔离级别
实体关系图(ERD),逻辑和物理
交易方式:COMMIT
,ROLLBACK
,错误处理
职位空缺列表的其余部分可以提供背景,以便更好地猜测"Advanced SQL"
可能包含的内容.
我不同意评论和回复,表明理解JOIN和汇总查询是"高级"技能; 我担心,很多雇主会认为这是相当基本的.这是一个粗略的猜测,因为"高级"可能意味着什么.
在过去的几年里,RDBMS领域出现了一些"糟糕"的新东西!
"高级SQL"要求可能暗示了一些新概念的知识和可能的熟练程度,例如:
CTE(通用表格表达式)
UDF(用户定义的函数)
全文搜索扩展/集成
使用新的分区方案,过滤的索引,稀疏列进行性能调整......)
新数据类型(例如:GIS /空间或分层)
XML支持/集成
LINQ
还有一些...(顺便说一句,上面的列表有点以MSSQL为中心,但在大多数其他DBMS平台中都观察到类似的演变).
虽然掌握新功能的专业(和缺点)是任何"高级SQL"从业者的重要任务,但旧的"高级基础"可能也被认为是"高级"的一部分:
触发器和存储过程
游标(何时使用,如何避免...)
设计专业知识:定义表格,索引内容,索引类型
性能调整一般的专业知识
查询优化(阅读查询计划,了解内在缓慢等等)
程序SQL
...
注意:以上内容侧重于与编程/主角相关的技能."高级SQL"还可以指具有管理角色的经验(复制,备份,硬件布局,用户管理......).来考虑一下,一个认真的程序员也应该对这种做法有点熟悉.
编辑:LuckyLindy发表评论,我发现很有见地.它表明,"高级"可能有效地具有与上述大多数类别中的公平专家级别不同的目的......
我在此重复此评论以使其更具可见性.
我认为很多公司都发布了高级SQL,因为他们已经厌倦了找一个说"我是SQL专家"并且无法整理3表外连接的人.我在招聘信息中发布了类似的内容,我的期望仅仅是候选人不需要经常来找我写SQL的帮助.(LuckyLindy评论)
我认为最好以一个例子突出显示.如果您觉得可以使用很少/没有参考资料快速编写以下SQL语句,那么我猜您可能满足其高级SQL要求:
DECLARE @date DATETIME SELECT @date = '10/31/09' SELECT t1.EmpName, t1.Region, t1.TourStartDate, t1.TourEndDate, t1.FOrdDate, FOrdType = MAX(CASE WHEN o.OrderDate = t1.FOrdDate THEN o.OrderType ELSE NULL END), FOrdTotal = MAX(CASE WHEN o.OrderDate = t1.FOrdDate THEN o.OrderTotal ELSE NULL END), t1.LOrdDate, LOrdType = MAX(CASE WHEN o.OrderDate = t1.LOrdDate THEN o.OrderType ELSE NULL END), LOrdTotal = MAX(CASE WHEN o.OrderDate = t1.LOrdDate THEN o.OrderTotal ELSE NULL END) FROM (--Derived table t1 returns the tourdates, and the order dates SELECT e.EmpId, e.EmpName, et.Region, et.TourStartDate, et.TourEndDate, FOrdDate = MIN(o.OrderDate), LOrdDate = MAX(o.OrderDate) FROM #Employees e INNER JOIN #EmpTours et ON e.EmpId = et.EmpId INNER JOIN #Orders o ON e.EmpId = o.EmpId WHERE et.TourStartDate <= @date AND (et.TourEndDate > = @date OR et.TourEndDate IS NULL) AND o.OrderDate BETWEEN et.TourStartDate AND @date GROUP BY e.EmpId,e.EmpName,et.Region,et.TourStartDate,et.TourEndDate ) t1 INNER JOIN #Orders o ON t1.EmpId = o.EmpId AND (t1.FOrdDate = o.OrderDate OR t1.LOrdDate = o.OrderDate) GROUP BY t1.EmpName,t1.Region,t1.TourStartDate,t1.TourEndDate,t1.FOrdDate,t1.LOrdDate
(查询来源)
说实话,这是一个相对简单的查询 - 只是一些内连接和一个子查询,以及一些常见的关键字(max,min,case).
我希望:
存储过程的创建和使用
连接(内部和外部)以及如何正确使用GROUP BY
绩效评估/调整
了解查询中有效(和低效)的处理方式(了解某些事物如何影响性能,例如在WHERE子句中使用函数)
动态SQL和游标知识(和IMO几次应该使用它们)
理解架构设计,索引和参照完整性
查看SQL For Smarties.我认为我也非常善于使用SQL,直到我读完那本书......深入探讨我在其他地方看不到的事情(IE第3和第4正常形式之间的区别,Boyce Codd Normal表格等)...