在工作中常用到的SQL

实际工作中常用sql积累及总结 实际工作中sql积累与总结。包括事物,游标,存储过程,行转列,递归树,递归查找所有的子节点,递归查找所有的父节点,数据库备份与还原,分布式查询,批量更新,合并记录,动态sql... 立即下载

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

最近在公司做了几张报表,还记得刚开始要做报表的时候都快把SQL给忘光了(当时在广州休假了1个月多,在实习期间也没咋写过SQL),回到公司的第一个需求就是做报表。

于是我很不要脸地跟带我的学长说:“SQL我好像忘光了,group 分组查询好像都忘得差不多了,我得复习一下”。

这篇文章来记录一下我曾经忘掉的group查询、join查询等一些比较实用/常用的SQL

  • 本文主打通俗易懂,不涵盖任何优化(适合新手观看)

一、回顾group 查询

group查询就是分组查询,为什么要分组查询?因为我们想按某个维度进行统计。下面来看个图:

现在我的数据如下

比如说,我想知道:每天Java3y这个公众号的点击量是多少。按我们人工而言,思路很简单:把相同的天数以及公众号名称为Java3y的数据找出来,再将每个点击量相加,就得出了结果了。

步骤

用上SQL我们可能会这样写:

select name,time,sum(pv) as pv  
from xxx_table 
where name = 'Java3y' group by name,time

1.1 group 查询可能存在的误解

记得有一天,有个群友在群上问了一个问题:

群里边的一个问题

其实他的需求很简单:检索出数据分组后时间最高的记录。但他是这样干的:

  1. 把先按照时间 order by
  2. 对order by后的记录进行分组

示例图:

群里面的一个图

1.2 造成这个误解的可能原因

有的工具可以支持这种的写法:

select * from xxx_table group by name

这种写法没有被禁止,并可以得出结果,比如得到的结果是:

Java4y    20  7月15号
Java3y    30  7月15号

这种写法其实是不合理的,要知道的是:使用group by分组统计之后,我们的select 后面只能跟着group by 的字段,或者是聚合函数。

group by规则

因为,我们对数据进行了分组查询,数据的分布情况,我们是不关心的。

记住:先分组,后统计(先把数据归类后,再对相同的数据进行统计)

1.3 group查询最常用的SQL

去重是我们经常会遇到的问题,打个比方说,由于各种原因(不管是业务上还是说是脏数据),现在我有两条重复的数据(除了ID,其余的字段都是相同的):

重复的数据

我这边只希望留下某一条记录作为查询结果就好了,我们可以写下以下的SQL:

select * from user where id in(
   select min(id) from user where name = 'Java3y' and pv = 20 and time='7-25' group by name,pv,time;
)

上面这条SQL是非常非常实用的,除了我说的去重以外,其实我们可以再”思考“一下:

  • 上面已经说了,使用group by分组统计之后,我们的select 后面只能跟着group by 的字段,或者是聚合函数。
  • 很多时候我们group by了以后,还想要查询结果中包含group by之外的字段(一般情况下,我们都不可能将group by 涵盖所有的字段),我们就可以上面那样,将查询后的结果作为子查询,放在外部查询的where 子句后,这样外部查询是可以select 出其他字段的。

(SQL写得比较少的朋友可能没什么感触啊,但我希望上面那种写法大家能够记住,以后一定会遇到类似的情况的)

二、回顾join查询

join查询不知道大家在刚学的时候是怎么理解的,反正我当初好像就挺迷迷糊糊的。我觉得join查询可以简单理解成这样:我想要的查询结果,一张表搞不掂,那我就join另一张表

比如说,现在我有两张的表:

第一张表

第二张表

现在我想知道在7月25号时:每个公众号的点击量、公众号名称、号主名称、公众号的创建日期

  • 显然,我们会发现一张表搞不掂啊,某些数据要依赖于另一张表才能把数据"完整"展示出来

