如何使用SQL系列 之 如何在SQL中使用CASE表达式

这篇具有很好参考价值的文章主要介绍了如何使用SQL系列 之 如何在SQL中使用CASE表达式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

编程语言通常以条件语句为特征,它们是执行特定操作直到满足特定条件的命令。一个常见的条件语句是if, then, else语句,它通常遵循以下逻辑:

if condition=true
	then action A
	else action B

这条语句的逻辑可以翻译成如下语言:“如果condition为真,那么perform action A。否则(else),执行动作B。”

CASE表达式是结构化查询语言(SQL)中的一个功能,它允许你对数据库查询应用类似的逻辑,并设置如何返回或显示结果集中值的条件。
在本教程中,你将学习如何使用CASE表达式,使用WHENTHENELSEEND关键字对数据设置条件。

前期准备

为了学习本指南,你需要一台运行某种使用SQL的关系数据库管理系统(RDBMS)的计算机。

注意:请注意,许多RDBMS使用它们自己独特的SQL实现。虽然本教程中概述的命令适用于大多数RDBMS,但如果你在MySQL以外的系统上测试它们,确切的语法或输出可能会有所不同。

你还需要一个装载了一些示例数据的数据库和表,可以在其中练习使用相关命令。

连接到MySQL并设置一个示例数据库

如果SQL数据库系统运行在远程服务器上,请从本地设备SSH到服务器:

ssh sammy@your_server_ip

然后打开MySQL服务器提示符,将==sammy==替换为你的MySQL用户账户的名称:

mysql -u sammy -p

创建一个名为caseDB的数据库:

CREATE DATABASE caseDB;

如果数据库成功创建,您将收到这样的输出:

OutputQuery OK, 1 row affected (0.01 sec)

要选择caseDB数据库,运行以下USE语句:

USE caseDB;
OutputDatabase changed

选择数据库后,在其中创建一个表。在本教程的示例中,我们将创建一个表,用于保存历史上最畅销的10个专辑的数据。这个表将包含以下6列:

  • music_id:显示int数据类型的值,并作为表的主键,这意味着这一列中的每个值都将作为其各自行的唯一标识符。
  • artist_name:使用varchar数据类型存储每个艺术家的名字,最多30个字符。
  • album_name:使用varchar数据类型,再一次最多30个字符每个专辑的名称。
  • release_date:使用 date数据类型跟踪每张专辑的发行日期,该数据类型使用YYYY-MM-DD日期格式。
  • genre_type:显示每个专辑的流派分类用的varchar数据类型最多25个字符。
  • copyes_sold:使用decimal数据类型存储以百万为单位售出的专辑拷贝总数。该列的精度为4,刻度为1,这意味着该列中的值可以有4位数字,其中一位位于小数点的右侧。

通过运行以下CREATE TABLE命令,创建一个名为top_albums的表,其中包含这些列:

CREATE TABLE top_albums (
music_id int, 
artist_name varchar(30),
album_name varchar(30), 
release_date DATE,
genre_type varchar(25),
copies_sold decimal(4,1),
PRIMARY KEY (music_id)
); 

接下来向空表中插入一些示例数据:

INSERT INTO top_albums
(music_id, artist_name, album_name, release_date, genre_type, copies_sold)
VALUES
(1, 'Michael Jackson', 'Thriller', '1982-11-30', 'Pop', 49.2),
(2, 'Eagles', 'Hotel California', '1976-12-08', 'Soft Rock', 31.5),
(3, 'Pink Floyd', 'The Dark Side of the Moon', '1973-03-01', 'Progressive Rock', 21.7),
(4, 'Shania Twain', 'Come On Over', '1997-11-04', 'Country', 29.6),
(5, 'AC/DC', 'Back in Black', '1980-07-25', 'Hard Rock', 29.5),
(6, 'Whitney Houston', 'The Bodyguard', '1992-11-25', 'R&B', 32.4),
(7, 'Fleetwood Mac', 'Rumours', '1977-02-04', 'Soft Rock', 27.9),
(8, 'Meat Loaf', 'Bat Out of Hell', '1977-10-11', 'Hard Rock', 21.7),
(9, 'Eagles', 'Their Greatest Hits 1971-1975', '1976-02-17', 'Country Rock', 41.2),
(10, 'Bee Gees', 'Saturday Night Fever', '1977-11-15', 'Disco', 21.6);
OutputQuery OK, 10 rows affected (0.01 sec)
Records: 10  Duplicates: 0  Warnings: 0

