引言
編程語(yǔ)言通常以條件語(yǔ)句為特征,它們是執(zhí)行特定操作直到滿足特定條件的命令。一個(gè)常見(jiàn)的條件語(yǔ)句是if, then, else
語(yǔ)句,它通常遵循以下邏輯:
if condition=true
then action A
else action B
這條語(yǔ)句的邏輯可以翻譯成如下語(yǔ)言:“如果condition為真,那么perform action A。否則(else),執(zhí)行動(dòng)作B。”
CASE
表達(dá)式是結(jié)構(gòu)化查詢語(yǔ)言(SQL)中的一個(gè)功能,它允許你對(duì)數(shù)據(jù)庫(kù)查詢應(yīng)用類似的邏輯,并設(shè)置如何返回或顯示結(jié)果集中值的條件。
在本教程中,你將學(xué)習(xí)如何使用CASE
表達(dá)式,使用WHEN
、THEN
、ELSE
和END
關(guān)鍵字對(duì)數(shù)據(jù)設(shè)置條件。
前期準(zhǔn)備
為了學(xué)習(xí)本指南,你需要一臺(tái)運(yùn)行某種使用SQL的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)的計(jì)算機(jī)。
注意:請(qǐng)注意,許多RDBMS使用它們自己獨(dú)特的SQL實(shí)現(xiàn)。雖然本教程中概述的命令適用于大多數(shù)RDBMS,但如果你在MySQL以外的系統(tǒng)上測(cè)試它們,確切的語(yǔ)法或輸出可能會(huì)有所不同。
你還需要一個(gè)裝載了一些示例數(shù)據(jù)的數(shù)據(jù)庫(kù)和表,可以在其中練習(xí)使用相關(guān)命令。
連接到MySQL并設(shè)置一個(gè)示例數(shù)據(jù)庫(kù)
如果SQL數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行在遠(yuǎn)程服務(wù)器上,請(qǐng)從本地設(shè)備SSH到服務(wù)器:
ssh sammy@your_server_ip
然后打開(kāi)MySQL服務(wù)器提示符,將==sammy==
替換為你的MySQL用戶賬戶的名稱:
mysql -u sammy -p
創(chuàng)建一個(gè)名為caseDB
的數(shù)據(jù)庫(kù):
CREATE DATABASE caseDB;
如果數(shù)據(jù)庫(kù)成功創(chuàng)建,您將收到這樣的輸出:
OutputQuery OK, 1 row affected (0.01 sec)
要選擇caseDB
數(shù)據(jù)庫(kù),運(yùn)行以下USE
語(yǔ)句:
USE caseDB;
OutputDatabase changed
選擇數(shù)據(jù)庫(kù)后,在其中創(chuàng)建一個(gè)表。在本教程的示例中,我們將創(chuàng)建一個(gè)表,用于保存歷史上最暢銷的10個(gè)專輯的數(shù)據(jù)。這個(gè)表將包含以下6列:
-
music_id
:顯示int
數(shù)據(jù)類型的值,并作為表的主鍵,這意味著這一列中的每個(gè)值都將作為其各自行的唯一標(biāo)識(shí)符。 -
artist_name
:使用varchar
數(shù)據(jù)類型存儲(chǔ)每個(gè)藝術(shù)家的名字,最多30個(gè)字符。 -
album_name
:使用varchar
數(shù)據(jù)類型,再一次最多30個(gè)字符每個(gè)專輯的名稱。 -
release_date
:使用date
數(shù)據(jù)類型跟蹤每張專輯的發(fā)行日期,該數(shù)據(jù)類型使用YYYY-MM-DD
日期格式。 -
genre_type
:顯示每個(gè)專輯的流派分類用的varchar
數(shù)據(jù)類型最多25個(gè)字符。 -
copyes_sold
:使用decimal
數(shù)據(jù)類型存儲(chǔ)以百萬(wàn)為單位售出的專輯拷貝總數(shù)。該列的精度為4,刻度為1,這意味著該列中的值可以有4位數(shù)字,其中一位位于小數(shù)點(diǎn)的右側(cè)。
通過(guò)運(yùn)行以下CREATE TABLE
命令,創(chuàng)建一個(gè)名為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)
);
接下來(lái)向空表中插入一些示例數(shù)據(jù):
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
插入數(shù)據(jù)后,就可以開(kāi)始在SQL中使用CASE
表達(dá)式了。
理解CASE表達(dá)式的語(yǔ)法
CASE
表達(dá)式允許你為數(shù)據(jù)設(shè)置條件,并使用類似于if-then
語(yǔ)句的邏輯來(lái)搜索數(shù)據(jù),比較值,并評(píng)估它們是否符合你設(shè)置的條件。下面是CASE
表達(dá)式的通用語(yǔ)法示例:
CASE表達(dá)式語(yǔ)法
. . .
CASE
WHEN condition_1 THEN outcome_1
WHEN condition_2 THEN outcome_2
WHEN condition_3 THEN outcome_3
ELSE else_outcome
END
. . .
根據(jù)你想為你的數(shù)據(jù)設(shè)置多少條件,你還需要在CASE
表達(dá)式中包含以下關(guān)鍵字:
-
WHEN
:這個(gè)關(guān)鍵字根據(jù)你設(shè)置的條件對(duì)表中的數(shù)據(jù)值進(jìn)行計(jì)算和比較。WHEN
與典型的if-then-else
語(yǔ)句中的if
類似。 -
THEN
:如果某個(gè)值不滿足條件,這個(gè)關(guān)鍵字會(huì)過(guò)濾你設(shè)置的每個(gè)條件。 -
ELSE
:如果數(shù)據(jù)值不滿足你在每個(gè)WHEN
和THEN
語(yǔ)句后設(shè)置的任何條件,那么這個(gè)關(guān)鍵字可以用來(lái)指定它的最終分類條件。 -
END
:為了成功運(yùn)行CASE
表達(dá)式并設(shè)置條件,你必須以END
關(guān)鍵字結(jié)尾。
有了對(duì)CASE
表達(dá)式結(jié)構(gòu)和語(yǔ)法的理解,你就可以開(kāi)始練習(xí)示例數(shù)據(jù)了。
使用CASE表達(dá)式
想象一下,你是一名DJ,正在為你古怪的卡羅爾阿姨的65歲生日慶?;顒?dòng)準(zhǔn)備曲目。你知道她的味道很難確定,所以你決定做一些研究十大暢銷唱片的通知你的一些音樂(lè)的決定。
首先,通過(guò)運(yùn)行SELECT
和*
符號(hào)來(lái)查看你在top_albums
表中編譯的所有數(shù)據(jù):
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年,她年輕的時(shí)候就喜歡上了很多七八十年代的熱門歌曲。你知道她是流行音樂(lè)、軟搖滾和迪斯科的超級(jí)粉絲,所以你要把這些放在你的歌曲列表中最重要的位置。
你可以通過(guò)使用CASE
表達(dá)式來(lái)實(shí)現(xiàn)這一點(diǎn),通過(guò)查詢genre_type
列下的數(shù)據(jù)值,為那些特定類型設(shè)置條件“高優(yōu)先級(jí)”。下面的查詢執(zhí)行了此操作,并為CASE
表達(dá)式創(chuàng)建的結(jié)果列創(chuàng)建了一個(gè)別名,命名為priority
。該查詢還包括artist_name
、album_name
和release_date
以獲取更多上下文。不要忘記使用END
關(guān)鍵字來(lái)完成你的CASE
表達(dá)式:
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)
即使這個(gè)輸出反映了你為那些“高優(yōu)先級(jí)”類型設(shè)置的條件,由于你省略了ELSE
關(guān)鍵字,這將導(dǎo)致未知或缺失的數(shù)據(jù)值,即NULL
值。如果你的數(shù)據(jù)值滿足你在CASE
表達(dá)式中設(shè)置的所有條件,ELSE
關(guān)鍵字可能沒(méi)有必要,但它對(duì)于任何剩余數(shù)據(jù)都是有用的,因此可以根據(jù)單個(gè)條件對(duì)其進(jìn)行正確分類。
對(duì)于下一個(gè)查詢,編寫相同的CASE
表達(dá)式,但這次使用ELSE
關(guān)鍵字設(shè)置條件。在下面的例子中,ELSE
參數(shù)將genre_type
中任何非高優(yōu)先級(jí)的數(shù)據(jù)值標(biāo)記為“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)
這個(gè)輸出現(xiàn)在更能代表您為具有最高優(yōu)先級(jí)和不具有最高優(yōu)先級(jí)的專輯設(shè)置的條件。盡管這有助于排在前四名的專輯Thriller
,?Hotel California
,?Rumours
和Saturday Night Fever
你相信在這張名單上需要更多的多樣性。但你也得說(shuō)服卡羅爾阿姨。
你決定做一個(gè)小實(shí)驗(yàn),讓卡羅爾阿姨拓寬她的音樂(lè)調(diào)色板,聽(tīng)剩下的專輯。你不提供專輯的任何上下文,而是指導(dǎo)她如實(shí)為它們打分,稱它們"Mellow, “Fun”或 “Boring.”。一旦她完成了,她會(huì)給你一份手寫的分?jǐn)?shù)清單?,F(xiàn)在你有了設(shè)置查詢條件所需的信息,如下所示:
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)
根據(jù)這個(gè)輸出,阿姨卡羅爾似乎開(kāi)放的新聲音,你會(huì)驚喜地看到她的分?jǐn)?shù)為平克弗洛伊德。但你對(duì)她對(duì)AC/DC, Meat Loaf和Whitney Houston的優(yōu)秀曲調(diào)不感興趣有點(diǎn)失望。
如果你能向卡羅爾阿姨展示一些專輯在客觀上比其他專輯更受歡迎,她可能會(huì)更靈活,所以你決定用一些數(shù)字來(lái)左右決定。事實(shí)上,這十張專輯之所以排名前十是因?yàn)樗鼈冊(cè)谶^(guò)去幾十年里賣給了粉絲數(shù)百萬(wàn)張。因此,在下一個(gè)查詢中,你將創(chuàng)建一個(gè)新的CASE
表達(dá)式,它根據(jù)copyes_sold
中到目前為止售出的專輯的數(shù)值數(shù)據(jù)來(lái)設(shè)置一個(gè)分?jǐn)?shù)。
你將使用CASE
表達(dá)式將銷量至少3500萬(wàn)張的專輯設(shè)置為“best”,銷量2500萬(wàn)張的專輯設(shè)置為“great”,銷量2000萬(wàn)張的專輯設(shè)置為“good”,銷量低于3500萬(wàn)張的專輯設(shè)置為“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)
基于這些輸出,沒(méi)有一張專輯被評(píng)為“mediocre”,因?yàn)樗麄兌假u出了2000多萬(wàn)張。然而,也有一些專輯從分?jǐn)?shù)上脫穎而出?,F(xiàn)在你可以為卡羅爾阿姨提供確鑿的證據(jù),證明他們演奏過(guò)AC/DC或惠特尼·休斯頓,因?yàn)樗麄兊膶]嬩N量超過(guò)2500萬(wàn)張,使他們成為最偉大的音樂(lè)作品。
現(xiàn)在你已經(jīng)了解了如何使用CASE
表達(dá)式為各種目的以及字符和數(shù)字?jǐn)?shù)據(jù)值設(shè)置條件。此外,CASE
如何使用if-then
邏輯來(lái)比較這些值并根據(jù)您所需的條件生成響應(yīng)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-701958.html
總結(jié)
理解如何使用CAST
表達(dá)式可以幫助你將數(shù)據(jù)范圍縮小到你設(shè)置的任何條件。無(wú)論你是想為某些價(jià)值觀設(shè)置不同的優(yōu)先級(jí),還是根據(jù)流行觀點(diǎn)或數(shù)字的標(biāo)準(zhǔn)對(duì)它們進(jìn)行評(píng)分,它都可以根據(jù)你的需求靈活設(shè)置。如果你想了解在結(jié)果集中操作數(shù)據(jù)值的其他方法,請(qǐng)查看我們關(guān)于CAST
函數(shù)和連接表達(dá)式的指南。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-701958.html
到了這里,關(guān)于如何使用SQL系列 之 如何在SQL中使用CASE表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!