MySQL中關(guān)于case when的用法
MySQL的case when語法有兩種
- 1.簡單函數(shù)
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
- 2.搜索函數(shù)
CASE WHEN [expr] THEN [result1]…ELSE [default] END
這兩種語法有什么區(qū)別呢?
簡單函數(shù)
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END???????
枚舉這個(gè)字段所有可能的值*
SELECT NAME '英雄', CASE NAME WHEN '德萊文' THEN '斧子' WHEN '德瑪西亞-蓋倫' THEN '大寶劍' WHEN '暗夜獵手-VN' THEN '弩' ELSE '無' END '裝備' FROM user_info;
搜索函數(shù)
CASE WHEN [expr] THEN [result1]…ELSE [default] END???????
搜索函數(shù)可以寫判斷,并且搜索函數(shù)只會(huì)返回第一個(gè)符合條件的值,其他case
被忽略
# when 表達(dá)式中可以使用 and 連接條件 SELECT NAME '英雄', age '年齡', CASE WHEN age < 18 THEN '少年' WHEN age < 30 THEN '青年' WHEN age >= 30 AND age < 50 THEN '中年' ELSE '老年' END '狀態(tài)' FROM user_info;
聚合函數(shù)sum配合case when的簡單函數(shù)實(shí)現(xiàn)多表left join的行轉(zhuǎn)列
注:
曾經(jīng)有個(gè)愛學(xué)習(xí)的路人問我,“那個(gè)sum()
只是為了好看一點(diǎn)嗎?”,left join
會(huì)以左表為主,連接右表時(shí),得到所有匹配的數(shù)據(jù),再group by
時(shí)只會(huì)保留一行數(shù)據(jù),因此case when
時(shí)要借助sum
函數(shù),保留其他列的和。
如果你還是不明白的話,那就親手實(shí)踐一下,只保留left join
看一下結(jié)果,再group by
,看一下結(jié)果。
例如下面的案例:
學(xué)生表/課程表/成績表 ,三個(gè)表left join
查詢每個(gè)學(xué)生所有科目的成績,使每個(gè)學(xué)生及其各科成績一行展示。
SELECT st.stu_id '學(xué)號', st.stu_name '姓名', sum( CASE co.course_name WHEN '大學(xué)語文' THEN sc.scores ELSE 0 END ) '大學(xué)語文', sum( CASE co.course_name WHEN '新視野英語' THEN sc.scores ELSE 0 END ) '新視野英語', sum( CASE co.course_name WHEN '離散數(shù)學(xué)' THEN sc.scores ELSE 0 END ) '離散數(shù)學(xué)', sum( CASE co.course_name WHEN '概率論與數(shù)理統(tǒng)計(jì)' THEN sc.scores ELSE 0 END ) '概率論與數(shù)理統(tǒng)計(jì)', sum( CASE co.course_name WHEN '線性代數(shù)' THEN sc.scores ELSE 0 END ) '線性代數(shù)', sum( CASE co.course_name WHEN '高等數(shù)學(xué)' THEN sc.scores ELSE 0 END ) '高等數(shù)學(xué)' FROM edu_student st LEFT JOIN edu_score sc ON st.stu_id = sc.stu_id LEFT JOIN edu_courses co ON co.course_no = sc.course_no GROUP BY st.stu_id ORDER BY NULL;
行轉(zhuǎn)列測試數(shù)據(jù)
-- 創(chuàng)建表 學(xué)生表 CREATE TABLE `edu_student` ( `stu_id` VARCHAR (16) NOT NULL COMMENT '學(xué)號', `stu_name` VARCHAR (20) NOT NULL COMMENT '學(xué)生姓名', PRIMARY KEY (`stu_id`) ) COMMENT = '學(xué)生表' ENGINE = INNODB; -- 課程表 CREATE TABLE `edu_courses` ( `course_no` VARCHAR (20) NOT NULL COMMENT '課程編號', `course_name` VARCHAR (100) NOT NULL COMMENT '課程名稱', PRIMARY KEY (`course_no`) ) COMMENT = '課程表' ENGINE = INNODB; -- 成績表 CREATE TABLE `edu_score` ( `stu_id` VARCHAR (16) NOT NULL COMMENT '學(xué)號', `course_no` VARCHAR (20) NOT NULL COMMENT '課程編號', `scores` FLOAT NULL DEFAULT NULL COMMENT '得分', PRIMARY KEY (`stu_id`, `course_no`) ) COMMENT = '成績表' ENGINE = INNODB; -- 插入數(shù)據(jù) -- 學(xué)生表數(shù)據(jù) INSERT INTO edu_student (stu_id, stu_name) VALUES ('1001', '盲僧'), ('1002', '趙信'), ('1003', '皇子'), ('1004', '寒冰'), ('1005', '蠻王'), ('1006', '狐貍'); -- 課程表數(shù)據(jù) INSERT INTO edu_courses (course_no, course_name) VALUES ('C001', '大學(xué)語文'), ('C002', '新視野英語'), ('C003', '離散數(shù)學(xué)'), ( 'C004', '概率論與數(shù)理統(tǒng)計(jì)' ), ('C005', '線性代數(shù)'), ('C006', '高等數(shù)學(xué)'); -- 成績表數(shù)據(jù) INSERT INTO edu_score (stu_id, course_no, scores) VALUES ('1001', 'C001', 67), ('1002', 'C001', 68), ('1003', 'C001', 69), ('1004', 'C001', 70), ('1005', 'C001', 71), ('1006', 'C001', 72), ('1001', 'C002', 87), ('1002', 'C002', 88), ('1003', 'C002', 89), ('1004', 'C002', 90), ('1005', 'C002', 91), ('1006', 'C002', 92), ('1001', 'C003', 83), ('1002', 'C003', 84), ('1003', 'C003', 85), ('1004', 'C003', 86), ('1005', 'C003', 87), ('1006', 'C003', 88), ('1001', 'C004', 88), ('1002', 'C004', 89), ('1003', 'C004', 90), ('1004', 'C004', 91), ('1005', 'C004', 92), ('1006', 'C004', 93), ('1001', 'C005', 77), ('1002', 'C005', 78), ('1003', 'C005', 79);
case when練習(xí)
有如下表結(jié)構(gòu),統(tǒng)計(jì)2019-10-21 00:00:00~2019-12-02 23:59:59
時(shí)間段內(nèi)的用戶并標(biāo)記新老用戶
CREATE TABLE `tb_hotel_user` ( `customer_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '旅客id', `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', `user_id` bigint(10) NULL DEFAULT NULL COMMENT '用戶id', `check_in_time` datetime(0) NULL DEFAULT NULL COMMENT '入住時(shí)間', `check_out_time` datetime(0) NULL DEFAULT NULL COMMENT '離店時(shí)間', PRIMARY KEY (`customer_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact; INSERT INTO `tb_hotel_user` VALUES (1, '張三', 1, '2019-12-02 14:18:57', NULL); INSERT INTO `tb_hotel_user` VALUES (2, '劉大', 2, '2019-11-08 14:19:07', NULL); INSERT INTO `tb_hotel_user` VALUES (3, '關(guān)二', 3, '2019-10-17 14:19:21', NULL); INSERT INTO `tb_hotel_user` VALUES (4, '關(guān)二', 3, '2019-12-02 14:19:44', NULL); INSERT INTO `tb_hotel_user` VALUES (5, '趙四', 4, '2019-11-29 14:19:54', NULL); -- 答案 SELECT a.user_id, CASE WHEN ISNULL( b.user_id ) THEN 1 ELSE 2 END newUser FROM ( SELECT DISTINCT user_id FROM tb_hotel_user WHERE check_in_time >= '2019-10-21 00:00:00' AND check_in_time <= '2019-12-02 23:59:59' ) a LEFT JOIN ( SELECT user_id FROM tb_hotel_user WHERE check_in_time <= '2019-12-02 23:59:59' GROUP BY user_id HAVING count( * ) > 1 ) b ON a.user_id = b.user_id
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
借助PHP的mysql_query()函數(shù)來創(chuàng)建MySQL數(shù)據(jù)庫的教程
這篇文章主要介紹了借助PHP的mysql_query()函數(shù)來創(chuàng)建MySQL數(shù)據(jù)庫的教程,將函數(shù)配合CREATE DATABASE語句使用,需要的朋友可以參考下2015-12-12MySql數(shù)據(jù)庫自動(dòng)遞增值問題
這篇文章主要介紹了MySql數(shù)據(jù)庫自動(dòng)遞增值問題的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07MySql 5.7.17 winx64的安裝配置詳細(xì)教程
這篇文章主要介紹了MySql 5.7.17 winx64的安裝配置教程,初始化數(shù)據(jù)庫、配置相關(guān)信息的方法在本文中介紹的非常詳細(xì),需要的朋友參考下2017-01-01在OneProxy的基礎(chǔ)上實(shí)行MySQL讀寫分離與負(fù)載均衡
基于Libevent機(jī)制實(shí)現(xiàn),單個(gè)實(shí)例可以實(shí)現(xiàn)25萬的SQL轉(zhuǎn)發(fā)能力,用一個(gè)OneProxy節(jié)點(diǎn)可以帶動(dòng)整個(gè)MySQL集群,為業(yè)務(wù)發(fā)展貢獻(xiàn)一份力量,下面由小編來為大家簡單說說2019-05-05一種簡單的ID生成策略: Mysql表生成全局唯一ID的實(shí)現(xiàn)
這篇文章主要介紹了一種簡單的ID生成策略: Mysql表生成全局唯一ID的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11Mysql分片,大數(shù)據(jù)量時(shí)擴(kuò)容解決方案
這篇文章主要介紹了Mysql分片,大數(shù)據(jù)量時(shí)擴(kuò)容解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06MySQL數(shù)據(jù)庫運(yùn)維之?dāng)?shù)據(jù)恢復(fù)的方法
本篇文章主要介紹了MySQL數(shù)據(jù)庫運(yùn)維之?dāng)?shù)據(jù)恢復(fù)的方法,此處總結(jié)一下恢復(fù)方案,并結(jié)合數(shù)據(jù)庫的二進(jìn)制日志做下數(shù)據(jù)恢復(fù)的示范。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06