MySQL常用判斷函數(shù)小結(jié)
說到if else 你肯定不陌生,這種判斷函數(shù)在各種編程語言中是家常便飯,但在編寫SQL語句中,或許你就很少用到了,甚至還沒怎么玩兒過。
在MySQL中基于對(duì)條件判斷的函數(shù)又叫“控制流函數(shù)”,用于mysql語句中的邏輯判斷。本文帶大家一起來看一看MySQL中都有哪些常用的控制流函數(shù),以及控制流函數(shù)的使用場景都有哪些?
一、函數(shù):CASE WHEN … THEN … ELSE … END
在SQL語句中,"CASE WHEN … THEN … ELSE … END"是較常見的用來判斷的語句,適用于增刪改查各類語句中,公式如下:
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、用在更新語句的更新條件中
給個(gè)情景1:婦女節(jié)大回饋,2020年注冊的新用戶,所有成年女性賬號(hào)送10元紅包,其他用戶送5元紅包,自動(dòng)充值。
示例語句如下:
-- 送紅包語句 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、用在查詢語句的返回值中
給個(gè)情景2:有個(gè)學(xué)生高考分?jǐn)?shù)表,需要將等級(jí)列出來,650分以上是重點(diǎn)大學(xué),600-650是一本,500-600分是二本,400-500是三本,400以下大專;
原測試數(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)
查詢語句:
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 '大專' 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 '大專' end as status_student -> from student_score; +-----+-----------+-------------+------+----------------+ | SID | S_NAME | TOTAL_SCORE | RANK | status_student | +-----+-----------+-------------+------+----------------+ | 1 | 陳哈哈 | 385 | 1760 | 大專 | | 2 | 扈亞鵬 | 491 | 1170 | 三本 | | 3 | 劉曉莉 | 508 | 1000 | 二本 | | 5 | 徐立楠 | 599 | 701 | 二本 | | 6 | 顧昊 | 601 | 664 | 一本 | | 7 | 陳子凝 | 680 | 9 | 重點(diǎn)大學(xué) | | 14 | 朱志鵬 | 335 | 1810 | 大專 | | 19 | 李昂 | 550 | 766 | 二本 | +-----+-----------+-------------+------+----------------+ 8 rows in set (0.00 sec)
3、用在分組查詢語句中
給個(gè)情景3:用戶包括中國各個(gè)省市,需要以省為單位進(jìn)行統(tǒng)計(jì),山東省、廣州省和其他省市的用戶數(shù)量;(這里用于測試使用,實(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)
分組查詢SQL:
SELECT SUM(c.users_count) AS '用戶數(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;
查詢結(jié)果:
mysql> SELECT -> SUM(c.users_count) AS '用戶數(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; +--------------+-----------+ | 用戶數(shù)量 | 歸屬省 | +--------------+-----------+ | 1230 | 其他 | | 520 | 山東省 | | 750 | 廣東省 | +--------------+-----------+ 3 rows in set (0.00 sec)
二、函數(shù):IF(expr,if_true_expr,if_false_expr)
在mysql中if()函數(shù)的用法類似于java中的三目表達(dá)式,具體語法如下:
IF(expr,if_true_expr,if_false_expr)
,如果expr的值為true,則返回if_true_expr的值,如果expr的值為false,則返回if_false_expr的值。
使用場景1:IF函數(shù)通常用于真實(shí)數(shù)據(jù)被替代的列;如性別,我們在庫中一般用tinyint存儲(chǔ),男 = 1,女 = 2;如查詢時(shí)需轉(zhuǎn)成字符,該場景就適用于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í) | 看小說 | | 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ù)改為(‘男’,‘女’)也可以通過IF函數(shù)修改(記得先修改列類型),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í) | 看小說 | | 15 | 賈旭 | 男 | 9年級(jí) | 吹牛逼 | | 19 | 李昂 | 男 | 9年級(jí) | 看片兒 | +----+-----------+-----+---------+-----------+ 9 rows in set (0.00 sec)
使用場景2:沿用上面的班級(jí)表,查詢男生和女生的總?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í) | 看小說 | | 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Window系統(tǒng)下自動(dòng)備份MySql數(shù)據(jù)庫方法
Window下可以使用Bat批處理文件來對(duì)MySql進(jìn)行備份操作,備份時(shí)一般數(shù)據(jù)量較大的情況可以使用復(fù)制文件的方式,但是這種方式要求服務(wù)器停機(jī)或者停止寫入命令,不大使用2012-11-11MYSQL中 TYPE=MyISAM 錯(cuò)誤的解決方法
這篇文章主要介紹了MYSQL中 TYPE=MyISAM 錯(cuò)誤的解決方法,需要的朋友可以參考下2014-08-08mysql中自增auto_increment功能的相關(guān)設(shè)置及問題
mysql中的自增auto_increment功能相信每位phper都用過,本文就為大家分享一下mysql字段自增功能的具體查看及設(shè)置方法2012-12-12Centos中安裝多個(gè)mysql數(shù)據(jù)的配置實(shí)例
最近因?yàn)閱挝豁?xiàng)目擴(kuò)充,需要在原線上數(shù)據(jù)庫服務(wù)器上加裝一個(gè)mysql實(shí)例(實(shí)際上就是從新編譯安裝一個(gè)非3306的自定義端口,不同目錄的mysql),研究了一天,終于順利搞定,這里把配置步驟發(fā)給大家,供大家學(xué)習(xí)使用2014-04-04Mysql數(shù)據(jù)庫高級(jí)用法之視圖、事務(wù)、索引、自連接、用戶管理實(shí)例分析
這篇文章主要介紹了Mysql數(shù)據(jù)庫高級(jí)用法之視圖、事務(wù)、索引、自連接、用戶管理,結(jié)合實(shí)例形式分析了MySQL數(shù)據(jù)庫視圖、事務(wù)、索引、自連接、用戶管理常見用法及操作注意事項(xiàng),需要的朋友可以參考下2019-11-11