那join其实就是把两张表合起来的一个操作:

join其实就是一个合并的操作

两张表合并起来以后我们就会发现,这张“大表”就含有这两张表的所有字段啦,那我想要什么都有了!

值得注意的是:在join的时候,会产生笛卡尔积(至于什么是笛卡尔积我这里就不说了,反正我们要记住的是join表时一定要写关联条件去除笛卡尔积)

另外,left join和right join也是我们经常用到,如果我们单纯写join关键字,那会被当成是inner join 。下面我简单解释一下:

  • 上面说了,在join的时候一定要写关联条件,如果是inner join的话,只有符合关联条件的数据才会存在最大表中
  • 如果是left join的话,即便关联条件不符合,左边表的数据一定会存在大表中
  • 如果是right join的话,即便关联条件不符合,右边表的数据一定会存在大表中

看下面的图:

join

此时我们的两张表关联的条件是“公众号” :如果是inner join,那么最后我们的表只有两条记录。如果是left join ,那么最后我们的表有三条数据。如果是right join,那么我们最后的表只有两条数据

三、回顾case when

SQL中的case when then else end用法其实跟我们程序语言中的if-else很是类似,在写SQL的时候也常常会用到。

我用得比较多的语法如下:

CASE WHEN sex = '1' THEN '男'
         WHEN sex = '2' THEN '女'
ELSE '其他' END   

在when后面可以跟多个表达式,比如说:

CASE WHEN sex = '1' and name ='Java3y' THEN '男'
         WHEN sex = '2' and name ='Java4y' THEN '女'
ELSE '其他' END   

如果要为case when表达式取别名,在end 关键字后边直接加就好了

更多用法详情参考:

四、一些常用的函数

4.1 hive和presto解析json

我这边会有这种情况:将json数据存到MySQL上。我去网上搜了一下以及问了同事,为什么要将json存到MySQL的字段上时,他们的答复都差不多:

  • 在MySQL存json数据,这样方便扩展啊。如果那些字段不需要用到索引,改动比较频繁,你又不想改动表的结构,那可以存json。
  • ps:在MySQL 5.7版本以后支持json类型

参考资料:

我这边做报表一般来hive或presto上搞的,所以解析json的也是在那上面。

hive解析json函数:

get_json_object(param1,'$.param2')

-- 如果是数组
get_json_object(xjson,'$.[0].param2')

presto 对json的处理函数:

 -- 数组  (去除第index个json)
 json_array_get(xjson,index) 
 
 -- 单个jsoin对象
 json_extract(xjson,'$.param2')

参考资料:

4.2 时间函数

昨天/近7天/本月按照这种指标来查询也是非常常见的:

昨天

SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1

7天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)

近30天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)

本月

SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )

上一月

SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1


在presto中使用时间格式,需要明确写出关键字timestamp,比如:

select supplier,count(id) 
from xxx_table 
where sendtime >= timestamp '2019-06-01' 

参考资料:

4.3 其他常用的函数

这里我简单整理一下我最近用过函数:

length  --计算字符串长度
concat  --连接两个字符串
substring -- 截取字符串
count   -- 统计数量
max   -- 最大
min   -- 最小
sum   -- 合计
floor/ceil  --...数学函数

再来分享一下最近遇到的一个需求,现在有的数据如下:

【Java3y简单】快乐学习
【Java3y简单】快乐学习渣渣
【Java3y通俗易懂】简单学
【Java3y通俗易懂】简单学芭芭拉
【Java3y平易近人】无聊学
【Java3y初学者】枯燥学
【Java3y初学者】枯燥学呱呱
【Java3y大数据】欣慰学
【Java3y学习】巴拉巴拉学
【Java3y学习】巴拉巴拉学哈哈
【Java3y好】雨女无瓜学

现在我统计出【】括号里边出现的频次,比如说:Java3y通俗易懂出现的频次是多少。当时一直都没想到好的思路,都快要搜“SQL 正则表达式 快速入门”了,请教了一下同事,同事很快就写出来了:

