什么是“高级”SQL?

看一下需要“高级SQL”的工作描述。 我可以写任何人的基本查询,也可以在专业环境中使用MySQL数据库,但是如果我被雇佣,我将如何处理这些工作? 什么是高级SQL的例子,我在哪里沿着SQL noob到SQL master的规模?

我认为这是最好的例子。 如果你觉得你可以用很less/没有参考材料快速写下面的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 

(查询来源)

说实话,这是一个相对简单的查询 – 只是一些内部连接和一个子查询,以及一些常见的关键字(最大,最小,大小写)。

基本


  1. 从表中SELECT
  2. 聚合第1部分: COUNTSUMMAX / MIN
  3. 聚合第2部分: DISTINCTGROUP BYHAVING

中间


  1. JOIN ,ANSI-89和ANSI-92语法
  2. UNION vs UNION ALL
  3. NULL处理: COALESCE和本机NULL处理
  4. 子查询: INEXISTS和inline视图
  5. 子查询:相关
  6. WITH语法:子查询分解/ CTE
  7. 查看

高级主题


  • 函数,存储过程,包
  • 旋转数据:CASE&PIVOT语法
  • 分层查询
  • 游标:隐式和显式
  • 触发器
  • dynamicSQL
  • 物化视图
  • 查询优化:索引
  • 查询优化:解释计划
  • 查询优化:分析
  • 数据build模:正常forms,1到3
  • 数据build模:主键和外键
  • 数据build模:表约束
  • 数据build模:链接/ Corrollary表
  • 全文search
  • XML
  • 隔离级别
  • 实体关系图(ERD),逻辑和物理
  • 事务: COMMITROLLBACK ,error handling

职位空缺的其余部分可以提供上下文,以提供更好的猜测"Advanced SQL"可能包含的内容。

我不同意评论和回应,表明理解JOIN和聚合查询是“高级”技能; 恐怕很多雇主会认为这是相当基本的。 这是“高级”可以表示的粗略猜测。

在过去的几年里,RDBMS领域出现了很多新东西!

“高级SQL”的要求可能暗示了一些新概念的知识和可能的熟练程度,例如:

  • CTE(公用表expression式)
  • UDF(用户定义的function)
  • 全文search扩展/整合
  • 性能调整与新的分区scheme,筛选索引,稀疏列…)
  • 新的数据types(例如:GIS /空间或分层)
  • XML支持/集成
  • LINQ
  • 还有一些…(顺便说一句,上面的列表有点以MSSQL为中心,但在大多数其他DBMS平台上也观察到类似的进化)。

对于任何“高级SQL”实践者而言,掌握新function的亲(和缺)是一项重要任务, 而旧的“先进基础”也可能被认为是“先进”的一部分

  • 触发器和存储过程
  • 游标(何时使用,如何避免…)
  • devise专长:定义表格,索引什么,索引types
  • 性能调优专业知识一般
  • 查询优化(阅读查询计划,知道什么是本质上缓慢等)
  • 程序SQL

注意:上述重点是与编程/主angular相关的技能。 “高级SQL”也可以指pipe理angular色的经验(复制,备份,硬件布局,用户pipe理…)。 想想看,一个认真的程序员也应该对这样的做法有些熟悉。

编辑 :LuckyLindy发表了一个评论,我发现很有见地。 这表明,“高级”可能实际上有一个不同的目的,而不是暗示在上面列出的大多数类别中公平对专家级别…
我在这里重复这个评论给它更多的知名度。

我认为很多公司发布了高级SQL,因为他们厌倦了让某个人说“我是一名SQL专家”,并且在拼凑一个3表外连接时遇到了麻烦。 我在招聘信息中发布类似的东西,我的期望是,一个候选人不需要经常来找我帮忙写SQL。 (评论由LuckyLindy)

我会期待:

  • 存储过程的创build和使用
  • 连接(内部和外部)以及如何正确使用GROUP BY
  • 性能评估/调优
  • 了解有效(低效)的查询方式(了解某些事情会如何影响性能,例如在WHERE子句中使用函数)
  • dynamicSQL和游标的知识(和IMO应该使用它的几次)
  • 理解模式devise,索引和参照完整性

查看SQL Smarties 。 我认为我对SQL也很好,直到我读了这本书…深入了解了很多,谈论了我在其他地方还没有看到的东西(IE区别于三分之一和四分之一的正常forms,Boyce Codd Normal表格等)…

一些“高级”function

  • recursion查询
  • 开窗/排名function
  • 枢轴和不透明
  • 性能调整

SELECT ... HAVING ...是一个好的开始。 并不是很多开发者似乎都明白如何使用它。

我认为子查询和PIVOT将有资格,以及多个联接,工会等。

性能调优,创build索引,存储过程等

“高级”意味着每个人都有所不同。 我可以想象这种types的事情对每一份招聘工作都有不同的意义。

当你看到他们的要求拼写,他们往往包括:

  • 查看
  • 存储过程
  • 用户定义的函数
  • 触发器
  • 有时光标

内部和外部连接是必须的,但我很less见到它在要求中提到。 而令人惊讶的是,有多less所谓的db专业人员不能在一个简单的外部联接中find自己的头脑。

在我以前的工作中,我们进行了技术testing,所有候选人都被要求参加。 10个问题,花了大约一个小时。 尽pipe如此,90%的失败可能会被筛选出来,因为他们无法编写INNER JOIN语句。 甚至不是一个外层。

我认为这是涉及SQL的任何工作描述的先决条件,并且在被掌握之前会一直保持独立。 从那里,与他们交谈 – 任何进一步的信息,他们真正在寻找什么,最坏的情况下,作为你的专业发展的一部分,要学习的东西有用的清单。

“高级SQL”是一个矛盾的术语。