小伙伴想精準查找自己想看的MySQL文章?喏 → MySQL江湖路 | 專欄目錄
??說到if else 你肯定不陌生,這種判斷函式在各種編程語言中是家常便飯,但在撰寫SQL陳述句中,或許你就很少用到了,甚至還沒怎么玩兒過,
??在MySQL中基于對條件判斷的函式又叫“控制流函式”,用于mysql陳述句中的邏輯判斷,本文帶大家一起來看一看MySQL中都有哪些常用的控制流函式,以及控制流函式的使用場景都有哪些?

目錄
- 一、函式:CASE WHEN ... THEN ... ELSE ... END
- 1、用在更新陳述句的更新條件中
- 2、用在查詢陳述句的回傳值中
- 3、用在分組查詢陳述句中
- 二、函式:IF(expr,if_true_expr,if_false_expr)
- 三、函式:IFNULL(expr1,expr2)
- 附、一張有故事的照片(九)
一、函式: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:婦女節大回饋,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:用戶包括中國各個省市,需要以省為單位進行統計,山東省、廣州省和其他省市的用戶數量;(這里用于測驗使用,實際情況下講道理表中應該會有歸屬省一列或者有另一張歸屬地表,)
資料如下:
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)
附、一張有故事的照片(九)

這張圖片來自08年汶川;
在地震中痛失妻子的男子飽含深情,
不忍將亡妻棄之野外,
將其身體與自己綁在一起,
用摩托車載著她前往當地的太平間,
在極大悲痛的折磨中,
他仍努力要給妻子些許死后的尊嚴,
CSDN認證博客專家
MySQL江湖人
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/202499.html
標籤:AI