插入数据后,就可以开始在SQL中使用CASE表达式了。

理解CASE表达式的语法

CASE表达式允许你为数据设置条件,并使用类似于if-then语句的逻辑来搜索数据,比较值,并评估它们是否符合你设置的条件。下面是CASE表达式的通用语法示例:

CASE表达式语法

. . .
CASE 
    WHEN condition_1 THEN outcome_1
    WHEN condition_2 THEN outcome_2
    WHEN condition_3 THEN outcome_3
    ELSE else_outcome
END 
. . .

根据你想为你的数据设置多少条件,你还需要在CASE表达式中包含以下关键字:

  • WHEN:这个关键字根据你设置的条件对表中的数据值进行计算和比较。WHEN与典型的if-then-else语句中的if类似。
  • THEN:如果某个值不满足条件,这个关键字会过滤你设置的每个条件。
  • ELSE:如果数据值不满足你在每个WHENTHEN语句后设置的任何条件,那么这个关键字可以用来指定它的最终分类条件。
  • END:为了成功运行CASE表达式并设置条件,你必须以END关键字结尾。

有了对CASE表达式结构和语法的理解,你就可以开始练习示例数据了。

使用CASE表达式

想象一下,你是一名DJ,正在为你古怪的卡罗尔阿姨的65岁生日庆祝活动准备曲目。你知道她的味道很难确定,所以你决定做一些研究十大畅销唱片的通知你的一些音乐的决定。

首先,通过运行SELECT*符号来查看你在top_albums表中编译的所有数据:

SELECT * FROM top_albums;
Output+----------+-----------------+-------------------------------+--------------+------------------+-------------+
| music_id | artist_name     | album_name                    | release_date | genre_type       | copies_sold |
+----------+-----------------+-------------------------------+--------------+------------------+-------------+
|        1 | Michael Jackson | Thriller                      | 1982-11-30   | Pop              |        49.2 |
|        2 | Eagles          | Hotel California              | 1976-12-08   | Soft Rock        |        31.5 |
|        3 | Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | Progressive Rock |        21.7 |
|        4 | Shania Twain    | Come On Over                  | 1997-11-04   | Country          |        29.6 |
|        5 | AC/DC           | Back in Black                 | 1980-07-25   | Hard Rock        |        29.5 |
|        6 | Whitney Houston | The Bodyguard                 | 1992-11-25   | R&B              |        32.4 |
|        7 | Fleetwood Mac   | Rumours                       | 1977-02-04   | Soft Rock        |        27.9 |
|        8 | Meat Loaf       | Bat Out of Hell               | 1977-10-11   | Hard Rock        |        21.7 |
|        9 | Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | Country Rock     |        41.2 |
|       10 | Bee Gees        | Saturday Night Fever          | 1977-11-15   | Disco            |        21.6 |
+----------+-----------------+-------------------------------+--------------+------------------+-------------+
10 rows in set (0.00 sec)

自从卡罗尔阿姨出生于1957年,她年轻的时候就喜欢上了很多七八十年代的热门歌曲。你知道她是流行音乐、软摇滚和迪斯科的超级粉丝,所以你要把这些放在你的歌曲列表中最重要的位置。

