程序员的知识教程库

网站首页 > 教程分享 正文

「你所不知道的Mysql」第四篇 条件语句和表拼接

henian88 2024-09-09 03:42:51 教程分享 9 ℃ 0 评论

今天会简单介绍一下union 和 case when的用法。

换座位

小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。

其中纵列的 id 是连续递增的

小美想改变相邻俩学生的座位。

你能不能帮她写一个 SQL query 来输出小美想要的结果呢?

示例:

+---------+---------+
| id | student |
+---------+---------+
| 1 | Abbot |
| 2 | Doris |
| 3 | Emerson |
| 4 | Green |
| 5 | Jeames |
+---------+---------+

假如数据输入的是上表,则输出结果如下:

+---------+---------+
| id | student |
+---------+---------+
| 1 | Doris |
| 2 | Abbot |
| 3 | Green |
| 4 | Emerson |
| 5 | Jeames |
+---------+---------+

注意:

如果学生人数是奇数,则不需要改变最后一个同学的座位。


本题不难,可以使用union或者case when来处理。


#union 解法

select s1.id-1 as id,s1.student from seat s1 where s1.id mod 2=0
union
select s2.id+1 as id,s2.student from seat s2 where s2.id mod 2=1 and s2.id!=(select max(id) from seat)
union
select s3.id as id,s3.student from seat s3 where s3.id mod 2=1 and s3.id=(select max(id) from seat)
order by id asc
#case when 解法

SELECT
	CASE
WHEN id % 2 = 0 THEN
	id - 1
WHEN id % 2 = 1
AND (id <> @maxId) THEN
	id + 1
ELSE
	id
END AS id,
 student
FROM
 (select @maxId := (SELECT max(id) FROM seat)) a,
	seat
order by id asc;

UNION

操作符语法格式:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

case when

相当于其他编程语言中的 if 语句,使得sql语言更加灵活。

MySQL 的 case when 的语法有两种:

  1. 简单函数
  2. CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
  3. 搜索函数
  4. CASE WHEN [expr] THEN [result1]…ELSE [default] END

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表