当前位置:  开发笔记 > 后端 > 正文

什么是"高级"SQL?

如何解决《什么是"高级"SQL?》经验,为你挑选了5个好方法。

查看需要"高级SQL"的职位描述.我可以和任何人一起编写基本查询,并且在专业环境中使用MySQL数据库,但是如果我被录用,我将从这些工作中得到什么?高级SQL的示例是什么?我在SQL noob到SQL master的范围内的位置是什么?



1> OMG Ponies..:

基本


    SELECT从表中的列

    骨料第1部分:COUNT,SUM,MAX/MIN

    骨料第2部分:DISTINCT,GROUP BY,HAVING

中间


    JOINs,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,错误处理


伟大的名单... IMO - 99%的公司要求高级SQL技能想要的只是寻找中级w /一些数据建模.

2> mjv..:

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

我不同意评论和回复,表明理解JOIN和汇总查询是"高级"技能; 我担心,很多雇主会认为这是相当基本的.这是一个粗略的猜测,因为"高级"可能意味着什么.

在过去的几年里,RDBMS领域出现了一些"糟糕"的新东西!

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

CTE(通用表格表达式)

UDF(用户定义的函数)

全文搜索扩展/集成

使用新的分区方案,过滤的索引,稀疏列进行性能调整......)

新数据类型(例如:GIS /空间或分层)

XML支持/集成

LINQ

还有一些...(顺便说一句,上面的列表有点以MSSQL为中心,但在大多数其他DBMS平台中都观察到类似的演变).

虽然掌握新功能的专业(和缺点)是任何"高级SQL"从业者的重要任务,但旧的"高级基础"可能也被认为是"高级"的一部分:

触发器和存储过程

游标(何时使用,如何避免...)

设计专业知识:定义表格,索引内容,索引类型

性能调整一般的专业知识

查询优化(阅读查询计划,了解内在缓慢等等)

程序SQL

...

注意:以上内容侧重于与编程/主角相关的技能."高级SQL"还可以指具有管理角色的经验(复制,备份,硬件布局,用户管理......).来考虑一下,一个认真的程序员也应该对这种做法有点熟悉.

编辑:LuckyLindy发表评论,我发现很有见地.它表明,"高级"可能有效地具有与上述大多数类别中的公平专家级别不同的目的......
我在此重复此评论以使其更具可见性.

我认为很多公司都发布了高级SQL,因为他们已经厌倦了找一个说"我是SQL专家"并且无法整理3表外连接的人.我在招聘信息中发布了类似的内容,我的期望仅仅是候选人不需要经常来找我写SQL的帮助.(LuckyLindy评论)


我认为很多公司都发布了高级SQL,因为他们已经厌倦了找一个说"我是SQL专家"并且无法整理3表外连接的人.我在招聘信息中发布了类似的内容,我的期望仅仅是候选人不需要经常来找我写SQL的帮助.

3> Beep beep..:

我认为最好以一个例子突出显示.如果您觉得可以使用很少/没有参考资料快速编写以下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).


对您的查询的批评/评论:1.数据库设计:TourEndDate列应该使用12/31/9999这样的"无结束日期"值而不是NULL,因为必须添加"OR TourEndDate IS NULL"的性能影响.此OR可能会获得扫描而不是搜索.2.您的查询假定每个OrderDate每个员工不能有多个订单.这是在数据库中执行的吗?3. EmpTours可以重叠吗?如果是这样,则存在db设计问题.4.为什么OrderDate不能在TourStartDate之前出现?5.员工表应该在派生表之外.6.更多的想法,但没有空间......
没有什么能像现实生活中的例子那样傻笑.我想我可以写这样的东西,但只有很多试验和错误,并查找详细信息.

4> Joe..:

我希望:

存储过程的创建和使用

连接(内部和外部)以及如何正确使用GROUP BY

绩效评估/调整

了解查询中有效(和低效)的处理方式(了解某些事物如何影响性能,例如在WHERE子句中使用函数)

动态SQL和游标知识(和IMO几次应该使用它们)

理解架构设计,索引和参照完整性



5> dicroce..:

查看SQL For Smarties.我认为我也非常善于使用SQL,直到我读完那本书......深入探讨我在其他地方看不到的事情(IE第3和第4正常形式之间的区别,Boyce Codd Normal表格等)...

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有