分享10个高级sql写法

2023-12-19

分享10个高级sql写法

原创 waynaqua waynblog 2023-03-12 23:36 发表于湖北

本文主要介绍博主在以往开发过程中,对于不同业务所对应的 sql 写法进行归纳总结而来。进而分享给大家。

  • 本文所讲述 sql 语法都是基于 MySql 8.0

  • 博主github地址:http://github.com/wayn111  欢迎大家关注,点个star

一、ORDER BY FIELD() 自定义排序逻辑

MySql 中的排序 ORDER BY 除了可以用 ASC 和 DESC,还可以通过**ORDER BY FIELD(str,str1,...)**自定义字符串/数字来实现排序。这里用 order_diy 表举例,结构以及表数据展示:

图片

ORDER BY FIELD(str,str1,...) 自定义排序sql如下:

SELECT * from order_diy ORDER BY FIELD(title,'九阴真经', 
'降龙十八掌','九阴白骨爪','双手互博','桃花岛主',
'全真内功心法','蛤蟆功','销魂掌','灵白山少主');

查询结果如下:

图片

如上,我们设置自定义排序字段为 title 字段,然后将我们自定义的排序结果跟在 title 后面。

二、CASE 表达式

「case when then else end」 表达式功能非常强大可以帮助我们解决 if elseif else 这种问题,这里继续用 order_diy 表举例,假如我们想在 order_diy 表加一列 level 列,根据money 判断大于60就是高级,大于30就是中级,其余显示低级,sql 如下:

SELECT *, 
case when money > 60 then '高级' 
when money > 30 then '中级' 
else '低级' END level 
from order_diy;

查询结果:

图片

image.png

三、EXISTS 用法

我猜大家在日常开发中,应该都对关键词 exists 用的比较少,估计使用 in 查询偏多。这里给大家介绍一下 exists 用法,引用官网文档:

图片

可知 exists 后面是跟着一个子查询语句,它的作用是 「根据主查询的数据,每一行都放到子查询中做条件验证,根据验证结果(TRUE 或者 FALSE),TRUE的话该行数据就会保留」 ,下面用 emp 表和 dept 表进行举例,表结构以及数据展示:

图片

计入我们现在想找到 emp 表中 dept_name 与 dept表 中 dept_name 对应不上员工数据,sql 如下:

SELECT * from emp e where exists (
SELECT * from dept p where e.dept_id = p.dept_id 
and e.dept_name != p.dept_name
)

查询结果:

图片

我们通过 exists 语法将外层 emp 表全部数据 放到子查询中与一一与 dept 表全部数据进行比较,只要有一行记录返回true。画个图展示主查询所有记录与子查询交互如下:

图片

image.png

  • 第一条记录与子查询比较时,全部返回 false,所以第一行不展示。

  • 第二行记录与子查询比较时,发现 销售部门 与 dept 表第二行 销售部 对应不上,返回 true,所以主查询该行记录会返回。

  • 第二行以后记录执行结果同第一条。

四、GROUP_CONCAT(expr) 组连接函数

「GROUP_CONCAT(expr)」 组连接函数可以返回分组后指定字段的字符串连接形式,并且可以指定排序逻辑,以及连接字符串,默认为英文逗号连接。这里继续用 order_diy 表举例:sql 如下:

SELECT name, GROUP_CONCAT(title ORDER BY id desc  SEPARATOR '-') 
from order_diy GROUP BY name ORDER BY NULL;

查询结果:

图片

image.png

如上我们通过 「GROUP_CONCAT(title ORDER BY id desc SEPARATOR '-')」 语句,指定分组连接 title 字段并按照 id 排序,设置连接字符串为 -

五、自连接查询

自连接查询是 sql 语法里常用的一种写法,掌握了自连接的用法我们可以在 sql 层面轻松解决很多问题。这里用 tree 表举例,结构以及表数据展示:

图片

tree 表中通过 pid 字段与 id 字段进行父子关联,假如现在有一个需求,我们想按照父子层级将 tree 表数据转换成 一级职位 二级职位 三级职位 三个列名进行展示,sql 如下:

SELECT t1.job_name '一级职位', t2.job_name '二级职位', t3.job_name '三级职位' 
from tree t1 join tree t2 on t1.id = t2.pid left join tree t3 on t2.id = t3.pid 
where t1.pid = 0;

结果如下:

图片

我们通过 「tree t1 join tree t2 on t1.id = t2.pid」 自连接展示 一级职位 二级职位 ,再用 「left join tree t3 on t2.id = t3.pid」 自连接展示 二级职位 三级职位 ,最后通过 「where 条件 t1.pid = 0」 过滤掉非一级职位的展示,完成这个需求。

六、更新 emp 表和 dept 表关联数据

这里继续使用上文提到的 emp 表和 dept 表,数据如下:

