SQL练习(6/81)

目录

1.寻找连续值

方法一:使用自连接(Self-Join)

方法二:使用窗口函数(Window Functions)

2.寻找有重复的值

 GROUP BY子句

HAVING子句

常用聚合函数:

3.找不存在某属性的值

not in

not exist

性能比较

使用场景


1.寻找连续值

方法一:使用自连接(Self-Join)

select distinct l1.num as ConsecutiveNums
from logs l1
join logs l2 on l1.id = l2.id - 1 and l1.num = l2.num
join logs l3 on l2.id = l3.id - 1 and l2.num = l3.num
  1. 自连接(Self-Join)

    • 自连接是指将同一张表连接到自身。通过为同一张表赋予不同的别名(如l1l2l3),可以将表中的行与其他行进行比较。

    • 在这个例子中,l1l2l3分别代表logs表中的不同行,通过id的偏移量来确定它们之间的顺序关系。

  2. 连接条件(Join Conditions)

    • l1.id = l2.id - 1:表示l2idl1id大1,即l2l1的下一行。

    • l1.num = l2.num:表示l1l2num值相同。

    • l2.id = l3.id - 1:表示l3idl2id大1,即l3l2的下一行。

    • l2.num = l3.num:表示l2l3num值相同。

    • 通过这些条件,确保了l1l2l3是连续的三行,并且它们的num值相同。

  3. DISTINCT关键字

    • DISTINCT用于去除结果中的重复行,确保输出的ConsecutiveNums是唯一的。

方法二:使用窗口函数(Window Functions)

select distinct num as ConsecutiveNums
from (select num,LAG(num,1) over(order by id ASC) as pre1,LAG(num,2) over(order by id ASC) as pre2,LEAD(num,1) over(order by id ASC) as post1,LEAD(num,2) over(order by id ASC) as post2from logs
) AS subquery
where (pre2 = pre1 and pre1 = num)or (pre1 = num and num = post1)or (num = post1 and post1 = post2)
  1. 窗口函数(Window Functions)

    • 窗口函数允许在结果集中对每一行进行计算,同时考虑其他行的值。LAGLEAD是两种常用的窗口函数。

    • LAG(num,1) over(order by id ASC) as pre1:获取当前行的前一行的num值。

    • LAG(num,2) over(order by id ASC) as pre2:获取当前行的前两行的num值。

    • LEAD(num,1) over(order by id ASC) as post1:获取当前行的下一行的num值。

    • LEAD(num,2) over(order by id ASC) as post2:获取当前行的下两行的num值。

  2. 子查询(Subquery)

    • 子查询用于生成一个临时表(subquery),其中包含了原始表中的num值以及通过窗口函数计算出的前后行的num值。

  3. WHERE子句

    • WHERE子句用于筛选出满足连续三次相同数字的行:

      • (pre2 = pre1 and pre1 = num):当前行的num值与其前两行的num值相同。

      • (pre1 = num and num = post1):当前行的num值与其前一行和下一行的num值相同。

      • (num = post1 and post1 = post2):当前行的num值与其下一行和下两行的num值相同。

  4. DISTINCT关键字

    • DISTINCT用于去除结果中的重复行,确保输出的ConsecutiveNums是唯一的。

180. 连续出现的数字 - 力扣(LeetCode)



2.寻找有重复的值

SELECT DISTINCT email AS Email
FROM Person
GROUP BY email
HAVING COUNT(email) > 1;
 GROUP BY子句
  • GROUP BY email

    • GROUP BY用于将结果集按一个或多个列分组。这里按email列分组,将具有相同email值的行归为一组。

    • 分组后,每个email值只会出现一次,便于后续的聚合操作。

HAVING子句
  • HAVING COUNT(email) > 1

    • HAVING用于对分组后的结果进行筛选,类似于WHERE子句,但HAVING用于筛选分组后的聚合结果。

    • COUNT(email):计算每个分组中的行数,即每个email值出现的次数。

    • HAVING COUNT(email) > 1:筛选出出现次数大于1的email值,即找出重复的email

常用聚合函数:
  1. COUNT:计算某个列中非NULL值的数量,或使用COUNT(*)计算表中的总行数。

  2. SUM:计算数值列的总和,仅适用于数值类型的列。

  3. AVG:计算数值列的平均值,仅适用于数值类型的列。

  4. MAX:找出某个列中的最大值,适用于数值列或字符串列。

  5. MIN:找出某个列中的最小值,适用于数值列或字符串列。

  6. COUNT(DISTINCT):计算某个列中唯一值的数量,通过DISTINCT去除重复值后计数。

  7. SUM(DISTINCT):计算某个列中唯一值的总和,通过DISTINCT去除重复值后求和。

  8. AVG(DISTINCT):计算某个列中唯一值的平均值,通过DISTINCT去除重复值后求平均。

  9. GROUP_CONCAT:将同一组中的值连接成一个字符串,可通过SEPARATOR指定分隔符。

  10. STDDEV:计算数值列的标准差,用于衡量数据的离散程度。

  11. VAR:计算数值列的方差,用于衡量数据的离散程度。

  12. BIT_AND:计算一组值的按位与,用于位运算。

  13. BIT_OR:计算一组值的按位或,用于位运算。

  14. BIT_XOR:计算一组值的按位异或,用于位运算。