select substring_index(left(title , INSTR(title , '】') -1 ) , '【',-1) 
FROM `xxx_table`

哇~,awesome

最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,关注即可获取!

转发到朋友圈是对我最大的支持!

觉得我的文章写得不错,点赞!

Tesseract-Ocr踩坑下载以及进行检验 1 OCR,即Optical Character Recognition:光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程。下载完成后进行解压找到这两个,然后复制到之前下载Tesseract-Ocr的tessdata文件下。可能会出现报错说chi下载的问题咱们不用管继续ok让它先下载完毕,后续会有下载chi的步骤。四、检验tesseract使用(将以下图片进行下载我这里将以下图片命名为3.png)我这里选的是2024年的版本如果下载不了;4 在安装的时候(找到下载的exe文件,双击) 阅读详情

相关推荐

MODNet模型轻量化实战:从PyTorch到NCNN移动端部署,模型缩小75%性能不减

本文详细介绍了MODNet模型轻量化实战,从PyTorch到NCNN移动端部署的全过程。通过量化压缩和推理优化,模型体积缩小75%的同时保持性能不减,在千元级安卓设备上实现25FPS的实时人像抠图。文章深入解析MODNet架构、PyTorch到ONNX转换的陷阱与解决方案,以及NCNN量化部署的极致优化实践,为移动端实时人像抠图提供了技术突破与工程实现。

weixin_29098117的博客 296

left join、right join左、右外连接的用法及理解