图片

可以看到上述 emp 表中 jack 的部门名称与 dept 表实际不符合,现在我们想将 jack 的部门名称更新成 dept 表的正确数据,sql 如下:

update emp, dept set emp.dept_name = dept.dept_name
where emp.dept_id = dept.dept_id;

查询结果:

图片

我们可以直接关联 emp 表和 dept 表并设置关联条件,然后更新 emp 表的 dept_name 为 dept 表的 dept_name。

七、ORDER BY 空值 NULL 排序

ORDER BY 字句中可以跟我们要排序的字段名称,但是当字段中存在 null 值时,会对我们的排序结果造成影响。我们可以通过 「ORDER BY IF(ISNULL(title), 1, 0)」 语法将 null 值转换成0或1,来达到将 null 值放到前面还是后面进行排序的效果。

SELECT * FROM test_rollup ORDER BY  IF(ISNULL(title), 0, 1), money;

查询结果:

图片

image.png

八、with rollup 分组统计数据的基础上再进行统计汇总

MySql 中可以使用 with rollup 在分组统计数据的基础上再进行统计汇总,即用来得到 group by 的汇总信息。这里继续用order_diy 表举例,sql 如下:

SELECT name, SUM(money) as money 
FROM order_diy GROUP BY name WITH ROLLUP;

查询结果:

图片

可以看到通过 「GROUP BY name WITH ROLLUP」 语句,查询结果最后一列显示了分组统计的汇总结果。但是 name 字段最后显示为 null,我们可以通过 coalesce() 比较函数,返回第一个非空参数。

SELECT coalesce(name, '总金额') name, SUM(money) as money 
FROM order_diy GROUP BY name WITH ROLLUP;

查询结果:

图片

image.png

九、with as 提取临时表别名

with as 语法需要 MySql 8.0以上版本,它的作用主要是提取子查询,方便后续共用,更多情况下会用在数据分析的场景上。

如果一整句查询中 「多个子查询都需要使用同一个子查询」 的结果,那么就可以用with as,将共用的子查询提取出来,加个别名。后面查询语句可以直接用,对于大量复杂的SQL语句起到了很好的优化作用。这里继续用 order_diy 表举例,这里使用with as给出sql 如下:

-- 使用 with as
with t1 as (SELECT * from order_diy where money > 30),
t2 as (SELECT * from order_diy where money > 60)
SELECT * from t1 
where t1.id not in (SELECT id from  t2) and t1.name = '周伯通';

查询结果:

图片

这个 sql 查询了 order_diy 表中 money 大于30且小于等于60之间并且 name 是周伯通的记录。

10、存在就更新,不存在就插入

MySql 中通过 「on duplicate key update」 语法来实现存在就更新,不存在就插入的逻辑。插入或者更新时,它会根据表中主键索引或者唯一索引进行判断,如果主键索引或者唯一索引有冲突,就会执行 「on duplicate key update」 后面的赋值语句。这里通过 news 表举例,表结构和说数据展示,其中 news_code 字段有唯一索引:

图片

添加sql:

-- 第一次执行添加语句
INSERT INTO `news` (`news_title`, `news_auth`, `news_code`) 
VALUES ('新闻3', '小花', 'wx-0003') 
on duplicate key update news_title = '新闻3';
-- 第二次执行修改语句
INSERT INTO `news` (`news_title`, `news_auth`, `news_code`) 
VALUES ('新闻4', '小花', 'wx-0003') 
on duplicate key update news_title = '新闻4';

结果如下:

图片

image.png

总结

