程序员必须清楚的 10 个高级 SQL 概念

分享7种SQL的进阶用法 推荐一款,每日有免费使用额度,支持PC、APP、VScode插件同步使用SQL(Structured Query Language)是一种强大的数据库查询和操作语言,它用于与关系数据库进行交互。随着数据的不断增长和应用需求的日益复杂,掌握SQL的进阶用法对于数据库管理员、数据分析师和后端开发人员等专业人士来说至关重要。本文将分享7种SQL的进阶用法,并提供实际的代码案例,帮助您提升数据库操作的效率和灵活性。 阅读详情

随着数据量持续增长,对合格数据专业人员的需求也会增长。具体而言,对SQL流利的专业人士的需求日益增长,而不仅仅是在初级层面。

因此,Stratascratch的创始人Nathan Rosidi以及我觉得我认为10个最重要和相关的中级到高级SQL概念。

那个说,我们走了!

1.常见表表达式(CTEs)


如果您想要查询子查询,那就是CTEs施展身手的时候 - CTEs基本上创建了一个临时表。

使用常用表表达式(CTEs)是模块化和分解代码的好方法,与您将文章分解为几个段落的方式相同。

请在Where子句中使用子查询进行以下查询。

SELECT 
 name,
 salary 
FROM
 People 
WHERE
 NAME IN ( SELECT DISTINCT NAME FROM population WHERE country = "Canada" AND city = "Toronto" ) 
 AND salary >= (
 SELECT
  AVG( salary ) 
 FROM
  salaries 
WHERE
 gender = "Female")


这似乎似乎难以理解,但如果在查询中有许多子查询,那么怎么样?这就是CTEs发挥作用的地方。

with toronto_ppl as (
   SELECT DISTINCT name
   FROM population
   WHERE country = "Canada"
         AND city = "Toronto"
)
, avg_female_salary as (
   SELECT AVG(salary) as avgSalary
   FROM salaries
   WHERE gender = "Female"
)
SELECT name
       , salary
FROM People
WHERE name in (SELECT DISTINCT FROM toronto_ppl)
      AND salary >= (SELECT avgSalary FROM avg_female_salary)


现在很清楚,Where子句是在多伦多的名称中过滤。如果您注意到,CTE很有用,因为您可以将代码分解为较小的块,但它们也很有用,因为它允许您为每个CTE分配变量名称(即toronto_ppl和avg_female_salary)

同样,CTEs允许您完成更高级的技术,如创建递归表。

2.递归CTEs.


递归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枢转数据


您很可能会看到许多要求在陈述时使用CASE WHEN的问题,这只是因为它是一种多功能的概念。如果要根据其他变量分配某个值或类,则允许您编写复杂的条件语句。

较少众所周知,它还允许您枢转数据。例如,如果您有一个月列,并且您希望为每个月创建一个单个列,则可以使用语句追溯数据的情况。

示例问题:编写SQL查询以重新格式化表,以便每个月有一个收入列。

Initial table:  
+------+---------+-------+  
| id   | revenue | month |  
+------+---------+-------+  
| 1    | 8000    | Jan   |  
| 2    | 9000    | Jan   |  
| 3    | 10000   | Feb   |  
| 1    | 7000    | Feb   |  
| 1    | 6000    | Mar   |  
+------+---------+-------+  

Result table:  
+------+-------------+-------------+-------------+-----+-----------+  
| id   | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |  
+------+-------------+-------------+-------------+-----+-----------+  
| 1    | 8000        | 7000        | 6000        | ... | null        |  
| 2    | 9000        | null        | null        | ... | null        |  
| 3    | null        | 10000       | null        | ... | null        |  
+------+-------------+-------------+-------------+-----+-----------+


5.EXCEPT vs NOT IN


除了几乎不相同的操作。它们都用来比较两个查询/表之间的行。所说,这两个人之间存在微妙的细微差别。

首先,除了过滤删除重复并返回不同的行与不在中的不同行。

同样,除了在查询/表中相同数量的列,其中不再与每个查询/表比较单个列。

6.自联结


一个SQL表自行连接自己。你可能会认为没有用,但你会感到惊讶的是这是多么常见。在许多现实生活中,数据存储在一个大型表中而不是许多较小的表中。在这种情况下,可能需要自我连接来解决独特的问题。

让我们来看看一个例子。

示例问题:给定下面的员工表,写出一个SQL查询,了解员工的工资,这些员工比其管理人员工资更多。对于上表来说,Joe是唯一一个比他的经理工资更多的员工。

