【问题标题】:What is "Advanced" SQL?什么是“高级”SQL?
【发布时间】:2010-01-13 03:14:06
【问题描述】:

查看需要“高级 SQL”的职位描述。我可以像任何人一样编写基本查询,并且在专业环境中使用过 MySQL 数据库,但是如果我被录用,我会从事这些工作吗?什么是高级 SQL 的例子?我在 SQL 新手到 SQL 大师的范围内处于什么位置?

【问题讨论】:

  • 你有没有问过任何发布这些职位描述的人他们是什么意思?我相信他们对他们正在寻找的技能有一个解释。他们说了什么?他们回答的哪一部分令人困惑?
  • 如果您了解联接和聚合,您会没事的。
  • 刚刚在 SO 上找到了这个相关问题:stackoverflow.com/questions/1178766/…
  • 根据您的“有时”声明,我猜您不会是他们想要的。但一定要打电话给他们讨论——不要解释你缺乏经验,只是了解更多关于职位的细节并表达你的热情。
  • 就我(个人)而言,联接和聚合是“基本”SQL 的一部分。

标签: sql database


【解决方案1】:

基础知识


  1. SELECTing 表中的列
  2. 聚合第 1 部分:COUNTSUMMAX/MIN
  3. 聚合第 2 部分:DISTINCTGROUP BYHAVING

中级


  1. JOINs,ANSI-89 和 ANSI-92 语法
  2. UNIONUNION ALL
  3. NULL 处理:COALESCE & 原生 NULL 处理
  4. 子查询:INEXISTS 和内联视图
  5. 子查询:相关
  6. WITH 语法:子查询分解/CTE
  7. 观看次数

高级主题


  • 函数、存储过程、包
  • 透视数据:CASE 和 PIVOT 语法
  • 分层查询
  • 游标:隐式和显式
  • 触发器
  • 动态 SQL
  • 实体化视图
  • 查询优化:索引
  • 查询优化:解释计划
  • 查询优化:分析
  • 数据建模:范式,1 到 3
  • 数据建模:主键和外键
  • 数据建模:表约束
  • 数据建模:链接/推论表
  • 全文检索
  • XML
  • 隔离级别
  • 实体关系图 (ERD),逻辑和物理
  • 事务:COMMITROLLBACK、错误处理

【讨论】:

  • 伟大的名单... IMO - 99% 的要求高级 SQL 技能的公司只是在寻找带有一些数据建模的中级。
  • 好名单。总是让我感到惊讶的是 UNION 经常被程序员忽视。当几个联合会简单得多时,人们似乎经常跳过复杂的箍来尝试组装多个表连接代码。
  • @Cruachan:我认为这主要是由于狭隘的视野和实践。 UNIONs 不需要像 JOIN 那样频繁。
  • 我会把这些高级主题放在中间。例如,带有 sp_executesql 的动态 SQL 恕我直言不是高级的,具有 2-5 年经验(中级)的人应该理解它,数据建模也是如此:主键和外键。我会在高级中添加参数嗅探以及理解恢复模型、如何真正批量加载数据、合并/循环/散列连接以及它们之间的区别、处理小数/浮点数等时的截断和舍入结果等
  • 我自己列出的此类项目会将更多此类项目归入较早的类别(高级到中级,中级到初学者)。我也可能会使用 Dreyfus 技能获取模型,并有 5 个类别而不是 3 个类别。我的列表也会更长,而不仅仅是列出技术特性,还包括概念和系统级项目。例如,知道搜索通常比扫描更好是基本的查询优化。知道设计违反了有用的范式以及如何修复它是中间查询优化。 ...等等。
【解决方案2】:

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

我不同意 cmets 和表示理解 JOIN 和聚合查询是“高级”技能的回答;恐怕许多雇主会认为这是相当基本的。以下是“高级”含义的粗略猜测。

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

