MySQL基礎(chǔ)入門(mén)之Case語(yǔ)句用法實(shí)例
引言
MySQL CASE 是一個(gè) MySQL 語(yǔ)句查詢(xún)關(guān)鍵字,它定義了處理循環(huán)概念以執(zhí)行條件集并使用 IF ELSE 返回匹配案例的方式。 MySQL 中的 CASE 是一種控制語(yǔ)句,它驗(yàn)證條件案例集,并在第一個(gè)案例滿足 else 值時(shí)顯示值并退出循環(huán)。
如果沒(méi)有找到 TRUE 且語(yǔ)句沒(méi)有 ELSE 部分或值,則 CASE 返回 NULL?;旧?,CASE 語(yǔ)句類(lèi)似于 IF THEN ELSE 邏輯循環(huán)語(yǔ)句。在 MySQL 服務(wù)器上運(yùn)行時(shí),它會(huì)讀取條件表達(dá)式,當(dāng)表達(dá)式大小寫(xiě)匹配時(shí),nit 會(huì)顯示結(jié)果。之后,它會(huì)進(jìn)一步停止執(zhí)行。
CASE 的語(yǔ)法
下面的語(yǔ)法定義了 CASE 語(yǔ)句 SQL 查詢(xún)結(jié)構(gòu):
CASE WHEN cond1 THEN value1 WHEN cond2 THEN value2 WHEN condN THEN valueN ELSE value END;
- Cond1,cond2,…..,condN:表示在 CASE 語(yǔ)句列表中需要評(píng)估的條件。
- Value1, value2, .....,valueN:表示滿足條件時(shí)需要顯示的各個(gè)值。
- Value:表示 else 部分滿足時(shí)顯示的值。
這部分允許在 MySQL 的查詢(xún)中添加邏輯 CASE 語(yǔ)句。為了生成有效的語(yǔ)句,我們?cè)谌魏蔚胤绞褂脦в?WHERE SELECT 和 ORDER BY 等子句的 CASE 語(yǔ)句。您可以通過(guò)如下所示的語(yǔ)法進(jìn)行評(píng)估:
SELECT column1,column2, CASE WHEN cond1 THEN value1 WHEN cond2 THEN value2 WHEN condN THEN valueN ELSE value END FROM TableName;
CASE 語(yǔ)句在 MySQL 中是如何工作的?
CASE 語(yǔ)句包含兩個(gè)過(guò)程:一個(gè)是 Simple CASE,另一個(gè)是 Searched CASE。我們使用 CASE 語(yǔ)句根據(jù)匹配條件提供結(jié)果值,使用邏輯控制方法與 SQL 子句(如 SELECT、WHERE 和 ORDER BY)一起為 SQL 查詢(xún)提供結(jié)果值。
假設(shè),下面的查詢(xún)解釋了 CASE 邏輯部分,其中我們提到了一個(gè)像 Student 的表,其中包含字段 StudentName、State、City,那么查詢(xún)將被寫(xiě)為:
SELECT StudentName, State, City FROM Students ORDER BY ( CASE WHEN State IS NULL THEN City ELSE State END);
從這里我們將知道,當(dāng)我們?cè)?SELECT 查詢(xún)中應(yīng)用 CASE 語(yǔ)句來(lái)獲取滿足特定 case 條件的特定值時(shí)。在上圖中,我們將 CASE 語(yǔ)句放在 State 和 City 列上,如果 State 列包含 NULL 值,則查詢(xún)顯示 City 列值,如果 case 語(yǔ)句無(wú)效或找不到值,則顯示部分值,即 State返回列值。在這里,我們使用 ORDER BY 子句獲取了應(yīng)用 CASE 的學(xué)生、州和城市的名稱(chēng),以對(duì)結(jié)果行進(jìn)行排序。
在 Simple CASE 中,CASE 的列值與 WHEN 子句中的條件語(yǔ)句值匹配以實(shí)現(xiàn)等價(jià)性,然后在語(yǔ)法中的一個(gè)之后生成結(jié)果值。但如果沒(méi)有相等的值,則返回 ELSE 部分值(如果提供)。
您不應(yīng)在 WHEN 子句值中使用 NULL,因?yàn)槿绻麍?zhí)行,邏輯部分將為 NULL = NULL,結(jié)果為 FALSE。
現(xiàn)在對(duì)于 Search CASE,它遵循與 Simple CASE 相同的邏輯過(guò)程,但搜索案例的一部分使其執(zhí)行起來(lái)有所不同。在這里,滿足 MySQL 數(shù)據(jù)類(lèi)型的值的 CASE 是基于它用于的上下文。例如,如果語(yǔ)句中使用了字符串上下文,則結(jié)果值將采用相同的數(shù)據(jù)類(lèi)型,字符串。此外,如果 CASE 條件表達(dá)式使用數(shù)字上下文,則返回的值將是整數(shù)、小數(shù)或?qū)崝?shù)值數(shù)據(jù)類(lèi)型。
帶有 SELECT 和 ORDER BY 子句的 CASE 語(yǔ)句
創(chuàng)建數(shù)據(jù)庫(kù)表
CREATE TABLE Students(StudentID int, StudentName varchar(255), State varchar(255), City varchar(255));
往數(shù)據(jù)庫(kù)插入新值
INSERT INTO Students (StudentID, StudentName, State, City) VALUES ('01', 'Wade', 'UK', 'London'); INSERT INTO Students (StudentID, StudentName, State, City) VALUES ('02', 'Vivi', 'US', 'NewYork'); INSERT INTO Students (StudentID, StudentName, State, City) VALUES ('03', 'Kyrie', 'CN', 'SH'); INSERT INTO Students (StudentID, StudentName, State, City) VALUES ('04', 'James', '', 'Cleveland ');
查詢(xún)數(shù)據(jù)
SELECT * FROM Students;
帶有 SELECT 查詢(xún)的 CASE 語(yǔ)句
SELECT StudentName, State, City FROM Students ORDER BY ( CASE WHEN State IS NULL THEN City ELSE State END);
具有聚合函數(shù)的 CASE 語(yǔ)句
我們將使用 CASE 語(yǔ)句和 SUM()
MySQL 函數(shù)按訂單狀態(tài)從 Orders 表中計(jì)算總銷(xiāo)售額。
創(chuàng)建數(shù)據(jù)庫(kù)表
CREATE TABLE Orders (OrderID int,SalesID int, OrderStatus varchar(255) );
插入數(shù)據(jù)
INSERT INTO Orders (OrderID, SalesID,OrderStatus) VALUES ('10', '001', 'Shipped'); INSERT INTO Orders (OrderID, SalesID,OrderStatus) VALUES ('11', '002', 'Shipped'); INSERT INTO Orders (OrderID, SalesID,OrderStatus) VALUES ('12', '003', 'Not Developed'); INSERT INTO Orders (OrderID, SalesID,OrderStatus) VALUES ('13', '004', 'Success'); INSERT INTO Orders (OrderID, SalesID,OrderStatus) VALUES ('14', '005', 'In Process'); INSERT INTO Orders (OrderID, SalesID,OrderStatus) VALUES ('15', '006', 'Cancelled');
SELECT 語(yǔ)句顯示表數(shù)據(jù)
SELECT * FROM Orders;
得到的數(shù)據(jù)如下:
10 1 Shipped
11 2 Shipped
12 3 Not Developed
13 4 Success
14 5 In Process
15 6 Cancelled
在 SQL SELECT 查詢(xún)中使用 SUM() 和 COUNT 作為聚合函數(shù)的 CASE 語(yǔ)句
SELECT SUM(CASE WHEN OrderStatus = 'Success' THEN 1 ELSE 0 END) AS 'Success Count', SUM(CASE WHEN OrderStatus = 'On Hold' THEN 1 ELSE 0 END) AS 'Hold Count', SUM(CASE WHEN OrderStatus = 'In Process' THEN 1 ELSE 0 END) AS 'Processing', SUM(CASE WHEN OrderStatus = 'Shipped' THEN 1 ELSE 0 END) AS 'Shipping count', SUM(CASE WHEN OrderStatus = 'Cancelled' THEN 1 ELSE 0 END) AS 'Cancellation Count', SUM(CASE WHEN OrderStatus = 'Not Developed' THEN 1 ELSE 0 END) AS 'Not Developed count', COUNT(*) AS 'Sum Total' FROM Orders;
運(yùn)行結(jié)果:
補(bǔ)充:case行轉(zhuǎn)列用法
現(xiàn)有表數(shù)據(jù)如下圖所示(性別列中,1表示男,2表示女):
需統(tǒng)計(jì)各年級(jí)男女人數(shù)。雖然表中數(shù)據(jù)已有各年級(jí)的男女人數(shù),但是還是不夠一目了然。接下來(lái)使用case語(yǔ)句查詢(xún)?nèi)缦拢?/p>
SELECT class, sum( CASE WHEN sex = '1' THEN population ELSE 0 END ) AS cnt_m, sum( CASE WHEN sex = '2' THEN population ELSE 0 END ) AS cnt_f FROM `school_test` GROUP BY class;
結(jié)果如下:
這是最經(jīng)典的case行轉(zhuǎn)列用法。
總結(jié)
MySQL CASE 語(yǔ)句允許對(duì) SQL 查詢(xún)執(zhí)行 IF ELSE 邏輯,以檢查條件語(yǔ)句并從數(shù)據(jù)庫(kù)表中獲取所需的結(jié)果集或值。
我們只能將 CASE 語(yǔ)句與存儲(chǔ)過(guò)程、存儲(chǔ)事件、函數(shù)和觸發(fā)器一起使用。它用于將條件表達(dá)式與一系列不同的值進(jìn)行比較,這些值提供了相應(yīng)的結(jié)果,該結(jié)果包含取決于查詢(xún)中使用的上下文的數(shù)據(jù)類(lèi)型。
因此,我們可以說(shuō) MySQL 中的 CASE 語(yǔ)句使查詢(xún)代碼更加高效和可讀。
到此這篇關(guān)于MySQL基礎(chǔ)入門(mén)之Case語(yǔ)句用法的文章就介紹到這了,更多相關(guān)MySQL Case語(yǔ)句用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
參看文章:
相關(guān)文章
mysql觸發(fā)器之創(chuàng)建多個(gè)觸發(fā)器操作實(shí)例分析
這篇文章主要介紹了mysql觸發(fā)器之創(chuàng)建多個(gè)觸發(fā)器操作,結(jié)合實(shí)例形式分析了mysql創(chuàng)建及使用多個(gè)觸發(fā)器的相關(guān)操作技巧,需要的朋友可以參考下2019-12-12MySQL創(chuàng)建用戶(hù)和權(quán)限管理的方法
這篇文章主要介紹了MySQL創(chuàng)建用戶(hù)和權(quán)限管理的方法,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07MySQL連接拋出Authentication Failed錯(cuò)誤的分析與解決思路
這篇文章主要給大家介紹了關(guān)于MySQL連接拋出Authentication Failed錯(cuò)誤的分析與解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10MySQL連接器提升應(yīng)用功能與數(shù)據(jù)存儲(chǔ)能力
這篇文章主要為大家介紹了MySQL連接器提升應(yīng)用功能與數(shù)據(jù)存儲(chǔ)能力,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10