MySQL常用判斷函數小結
說到if else 你肯定不陌生,這種判斷函數在各種編程語言中是家常便飯,但在編寫SQL語句中,或許你就很少用到了,甚至還沒怎么玩兒過。
在MySQL中基于對條件判斷的函數又叫“控制流函數”,用于mysql語句中的邏輯判斷。本文帶大家一起來看一看MySQL中都有哪些常用的控制流函數,以及控制流函數的使用場景都有哪些?
一、函數: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、用在更新語句的更新條件中
給個情景1:婦女節(jié)大回饋,2020年注冊的新用戶,所有成年女性賬號送10元紅包,其他用戶送5元紅包,自動充值。
示例語句如下:
-- 送紅包語句 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'
需要注意的點,Case函數只返回第一個符合條件的值,剩下的Case when部分將會被自動忽略
2、用在查詢語句的返回值中
給個情景2:有個學生高考分數表,需要將等級列出來,650分以上是重點大學,600-650是一本,500-600分是二本,400-500是三本,400以下大專;
原測試數據如下:
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 '重點大學' 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 '重點大學' -> 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 | 重點大學 | | 14 | 朱志鵬 | 335 | 1810 | 大專 | | 19 | 李昂 | 550 | 766 | 二本 | +-----+-----------+-------------+------+----------------+ 8 rows in set (0.00 sec)
3、用在分組查詢語句中
給個情景3:用戶包括中國各個省市,需要以省為單位進行統(tǒng)計,山東省、廣州省和其他省市的用戶數量;(這里用于測試使用,實際情況下講道理表中應該會有歸屬省一列或者有另一張歸屬地表。)
數據如下:
mysql> select * from users_area; +----+--------------+-------------+ | id | city | users_count | +----+--------------+-------------+ | 1 | 北京 | 650 | | 2 | 上海 | 500 | | 3 | 濟南 | 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 '用戶數量', CASE c.city WHEN '濟南' THEN '山東省' WHEN '青島' THEN '山東省' WHEN '棗莊' THEN '山東省' WHEN '廣州' THEN '廣東省' WHEN '深圳' THEN '廣東省' ELSE '其他' END AS '歸屬省' FROM users_area c GROUP BY CASE c.city WHEN '濟南' THEN '山東省' WHEN '青島' THEN '山東省' WHEN '棗莊' THEN '山東省' WHEN '廣州' THEN '廣東省' WHEN '深圳' THEN '廣東省' ELSE '其他' END;
查詢結果:
mysql> SELECT -> SUM(c.users_count) AS '用戶數量', -> CASE c.city -> WHEN '濟南' THEN '山東省' -> WHEN '青島' THEN '山東省' -> WHEN '棗莊' THEN '山東省' -> WHEN '廣州' THEN '廣東省' -> WHEN '深圳' THEN '廣東省' -> ELSE '其他' END AS '歸屬省' -> FROM -> users_area c -> GROUP BY CASE c.city -> WHEN '濟南' THEN '山東省' -> WHEN '青島' THEN '山東省' -> WHEN '棗莊' THEN '山東省' -> WHEN '廣州' THEN '廣東省' -> WHEN '深圳' THEN '廣東省' -> ELSE '其他' END; +--------------+-----------+ | 用戶數量 | 歸屬省 | +--------------+-----------+ | 1230 | 其他 | | 520 | 山東省 | | 750 | 廣東省 | +--------------+-----------+ 3 rows in set (0.00 sec)
二、函數:IF(expr,if_true_expr,if_false_expr)
在mysql中if()函數的用法類似于java中的三目表達式,具體語法如下:
IF(expr,if_true_expr,if_false_expr)
,如果expr的值為true,則返回if_true_expr的值,如果expr的值為false,則返回if_false_expr的值。
使用場景1:IF函數通常用于真實數據被替代的列;如性別,我們在庫中一般用tinyint存儲,男 = 1,女 = 2;如查詢時需轉成字符,該場景就適用于IF函數。
原數據:
mysql> select * from student; +----+-----------+-----+---------+-----------+ | ID | NAME | SEX | GRADE | HOBBY | +----+-----------+-----+---------+-----------+ | 1 | 陳哈哈 | 1 | 9年級 | 上網 | | 2 | 扈亞鵬 | 1 | 9年級 | 美食 | | 3 | 劉曉莉 | 2 | 9年級 | 金希澈 | | 5 | 徐立楠 | 2 | 9年級 | 閱讀 | | 6 | 顧昊 | 1 | 9年級 | 籃球 | | 7 | 陳子凝 | 2 | 9年級 | 看電影 | | 14 | 朱志鵬 | 1 | 9年級 | 看小說 | | 15 | 賈旭 | 1 | 9年級 | 吹牛逼 | | 19 | 李昂 | 1 | 9年級 | 看片兒 | +----+-----------+-----+---------+-----------+ 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)格式數據改為(‘男’,‘女’)也可以通過IF函數修改(記得先修改列類型),SQL如下:
mysql> UPDATE student set sex = IF(sex = 1,'男','女'); Query OK, 9 rows affected (0.06 sec) Rows matched: 9 Changed: 9 Warnings: 0
修改后數據:
mysql> select * from student; +----+-----------+-----+---------+-----------+ | ID | NAME | SEX | GRADE | HOBBY | +----+-----------+-----+---------+-----------+ | 1 | 陳哈哈 | 男 | 9年級 | 上網 | | 2 | 扈亞鵬 | 男 | 9年級 | 美食 | | 3 | 劉曉莉 | 女 | 9年級 | 金希澈 | | 5 | 徐立楠 | 女 | 9年級 | 閱讀 | | 6 | 顧昊 | 男 | 9年級 | 籃球 | | 7 | 陳子凝 | 女 | 9年級 | 看電影 | | 14 | 朱志鵬 | 男 | 9年級 | 看小說 | | 15 | 賈旭 | 男 | 9年級 | 吹牛逼 | | 19 | 李昂 | 男 | 9年級 | 看片兒 | +----+-----------+-----+---------+-----------+ 9 rows in set (0.00 sec)
使用場景2:沿用上面的班級表,查詢男生和女生的總人數;SQL如下:
(sex='男’的返回1,然后用SUM相加得出男生人數,女生同理。)
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)
三、函數:IFNULL(expr1,expr2)
IFNULL函數是MySQL控制流函數之一,它有兩個參數,兩個參數可以是真實值或表達式,如果expr1不是NULL,則返回第一個參數(expr1)。 否則,IFNULL函數返回第二個參數。
原始數據:
mysql> select * from student; +----+-----------+------+---------+-----------+ | ID | NAME | SEX | GRADE | HOBBY | +----+-----------+------+---------+-----------+ | 1 | 陳哈哈 | 男 | 9年級 | 上網 | | 2 | 扈亞鵬 | 男 | 9年級 | 美食 | | 3 | 劉曉莉 | 女 | 9年級 | 金希澈 | | 5 | 徐立楠 | 女 | 9年級 | 閱讀 | | 6 | 顧昊 | 男 | 9年級 | 籃球 | | 7 | 陳子凝 | 女 | 9年級 | 看電影 | | 14 | 朱志鵬 | NULL | 9年級 | 看小說 | | 19 | 李昂 | NULL | 9年級 | 看片兒 | +----+-----------+------+---------+-----------+ 8 rows in set (0.00 sec)
將SEX為NULL的數據展示為:‘未知’:
mysql> SELECT `NAME`,IFNULL(sex,'未知') from student; +-----------+----------------------+ | NAME | IFNULL(sex,'未知') | +-----------+----------------------+ | 陳哈哈 | 男 | | 扈亞鵬 | 男 | | 劉曉莉 | 女 | | 徐立楠 | 女 | | 顧昊 | 男 | | 陳子凝 | 女 | | 朱志鵬 | 未知 | | 李昂 | 未知 | +-----------+----------------------+ 8 rows in set (0.00 sec)
到此這篇關于MySQL常用判斷函數小結的文章就介紹到這了,更多相關MySQL 判斷函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql中自增auto_increment功能的相關設置及問題
mysql中的自增auto_increment功能相信每位phper都用過,本文就為大家分享一下mysql字段自增功能的具體查看及設置方法2012-12-12Mysql數據庫高級用法之視圖、事務、索引、自連接、用戶管理實例分析
這篇文章主要介紹了Mysql數據庫高級用法之視圖、事務、索引、自連接、用戶管理,結合實例形式分析了MySQL數據庫視圖、事務、索引、自連接、用戶管理常見用法及操作注意事項,需要的朋友可以參考下2019-11-11