最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中關(guān)于case when的用法

 更新時(shí)間:2024年06月19日 09:45:23   作者:嘆人間,美中不足今方信  
這篇文章主要介紹了MySQL中關(guān)于case when的用法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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ù)只會返回第一個(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會以左表為主,連接右表時(shí),得到所有匹配的數(shù)據(jù),再group by時(shí)只會保留一行數(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)文章

  • MySQL?InnoDB?存儲引擎的底層邏輯架構(gòu)

    MySQL?InnoDB?存儲引擎的底層邏輯架構(gòu)

    這篇文章主要為大家介紹了MySQL?InnoDB?存儲引擎的底層邏輯架構(gòu)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • MySQL主從復(fù)制故障排查及解決方案

    MySQL主從復(fù)制故障排查及解決方案

    在 MySQL 生產(chǎn)運(yùn)維里,主從復(fù)制是數(shù)據(jù)備份、讀寫分離、高可用架構(gòu)的核心,但配置、網(wǎng)絡(luò)、磁盤、數(shù)據(jù)一致性、日志清理等問題,總能讓復(fù)制突然中斷,因此本文給大家介紹了MySQL主從復(fù)制故障排查及解決方案,需要的朋友可以參考下
    2026-03-03
  • MySQL數(shù)據(jù)庫之索引詳解

    MySQL數(shù)據(jù)庫之索引詳解

    大家好,本篇文章主要講的是MySQL數(shù)據(jù)庫之索引詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • mysql查看用戶授權(quán)信息的具體方法

    mysql查看用戶授權(quán)信息的具體方法

    在本篇文章里小編給大家整理的是一篇關(guān)于mysql查看用戶授權(quán)信息的具體方法,有需要的朋友們可以參考下。
    2020-08-08
  • MYSQL設(shè)置字段自動獲取當(dāng)前時(shí)間的sql語句

    MYSQL設(shè)置字段自動獲取當(dāng)前時(shí)間的sql語句

    整理數(shù)據(jù)庫數(shù)據(jù),看到好多表都有加create_time和 update_time字段,來記錄數(shù)據(jù)插入的時(shí)間和更新時(shí)間,但是時(shí)間插入是通過代碼來維護(hù)的,這篇文章主要介紹了MYSQL設(shè)置字段自動獲取當(dāng)前時(shí)間,需要的朋友可以參考下
    2023-07-07
  • MySQL無法輸入中文字符問題的解決辦法

    MySQL無法輸入中文字符問題的解決辦法

    MySQL無法輸入中文的問題大多是由于字符集不匹配所導(dǎo)致的,下面這篇文章主要給大家介紹了關(guān)于MySQL無法輸入中文字符問題的解決辦法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Mysql使用大全 從基礎(chǔ)到存儲過程

    Mysql使用大全 從基礎(chǔ)到存儲過程

    看到園子里總結(jié)的Mysql用法,我覺得沒有我的全面,我的從登錄到高級的存儲過程都涉及到,這部分是我平常不會或是出現(xiàn)問題都會拿來看,不過現(xiàn)在就和我一起來使用命令模式學(xué)習(xí)一下數(shù)據(jù)庫最基本的吧
    2012-05-05
  • 最新評論

    上高县| 新丰县| 九江县| 福建省| 扎兰屯市| 南投县| 苍南县| 绵阳市| 班玛县| 剑河县| 清镇市| 钦州市| 冀州市| 伊通| 疏勒县| 平塘县| 汨罗市| 万州区| 上饶县| 清水河县| 静乐县| 安多县| 龙州县| 昌乐县| 阿拉善左旗| 钦州市| 兴和县| 阿合奇县| 疏勒县| 南安市| 富蕴县| 临沭县| 乌鲁木齐县| 资中县| 连山| 荆州市| 新竹市| 靖江市| 文昌市| 卓尼县| 嘉兴市|