到这里,本文所分享的10个高级sql写法就全部介绍完了,希望对大家日常开发 sql 编写有所帮助,喜欢的朋友们可以点赞加关注????。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分享10个高级sql写法 的相关文章

  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 跨多个表进行搜索,并在结果行中显示表名称

    如何构建 SQL 语句以跨多个平面不相关的表运行 并使用选择结果和结果来自的表的名称显示结果 这种情况是这样的 我有几个表 每个表都有相同的列名 这是我从外部各方收到的数据 并将其存储在不同的表中 相同的表看起来像 Table 1 pid
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 计算运行总计时出错(之前期间的累计)

    我有一张桌子 我们称之为My Table有一个Created日期时间列 在 SQL Server 中 我试图提取一个报告 该报告显示历史上有多少行My Table按月在特定时间 现在我知道我可以显示有多少added每个月 SELECT YE
  • 执行带有 EXCEPTION 的 PostgreSQL 查询会导致两条不同的错误消息

    我有一个 PostgreSQL 查询 其中包含事务和列重复时的异常 BEGIN ALTER TABLE public cars ADD COLUMN top speed text EXCEPTION WHEN duplicate colum
  • 索引数量越少意味着插入、更新和删除速度更快? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 postgres 和 node js 在单个语句中执行多个查询

    我需要在像这样的单个语句中执行插入和删除查询 INSERT INTO COMPANY ID NAME VALUES 1 Paul DELETE FROM COMPANY WHERE ID 12 这是我用于执行查询的 node js 代码 p
  • 在 Oracle 行的多个列上使用透视

    我在 Oracle 表中有以下示例数据 tab1 我正在尝试将行转换为列 我知道如何在某一列上使用 Oracle 数据透视表 但是否可以将其应用于多个列 样本数据 Type weight height A 50 10 A 60 12 B 4
  • 优化 SQL Server 上的删除

    Deletesql server 上的有时很慢 我经常需要优化它们以减少所需的时间 我一直在谷歌上搜索一些关于如何做到这一点的提示 并且我发现了各种各样的建议 我想知道你最喜欢和最有效的驯服删除野兽的技术 以及它们如何以及为什么起作用 到目
  • 如何找到多个列中的最小值

    我在我的 DB 3 col 中有一个值 我想在所有这些值中找到一个值 如下所述 表名 MyTable id col1 col2 col3 1 200 300 400 2 100 150 300 3 800 102 20 4 80 80 0
  • 如何在 DB2 AS/400 中将小数字段转换为日期字段?

    我有一个 DECIMAL 字段 其中包含 AS400 格式的日期 1100614 我努力了 cast MYDATE as DATE 但我无法将 DECIMAL 转换为 DATE 而 DATE MYDATE 返回空值 如何将此字段转换为日期字
  • PostgreSQL 中“-”处或附近的语法错误

    我正在尝试运行查询来更新用户密码 alter user dell sys with password Pass 133 但因为 它给了我这样的错误 ERROR syntax error at or near LINE 1 alter use
  • SQL 查询用于计算每个客户的订单数量和总金额

    我有两张桌子Order与列 OrderID OrderDate CID EmployeeID And OrderItem与列 OrderID ItemID Quantity SalePrice 我需要返回客户 ID CID 每个客户的订单数
  • SQL Join 列上类似于另一列[重复]

    这个问题在这里已经有答案了 可能的重复 mysql连接查询使用like https stackoverflow com questions 1930809 mysql join query using like 我想要进行连接 其中一列包含
  • T-SQL:用最新的非空值替换 NULL 的最佳方法?

    假设我有这张表 id value 1 5 2 4 3 1 4 NULL 5 NULL 6 14 7 NULL 8 0 9 3 10 NULL 我想编写一个查询来替换任何NULL值与表中最后一个不为空的值在那一栏里 我想要这个结果 id va
  • 通过 osql.exe 运行脚本时出现问题

    我尝试以这种格式运行我的软件的更新脚本 osql exe i path to script U 用户 P 密码 S sqlserver 位置 d 数据库名称 n b 大多数脚本的格式相同 并且都以 GO 结尾 其中很多都运行得很好 但随机脚
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • JDBC插入实数数组

    我试图将一个真实的数组插入到 postgresql 数组中 该表的定义是 String sqlTable CREATE TABLE IF NOT EXISTS ccmBlock sampleId INTEGER block REAL 插入内
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • st_intersects 与 st_overlaps

    这两个查询有什么区别 select a gid sum length b the geom from polygons as a roads as b where st intersects a the geom b the geom gr