“高级 SQL”要求可能暗示 知识和可能精通几个新概念,例如:

  • CTE(公用表表达式)
  • UDF(用户定义函数)
  • 全文搜索扩展/集成
  • 使用新的分区方案、过滤索引、稀疏列进行性能调整...)
  • 新的数据类型(例如:GIS/空间或分层)
  • XML 支持/集成
  • LINQ
  • 还有更多...(顺便说一句,上面的列表有点以 MSSQL 为中心,但在大多数其他 DBMS 平台中也观察到了类似的演变)。

虽然了解新功能的优缺点对于任何“高级 SQL”从业者来说都是一项重要任务,但旧的“高级基础”可能也被视为“高级”的一部分强>:

  • 触发器和存储过程
  • 游标(何时使用,如何避免......)
  • 设计专业知识:定义表、索引内容、索引类型
  • 一般性能调优专业知识
  • 查询优化(阅读查询计划,了解什么是本质上的慢等)
  • 过程 SQL
  • ...

注意:以上内容侧重于与编程/领导角色相关的技能。 “高级 SQL”也可以指具有管理角色(复制、备份、硬件布局、用户管理...)的经验。想想看,一个认真的程序员应该也对这种做法有些熟悉。

编辑:LuckyLindy 发表了一条我觉得很有见地的评论。它表明“高级”可能实际上有不同的目的,而不是在上面列出的大多数类别中暗示公平到专家的水平......
我在此处重复此评论以使其更具可见性。

我认为很多公司发布高级 SQL 是因为他们厌倦了让某人说“我是 SQL 专家”并且很难将 3 表外连接放在一起。我在招聘信息中发布了类似的内容,我的期望只是候选人不需要经常来找我帮助编写 SQL。(来自 LuckyLindy 的评论)

