MySQL ---- SQL语句学习笔记二

case when

  1. 语句

case when 表达式 then 输出 when 表达式 then 输出 else 输出 end

  1. scores表创建
name stage score
a js 1
b js 2
c js 3
a py 2
b py 3
c py 1
a sql 2
b sql 2
c sql 4

通过 SQL 将表的成绩进行统计!

SELECT
	name,
	max(
		CASE
		WHEN stage = 'js' THEN
			score
		ELSE
			NULL
		END
	) AS js,
	max(
		CASE
		WHEN stage = 'py' THEN
			score
		ELSE
			NULL
		END
	) AS py,
	max(
		CASE
		WHEN stage = 'sql' THEN
			score
		ELSE
			NULL
		END
	) AS 'sql',
	AVG(score)
	AS ag
FROM
	scores
GROUP BY
	name
  1. 生成表
name js py sql ag
a 1 2 2 1.6667
b 2 3 2 2.3333
c 3 1 4 2.6667

join

1. join 与 left join 的区别

1.1 left join 必须有 on;
1.2 left join 会检查左边表的数据是否都包含在新生成的表中;是,则与 join 没区别;否,则用 null 与不包含的行,组成新行,加入新表!

2. join 实现 case when 效果

SELECT
	s1.`name`,
	s1.score AS js,
	s2.score AS py,
	s3.score AS 'sql',
	(s1.score + s2.score + s3.score) / 3 AS ag
FROM
	scores s1
JOIN scores s2 ON s1.stage = 'js'
AND s2.stage = 'py'
AND s1.`name` = s2.`name`
JOIN scores s3 ON s3.stage = 'sql'
AND s1.`name` = s3.`name`

缺点:计算每个人的平均分数比较麻烦,如果增加科目,计算平均分需要修改!

3. 优化平均分计算

SELECT
	s1.`name`,
	s1.score AS 'js',
	s2.score AS 'py',
	s3.score AS 'sql',
	s4.ag AS ag
FROM
	scores s1
JOIN scores s2 ON s1.stage = 'js'
AND s2.stage = 'py'
AND s1.`name` = s2.`name`
JOIN scores s3 ON s3.stage = 'sql'
AND s1.`name` = s3.`name`
JOIN (
	SELECT
		`name`,
		AVG(score) AS ag
	FROM
		scores
	GROUP BY
		`name`
) s4 ON s4.`name` = s1.`name`

4. 结果

name js py sql ag
a 1 2 2 1.6667
b 2 3 2 2.3333
c 3 1 4 2.6667

猜你喜欢

转载自blog.csdn.net/m0_38082783/article/details/113337251