随机推荐

  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)更改应用图标

    鸿蒙 HarmonyOS 项目方舟框架 ArkUI 更改应用图标 一 操作环境 操作系统 Windows 10 专业版 IDE DevEco Studio 3 1 SDK HarmonyOS 3 1 二 更改图标 图标的位置 entry g
  • 在Java培训班如何进阶学习

    Java作为一门广泛应用的编程语言 学习者在Java培训班学习之后 如何进一步提升自己的技能水平是一个重要的问题 下面将介绍一些进阶学习的方法 帮助学习者更好地掌握Java编程技能 1 深入学习核心概念 在Java培训班学习过程中 学习者已
  • Adobe Reader等停止工作的原因不少,但可修复性很强

    这种情况是随机发生的 比如如果你在正常的状态下关闭了电脑 第二天打开Adobe Reader时可能就会出现这个错误 但别担心 在这篇文章中 我们将解释为什么Adobe Reader或Acrobat DC停止工作 以及我们如何解决这个问题 是
  • 【保姆级教程】使用tensorflow_hub的预训练模型实现神经风格迁移

    目录 一 神经风格迁移 二 安装依赖 三 实践 四 其他 一 神经风格迁移 神经风格迁移 是一种优化技术 主要将两个图像 内容 图像 和 风格
  • 企业数字化转型进入深海区:生成式AI时代下如何制定数据战略

    随着科技的不断进步 企业数字化转型已经不再是简单的概念 而是正在进入一个全新的深海区 在这个深海区 数据变得至关重要 而生成式人工智能 AI 的兴起更是推动了数字化转型的飞速发展 本文将探讨在这个生成式AI时代下 企业应如何制定有效的数据战
  • 探索关系:Python中的Statsmodels库进阶

    目录 写在开头 1 多元线性回归 场景介绍 2 Logistic回归 2 1 Logistic回归的概念 2 2 应用案例 2 2 1 建立模型和预测
  • 房屋坍塌预警监测特点,建设建筑结构监测安全系统

    近年来 随着城市化的快速发展 房屋建筑的数量不断增加 但同时也伴随着一些安全隐患 其中 房屋坍塌是其中一个重要的安全隐患 给人们的生命财产安全带来了巨大的威胁 因此 如何有效地监测和预警房屋坍塌成为了当前的重要课题 一 房屋坍塌预警监测系统
  • 基于生成式对抗网络的视频生成技术

    随着人工智能的快速发展 生成式对抗网络 GAN 作为一种强大的生成模型 已经在多个领域展现出了惊人的能力 其中 基于GAN的视频生成技术更是引起了广泛的关注 本文将介绍基于生成式对抗网络的视频生成技术的原理和应用 探索其对电影 游戏等领域带
  • Spring Boot整合Sharding-JDBC实现强制路由

    目录 强制路由 HintManager 强制分片 强制访问主库 强制路由 ShardingSphere使用ThreadLocal管理分片键值进行Hint强制路由 可以通过编程的方式向HintManager中添加分片值 该分片值仅在当前线程内
  • 如何有效预警城市内涝,内涝积水监测仪效果

    城市内涝一直都是一个比较严肃的问题 因为对于城市的基础设施和居民的日常生活来讲 都会产生双重的影响 还有可能会威胁着人们的生命财产安全 所以采用内涝积水监测仪有效预警城市内涝是一种先进的高科技手段 不仅可以达到实时监测路面积水的目的 还可以
  • 物联网数据采集网关在工厂数字化转型中的应用

    物联网数据采集网关能将各种传感器 执行器等设备连接在一起 通过收集 处理和传输来自各种物理设备的信息 实现数据的集成和分析 同时可通过云平台进行数据交互 它具有数据转换 数据处理 数据传输等功能 是工厂数字化转型的核心组件 随着科技的飞速发
  • 【EI会议征稿】第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024)

    第四届计算机网络安全与软件工程国际学术会议 CNSSE 2024 2024 4th International Conference on Computer Network Security and Software Engineering
  • 最新51单片机毕业设计项目集合

    文章目录 1前言 2 STM32 毕设课题 3 如何选题 3 1 不要给自己挖坑 3 2 难度把控 3 3 如何命名题目 4 最后 1前言 更新单片机嵌入式选题后 不少学弟学妹催学长更新STM32和C51选题系
  • PCL片段

    PCL 包含目录 D project PCL PCL 1 13 1 include pcl 1 13 pcl D project PCL PCL 1 13 1 3rdParty Boost include boost 1 82 D proj
  • 题解 | #输出某一年的各个月份的天数#

    三方寄过去了 告诉我停止24届招聘 全部毁约 牛的 he芯 毁约应届生 34316 广西北部湾银行2022年校园招聘 广西北部湾银行股份有限公司2022届校园招聘 看终端大把大把15级的 这个14级是不是终端bg的白菜了 程序员面试六战六捷
  • 【音视频 | AAC】AAC音频编码详解

    博客主页 https blog csdn net wkd 007 博客内容 嵌入式开发 Linux C语言 C 数据结构 音视频 本文内容 介绍AAC音频编码 金句分享 你不能选择最好的 但最好的会来选择你 泰戈尔 本文未经允许 不得转发
  • ResNet 原论文及原作者讲解

    ResNet 论文 摘要 1 引入 2 相关工作 残差表示 快捷连接
  • 分享64个JavaGame源码总有一个是你想要的

    分享64个JavaGame源码总有一个是你想要的 学习知识费力气 收集整理更不易 知识付费甚欢喜 为咱码农谋福利 游戏项目名称 链接 https pan baidu com s 1Q4VlNlOMJU2yzoNagAcaCA pwd 666
  • ubuntu 20.04 时区设置 时间同步设置

    ubuntu 20 04 时区设置 时间同步设置 Ubuntu开启NTP时间同步 https blog csdn net sorcererr article details 128675919 timedatectl status time
  • 分享10个高级sql写法

    分享10个高级sql写法 原创 waynaqua waynblog 2023 03 12 23 36 发表于湖北 本文主要介绍博主在以往开发过程中 对于不同业务所对应的 sql 写法进行归纳总结而来 进而分享给大家 本文所讲述 sql 语法