第十二章 - 条件判断(case when 和 if)和视图

2023-11-09

第十二章 - 条件判断(case when 和 if),和视图(view)

if 的用法

通过使用if函数可以实现数据二分类或者多分类的功能,比如按年龄区分青年、中年、老年,或者按价格区分价值等级等等,也是很常用的函数。
函数用法:当表达式成立时,返回a,否则就返回b。

if(表达式,a,b) 

举个例子:if的基本用法
按年龄段把用户分为年轻人和老年。

当年龄小于60岁的标记为年轻人,60岁(含60)以上的为老年人。

select
	name,
	age,
	if(age < 60,'年轻人','老年人') as '年龄段'
from
	test.titanic

输出结果:
在这里插入图片描述

if还可以嵌套使用

if ( 表达式 , if ( 表达式 , a1 , a2 ) , b )
或者
if ( 表达式 , a , if ( 表达式 , b1 , b2 ) )

举个例子:if嵌套使用
按年龄段把用户分为青年、中年、老年。
当年龄小于30岁时标记为青年,30岁到60岁以下的用户为中年,60岁以上(含60岁)的为老年

select
	name,
	age,
	if(age < 60,if(age < 30 , '青年','中年'),'老年') as '年龄段'
from
	test.titanic

输出结果:
在这里插入图片描述

case when 的用法

case when语句可以实现多条件判断,前面使用if虽然使用嵌套的方式也可以实现多条件判断,但是灵活性和代码可读性就低于case when语句。
case when 有两种用法,一种是固定值的用法,一种是表达式的用法,后一种用法更灵活也是最常用的一种。
用法1:不够灵活,不常用
以case开始,设置列名,当列内的值等于值1时返回a,等于值2时返回b,等于值3时返回c,…,(else表示当以上表达式都不满足时返回x。可不写,不写时返回null),最后以end结束

	case 列名
		when1 then a
        when2 then b
        when3 then c
        ....
        else x end 

用法2:使用灵活,常用
以case开始,满足表达式1返回a,满足表达式2返回b,满足表达式3返回c,…,(else表示当以上表达式都不满足时返回x。可不写)最后以end结束

	case 
		when 表达式1 then a
        when 表达式2 then b
        when 表达式3 then c
        ....
        else x end 

下面用case when语句实现if嵌套语句的例子
举个例子
按年龄段把用户分为青年、中年、老年。

select
	name,
	age,
	case 
		when age < 30 then '青年'
        when age < 60 then '中年'
        else '老年' end as '年龄段'
from
	test.titanic

输出结果:
在这里插入图片描述
和if嵌套实现的查询结果是一样的。

举个例子:使用正则匹配的case when
通过表达式匹配文本中对应季节的关键字,对服装进行季节的区分。

select
	title,
	case 
		when title regexp '春' then '春季'
	    when title regexp '夏' then '夏季'
	    when title regexp '秋' then'秋装'
	    when title regexp '冬' then '冬季'
	    else '其他' end as '季节分类'
from
	rectmall.product

输出结果:
在这里插入图片描述

视图(view)的用法

视图的作用就是把一个查询打包成一个虚拟的表。
视图的一些特点:

简化复杂的SQL:在一些复杂且有重复使用某些查询语句的情况下,可以大大简化SQL的操作。
数据保护:可一通过访问权限给予用户部分表的数据查询权限,而不是全部表的查询权限。
变更数据展示格式:可以在视图中修改数据的展示样式和格式。

语句格式:

create view 视图表名 as  查询语句

举个例子:
统计所有男性用户中,不同点击行为的数量。点击行为在behavior_log 表中,共四种行为 pv:浏览,cart加入购物车,fav:喜欢,buy:购买。用户性别在user_profile表中,1 为男性,2为女性。
非视图查询:

select
	case 
		when btag = 'pv' then '浏览'
	    when btag = 'cart' then "加购"
	    when btag = 'fav' then "喜欢"
	    when btag = 'buy' then "购买"
	    end as '行为',
	count(btag) as '数量'
from
	(
	select
		userid,
		final_gender_code,
		btag
	from
		user_profile as a left join behavior_log as b on a.userid = b.user
	 ) as temp
where 
	final_gender_code = 1
group by
	btag

输出结果:
在这里插入图片描述
作为一个合格的数据分析师,查询出来的数据还是要转换下显示样式,比如把字母缩写或者应为名称转换为中文格式显示。

这个查询结果是ok的,可是当我们还要再查询出女生的点击情况,或者每种浏览行为中的男女比例时呢。
这时候如果用视图来创建一个精简过的数据表,然后直接调用视图的化会不会更方便一些呢?下面我们来尝试一下。
先创建一个视图:

