MySQL常用判斷函數(shù)小結(jié)
說(shuō)到if else 你肯定不陌生,這種判斷函數(shù)在各種編程語(yǔ)言中是家常便飯,但在編寫(xiě)SQL語(yǔ)句中,或許你就很少用到了,甚至還沒(méi)怎么玩兒過(guò)。
在MySQL中基于對(duì)條件判斷的函數(shù)又叫“控制流函數(shù)”,用于mysql語(yǔ)句中的邏輯判斷。本文帶大家一起來(lái)看一看MySQL中都有哪些常用的控制流函數(shù),以及控制流函數(shù)的使用場(chǎng)景都有哪些?
一、函數(shù):CASE WHEN … THEN … ELSE … END
在SQL語(yǔ)句中,"CASE WHEN … THEN … ELSE … END"是較常見(jiàn)的用來(lái)判斷的語(yǔ)句,適用于增刪改查各類(lèi)語(yǔ)句中,公式如下:
CASE expression WHEN if_true_expr THEN return_value1 WHEN if_true_expr THEN return_value2 WHEN if_true_expr THEN return_value3 …… ELSE default_return_value END
1、用在更新語(yǔ)句的更新條件中
給個(gè)情景1:婦女節(jié)大回饋,2020年注冊(cè)的新用戶(hù),所有成年女性賬號(hào)送10元紅包,其他用戶(hù)送5元紅包,自動(dòng)充值。
示例語(yǔ)句如下:
-- 送紅包語(yǔ)句
UPDATE users_info u
SET u.balance = CASE WHEN u.sex ='女' and u.age > 18 THEN u.balance + 10
ELSE u.balance + 5 end
WHERE u.create_time >= '2020-01-01'需要注意的點(diǎn),Case函數(shù)只返回第一個(gè)符合條件的值,剩下的Case when部分將會(huì)被自動(dòng)忽略
2、用在查詢(xún)語(yǔ)句的返回值中
給個(gè)情景2:有個(gè)學(xué)生高考分?jǐn)?shù)表,需要將等級(jí)列出來(lái),650分以上是重點(diǎn)大學(xué),600-650是一本,500-600分是二本,400-500是三本,400以下大專(zhuān);
原測(cè)試數(shù)據(jù)如下:
mysql> select * from student_score; +-----+-----------+-------------+------+ | SID | S_NAME | TOTAL_SCORE | RANK | +-----+-----------+-------------+------+ | 1 | 陳哈哈 | 385 | 1760 | | 2 | 扈亞鵬 | 491 | 1170 | | 3 | 劉曉莉 | 508 | 1000 | | 5 | 徐立楠 | 599 | 701 | | 6 | 顧昊 | 601 | 664 | | 7 | 陳子凝 | 680 | 9 | | 14 | 朱志鵬 | 335 | 1810 | | 19 | 李昂 | 550 | 766 | +-----+-----------+-------------+------+ 8 rows in set (0.00 sec)
查詢(xún)語(yǔ)句:
SELECT *,case when total_score >= 650 THEN '重點(diǎn)大學(xué)'
when total_score >= 600 and total_score <650 THEN '一本'
when total_score >= 500 and total_score <600 THEN '二本'
when total_score >= 400 and total_score <500 THEN '三本'
else '大專(zhuān)' end as status_student
from student_score;mysql> SELECT *,case when total_score >= 650 THEN '重點(diǎn)大學(xué)'
-> when total_score >= 600 and total_score <650 THEN '一本'
-> when total_score >= 500 and total_score <600 THEN '二本'
-> when total_score >= 400 and total_score <500 THEN '三本'
-> else '大專(zhuān)' end as status_student
-> from student_score;
+-----+-----------+-------------+------+----------------+
| SID | S_NAME | TOTAL_SCORE | RANK | status_student |
+-----+-----------+-------------+------+----------------+
| 1 | 陳哈哈 | 385 | 1760 | 大專(zhuān) |
| 2 | 扈亞鵬 | 491 | 1170 | 三本 |
| 3 | 劉曉莉 | 508 | 1000 | 二本 |
| 5 | 徐立楠 | 599 | 701 | 二本 |
| 6 | 顧昊 | 601 | 664 | 一本 |
| 7 | 陳子凝 | 680 | 9 | 重點(diǎn)大學(xué) |
| 14 | 朱志鵬 | 335 | 1810 | 大專(zhuān) |
| 19 | 李昂 | 550 | 766 | 二本 |
+-----+-----------+-------------+------+----------------+
8 rows in set (0.00 sec)3、用在分組查詢(xún)語(yǔ)句中
給個(gè)情景3:用戶(hù)包括中國(guó)各個(gè)省市,需要以省為單位進(jìn)行統(tǒng)計(jì),山東省、廣州省和其他省市的用戶(hù)數(shù)量;(這里用于測(cè)試使用,實(shí)際情況下講道理表中應(yīng)該會(huì)有歸屬省一列或者有另一張歸屬地表。)
數(shù)據(jù)如下:
mysql> select * from users_area; +----+--------------+-------------+ | id | city | users_count | +----+--------------+-------------+ | 1 | 北京 | 650 | | 2 | 上海 | 500 | | 3 | 濟(jì)南 | 300 | | 4 | 青島 | 100 | | 5 | 廣州 | 350 | | 6 | 深圳 | 400 | | 7 | 棗莊 | 120 | | 8 | 烏魯木齊 | 80 | +----+--------------+-------------+ 8 rows in set (0.00 sec)
分組查詢(xún)SQL:
SELECT
SUM(c.users_count) AS '用戶(hù)數(shù)量',
CASE c.city
WHEN '濟(jì)南' THEN '山東省'
WHEN '青島' THEN '山東省'
WHEN '棗莊' THEN '山東省'
WHEN '廣州' THEN '廣東省'
WHEN '深圳' THEN '廣東省'
ELSE '其他' END AS '歸屬省'
FROM
users_area c
GROUP BY CASE c.city
WHEN '濟(jì)南' THEN '山東省'
WHEN '青島' THEN '山東省'
WHEN '棗莊' THEN '山東省'
WHEN '廣州' THEN '廣東省'
WHEN '深圳' THEN '廣東省'
ELSE '其他' END;查詢(xún)結(jié)果:
mysql> SELECT
-> SUM(c.users_count) AS '用戶(hù)數(shù)量',
-> CASE c.city
-> WHEN '濟(jì)南' THEN '山東省'
-> WHEN '青島' THEN '山東省'
-> WHEN '棗莊' THEN '山東省'
-> WHEN '廣州' THEN '廣東省'
-> WHEN '深圳' THEN '廣東省'
-> ELSE '其他' END AS '歸屬省'
-> FROM
-> users_area c
-> GROUP BY CASE c.city
-> WHEN '濟(jì)南' THEN '山東省'
-> WHEN '青島' THEN '山東省'
-> WHEN '棗莊' THEN '山東省'
-> WHEN '廣州' THEN '廣東省'
-> WHEN '深圳' THEN '廣東省'
-> ELSE '其他' END;
+--------------+-----------+
| 用戶(hù)數(shù)量 | 歸屬省 |
+--------------+-----------+
| 1230 | 其他 |
| 520 | 山東省 |
| 750 | 廣東省 |
+--------------+-----------+
3 rows in set (0.00 sec)二、函數(shù):IF(expr,if_true_expr,if_false_expr)
在mysql中if()函數(shù)的用法類(lèi)似于java中的三目表達(dá)式,具體語(yǔ)法如下:
IF(expr,if_true_expr,if_false_expr),如果expr的值為true,則返回if_true_expr的值,如果expr的值為false,則返回if_false_expr的值。
使用場(chǎng)景1:IF函數(shù)通常用于真實(shí)數(shù)據(jù)被替代的列;如性別,我們?cè)趲?kù)中一般用tinyint存儲(chǔ),男 = 1,女 = 2;如查詢(xún)時(shí)需轉(zhuǎn)成字符,該場(chǎng)景就適用于IF函數(shù)。
原數(shù)據(jù):
mysql> select * from student; +----+-----------+-----+---------+-----------+ | ID | NAME | SEX | GRADE | HOBBY | +----+-----------+-----+---------+-----------+ | 1 | 陳哈哈 | 1 | 9年級(jí) | 上網(wǎng) | | 2 | 扈亞鵬 | 1 | 9年級(jí) | 美食 | | 3 | 劉曉莉 | 2 | 9年級(jí) | 金希澈 | | 5 | 徐立楠 | 2 | 9年級(jí) | 閱讀 | | 6 | 顧昊 | 1 | 9年級(jí) | 籃球 | | 7 | 陳子凝 | 2 | 9年級(jí) | 看電影 | | 14 | 朱志鵬 | 1 | 9年級(jí) | 看小說(shuō) | | 15 | 賈旭 | 1 | 9年級(jí) | 吹牛逼 | | 19 | 李昂 | 1 | 9年級(jí) | 看片兒 | +----+-----------+-----+---------+-----------+ 9 rows in set (0.00 sec)
處理sex字段為字符格式展示;
mysql> SELECT `NAME`,IF(sex = 1,'男','女') FROM student; +-----------+-------------------------+ | NAME | IF(sex = 1,'男','女') | +-----------+-------------------------+ | 陳哈哈 | 男 | | 扈亞鵬 | 男 | | 劉曉莉 | 女 | | 徐立楠 | 女 | | 顧昊 | 男 | | 陳子凝 | 女 | | 朱志鵬 | 男 | | 賈旭 | 男 | | 李昂 | 男 | +-----------+-------------------------+ 9 rows in set (0.00 sec)
如果將(1,2)格式數(shù)據(jù)改為(‘男’,‘女’)也可以通過(guò)IF函數(shù)修改(記得先修改列類(lèi)型),SQL如下:
mysql> UPDATE student set sex = IF(sex = 1,'男','女'); Query OK, 9 rows affected (0.06 sec) Rows matched: 9 Changed: 9 Warnings: 0
修改后數(shù)據(jù):
mysql> select * from student; +----+-----------+-----+---------+-----------+ | ID | NAME | SEX | GRADE | HOBBY | +----+-----------+-----+---------+-----------+ | 1 | 陳哈哈 | 男 | 9年級(jí) | 上網(wǎng) | | 2 | 扈亞鵬 | 男 | 9年級(jí) | 美食 | | 3 | 劉曉莉 | 女 | 9年級(jí) | 金希澈 | | 5 | 徐立楠 | 女 | 9年級(jí) | 閱讀 | | 6 | 顧昊 | 男 | 9年級(jí) | 籃球 | | 7 | 陳子凝 | 女 | 9年級(jí) | 看電影 | | 14 | 朱志鵬 | 男 | 9年級(jí) | 看小說(shuō) | | 15 | 賈旭 | 男 | 9年級(jí) | 吹牛逼 | | 19 | 李昂 | 男 | 9年級(jí) | 看片兒 | +----+-----------+-----+---------+-----------+ 9 rows in set (0.00 sec)
使用場(chǎng)景2:沿用上面的班級(jí)表,查詢(xún)男生和女生的總?cè)藬?shù);SQL如下:
(sex='男’的返回1,然后用SUM相加得出男生人數(shù),女生同理。)
SELECT SUM(IF(sex = '男',1,0)) as boyNum, SUM(IF(sex = '女',1,0)) as girlNum from student;
mysql> SELECT SUM(IF(sex = '男',1,0)) as boyNum,SUM(IF(sex = '女',1,0)) as girlNum from student; +--------+---------+ | boyNum | girlNum | +--------+---------+ | 6 | 3 | +--------+---------+ 1 row in set (0.00 sec)
三、函數(shù):IFNULL(expr1,expr2)
IFNULL函數(shù)是MySQL控制流函數(shù)之一,它有兩個(gè)參數(shù),兩個(gè)參數(shù)可以是真實(shí)值或表達(dá)式,如果expr1不是NULL,則返回第一個(gè)參數(shù)(expr1)。 否則,IFNULL函數(shù)返回第二個(gè)參數(shù)。
原始數(shù)據(jù):
mysql> select * from student; +----+-----------+------+---------+-----------+ | ID | NAME | SEX | GRADE | HOBBY | +----+-----------+------+---------+-----------+ | 1 | 陳哈哈 | 男 | 9年級(jí) | 上網(wǎng) | | 2 | 扈亞鵬 | 男 | 9年級(jí) | 美食 | | 3 | 劉曉莉 | 女 | 9年級(jí) | 金希澈 | | 5 | 徐立楠 | 女 | 9年級(jí) | 閱讀 | | 6 | 顧昊 | 男 | 9年級(jí) | 籃球 | | 7 | 陳子凝 | 女 | 9年級(jí) | 看電影 | | 14 | 朱志鵬 | NULL | 9年級(jí) | 看小說(shuō) | | 19 | 李昂 | NULL | 9年級(jí) | 看片兒 | +----+-----------+------+---------+-----------+ 8 rows in set (0.00 sec)
將SEX為NULL的數(shù)據(jù)展示為:‘未知’:
mysql> SELECT `NAME`,IFNULL(sex,'未知') from student; +-----------+----------------------+ | NAME | IFNULL(sex,'未知') | +-----------+----------------------+ | 陳哈哈 | 男 | | 扈亞鵬 | 男 | | 劉曉莉 | 女 | | 徐立楠 | 女 | | 顧昊 | 男 | | 陳子凝 | 女 | | 朱志鵬 | 未知 | | 李昂 | 未知 | +-----------+----------------------+ 8 rows in set (0.00 sec)
到此這篇關(guān)于MySQL常用判斷函數(shù)小結(jié)的文章就介紹到這了,更多相關(guān)MySQL 判斷函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql 的存儲(chǔ)引擎,myisam和innodb的區(qū)別
這篇文章主要介紹了Mysql 的存儲(chǔ)引擎,myisam和innodb的區(qū)別,需要的朋友可以參考下2014-12-12
MySQL進(jìn)行分片合并的實(shí)現(xiàn)步驟
分片合并是指在分布式數(shù)據(jù)庫(kù)系統(tǒng)中,將不同分片上的查詢(xún)結(jié)果進(jìn)行整合,以獲得完整的查詢(xún)結(jié)果,下面就來(lái)具體介紹一下,感興趣的可以了解一下2025-08-08
MySQL的備份工具mysqldump的基礎(chǔ)使用命令總結(jié)
這篇文章主要介紹了MySQL的備份工具mysqldump的基礎(chǔ)使用命令總結(jié),除了基本的導(dǎo)入導(dǎo)出,還介紹了其他一些命令參數(shù)的用法,需要的朋友可以參考下2015-12-12
MySQL安裝過(guò)程報(bào)starting?the?server報(bào)錯(cuò)詳細(xì)解決方案(附MySQL安裝程序)
如果電腦是第一次安裝MySQL,一般不會(huì)出現(xiàn)這樣的報(bào)錯(cuò),starting the server失敗通常是因?yàn)樯洗伟惭b的該軟件未清除干凈,這篇文章主要給大家介紹了關(guān)于MySQL安裝過(guò)程報(bào)starting?the?server報(bào)錯(cuò)的詳細(xì)解決方案,文中還附MySQL安裝程序,需要的朋友可以參考下2024-03-03
解決MySQL8.0安裝第一次登陸修改密碼時(shí)出現(xiàn)的問(wèn)題
這篇文章主要介紹了解決MySQL8.0安裝第一次登陸修改密碼時(shí)出現(xiàn)的問(wèn)題,在文章開(kāi)頭給大家介紹了mysql 8.0.16 初次登錄修改密碼的方法,需要的朋友可以參考下2019-06-06

