MySQL 的 case when 的語法有兩種:函數
簡單函數
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
搜索函數
CASE WHEN [expr] THEN [result1]…ELSE [default] END
這兩種語法有什麼區別呢?學習
簡單函數
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END: 枚舉這個字段全部可能的值*測試
SELECT
NAME '英雄',
CASE NAME
WHEN '德萊文' THEN
'斧子'
WHEN '德瑪西亞-蓋倫' THEN
'大寶劍'
WHEN '暗夜獵手-VN' THEN
'弩'
ELSE
'無'
END '裝備'
FROM
user_info;
搜索函數
CASE WHEN [expr] THEN [result1]…ELSE [default] END:搜索函數能夠寫判斷,而且搜索函數只會返回第一個符合條件的值,其餘case被忽略數學
# when 表達式中能夠使用 and 鏈接條件
SELECT
NAME '英雄',
age '年齡',
CASE
WHEN age < 18 THEN
'少年'
WHEN age < 30 THEN
'青年'
WHEN age >= 30
AND age < 50 THEN
'中年'
ELSE
'老年'
END '狀態'
FROM
user_info;
聚合函數 sum 配合 case when 的簡單函數實現多表 left join 的行轉列
注:曾經有個愛學習的路人問我,「那個sum()只是爲了好看一點嗎?」,left join會以左表爲主,鏈接右表時,獲得全部匹配的數據,再group by時只會保留一行數據,所以case when時要藉助sum函數,保留其餘列的和。若是你仍是不明白的話,那就親手實踐一下,只保留left join看一下結果,再group by,看一下結果。例以下面的案例:學生表/課程表/成績表 ,三個表left join查詢每一個學生全部科目的成績,使每一個學生及其各科成績一行展現。搜索
SELECT
st.stu_id '學號',
st.stu_name '姓名',
sum(
CASE co.course_name
WHEN '大學語文' THEN
sc.scores
ELSE
0
END
) '大學語文',
sum(
CASE co.course_name
WHEN '新視野英語' THEN
sc.scores
ELSE
0
END
) '新視野英語',
sum(
CASE co.course_name
WHEN '離散數學' THEN
sc.scores
ELSE
0
END
) '離散數學',
sum(
CASE co.course_name
WHEN '機率論與數理統計' THEN
sc.scores
ELSE
0
END
) '機率論與數理統計',
sum(
CASE co.course_name
WHEN '線性代數' THEN
sc.scores
ELSE
0
END
) '線性代數',
sum(
CASE co.course_name
WHEN '高等數學' THEN
sc.scores
ELSE
0
END
) '高等數學'
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;
行轉列測試數據
-- 建立表 學生表
CREATE TABLE `edu_student` (
`stu_id` VARCHAR (16) NOT NULL COMMENT '學號',
`stu_name` VARCHAR (20) NOT NULL COMMENT '學生姓名',
PRIMARY KEY (`stu_id`)
) COMMENT = '學生表' 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 '學號',
`course_no` VARCHAR (20) NOT NULL COMMENT '課程編號',
`scores` FLOAT NULL DEFAULT NULL COMMENT '得分',
PRIMARY KEY (`stu_id`, `course_no`)
) COMMENT = '成績表' ENGINE = INNODB;數據
-- 插入數據查詢
-- 學生表數據英語
INSERT INTO edu_student (stu_id, stu_name)
VALUES
('1001', '盲僧'),
('1002', '趙信'),
('1003', '皇子'),
('1004', '寒冰'),
('1005', '蠻王'),
('1006', '狐狸');
-- 課程表數據
INSERT INTO edu_courses (course_no, course_name)
VALUES
('C001', '大學語文'),
('C002', '新視野英語'),
('C003', '離散數學'),
(
'C004',
'機率論與數理統計'
),
('C005', '線性代數'),
('C006', '高等數學');
-- 成績表數據 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);