专栏名称: 数据分析与开发
伯乐在线旗下账号,分享数据库相关技术文章、教程和工具,另外还包括数据库相关的工作。偶尔也谈谈程序员人生 :)
目录
相关文章推荐
51好读  ›  专栏  ›  数据分析与开发

说下 10 个高级的 SQL 查询技巧

数据分析与开发  · 公众号  · 数据库  · 2024-08-14 11:50

主要观点总结

本文介绍了SQL中的10个重要和相关的中级到高级概念,包括常见表表达式(CTEs)、递归CTEs、临时函数、使用CASE WHEN枢转数据、EXCEPT与NOT IN、自联结、Rank vs Dense Rank vs Row Number、计算Delta值、计算运行总数、日期时间操纵等。

关键观点总结

关键观点1: 常见表表达式(CTEs)

使用常见表表达式(CTEs)是模块化和分解代码的好方法。CTEs允许您完成更高级的技术,如创建递归表。

关键观点2: 递归CTEs

递归CTE是引用自己的CTE,尤其适用于查询组织结构图、文件系统、网页链接图等的分层数据。

关键观点3: 临时函数

临时函数允许您将代码的块分解为较小的代码块,适用于写入清洁代码,并防止重复。

关键观点4: 使用CASE WHEN枢转数据

CASE WHEN不仅用于分配某个值或类,还可以用于枢转数据,例如将每月收入转化为单独的列。

关键观点5: EXCEPT与NOT IN

这两个操作用于比较两个查询/表之间的行,但存在微妙的差别。

关键观点6: 自联结

一个SQL表可以通过自行连接自己来解决特定问题,比如查找员工的工资高于其管理人员的员工。

关键观点7: Rank vs Dense Rank vs Row Number

这些功能用于对行和价值进行排名,例如顶级客户、产品、国家等。

关键观点8: 计算Delta值

使用Lead和Lag函数比较不同时期的值以计算Deltas。

关键观点9: 计算运行总数

使用具有SUM的窗口函数可以计算运行总数。

关键观点10: 日期时间操纵

涉及日期时间数据的SQL问题很常见,例如将数据分组或将日期格式从DD-MM-Yyyy转换为YYYY-MM-DD。


正文

请到「今天看啥」查看全文


递归CTE是引用自己的CTE,就像Python中的递归函数一样。递归CTE尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。

递归CTE有3个部分:

  • 锚构件:返回CTE的基本结果的初始查询
  • 递归成员:引用CTE的递归查询。这是所有与锚构件的联盟
  • 停止递归构件的终止条件

以下是获取每个员工ID的管理器ID的递归CTE的示例:

with org_structure as (
    SELECT id
         , manager_id
    FROM staff_members
    WHERE manager_id IS NULL
    UNION ALL
    SELECT sm.id
         , sm.manager_id
    FROM staff_members sm
             INNER JOIN org_structure os
                        ON os.id = sm.manager_id


3.临时函数

如果您想了解有关临时函数的更多信息,请检查此项,但知道如何编写临时功能是重要的原因:

  • 它允许您将代码的块分解为较小的代码块
  • 它适用于写入清洁代码
  • 它可以防止重复,并允许您重用类似于使用Python中的函数的代码。

考虑以下示例:

SELECT name
     , CASE WHEN tenure < 1 THEN "analyst"
            WHEN tenure BETWEEN 1 and 3 THEN "associate"
            WHEN tenure BETWEEN 3 and 5 THEN "senior"
            WHEN tenure > 5 THEN "vp"
            ELSE "n/a"
        END AS seniority
FROM employees

相反,您可以利用临时函数来捕获案例子句。

CREATE TEMPORARY FUNCTION get_seniority(tenure INT64) AS (
   CASE WHEN tenure < 1 THEN "analyst"
        WHEN tenure BETWEEN 1 and 3 THEN "associate"
        WHEN tenure BETWEEN 3 and 5 THEN "senior"
        WHEN tenure > 5 THEN "vp"
        ELSE "n/a"
   END
);
SELECT name
     , get_seniority(tenure) as seniority
FROM employees

通过临时函数,查询本身更简单,更可读,您可以重复使用资历函数!


4.使用CASE WHEN枢转数据







请到「今天看啥」查看全文