# 创建视图的时候可以直接就把数据做一个加工处理,这样在用到的时候看起来也会更方便一些。
create view behavior_table as
select
	userid as "用户ID",
	if(final_gender_code = 1 , "男","女") as "性别",
	case 
		when b.btag = 'pv' then '浏览'
	    when b.btag = 'cart' then "加购"
	    when b.btag = 'fav' then "喜欢"
	    when b.btag = 'buy' then "购买"
	    end as '行为'
from
	user_profile as a left join behavior_log as b on a.userid = b.user

创建好视图后,我们来先查看下视图中的数据样式。

# 查看视图中的数据
select
	*
from
	behavior_table

输出结果:
在这里插入图片描述
可以看到创建的视图behavior_table中,数据已经进行了格式的转换。
下面我们来使用视图去查询开始的问题(统计所有男性用户中,不同点击行为的数量。)

select
	`行为`,
	count(`行为`) as '计数'
from
	behavior_table
where 
	`性别` = '男'
group by
	`行为`

输出结果:
在这里插入图片描述
结果和之前是一样的。
下面再查询浏览行为中男女人数各多少。只需要直接通过创建的视图中去查询就可以了。

select
	`性别`,
	# 去重可以把重复的用户id去掉
	count(distinct `用户ID`) as '计数'
from
	behavior_table
where 
	`行为` = '浏览'
group by
	`性别`

输出数据:
在这里插入图片描述

