题目:小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。其中纵列的id是连续递增的小美想改变相邻俩学生的座位。

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




-- 创建seat表CREATE TABLE seat(  id int(4) not NULL,  student VARCHAR(10) not NULL);
-- 插入数据INSERT INTO seat VALUE(1,'Abbot');INSERT INTO seat VALUE(2,'Doris');INSERT INTO seat VALUE(3,'Emerson');INSERT INTO seat VALUE(4,'Green');INSERT INTO seat VALUE(5,'Jeames');


SQL练习笔记二:换座位_java




-- 解法1:使用UNION凭借查询结果SELECT  * FROM  (-- id为偶数则id-1 --  SELECT    id - 1 AS id,    student   FROM    seat   WHERE    id % 2 = 0 UNION ALL  SELECT-- id为非最大奇数则id加1 --    id + 1 AS id,    student   FROM    seat   WHERE    id % 2 <> 0     AND id <(    SELECT      max( id )     FROM      seat     ) UNION ALL  SELECT -- 查找最后一个id,且为奇数 --    *   FROM    seat   WHERE    id =(    SELECT      max( id )     FROM      seat     )     AND id % 2 <> 0   ) AS temp ORDER BY  id;




-- 解法2:使用CASE条件分支判断查询SELECT  (  CASE       WHEN id%2= 1 AND id != ( SELECT MAX( id ) FROM seat ) THEN id + 1       WHEN id%2= 0 THEN  id - 1       ELSE id       END   ) AS id,  student FROM  seat ORDER BY  id;

两种查询语句查询结果如下:

SQL练习笔记二:换座位_java_02

总结:本题的知识点就是CASE条件分支,在不知道CASE之前,我使用了最笨的一种方法,分别查询出奇数、偶数及最后一位的id再对id值进行调整(奇数加1,偶数减1,最后一id值位不变),最后再将查询结果进行UNION拼接并ORDER BY升序排序,语句过于繁琐冗长,其意思跟使用解法2中的CASE条件分支查询一样。