【讨论】:

  • LINQ 在那里看起来特别热,但可惜它对我们这些在 Linuxland 中的人不可用。 (AFIK)
  • 我喜欢这个区分不同类型“高级”的答案。
  • @DarenW,正如所表明的,这个列表有点以微软为中心。这说 LINQ 很容易通过 Mono 进入 Linux(不过我不能说太多,因为虽然我在这两个世界中工作,但在 Unix 中我不使用 Mono。
  • 我认为很多公司发布高级 SQL 是因为他们厌倦了让某人说“我是 SQL 专家”并且很难将 3 表外连接放在一起。我在职位发布中发布了类似的内容,我的期望只是候选人不需要经常来找我帮助编写 SQL。
  • @LuckyLindy。伟大的洞察力!这绝对是“高级”关键字的非常合理的用法!我非常喜欢你的评论,所以我把它添加到我的文字中! (当然,有适当的信用)。还对您自己的回复 +1,我刚刚注意到了...
【解决方案3】:

我认为最好用一个例子来强调它。如果你觉得你可以在很少/没有参考资料的情况下快速编写以下 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

(source of query)

老实说,这是一个相对简单的查询 - 只是一些内部连接和一个子查询,以及一些常见的关键字(max、min、case)。

【讨论】:

  • 没有什么比现实生活中的例子更令人目瞪口呆了。我想我可以写出这样的东西,但只能通过反复试验和查找细节。
  • 对您的查询的批评/cmets:1. 数据库设计:TourEndDate 列应该使用类似 12/31/9999 的“无结束日期”值而不是 NULL,因为必须添加性能影响“或 TourEndDate 为空”。这个 OR 可能会得到扫描而不是搜索。 2. 您的查询假定每个 OrderDate 每个员工不能有多个订单。这是在数据库中强制执行的吗? 3. EmpTours 可以重叠吗?如果是这样,则存在数据库设计问题。 4. 为什么 OrderDate 不能在 TourStartDate 之前? 5.雇员表应该在派生表之外。 6. 更多的想法,但没有空间......
【解决方案4】:

查看SQL For Smarties。我认为我对 SQL 也很擅长,直到我读了那本书……深入讨论了我在其他地方没见过的东西(即第 3 和第 4 范式之间的区别,Boyce Codd Normal形式等)...

【讨论】:

    【解决方案5】:

    我希望:

    • 存储过程的创建和使用
    • 联接(内部和外部)以及如何正确使用 GROUP BY
    • 性能评估/调整
    • 了解查询中高效(和低效)的处理方式(了解某些事情如何影响性能,例如在 WHERE 子句中使用函数)
    • 动态 SQL 和游标知识(以及 IMO 应该使用它们的几次)
    • 了解架构设计、索引和参照完整性

    【讨论】:

    • 我同意其中的一些观点,但根据我的经验,您列出的大部分内容实际上都被认为超出了高级水平。除了高级查询之外,性能调优和架构往往是独立的技能。
    • “超越高级”听起来很有趣。然而,鉴于我现有的知识水平和在一些个人项目上的实践,这些似乎都是我至少已经理解一半的概念,或者我可以相当容易地掌握。但也许真正的挑战在于如何明智地协调它们,以便在大型任务关键系统上工作?
    • @Daren:我说“超越高级”的原因是,在某些时候,你的技能组合会变得很大,以至于你会进入不同的角色和最低限度的特定技能。例如,性能调优要求您非常了解数据库引擎的内部结构。对于复杂的查询编写而言并非如此。模式设计要求您知道您正在建模的问题领域的专家......等等。
    • 我不确定存储过程是否应该在该列表中。诸如连接、分析、模式设计等都是“高级” SQL 程序员应该知道并准备好使用的东西,而对于存储过程是“好”还是“坏”仍未达成共识。
    • 除了关于存储过程的第 1 点和第 5 点以外,我都同意。通常,职位发布会明确说明 PL/SQL、存储过程或类似内容。在大公司,这些任务通常交给 DBA。
    【解决方案6】:

    一些“高级”功能

    • 递归查询
    • 窗口/排名函数
    • 旋转和取消旋转
    • 性能调优

    【讨论】:

    • +1 用于提及“递归查询”;自提出问题以来,这些年来仍然是唯一一次提及。
    【解决方案7】:

    当您在需求中看到它们的详细说明时,它们往往包括:

    • 观看次数
    • 存储过程
    • 用户定义函数
    • 触发器
    • 有时是光标

    内连接和外连接是必须的,但我很少在需求中看到它。令人惊讶的是,有多少所谓的 db 专业人员无法理解简单的外部连接。

    【讨论】:

    • 在我的阅读中,是的,显然很多处理数据库的软件开发人员都没有加入。有人为此编写好的教育材料的好机会!
    【解决方案8】:

    SELECT ... HAVING ... 是一个好的开始。似乎没有多少开发人员了解如何使用它。

    【讨论】:

    • 如“选择工作有(薪水> a_lot)和(sql_skill
    【解决方案9】:

    我想子查询和 PIVOT 以及多个联接、联合等都符合条件。

    【讨论】:

      【解决方案10】:

      性能调优、创建索引、存储过程等

      “高级”对每个人都有不同的含义。我想这种类型的东西对每张招聘海报都有不同的意义。

      【讨论】:

      • 是的,有时发帖者不知道 SQL 是什么,并认为高级 SQL 是他们从未使用过的 Microsoft Access 的某些功能。 ;-)
      【解决方案11】:

      在我之前的工作中,我们进行了一项技术测试,所有候选人都被要求参加。 10道题,大概用了一个小时。不过老实说,90% 的失败都可以被筛选掉,因为他们无法编写 INNER JOIN 语句。连外衣都没有。

      我认为这是任何涉及 SQL 的工作描述的先决条件,并且在掌握它之前会保持安静。不过,从那里与他们交谈 - 关于他们实际寻找的任何进一步信息,在最坏的情况下,将成为您职业发展的一部分需要学习的有用内容列表。

      【讨论】:

        猜你喜欢
        • 2020-10-09
        • 2013-05-09
        • 2010-12-24
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        • 2021-12-24
        相关资源
        最近更新 更多