视图的一些规则和限制:

  • 图名称必须是唯一的,不能与别的视图名字重复,也不能与表的名字重复。
  • 可创建视图的数目是没有限制的。
  • 视图是可以嵌套的,也就是说创建一个视图的时候可以使用别的是同中的数据来构造一个新的视图。
  • 视图不能索引,不能有关联的触发器。
  • 视图可以和表一起用,其实视图就是一个虚拟的表,可以和表做表连接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十二章 - 条件判断(case when 和 if)和视图 的相关文章

  • Mysql 更快的 INSERT

    好的 我有大约 175k 个 INSERT 语句 相当大的 INSERT 语句 例如 INSERT INTO gast ID Identiteitskaartnummer Naam Voornaam Adres Postcode Stad
  • SQL 查询 - 将查询中的日期格式更改为 DD/MM/YYYY

    我想要实现的目标相当简单 将一种日期格式转换为另一种日期格式 由此 Jan 30 2013 12 00 00 000AM对此 DD MM YYYY或者在这种情况下30 01 2013 但是 当它是该月的 1 号到 9 号时 日期格式缺少零并
  • 如何在 SQL 中引用自定义字段

    我正在使用 mssql 但在使用子查询时遇到问题 真正的查询相当复杂 但其结构与此相同 select customerName customerId select count from Purchases where Purchases c
  • 将 2 个不同表中的 2 个值相乘

    我正在尝试使用 SQL 将值 X 乘以值 Y 值 X 位于表 A 中 B 位于表 B 中 我找不到这个问题的答案 表交易 ID Transaction ID Total Amount 1 001 1200 2 002 1500 3 003
  • 使用 C# 恢复数据库

    我正在尝试使用 Microsoft SqlServer Management Smo 将数据库从一台服务器恢复到另一台服务器 问题是我不断收到错误消息 指出找不到 MDF 文件 原因是它试图在 SQL 实例名称的数据文件夹中查找它的来源 而
  • 返回表中不存在的记录

    如何获取表中没有记录的ID 例如 select id name mail from users where id in 2 3 4 5 6 该查询返回记录 2 3 4 的输出 但不返回记录 5 和 6 因为表中不存在记录 现在我想知道表中没
  • 确定自上次访问 SQL Server 以来的行更改

    我们有一个多用户系统 用户将数据保存到中央 SQL Server 2005 数据库中 我们遇到了一个问题 即一个用户刷新数据库中的更改 而另一个用户保存新数据 我们当前收集更改的方式是每个表上都有一个时间戳列 该列在每行插入 更新时都会填充
  • 土耳其语字符显示不正确[重复]

    这个问题在这里已经有答案了 MySql 数据库使用 utf 8 编码 数据存储正确 我使用 set name utf8 查询来确保调用的数据是 utf 8 编码 只要标头字符集是 utf 8 数据库中的所有变量都可以正常工作 但静态html
  • 如何从 SQL Server 2008 返回由共享公共父级的多个选择构成的 XML

    我尝试过使用 FOR XML PATH FOR XML EXPLICIT 和 FOR XML AUTO 但数据从未采用正确的层次结构构建 基本上 我有一张父表 客户 和 3 个子表 每个表都有一个 customerid 列 Customer
  • MAMP Pro mysql 无法启动

    我遇到问题无法找到解决此问题的方法 我收到这个错误 2017 01 11 23 58 25 7fffbac563c0 InnoDB Operating system error number 2 in a file operation In
  • 计算唯一值的数量

    如果我有三列 orderNumber name email 我想计算表中有多少个唯一的电子邮件 我该怎么做 像这样的声明 SELECT count email FROM orders 给我总数 I tried SELECT DISTINCT
  • Laravel 5:如何检索并显示属于特定类别的所有帖子

    我有3张桌子 user id username subreddits id name created at posts id title link user id subreddit id 问题是 我手动获取 subreddit 类别的 i
  • 为什么我的 php 代码无法连接到远程 MySql 数据库?

    我正在尝试连接到远程 MySql 数据库 但收到以下错误消息 警告 mysqli connect HY000 2002 连接尝试失败 因为连接方在一段时间后没有正确响应 或者由于连接的主机未能响应而建立的连接失败 在 C myLocalDi
  • MySQL中的字符串分割函数

    谁能告诉我如何在 mysql 中实现 split 函数 其行为类似于 Javascript split 我想要一个这样的功能 SELECT Split a b c d AS splitted 结果如下 splitted a b c d 有谁
  • 单笔交易与多笔交易[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 Sequel Pro 在导入过程中将字符串更改为日期?

    我正在尝试使用 Sequel Pro 将文件导入到 MySQL 表中 我知道我需要使用 STR TO DATE 但我无法找出正确的语法 我在每一行都收到一堆这样的错误 ERROR in row 1 You have an error in
  • “已经有一个与此命令关联的打开的 DataReader,必须先将其关闭。”

    我正在开发需要连接到另一个数据库以获取一些数据的应用程序 为此 我决定使用 SqlConnection reader 等 我需要执行一些查询 例如首先我需要获取某个用户的卡 ID 之后我需要通过该卡 ID 获取一些数据 这是我的代码 reg
  • Mysql:多个表还是一张大表?

    这个问题已经被问过 但我还没有找到 1 个语音答案 最好这样做 1 张大桌子 其中 用户 ID 属性 1 属性 2 属性 3 属性 4 或 4 个小桌子 其中 用户 ID 属性 1 用户 ID 属性 2 用户 ID 属性 3 用户 ID 属
  • 创建索引可以使用现有索引吗?

    我在 A B 和 C 列上有单独的索引 我想在 A B C 三列上创建一个复合索引 我的会有什么影响existing指数对综合指数creation 数据库会利用它们吗 它们是否无关紧要 或者它们会减慢我的新复合索引的创建速度吗 我正在使用
  • 如何在 PostgreSQL 中生成月份列表?

    我有一张桌子A with startdate列是TIMESTAMP WITHOUT TIME ZONE我需要编写一个查询 函数来生成月份列表MIN列的值直到MAX列的值 例如 startdate 2014 12 08 2015 06 16

随机推荐

  • Typora和PicGo-Core搭配使用(解决博客单独上传图片问题)

    前言 本文简单介绍快速上传图片并获取图片 URL 链接的工具 图片存放到Gitee仓库中 在博客网站发布时不必担心图片转存失败问题 解决本地图片在网站需单独上传的难题 将本地图片存储在网络中 图床 并生成URL 联网情况下通过URL链接即可
  • Unity之六:项目实战篇

    文章目录 一 一个简单的实例 二 使用CMake组织项目与Unity 2 1 目录结构 2 2 CMakeLists txt的编写 2 3 使用实例 一 一个简单的实例 一个测试单元是源文件 测试文件和Unity构成的 把他们放在一起进行编
  • 【算法提升】——异或理解,位的运算

    个人主页 努力学习的少年 版权 本文由 努力学习的少年 原创 在CSDN首发 需要转载请联系博主 如果文章对你有帮助 欢迎关注 点赞 收藏 一键三连 和订阅专栏哦 目录 一 只出现一次的数字 1 二 数组中只出现一次的数字2 一 只出现一次
  • localStorage在Safari浏览器无痕模式下失效

    Safari无痕模式是不能使用localStorage的 可以利用这个特性判断用户是否开启无痕模式 并提醒用户关闭无痕模式 if typeof localStorage object try localStorage setItem loc
  • 学习笔记 JavaScript ES6 异步编程Promise

    Promise ES里面对异步操作的第一种方案 学习Promise 让异常操作变得优雅 Promise的精髓在于异步操作的状态管理 一个Promise最基本用法 他的参数是一个方法 这个方法里有两个参数 一个是异步操作执行成功的回调 一个是
  • DC综合脚本中文详细解释

    script for Design Compiler DC综合编译脚本 language TCL 语言说明 Usage 使用说明 1 make sure the lib in the current directory 确保设计库在正确的文
  • Xcode项目设置项中的LLVM

    LLVM是构架编译器
  • html5开发手机打电话发短信功能,html5的高级开发,html5开发大全,html手机电话短信功能详解

    原文地址 http blog csdn net xmtblog article details 32931905 在很多的手机网站上 有打电话和发短信的功能 对于这些功能是如何实现的呢 其实不难 今天我们就用html5来实现他们 简单的让你
  • Angular--官方文档之 Angular CLI

    学习Angular官方文档的时候 参考https angular cn guide quickstart 这个快速开发的文档 对于我这个AngularJs小白在看了Angular菜鸟教程后 只能说可以简单的运用一下 看到一些专业术语 我也是
  • 嵌入式Linux(四)—嵌入式C语言(杂项/数据类型关键字)

    目录 杂项关键字 sizeof Return 数据类型关键字 char 进制 int long short Unsigned signed Float double void 自定义数据类型 Struct Union enum typede
  • cppcheck使用

    cppcheck使用 cppcheck说明 cppcheck能够检查出来的问题 cppcheck使用并生成html结果 生成html结果 cppcheck说明 cppcheck主要用来检查c c 代码的 本文主要讲述cppcheck用命令行
  • Flutter 开发小结

    接触 Flutter 已经有一阵子了 期间记录了很多开发小问题 苦于忙碌没时间整理 最近项目进度步上正轨 借此机会抽出点时间来统一记录这些问题 并分享项目开发中的一点心得以及多平台打包的一些注意事项 希望能对大家有所帮助 UI 组件使用 官
  • Linux 下使用Crontab定时任务同时执行多条定时任务

    Linux 下使用Crontab定时任务同时执行多条定时任务 使用 符连接即可 示例如下 0 6 bea ceos timer bin pb ClosePbManifestTimer sh gt dev null 2 gt 1 bea ce
  • 【高项】质量管理(ITTO)

    过程组 子过程 输入 I 工具和技术 TT 输出 O 规划 1规划质量管理 1 项目章程 2 项目管理计划 需求管理计划 风险管理计划 相关方参与计划 范围基准 3 项目文件 假设日志 需求文件 需求跟踪矩阵 风险登记册 相关方登记册 4
  • QT源码剖析-QT对象通信机制信号槽的绑定具体实现

    本文详细介绍QT核心机制之一 信号和槽 我们在此根据Qt源代码一步一步探究其信号槽的实现过程 核心知识点 模板元编程技术 Qt moc预编译机制 QObject类 目录 1 QObject类介绍 2 相关助手类介绍 2 1 类型 函数指针
  • pip安装出现Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory: '

    问题描述 pip安装库或者更新pip版本时出现如下问题 Could not install packages due to an EnvironmentError Errno 2 No such file or directory c us
  • LeetCode 面试题01.09 字符串轮转

    题目 字符串轮转 给定两个字符串s1和s2 请编写代码检查s2是否为s1旋转而成 比如 waterbottle 是 erbottlewat 旋转后的字符串 示例1 输入 s1 waterbottle s2 erbottlewat 输出 Tr
  • 一个独特的开源插件evil.js

    前言 最近发现一个好玩有解压的开源插件 注意 不可使用在正式项目中 这里分享下 gitee地址 evil js 此代码仅在周日的时候执行以下逻辑 声明 请勿用于任何项目 如果导致任何问题 与本人无关https gitee com haoxi
  • 矩阵LU分解

    一 矩阵LU分解定理 设A为n阶矩阵 如果A的顺序主子式Di 0 i 1 2 n 1 则A可以分解为一个单位下三角矩阵L和一个上三角矩阵U的乘积 且这种分解是唯一的 即A LU 二 矩阵LU分解Python代码 自己原创 def lu de
  • 第十二章 - 条件判断(case when 和 if)和视图

    第十二章 条件判断 case when 和 if 和视图 view if 的用法 case when 的用法 视图 view 的用法 if 的用法 通过使用if函数可以实现数据二分类或者多分类的功能 比如按年龄区分青年 中年 老年 或者按价