SQL 碎碎念,你可能用不到但不能不知道的数据库技巧(1)

191 阅读2分钟

“ 本文正在参加「技术专题19期 漫谈数据库技术」活动

前言

作为一个程序员,时时刻刻都要忙碌于将实际业务转化为代码的繁忙工作中.你可能从事前端工作,展示漂亮的界面, 你是后端,可能按照业务逻辑疯狂封装着接口. 最终种种数据落地都要涉及到数据,

将CURD 到数据库中. 现在很多框架集成了多种SQL功能,但是逻辑复杂的业务仍然要使用原生SQL.

结合多年经验,百里这里列举出你可能未发现的SQL一些'用法'!!

大家好,这里是百里,SQL 碎碎念, 希望大家喜欢.

一 、 多表嵌套关系乱,修改起来'真'复杂

工作中会遇到非常多的多种业务相互嵌套,然后按照条件在修改某个表的数据, 然而传统的书,视频学习资料中,告诉的你就是

UPDATA 字段1 = 内容1 , 字段2 = 内容2 FROM 表 where 条件1 条件2

这样的内容. 对于新手来说肯定看到的一个头两个大 .

解决办法

创建临时表,将复杂的数据逻辑写入到临时表中,并将需要改的关联字段去重,设定好条件,

使用UPDATA 被修改表字段1 = 临时表内容1 , 被修改表2 = 临时表内容2 from 表1 inner join 临时表 on 关系1 = 关系2 where 条件1 条件2

例子:

假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price;另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段Price更新为Price表中价格字段的80%。 
在Mysql中我们有几种手段可以做到这一点,一种是update table1 t1, table2 ts ...的方式: ···

UPDATE product p 
INNER JOIN productPrice pp 
ON p.productId = pp.productId 
SET pp.price = pp.price * 0.8 
WHERE p.dateCreated < '2022-11-01' 

二、 数据增加‘真’麻烦,只能逐条INSERT ?

我们知道数据库中是有WHILE ,和游标的, 结合新增数据我们也是按照传中的insert (字段1,字段2..) into values(值1,值2...) ,循环逐条新增数据反倒麻烦, 可能对于很多高手来说这条可能觉得小题大做!但是百里当入手时,领导让我批量增加数据,我这还where 加条件判断呢....ε=(´ο`*)))唉究极黑历史 .

解决办法

在SQL 中 可以使用 ,INSERT INTO 表 select 值 ... from (表) where 条件1 的形式批量增加数据,前提要保证字段位置对的上.

例子

假定我们有3张表,

表A : 工号,姓名,性别,年龄. 表B : 工号,地址,电话, 这个时候有个接口需要自建立表C, 取工号,姓名,地址电话 其他字段. 这个时候就使用批量增加的方式, 减少代码量

insert into 表C from
select a.姓名 , b.地址,b.电话 fromA a inner join  表b on a.工号 = b.工号 where  条件...

三、 复杂数据真麻烦,转换格式‘真’头疼

工作中肯定会遇到各种奇葩数据,然后又需要你整理成领导想要的数据,其中最常规也是最头疼的就是,行列转换了. 比如这种

image.png

让你统计出 user ,no, type 对应的数量, 这时就很麻烦.

解决办法

#定义数据
declare @t table(usser int ,no int ,a int,b int, c int)  
insert into @t select 1,1,21,34,24  
union all select 1,2,42,25,16
#转换
SELECT usser,no,Type=attribute, Num=value  
FROM @t  
  UNPIVOT  
  (  
    value FOR attribute IN([a], [b], [c])  
  ) AS UPV
image.png

今天的不开心就到此为止吧, 明天依旧光芒万丈~ 这里是百里,如果我帮到您,谢谢点个赞~.

wallhaven-3z2jrd.png

“ 本文正在参加「技术专题19期 漫谈数据库技术」活动