+----+-------+--------+-----------+  
| Id | Name  | Salary | ManagerId |  
+----+-------+--------+-----------+  
| 1  | Joe   | 70000  | 3         |  
| 2  | Henry | 80000  | 4         |  
| 3  | Sam   | 60000  | NULL      |  
| 4  | Max   | 90000  | NULL      |  
+----+-------+--------+-----------+Answer:  
SELECT  
    a.Name as Employee  
FROM  
    Employee as a  
    JOIN Employee as b on a.ManagerID = b.Id  
WHERE a.Salary > b.Salary


7.Rank vs Dense Rank vs Row Number


它是一个非常常见的应用,对行和价值进行排名。以下是公司经常使用排名的一些例子:

  • 按购物,利润等数量排名最高值的客户
  • 排名销售数量的顶级产品
  • 以最大的销售排名顶级国家
  • 排名在观看的分钟数,不同观众的数量等观看的顶级视频。

在SQL中,您可以使用几种方式将“等级”分配给行,我们将使用示例进行探索。考虑以下Query和结果:

SELECT Name  
 , GPA  
 , ROW_NUMBER() OVER (ORDER BY GPA desc)  
 , RANK() OVER (ORDER BY GPA desc)  
 , DENSE_RANK() OVER (ORDER BY GPA desc)  
FROM student_grades


图片

 

ROW_NUMBER()返回每行开始的唯一编号。当存在关系时(例如,BOB vs Carrie),

ROW_NUMBER()如果未定义第二条标准,则任意分配数字。

Rank()返回从1开始的每行的唯一编号,除了有关系时,等级()将分配相同的数字。同样,差距将遵循重复的等级。

dense_rank()类似于等级(),除了重复等级后没有间隙。请注意,使用dense_rank(),Daniel排名第3,而不是第4位()。

8.计算Delta值


另一个常见应用程序是将不同时期的值进行比较。例如,本月和上个月的销售之间的三角洲是什么?或者本月和本月去年这个月是什么?

在将不同时段的值进行比较以计算Deltas时,这是Lead()和LAG()发挥作用时。

这是一些例子:

# Comparing each month's sales to last month  
SELECT month  
       , sales  
       , sales - LAG(sales, 1) OVER (ORDER BY month)  
FROM monthly_sales  
# Comparing each month's sales to the same month last year  
SELECT month  
       , sales  
       , sales - LAG(sales, 12) OVER (ORDER BY month)  
FROM monthly_sales


9.计算运行总数


如果你知道关于row_number()和lag()/ lead(),这可能对您来说可能不会惊喜。但如果你没有,这可能是最有用的窗口功能之一,特别是当您想要可视化增长!

使用具有SUM()的窗口函数,我们可以计算运行总数。请参阅下面的示例:

SELECT Month  
       , Revenue  
       , SUM(Revenue) OVER (ORDER BY Month) AS Cumulative  
FROM monthly_revenue

10.日期时间操纵

 
您应该肯定会期望某种涉及日期时间数据的SQL问题。例如,您可能需要将数据分组组或将可变格式从DD-MM-Yyyy转换为简单的月份。

您应该知道的一些功能是:

  • 提炼
  • 日元
  • date_add,date_sub.
  • date_trunc.

示例问题:给定天气表,写一个SQL查询,以查找与其上一个(昨天)日期相比的温度较高的所有日期的ID。

+---------+------------------+------------------+  
| Id(INT) | RecordDate(DATE) | Temperature(INT) |  
+---------+------------------+------------------+  
|       1 |       2015-01-01 |               10 |  
|       2 |       2015-01-02 |               25 |  
|       3 |       2015-01-03 |               20 |  
|       4 |       2015-01-04 |               30 |  
+---------+------------------+------------------+Answer:  
SELECT  
    a.Id  
FROM  
    Weather a,  
    Weather b  
WHERE  
    a.Temperature > b.Temperature  
    AND DATEDIFF(a.RecordDate, b.RecordDate) = 1


谢谢阅读!
就这样!我希望这有助于您在面试准备中 - 我相信,如果您知道这10个内部概念,那么在那里大多数SQL问题时,你会做得很好。祝你学习努力最好!
 

高级java程序员必读的10本书,快来看鸭 阿里巴巴Java 程序员常用的 10 款开源工具本文主要介绍了阿里巴巴Java程序员常用的一些基本和高级的工具。如果你是一个经验丰富的Java开发人员,你可能熟悉这些工具,但如果没有 10、Linux Linux最好从Linux命令行的基础知识入手。Linux是一个自由开放源代码的Unix操作系统,在你的职业生涯中起着重要的作用。 Java 程序员们,这20 道技术层面问题,加入新团队前必须考虑合作10. 团队中都有谁?负责哪方面的工作?通常软件团队都有几位工程师。有的时候,每个工程师负责的工作都不一 阅读详情

