首页 > 数据库 >SQL进阶技巧:如何利用if语句简化where或join中的条件 | if条件语句的优雅使用方法

SQL进阶技巧:如何利用if语句简化where或join中的条件 | if条件语句的优雅使用方法

时间:2024-09-24 09:20:59浏览次数:3  
标签:语句 purchase join age info user SQL id select

目录

0 问题场景

1 数据准备

2 问题分析

2.1 需求一

2.2需求二

3 小结

想要进一步了解SQL这门艺术语言的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。

专栏 原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。

数字化建设通关指南


0 问题场景

有两张表,一张用户下单表user_purchase(用户ID粒度)包含用户ID、订单ID和下单消耗金额和一张用户维表user_info包含用户ID、用户年龄和用户是否实名认证。

user_purchase

user_info

需求一

  • 我想取出所有认证过的用户,如果用户没有认证过,就取出年龄大于18岁的用户

需求二

  • 在user_purchase的基础上加上用户年龄字段,但是user_purchase中存在用户ID大量为null的情况,和user_info关联的话会产生数据倾斜,需要做一下倾斜处理

1 数据准备

create table user_purchase as 
(

  select stack(
  
  4,
  1001,1,20,
  1002,2,10,
  1003,3,40,
  null,4,40
  
  ) as(user_id,order_id,amount)

);

create table user_info as 
(

  select stack(
  
  3,
  1001,25,1,
  1002,30,1,
  1003,18,0
  
  ) as(user_id,age,is_certified)

);

2 问题分析

2.1 需求一

  • 一般写法:可以按照是否认证过分成两个条件用或逻辑取出想要的数据

select
    *
from user_info
where is_certified=1 or (is_certified=0 and age > 18)
  •  优雅写法

使用if函数:如果认证过所有数据记录都是满足条件的,如果没有认证过要继续判断一下年龄是否满足大于18岁。这种写法更加易读简洁

select
    user_id
    ,age
    ,is_certified
from user_info
where if(is_certified=1, 1=1, age > 18) 

2.2需求二

  • 一般写法:在关联之前提前处理user_purchase中的user_id的null

select
    a.user_id
    ,a.order_id
    ,a.amount
    ,b.age
from
  (
    select
        if(user_id is null, concat('user_', FLOOR(100 * RAND())), user_id) as user_id_process
        ,user_id
        ,order_id
        ,amount
    from user_purchase
  ) a
left join
  (
    select
        user_id
        ,age
        ,is_certified
    from user_info
  ) b on a.user_id_process=b.user_id
  • 优雅写法 

使用if函数:在关联的时候对user_purchase中为null的user_id做处理

select
    a.user_id
    ,a.order_id
    ,a.amount
    ,b.age
from
  (
    select
        user_id
        ,order_id
        ,amount
    from user_purchase
  ) a
left join
  (
    select
        user_id
        ,age
        ,is_certified
    from user_info
  ) b on if(a.user_id is null, concat('user_', FLOOR(100 * RAND())), a.user_id)=b.user_id

3 小结

数仓开发中if函数是最最常用的函数之一,我们一般都是在select之后或者聚合函数中高频使用,在其他关键字后面使用较少。特定场景在where和join条件中使用if函数,还是相当优雅的

想要进一步了解SQL这门艺术语言的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。

专栏 原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。
 

数字化建设通关指南

主要内容:


(1)SQL进阶实战技巧

可以参考如下教程,具体链接如下

SQL很简单,可你却写不好?也许这才是SQL最好的教程


 

上面链接中的文章及技巧会不定期更新。

(2)数仓建模实战技巧和个人心得

       1)新人入职新公司后应如何快速了解业务?

       2)以业务视角看宽表化建设?

       3)  维度建模 or 关系型建模?

       4)业务模型与数据模型有什么区别?业务阶段的模型该如何建设?

       5)业务指标体系该如何建设?指标体系该如何维护?指标平台应如何建设?指标体系                           该由谁来搭建?

       6)如何优雅设计DWS层?DWS层模型好坏该如何评价?

       7)指标发生异常,该如何排查?应从哪些方面入手寻找问题点?

       8) 数据架构的选择,mpp or hadoop?

       9)数仓团队应如何体现自己的业务价值,讲好数据故事?

       10)BI与大数据有什么关系?BI与信息化、数字化之间有什么关系?BI与报表之间的关                          系?

       11)数据部门如何与业务部门沟通,并规划指引业务需求?