你可以通过使用CASE表达式来实现这一点,通过查询genre_type列下的数据值,为那些特定类型设置条件“高优先级”。下面的查询执行了此操作,并为CASE表达式创建的结果列创建了一个别名,命名为priority。该查询还包括artist_namealbum_namerelease_date以获取更多上下文。不要忘记使用END关键字来完成你的CASE表达式:

SELECT artist_name, album_name, release_date,
CASE WHEN genre_type = 'Pop' THEN 'High Priority' 
WHEN genre_type = 'Soft Rock' THEN 'High Priority'
WHEN genre_type = 'Disco' THEN 'High Priority'
END AS priority
FROM top_albums;
Output+-----------------+-------------------------------+--------------+---------------+
| artist_name     | album_name                    | release_date | priority      |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller                      | 1982-11-30   | High Priority |
| Eagles          | Hotel California              | 1976-12-08   | High Priority |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | NULL          |
| Shania Twain    | Come On Over                  | 1997-11-04   | NULL          |
| AC/DC           | Back in Black                 | 1980-07-25   | NULL          |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | NULL          |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | High Priority |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | NULL          |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | NULL          |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)

即使这个输出反映了你为那些“高优先级”类型设置的条件,由于你省略了ELSE关键字,这将导致未知或缺失的数据值,即NULL值。如果你的数据值满足你在CASE表达式中设置的所有条件,ELSE关键字可能没有必要,但它对于任何剩余数据都是有用的,因此可以根据单个条件对其进行正确分类。

对于下一个查询,编写相同的CASE表达式,但这次使用ELSE关键字设置条件。在下面的例子中,ELSE参数将genre_type中任何非高优先级的数据值标记为“Maybe”:

SELECT artist_name, album_name, release_date,
CASE WHEN genre_type = 'Pop' THEN 'High Priority' 
WHEN genre_type = 'Soft Rock' THEN 'High Priority'
WHEN genre_type = 'Disco' THEN 'High Priority'
ELSE 'Maybe'
END AS priority
FROM top_albums;
[sceondary_label Output]
+-----------------+-------------------------------+--------------+---------------+
| artist_name     | album_name                    | release_date | priority      |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller                      | 1982-11-30   | High Priority |
| Eagles          | Hotel California              | 1976-12-08   | High Priority |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | Maybe         |
| Shania Twain    | Come On Over                  | 1997-11-04   | Maybe         |
| AC/DC           | Back in Black                 | 1980-07-25   | Maybe         |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | Maybe         |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | High Priority |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | Maybe         |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | Maybe         |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)

这个输出现在更能代表您为具有最高优先级和不具有最高优先级的专辑设置的条件。尽管这有助于排在前四名的专辑ThrillerHotel CaliforniaRumoursSaturday Night Fever你相信在这张名单上需要更多的多样性。但你也得说服卡罗尔阿姨。

你决定做一个小实验,让卡罗尔阿姨拓宽她的音乐调色板,听剩下的专辑。你不提供专辑的任何上下文,而是指导她如实为它们打分,称它们"Mellow, “Fun”或 “Boring.”。一旦她完成了,她会给你一份手写的分数清单。现在你有了设置查询条件所需的信息,如下所示:

SELECT artist_name, album_name, release_date,
CASE WHEN genre_type = 'Hard Rock' THEN 'Boring' 
WHEN genre_type = 'Country Rock' THEN 'Mellow'
WHEN genre_type = 'Progressive Rock' THEN 'Fun'
WHEN genre_type = 'Country' THEN 'Fun'
WHEN genre_type = 'R&B' THEN 'Boring'
ELSE 'High Priority' 
END AS score
FROM top_albums;
Output
+-----------------+-------------------------------+--------------+---------------+
| artist_name     | album_name                    | release_date | score         |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller                      | 1982-11-30   | High Priority |
| Eagles          | Hotel California              | 1976-12-08   | High Priority |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | Fun           |
| Shania Twain    | Come On Over                  | 1997-11-04   | Fun           |
| AC/DC           | Back in Black                 | 1980-07-25   | Boring        |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | Boring        |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | High Priority |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | Boring        |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | Mellow        |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)