相关推荐

结构方程模型amos的操作与应用pdf_AMOS结构方程进行医学问卷量表分析教程(一阶简单路径效应分析)...

在生物医药的数据统计分析中,要研究量表和量表之间的关系时候,由于维度题项较多,而不再是单一的变量,因此我们要使用AMOS结构方程进行处理。​ 举个例子,比如对住院患者的相关研究,设置了患者在住院期间的适应性量表和自我效能的量表,想考察患者适应性与自我效能之间的影响关系,或者说适应性的强弱是否会影响到患者自我效能的高低。此时适应性量表和自我效能量表都不是单一的变量,而是有N个题项构成的...

weixin_39637614的博客 7710

SQL学习——进阶篇

窗口函数原则上只能写在select子句中,partition子句可以省略,省略就是不指定分组,但是,这就失去了窗口函数的功能,所以一般不要这么使用。,所以经常用来在每组内排名,同时具有分组(partition by)和排序(order by)的功能。,如排名问题:每个部门按业绩来排名;topN问题:找出每个部门排名前N的员工进行奖励。其中AxB 与 BxA 就是所谓的笛卡尔乘积,很明显AxB!:count(列名)会比count(1)快;:count(1)会比count(列名)快。**窗口函数功能: **

qq_49948651的博客 3380

LilyPad三色LED共阳极控制:从原理到Arduino编程实战

RGB LED作为可编程光源的核心组件,通过红、绿、蓝三原色的加色混合原理,能够生成丰富的色彩。其内部结构主要分为共阳极和共阴极两种类型,这决定了驱动电路的设计和编程逻辑。在电子织物和可穿戴设备领域,掌握RGB LED的控制技术对于实现动态光效和交互反馈至关重要。本文以LilyPad三色LED为例,深入解析其共阳极特性,并详细演示如何结合Arduino进行PWM编程,从而精准控制颜色与亮度,为智能服装、互动艺术装置等项目提供可靠的照明解决方案。

weixin_30237719的博客 607

高级SQL查询

返回查询的数据有多少条。

qq_52463861的博客 920

【Unity】Unity 跨平台及编译过程

早期的Unity跨平台是基于MONO运行时的,又通过CLS实现了跨语言。其基本思路是将各个版本的语言统一编译成CIL语言,在不同平台运行时使用CLR进行解释。有点类似于Java的jdk和jvm。 CLS(Common Language System)通用语言规范:CLS是一种规范,类似于schema,当文件被指定遵守CLS规范后,在某语言中写出不符合通用规范的代码后将被警告或报错。 MONO是一个开源工程,其中包含C#编译器,CLR运行时,以及一组类库。该工程常见了一系列符合ECMA标准的.NET工具,MO

一个普普通通的游戏开发者 7237

QComboBox设置最大显示数量多余的用滑动条,以及QComboBox::setMaxVisibleItems()不起作用的问题

QComoboBox是Qt封装的一个选择框的东西,但是我在使用过程中有一点感觉很不好,如图: 不论你往里面添加多少个它都会给你显示全部,甚至给你铺满全屏,后来看了官方文档发现有个setMaxVisibleItems()的方法,我欣喜若狂啊,终于特么的能解决了,但是,很遗憾,不知为啥,我设置上之后并没有起作用,依然会显示全部,后来搜了百度发现有个人是这样解决的 QComboBox *box = ne...

Aboveground的博客 4919

SQL高级查询详解:从基础到内外联表查询全面解析

本文全面深入地介绍了SQL(结构化查询语言)的高级查询技术,从基础查询到更复杂的查询操作,一步步引导读者掌握SQL查询的精髓。首先,文章通过创建和使用SQL表进行实例操作,为读者构建了一个清晰的SQL查询环境。之后,文章详细阐述了基础查询、条件查询、范围查询、判空查询、模糊查询、分页查询、排序查询、聚合查询以及分组查询等常用高级查询技术,同时借助实际代码示例进行详细演示,使理论知识与实践操作紧密结合。此外,文章还深入探讨了联表查询,包括内联、左联、右联和全联,并通过图像展示不同联表方式的概念。

Lion_Long的博客 2225

大陆毫米波雷达ARS408-21xx实战:从零搭建ROS环境下的目标检测与可视化