文章不限于以上内容,有新的想法也会及时更新到该专栏。

具体专栏链接如下:

数字化建设通关指南_莫叫石榴姐的博客-CSDN博客

标签:语句,purchase,join,age,info,user,SQL,id,select
From: https://blog.csdn.net/godlovedaniel/article/details/142468407

相关文章

  • MySQL主从复制中启用GTID(全局事务标识符)模式
    在MySQL中启用GTID(全局事务标识符)模式进行主从复制涉及几个步骤。GTID为每个事务赋予一个唯一的标识符,从而简化了复制过程和故障恢复。以下是启用GTID模式的基本步骤:首先确保两台数据库目前数据保持一致1.准备工作确保您使用的MySQL版本支持GTID。GTID从MySQL5.6版本开始支持......
  • 无法使用我的 pip 安装 mysql-connector
    我正在尝试使用pip安装mysql连接器,但它一直向我显示此错误:连接被'ProxyError('无法连接到代理。',TimeoutError('timedout'))':/simple/mysqlx-connector/|中断||我认为这可能是我所在地区过滤的结果因为我是初学者,不知道如何解决问题或问题是什么。有人可以帮我吗?......
  • C语言分支语句和循环语句
     目录选择语句if-else语句if嵌套switch语句逻辑操作符!逻辑非&&逻辑与||  逻辑或循环语句while循环do-while循环for循环break和continue语句 break语句continue语句选择语句if-else语句if语句的语法形式if(表达式){语句}在C语言中非0为真,0为......
  • MySQL 5.7 Command Line Client 闪屏退出
    MySQL5.7CommandLineClient 闪屏退出 解释:MySQL5.7CommandLineClient闪屏退出可能是因为缺少某些环境变量配置,或者是MySQL安装过程中出现了问题。解决方法:   检查环境变量:确保PATH环境变量中包含了MySQL的bin目录路径。在Windows系统中,可以在系统属性的“高级”......
  • “MySQL 查询反馈全解析:揭开消息、摘要、状态、结果及警告(错误)的神秘面纱”(详细)
    在MySQL中,当您运行查询时,通常会显示几个主要的标签或部分。这些部分通常包括消息(Message)、摘要(Summary)、状态(Status)、结果(Results)以及警告或错误(Warnings/Errors)。以下是这些部分的详细解释:消息(Message):这是一个简要的反馈区,显示查询执行的结果信息。如果查询执行成功......
  • navicat无法连接远程mysql数据库1130报错的解决方法
    出现报错:1130-Host'ipaddress'isnotallowedtoconnecttothisMySQLservenavicat,当前ip不允许连接到这个MySQL服务解决当前ip无法连接远程mysql的方法1.查看mysql端口,并在服务器安全组中放开相应入方向端口后重启服务器sudonetstat-tulnp|grepmysql查看端......
  • 828华为云征文|华为云 Flexus 云服务器 X 实例:在openEuler系统下搭建MySQL主从复制
    828华为云征文|华为云Flexus云服务器X实例:在openEuler系统下搭建MySQL主从复制前言一、Flexus云服务器X实例介绍1.1Flexus云服务器X实例简介1.2Flexus云服务器X实例特点1.3Flexus云服务器X实例使用场景二、MySQL数据库介绍2.1MySQL简介2.2MySQL主要特点2.3MySQ......
  • 志愿服务管理系统(含源码+sql+视频导入教程+文档)
    ......
  • 基于jsp的图书馆管理系统的设计与实现 (含源码+sql+视频导入教程+文档)
    ......
  • mysqldump 远程备份 mysql
    mysqldump远程备份使用mysqldump进行远程数据库备份,你需要具备远程服务器的访问权限,并且确保远程服务器的MySQL服务允许远程连接。mysqldump-uroot-ppassword-h192.168.1.100mydatabase>backup.sql mysqldump指令如下: mysqldump-h[服务器IP]-P[mysql端口号......