根据这个输出,阿姨卡罗尔似乎开放的新声音,你会惊喜地看到她的分数为平克弗洛伊德。但你对她对AC/DC, Meat Loaf和Whitney Houston的优秀曲调不感兴趣有点失望。

如果你能向卡罗尔阿姨展示一些专辑在客观上比其他专辑更受欢迎,她可能会更灵活,所以你决定用一些数字来左右决定。事实上,这十张专辑之所以排名前十是因为它们在过去几十年里卖给了粉丝数百万张。因此,在下一个查询中,你将创建一个新的CASE表达式,它根据copyes_sold中到目前为止售出的专辑的数值数据来设置一个分数。

你将使用CASE表达式将销量至少3500万张的专辑设置为“best”,销量2500万张的专辑设置为“great”,销量2000万张的专辑设置为“good”,销量低于3500万张的专辑设置为“ordinary”,如下例所示:

SELECT artist_name, album_name, release_date, CASE WHEN copies_sold >35.0 THEN 'best'
WHEN copies_sold >25.0 THEN 'great'
WHEN copies_sold >20.0 THEN 'good'
ELSE 'mediocre' END AS score FROM top_albums;
Output+-----------------+-------------------------------+--------------+-------+
| artist_name     | album_name                    | release_date | score |
+-----------------+-------------------------------+--------------+-------+
| Michael Jackson | Thriller                      | 1982-11-30   | best  |
| Eagles          | Hotel California              | 1976-12-08   | great |
| Pink Floyd      | The Dark Side of the Moon     | 1973-03-01   | good  |
| Shania Twain    | Come On Over                  | 1997-11-04   | great |
| AC/DC           | Back in Black                 | 1980-07-25   | great |
| Whitney Houston | The Bodyguard                 | 1992-11-25   | great |
| Fleetwood Mac   | Rumours                       | 1977-02-04   | great |
| Meat Loaf       | Bat Out of Hell               | 1977-10-11   | good  |
| Eagles          | Their Greatest Hits 1971-1975 | 1976-02-17   | best  |
| Bee Gees        | Saturday Night Fever          | 1977-11-15   | good  |
+-----------------+-------------------------------+--------------+-------+
10 rows in set (0.00 sec)

基于这些输出,没有一张专辑被评为“mediocre”,因为他们都卖出了2000多万张。然而,也有一些专辑从分数上脱颖而出。现在你可以为卡罗尔阿姨提供确凿的证据,证明他们演奏过AC/DC或惠特尼·休斯顿,因为他们的专辑销量超过2500万张,使他们成为最伟大的音乐作品。

现在你已经了解了如何使用CASE表达式为各种目的以及字符和数字数据值设置条件。此外,CASE如何使用if-then逻辑来比较这些值并根据您所需的条件生成响应。

总结

理解如何使用CAST表达式可以帮助你将数据范围缩小到你设置的任何条件。无论你是想为某些价值观设置不同的优先级,还是根据流行观点或数字的标准对它们进行评分,它都可以根据你的需求灵活设置。如果你想了解在结果集中操作数据值的其他方法,请查看我们关于CAST函数和连接表达式的指南。文章来源地址https://www.toymoban.com/news/detail-701958.html