本文详细介绍了大陆毫米波雷达ARS408-21xx在ROS环境下的实战部署全流程。从硬件连接、CAN总线配置,到ROS驱动节点开发、CAN报文解析,再到RViz三维可视化实现,提供了完整的代码示例与调试技巧,帮助开发者快速搭建毫米波雷达目标检测与可视化系统。

open4的博客 633

sql进阶教程

SQL进阶教程

保持热爱,持续学习 4719

Snort源代码编译 _ 采坑之旅(for Windows VS2015)

    系统环境:Windows7 sp1 x64     编译环境:VS2015 SP1     Snort版本:2.9.12     daq版本:2.0.6     Snort官网:https://www.snort.org/downloads#snort-downloads 背景     最近需要实现一个类似网络防火墙的产品,主要参考Snort源码,先花了点时间简单读了下网上比较流行的《...

magictong的专栏 8888

uniapp - 解决App端报错reportJSException >>>> exception function:createInstanceContext, exception:white sc

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,uniApp报错,reportJSException>>>>exceptionfunction:createInstanceContext,exception:whitescreencausecreateinstanceContextfailed,运行自定义基座时白屏,uniapp项目运行白屏reportJSException,检查没问题依旧报错,第三方库插件,组件,uniapp打包调试

🏆 前端领域优质创作者 1万+

程序员必须清楚的 10 个高级 SQL 概念!

随着数据量持续增长,对合格数据专业人员的需求也会增长。具体而言,对SQL流利的专业人士的需求日益增长,而不仅仅是在初级层面。 因此,Stratascratch的创始人Nathan Rosidi以及我觉得我认为10个最重要和相关的中级到高级SQL概念。 那个说,我们走了! 1.常见表表达式(CTEs) 如果您想要查询子查询,那就是CTEs施展身手的时候 - CTEs基本上创建了一个临时表。 使用常用表表达式(CTEs)是模块化和分解代码的好方法,与您将文章分解为几个段落的方式相同。 请在Where子句中使用子

Java技术栈,分享最主流的Java技术 8379

CKS-CN考试之路----11

显然是alpine-b的镜像有libcrypto3-3.1.4-r5。新版本发布老版本会被回收,此时pod只剩下2个container。我们依次测试是哪个镜像里包含libcrypto3。可以看到alpine的pod有3个副本.

Q先生 652

程序员必须清楚的 10 个高级 SQL 概念(1)

如果您想了解有关临时函数的更多信息,请检查此项,但知道如何编写临时功能是重要的原因:它允许您将代码的块分解为较小的代码块它适用于写入清洁代码它可以防止重复,并允许您重用类似于使用Python中的函数的代码。考虑以下示例:ELSE “n/a”相反,您可以利用临时函数来捕获案例子句。ELSE “n/a”END通过临时函数,查询本身更简单,更可读,您可以重复使用资历函数4.使用CASE WHEN枢转数据。

2401_84004024的博客 676

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[转载]SAS程序员必备的十大技巧

SUGI27(2002)有一篇被广泛引用的文章,就两页纸,Doug Zirbel的10 Things Experienced SAS® Programmers Don’t Know – But Should[size=medium](“SAS程序员不知道但必须知道的10件事”),题目挺拉风,讲的是对有经验的SAS程序员的一次非正式调查,要他们列出SAS程序员需要的一些技巧。其实一共列出了22条,当...

slothful的博客 1352

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

初级、中级、高级程序员的区别在哪里?

低级程序员认为自己与高级程序员的区别, 主要是高级程序员任何功能都能编码实现, 编码速度快, 代码无bug。高级程序员认为他们之所以高级, 在于他们认识到代码 bug 是不可避免的, 有千万种理由可以导致 bug,但他们可以在设计和逻辑上保证(追求)滴水不漏,并用逻辑的百分之百准确性还减少代码 bug。那么到底初级、中级与高级程序员的区别究竟在哪里呢?初级程序员初级程序员就是传说中的码农,依靠复制...

deng707273的博客 3万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java 程序员常犯的 10 个 SQL 错误!

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

2401_84408845的博客 853

Java高级程序员面试笔试宝典

成为一名Java高级程序员需要坚实的基础知识、广泛的实践经验和不断学习的精神。这份Java高级程序员面试笔试宝典将帮助您全面准备高级职位的面试和笔试,展示您的技能和潜力,开启Java职业生涯的新篇章。祝您成功!

努力是为了站在万人之中,成为别人的光 1万+
上一篇: 面试官:GET 请求能上传图片吗?我蒙了。。
下一篇: 90后阿里P7晒出工资单:猛补了这个,真香...
Java领域指导者
博客等级 码龄7年 404粉丝 265原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值