mysql語法中case when then與列轉行的使用場景非常豐富。 case語句類似java中條件分支語句的作用,可以類比java中的switch語句或者if語句來學習。 其語法如下: case語句的語法: 轉換單個欄位時: case 欄位 when 欄位值 then 返回值 when 欄位值 ...
mysql語法中case when then與列轉行的使用場景非常豐富。
case語句類似java中條件分支語句的作用,可以類比java中的switch語句或者if語句來學習。
其語法如下:
case語句的語法:
轉換單個欄位時:
case 欄位
when 欄位值 then 返回值
when 欄位值 then 返回值
when 欄位值 then 返回值
。。。。。。
else 預設值 end 別名;
當有多個欄位需要轉換時:
case
when 欄位名1=欄位值11 and 欄位名2=欄位值2 and 。。。 then 返回值
when 欄位名1=欄位值12 and 欄位名2=欄位值3 and 。。。 then 返回值
when 欄位名1=欄位值13 and 欄位名2=欄位值4 and 。。。 then 返回值
when 欄位名1=欄位值14 and 欄位名2=欄位值5 and 。。。 then 返回值
。。。。。。
else 預設值 end 別名;
而列轉行則能夠幫我們把資料庫某些列轉換為行的形式展示給我們。
例如:
將上述結果進行列轉行可以得到如下結果:
列轉行語法:
sum(case when then else end) as 或者 max(case when then else end) as
創建一個資料庫stu,建立學生表,班級表,課程表,成績表
班級表包含班級id、班級名稱
創建班級表:
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes` (
`cid` int(11) NOT NULL,
`cname` varchar(10) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
向班級表插入一個班級
INSERT INTO `classes` VALUES ('111', '一班');
課程表包含課程id、課程名稱
創建課程表:
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
`scid` int(11) NOT NULL,
`scname` varchar(10) DEFAULT NULL,
PRIMARY KEY (`scid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
向課程表插入三門課程
INSERT INTO `sc` VALUES ('11', '語文');
INSERT INTO `sc` VALUES ('22', '數學');
INSERT INTO `sc` VALUES ('33', '英語');
成績表包含成績id、分數、分數所屬學生id、分數所屬課程id
創建成績表:
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`coid` int(11) NOT NULL,
`score` int(8) DEFAULT NULL,
`sid` int(11) DEFAULT NULL,
`scid` int(11) DEFAULT NULL,
PRIMARY KEY (`coid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
向成績表插入6條記錄:
INSERT INTO `score` VALUES ('1111', '90', '1', '11');
INSERT INTO `score` VALUES ('2222', '99', '1', '22');
INSERT INTO `score` VALUES ('3333', '89', '2', '11');
INSERT INTO `score` VALUES ('4444', '88', '2', '33');
INSERT INTO `score` VALUES ('5555', '75', '3', '22');
INSERT INTO `score` VALUES ('6666', '59', '3', '33');
學生表包含學生id、學生姓名、所屬班級id
創建學生表:
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int(11) NOT NULL,
`sname` varchar(10) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
向學生表插入三個學生:
INSERT INTO `student` VALUES ('1', '張三', '111');
INSERT INTO `student` VALUES ('2', '李四', '111');
INSERT INTO `student` VALUES ('3', '王五', '111');
查詢每個學生的姓名、所屬班級、所學課程、課程得分
SELECT
s.sname,
cl.cname,
sc.scname,
co.score
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid;
在上一個結果集的基礎上,將同一個學生的所有所學課程與所有分數分別以逗號形式連接成字元串:
SELECT
s.sname,
cl.cname,
GROUP_CONCAT(co.score) 分數,
GROUP_CONCAT(sc.scname) 課程
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid
GROUP BY
s.sname,
cl.cname;
列轉行實例:
①
SELECT
s.sname,
cl.cname,
IFNULL(
Max(
CASE sc.scname
WHEN '語文' THEN
co.score
END
),
'未選'
) AS '語文',
IFNULL(
Max(
CASE sc.scname
WHEN '數學' THEN
co.score
END
),
'未選'
) AS '數學',
IFNULL(
Max(
CASE sc.scname
WHEN '英語' THEN
co.score
END
),
'未選'
) AS '英語'
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid
GROUP BY
s.sname,
cl.cname;
②
SELECT
s.sname,
cl.cname,
max(
IF (
sc.scname = '語文',
co.score ,- 1
)
) AS '語文',
max(
IF (
sc.scname = '數學',
co.score ,- 1
)
) AS '數學',
max(
IF (
sc.scname = '英語',
co.score ,- 1
)
) AS '英語'
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid
GROUP BY
s.sname,
cl.cname;