到了这里,关于如何使用SQL系列 之 如何在SQL中使用CASE表达式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SQL-正则】利用正则表达式进行过滤操作(常用正则表达式)

    1、由数字、26个英文字母或者下划线组成的字符串 2、非负整数(正整数 + 0 ) 3、正整数 4、非正整数(负整数 + 0) 5、负整数 6、整数 7、非负浮点数(正浮点数 + 0) 8、正浮点数 9、非正浮点数(负浮点数 + 0) 10、负浮点数 11、浮点数 12、由26个英文字母组成的字符串 13、

    2024年02月12日
    浏览(65)
  • SQL-正则表达式和约束

    正则表达式 约束 正则表达式是一种用来描述字符串模式的工具,它可以用于匹配、查找、替换等操作。正则表达式由字符和特殊字符组成,可以使用这些字符来定义匹配规则。 常用的正则表达式字符和特殊字符有: 普通字符:表示匹配该字符本身,如 a 表示匹配字母\\\"a\\\"。

    2024年02月08日
    浏览(37)
  • SQL中常见正则表达式用法

    在 SQL 中,正则表达式是一种强大的工具,用于匹配相应的字符串模式。SQL 支持的正则表达式语法因数据库而异,下面是一些常用的正则表达式元字符: . :匹配任何单个字符 * :匹配任意数量的前一个字符 + :匹配一个或多个前一个字符 ? :匹配零个或一个前一个字符 ^ :

    2024年02月15日
    浏览(48)
  • 【SQL篇】窗口函数和公共表达式

    思路 先给每个数进行排名 用这些数减去自己的排名,如果减了之后的结果是一样的,说明这几个数是连续的 用logid减去排名得出来的数进行group by,也就是把连续的数全都放在一个一个小组里面,求出每个小组的最大值和最小值就可以了 1596题 总结 这里有个坑,count并不会根

    2024年02月02日
    浏览(29)
  • 030、SQL语句之数据类型与表达式

    类型 存储空间 最小值(有符号/无符号) 最大值(有符号/无符号) TINYINT 1 -128 / 0 127 / 255 SMALLINT 2 -32768 / 0 32767 / 65535 MEDIUMINT 3 -8388608 / 0 8388607 / 16777215 INT 4 -2147483648 / 0 BIGINT 8 -9223372036854775808 / 0 9223372036854775807 / 18446744073709551615 注意unsigned: 不允许负数 用于精确数值:整数、小数或两

    2024年02月13日
    浏览(38)
  • Case表达式

    在发现结果为真的WHEN子句时,CASE表达式的真假值判断会终止,剩余的WHEN子句会被忽略: 注意: 统一各分支返回的数据类型. 记得写end. 写else子句的习惯,否则执行结果默认处理为null. 将已有编号方式转换为新的方式并统计 下面给出的group by引用select中定义的别名,case写在group by违反

    2024年04月22日
    浏览(33)
  • HIVE SQL中替换不可见字符的正则表达式

    对于剔除字符串首尾的空格,使用较多的是 trim() 、 ltrim() 、 rtrim() 函数,但是他们无法去除字符串中间的空格。 这个时候通常会使用正则表达式来替换字符串中的空白字符 s 表示匹配任何空白字符,包括空格、制表符、换页符等等, 等价于[ fnrtv]。 返回结果: ‘abcdefg’

    2024年02月16日
    浏览(34)
  • 「SQL面试题库」 No_109 计算布尔表达式的值

    「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。 1.1 活动流程 整理题目 :西红柿每天无论刮风下雨

    2024年02月13日
    浏览(40)
  • notepad++配合正则表达式分组模式处理文本转化为sql语句

    一、正则分组知识点补充 正则分组和捕获 ():用于分组和捕获子表达式。 大白话就是()匹配到的数据,通过美元符号加下标可以获取该数据,例如$1、$2, 下标从1开始。 下面的案例就采用该模式处理文本数据 二、使用正则的需求背景 有一份报表的数据,需要把数据入库到m

    2024年02月07日
    浏览(47)
  • Web攻防--Java_SQL注入--XXE注入-- SSTI模板注入--SPEL表达式注入

    编译器在编译sql语句时,会依次进行词法分析、语法分析、语义分析等操作, 预编译技术会让数据库跳过编译阶段,也就无法就进行词法分析,不会被拆开,注入语句也就不会被识别为SQL的,从而防止恶意注入语句改变原有SQL语句本身逻辑。 在使用JDBC进行数据

    2024年02月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包