3.找不存在某属性的值

not in

select name as Customers
from Customers
where Customers.id not in (select customerId from Orders
)
  • 定义

    • NOT IN 用于检查某个值是否不在一个子查询或值列表中。

  • 语法

    SELECT column_name
    FROM table_name
    WHERE column_name NOT IN (subquery | value_list);
  • 特点

    • 子查询NOT IN 后面可以跟一个子查询,返回一个值列表。

    • 值列表:也可以直接跟一个具体的值列表。

    • 性能:在某些情况下,NOT IN 的性能可能不如 NOT EXISTS,尤其是在子查询返回大量数据时。

    • 空值处理:如果子查询返回的列表中包含 NULLNOT IN 会返回空结果集,因为 NULL 与任何值的比较结果都是 UNKNOWN

not exist

SELECT name AS Customers
FROM Customers c
WHERE NOT EXISTS (SELECT 1FROM Orders oWHERE o.customerId = c.id
);
  • 定义

    • NOT EXISTS 用于检查某个子查询是否不返回任何行。

  • 语法

    SELECT column_name
    FROM table_name
    WHERE NOT EXISTS (subquery);
  • 特点

    • 子查询NOT EXISTS 后面必须跟一个子查询。

    • 性能:通常比 NOT IN 更高效,尤其是在处理大量数据时。NOT EXISTS 会在找到第一个匹配的行时停止进一步检查,而 NOT IN 会检查整个子查询结果。

    • 空值处理NOT EXISTS 不受 NULL 值的影响,因为它只关心子查询是否返回行,而不是具体的值。

性能比较

  • NOT IN

    • 适用于子查询返回的值列表较小的情况。

    • 如果子查询返回大量数据,性能可能会下降。

    • NULL 值敏感,可能导致意外结果。

  • NOT EXISTS

    • 通常更高效,尤其是在处理大量数据时。

    • 不受 NULL 值的影响。

    • 逻辑上更清晰,尤其是在涉及多表连接时。

使用场景

  • NOT IN

    • 适用于简单的值列表检查。

    • 适用于子查询返回的值列表较小的情况。

  • NOT EXISTS

    • 适用于复杂的子查询,尤其是涉及多表连接的情况。

    • 适用于需要高效处理大量数据的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【流程控制结构】

流程控制结构 流程控制结构1、顺序结构2、选择结构if基本选择结构if else语法多重if语法嵌套if语法switch选择结构 3、循环结构循环结构while循环结构程序调试for循环跳转语句区别 流程控制结构 1、顺序结构 流程图 优先级 2、选择结构 if基本选择结构 单if 语法 if&…

【机器人】复现 UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025

UniGoal的提出了一个通用的零样本目标导航框架,能够统一处理多种类型的导航任务。 支持 对象类别导航、实例图像目标导航和文本目标导航,而无需针对特定任务进行训练或微调。 本文分享UniGoal复现和模型推理的过程~ 查找沙发,模…

python + flask 做一个图床

1. 起因, 目的: 对这个网站:https://img.vdoerig.com/ , 我也想实现这种效果。做一个简单的图床,后面,可以结合到其他项目中。 2. 先看效果 实际效果。 3. 过程: Grok 聊天: https://img.vdoerig.co…

Java生产环境设限参数教学

哈哈,这个问题问得好!咱们用开餐厅的比喻来理解生产环境的四大必须设限参数,保证你听完再也不会忘!(搓手手) 1. 堆内存上限:-Xmx(厨房的最大容量) 问题:想象…

电脑出故障驱动装不上?试试驱动人生的远程服务支持

在日常工作或学习中,驱动问题时常成为电脑用户的一大困扰。尤其是在更换硬件、重装系统、驱动冲突等情况下,许多用户往往手足无措,不知道从何下手。而“驱动人生”作为国内领先的驱动管理工具,一直以高效、便捷、智能著称。现在&a…

JS手写代码篇---手写 instanceof 方法

2、手写 instanceof 方法 instancecof用于检测一个对象是否是某个构造函数的实例。它通常用于检查对象的类型,尤其是在处理继承关系时。 eg: const arr [1,2,3,4,5]console.log(arr instanceof Array); // trueconsole.log(arr instanceof Object); // true那这是…