select *from Table_1 select *from table_5 select a.NAME,b.kk from Table_1 a left join table_5 b on a.ID=1 /* 1、查询table_1表中ok这个列的值和table_5表中kk这个值、表后面的a.b是别名、只是没用as表达 2、left join on是'左外连接'、是以左表为主、就是left join前面的table_1这...

水亦流人必上的博客 1617

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4660

会SQL语句能帮你找到哪些工作?看看这些必须会SQL的职业

SQL语句是一种用于操作关系型数据库的语言,它可以让你对数据进行增删改查、排序、分组、聚合、连接等操作。如果你会SQL语句,你就可以从海量的数据中提取出有价值的信息,为各种业务场景提供支持。那么学会SQL语句,你可以从事哪些职业呢?下面小编来介绍几个常见的需要会SQL语句的职业,并且说明他们的工作内容、技能要求和发展前景。数据库开发工程师是专门负责编写SQL代码的人员,他们需要掌握数据库的基本原理和设计方法,以及不同类型的数据库系统(如MySQL、Oracle、SQL Server等)的特点和优化技巧。

wly55690的博客 5222

GNSS数据资源全解析:从DCB到BSX文件的下载与应用指南

本文系统解析了GNSS数据处理所需的核心数据资源,包括DCB、BSX、SP3、CLK等关键文件的官方下载路径与应用方法。详细介绍了CDDIS、武汉大学镜像站等权威数据源,并提供了从数据下载到实际应用的完整指南,帮助用户高效获取GNSS数据,提升精密定位处理效率。

weixin_29246195的博客 141

RK3568(buildroot)利用squashfs+overlay实现嵌入式系统高可靠存储方案

本文详细介绍了在RK3568嵌入式平台上,基于Buildroot系统,利用squashfs只读根文件系统与overlayfs可写层相结合的高可靠存储方案。该方案能有效防止设备意外断电导致的系统文件损坏,通过内核配置、启动脚本编写及镜像制作,实现系统核心的只读保护与用户数据的持久化分离,显著提升嵌入式设备的现场稳定性。

weixin_29189381的博客 548

JSON_EXTRACT JSON_UNQUOTE以及json数组下标选择

大前提5.7版本+ 本文只为扫盲 以及关于json串数组下表的选择方法 太过详细的用法可参照官方文档(写时没打开mysql.com…所以待贴详细地址)或其他博客 测试表结构 内容 首先是JSON_UNQUOTE函数 望文生义 就是去掉引号的功能 将原json串的引号去掉转成string类型 然后来说下JSON_EXTRACT函数 根据键查对象 SELECT JSON_EXTRACT(conte...

快乐小咸鱼007的博客 1万+

【Unity3D渲染】Unity3d实现Photoshop的各种图层混合模式

Adobe Photoshop图层混合原理、Unity ShaderLab图层混合实现

a310989583的专栏 2435

工作中,我们经常用到哪些SQL语句呢?

工作中我们基本上每天都要与数据库打交道,数据库的知识点呢也特别多,全部记住呢也是不可能的,也没必要把所有的记住(有些语句命令可能我们一辈子都用不到)。 所以呢在工作之余,把工作中经常用到的一些语句整理出来,忘记的时候可以当做字典来查。 个人在工作中用Oracle数据库比较多,就以关系型数据库Oracle为例进行整理,后面可能会整理一些非关系型数据库,如mogodb之类的。 如果你觉得有所价值可以参考。如果有不全或者错误的也欢迎大家指正。 一、DDL部分(create、drop、alte...

再小的帆也能远航,把分享变成一种习惯 1415

高通8155源码下载与Android源码编译

一.下载代码 高通下载源码位置: Qualcomm CreatePoint 注册账号,然后登入 可以先选择edit -> infotainment -> sa8155 -> favorites, 点击View TOC就可以过滤出sa8155所有的信息目录.如下图 拉取代码链接在ChipCode中,点击进去可以看到所有的基线版本,选择你需要下载的版本点进去,如sa8155p-la-1-0_ap_standard_oem,把高通专有代码和开源代码都下载到本机. 1..

Johnny2004的专栏 7675

高通GAIA V3命令参考手册的研读学习(15):自定制命令的详细工作描述

里的示例一样,手机APP发出这个GetManuFacturer的命令发0x0000,那么耳机回复:0x8000, 同时在回复的playload部分,用最多15个字节的ACSII码来表达制造商信息(因此最多15个字母)。那么这个APP在通过GAIA协议控制这个耳机时,不仅可以通过前面讲过的vendor ID来识别,也可以更进一步通过这个命令来识别这个耳机,到底是不是本公司的。通过这个可变长度的playload,真的是可以传达极多的事先约定的信息,相当的灵活,真是不错!这个命令用来得到设备的制造商信息。

qq_37191547的博客 398

在工作中常用的sql语句

这个是我以前在工作中常用的一些SQL语句,里面大部分都是从其他网站上找的,只有部分是自己在工作中解决问题事记录的,现在一起贴出来跟大家分享下,其实很多时候看看别人的经验总结和技术的理解,会使自己少走很多弯路。 1.监控事例的等待:  select event,sum(decode(wait_time,0,0,1)) prev, sum(decode(wait_time,0,1,0)) cu...

weixin_30294709的博客 74

OpenMM | PDBFixer 用于蛋白质预处理

PDBFixer 用于蛋白质预处理

DrugOne 3006

中casewhen的用法_在工作中常用到的SQL

这篇文章来记录一下我曾经忘掉的group查询、join查询等一些比较实用/常用的SQL本文主打通俗易懂,不涵盖任何优化(适合新手观看)一、回顾group 查询group查询就是分组查询,为什么要分组查询?因为我们想按某个维度进行统计。下面来看个图:现在我的数据如下比如说,我想知道:每天Java3y这个公众号的点击量是多少。按我们人工而言,思路很简单:把相同的天数以及公众号名称为Java3y的数据找...

weixin_29688227的博客 812

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

在工作中PostgreSQL常用的SQL命令

在工作中PostgreSQL常用的SQL命令。

a_beiyo的博客 1482

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: 在工作中常用到的SQL
下一篇: 记一次愚蠢的操作--线程安全问题
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值