使用exceljs将excel文件转化为html预览最佳实践(完整源码)

前言 在企业应用中,我们时常会遇到需要上传并展示 Excel 文件的需求,以实现文件内容的在线预览。经过一番探索与尝试,笔者最终借助 exceljs 这一库成功实现了该功能。本文将以 Vue 3 为例,演示如何实现该功能,代码示例…

PMP-第十二章 项目采购管理

项目采购管理核心概念 项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程项目组织既可以是买方(甲方) ,也可以是卖方(乙 方)项目采购管理过程围绕协议来进行,协议是买卖双方之间具…

maven和npm区别是什么

这是一个很容易搞糊涂新手的问题,反正我刚开始从课堂的知识转向项目网站开发时,被这些问题弄得晕头转向,摸不着头脑,学的糊里糊涂,所以,写了这么久代码,也总结一下,为后来者传授下经…

Leetcode76覆盖最小子串

覆盖最小子串 代码来自b站左程云 class Solution {public String minWindow(String str, String tar) {char[] s str.toCharArray();char[] t tar.toCharArray();int[] cnt new int[256];for (char cha : t) { cnt[cha]--;}int len Integer.MAX_VALUE;int debt t.length…

Linux du 命令终极指南:从基础到精通

文章目录 Linux du 命令终极指南:从基础到精通du 命令简介常用参数详解常见用法示例查看当前目录总大小查看当前目录及其子目录占用空间只显示当前目录总占用空间查看目录下每个文件和子目录的大小查看某目录深度为 1 的大小分布查看某目录并排除日志文件查看多个目…

sychronized原理(嚼碎了喂版)

先说一下心得吧,我们知道硬软不分家,在学习底层原理的时候我们不需要死扣到底,没必要把硬件方面全吃透,点到为止,学到能够帮助理解代码即可,我们的目标是写出高性能的代码,而不是创造出硬软一体…

Ngrok 配置:实现 Uniapp 前后端项目内网穿透

文章目录 一、下载并安装 ngrok二、配置 ngrok Authtoken三、启动本地 uniapp 项目四、使用 ngrok 暴露本地服务五、通过公网 URL 访问项目六、后端API项目的穿透问题排查 (uni-app 后端 API 示例)交互流程图示 七、ngrok Web 界面 (本地监控)八、停止 ngrok总结 ngrok 是一款…

k8s灰度发布

基于 Traefik 的加权灰度发布-腾讯云开发者社区-腾讯云 Traefik | Traefik | v1.7 Releases traefik/traefik GitHub 从上面连接下载后上传到harbor虚拟机 vagrant upload /C/Users/HP280/Downloads/traefik 下载配置文件 wget -c http://raw.githubusercontent.com/conta…

win10-django项目与mysql的基本增删改查

以下都是在win10系统下,django项目的orm框架对本地mysql的表的操作 models.py----->即表对应的类所在的位置 在表里新增数据 1.引入表对应的在models.py中的类class 2.在views.py中使用函数:类名.objects.create(字段名值,字段名"值"。。。…

`ParameterizedType` 和 `TypeVariable` 的区别

在 Java 的泛型系统中,ParameterizedType 和 TypeVariable 是两个不同的类型表示,它们都属于 java.lang.reflect.Type 接口的子接口。两者都在反射(Reflection)中用于描述泛型信息,但用途和含义不同。 🌟 一…

PR-2021

推荐深蓝学院的《深度神经网络加速:cuDNN 与 TensorRT》,课程面向就业,细致讲解CUDA运算的理论支撑与实践,学完可以系统化掌握CUDA基础编程知识以及TensorRT实战,并且能够利用GPU开发高性能、高并发的软件系统&#xf…

unity使用ZXing.Net生成二维码

下载链接 https://github.com/micjahn/ZXing.Net 放到Plugins下即可使用

Ubuntu 编译SRS和ZLMediaKit用于视频推拉流

SRS实现视频的rtmp webrtc推流 ZLMediaKit编译生成MediaServer实现rtsp推流 SRS指定某个固定网卡,修改程序后重新编译 打开SRS-4.0.0/trunk/src/app/srs_app_rtc_server.cpp,在 232 行后面添加: ZLMediaKit编译后文件存放在ZLMediakit/rele…

如何备考GRE?

1.引言 GRE和雅思不太相同,首先GRE是美国人的考试,思维方式和很多细节和英系雅思不一样。所以底层逻辑上我觉得有点区别。 难度方面,我感觉GRE不容易考低分,但考高分较难。雅思就不一样了不仅上限难突破,下限还容易6…