免费教程《图解 SQL 面试题》
  • 图解 SQL 面试题
  • 第 1 章:简单查询
  • 图解面试题:如何查找重复数据?
  • 第 2 章:复杂查询
    • 图解面试题:如何查找第 N 高的数据?
  • 第 3 章 多表查询?
    • 图解面试题:多表如何查询?
    • 图解面试题:如何查找不在表里的数据?
    • 图解面试题:你有多久没涨过工资了?
    • 图解面试题:如何比较日期数据?
    • 图解面试题:如何交换数据?
    • 滴滴 2020 年面试题:如何找出最小的 N 个数?
    • 图解面试题:行列互换问题,怎么办?
    • 图解面试题:找出连续出现 N 次的内容?
    • 链家面试题:如何分析留存率?
  • 第 4 章
    • 拼多多面试题:如何查找前 20% 的数据?
    • 图解面试题:如何查找工资前三高的员工
    • 图解面试题:如何分组比较?
    • 图解面试题:双 11 用户如何分析?
    • 图解面试题:如何分析游戏?
  • 第 5 章:项目实战
    • 图解面试题:滴滴 2020 求职真题
    • 滴滴面试题:打车业务问题如何分析?
    • 电商面试题:如何分析复杂业务?
    • 图解面试题:如何分析用户满意度?
    • 图解面试题:如何分析红包领取情况?
    • 图解面试题:如何分析中位数?
    • 小红书面试题:如何分析用户行为?
    • 教育行业案例:学员续费如何分析?
    • 字节跳动面试题:你的平均薪水是多少?
Powered by GitBook
On this page

Was this helpful?

  1. 第 3 章 多表查询?

图解面试题:如何交换数据?

Previous图解面试题:如何比较日期数据?Next滴滴 2020 年面试题:如何找出最小的 N 个数?

Last updated 4 years ago

Was this helpful?

【题目】

小明是一所学校的老师,她有一张 “学生表”,平时用来存放座位号和学生的信息。其中,座位号是连续递增的。总的座位数是偶数。

现在,小明想改变相邻俩学生的座位。你能不能帮她写一个 sql 查来输出想要的结果呢?

示例查询结果如下:

【解题思路】

第一步:理清换座位的逻辑

查询目的是改变相邻学生的座位号。为了理清逻辑,在原表中插入一列叫做“奇偶数”,对应表示 “座位号” 的值是 “奇数” 还是“偶数”。

1)如果原来座位号是奇数的学生,换座位后,这名学生的座位号变为 “座位号 + 1”。

2)如果原来座位号是偶数的学生,换座位后,这名学生的座位号变为 “座位号 - 1”。

第二步:如何判断座位号是奇数,还是偶数

sql 求余函数:mod(n,m) ,返回 n 除以 m 的余数。比如 mod(8,2) 的结果是 0。

如果 n 除以 2 的余数是 0,说明 n 是偶数,否则是奇数。

转换为判断奇数,偶数的 sql 就是:

case
      when mod(座位号, 2) != 0  then  '奇数'
      when mod(座位号, 2)  = 0  then  '偶数'
end

把前面的逻辑写到 sql 里就是:

1)如果原来座位号是奇数的学生,换座位后,这名学生的座位号变为 “座位号 + 1”。

2)如果原来座位号是偶数的学生,换座位后,这名学生的座位号变为 “座位号 - 1”。

case
       when mod(座位号, 2) != 0  then 座位号 + 1
       when mod(座位号, 2)  = 0  then 座位号 - 1
end  as  '交换后座位号'

加入 select 字句,就是最好的结果:

select
      (case
             when mod(座位号, 2) != 0  then 座位号 + 1
             when mod(座位号, 2)  = 0  then 座位号 - 1
      end)  as  '交换后座位号',
      姓名
from 学生表;

【本题考点】

  1. 逻辑思维能力,如何使用对比分析方法发现规律

  2. 条件判断语句 case

  3. 如何判断奇数和偶数:mod 函数

【举一反三】

原始座次表 ‘seat’如下,现需要更换相邻位置学生的座次。

注:该座次表‘seat’共有 5 名学生,第 5 个 座位号是奇数的不变

查询逻辑和前面一样,但是座位总数是奇数,所以:如果最后一个座位号也是奇数,那么他没有可以交换的座位了,所以最后一个座位号的学生不变。

最后一个座位号,等于表里有多少行,可以用 count(*) 计算出来

# 最后一个座位号
select count(*) as counts 
from seat;

最后一个座位号作为条件判断使用时,可以使用子查询,以便调用。最终 sql 如下。

select
    (case
      # 当座位号是奇数并且不是不是最后一个座位号时
        when mod(id, 2) != 0 and counts!= id then id + 1
       # 当座位号是奇数并且是最后一个座位号时,座位号不变
        when mod(id, 2) != 0 and counts = id then id
       # 当座位号是偶数时
        else id - 1
    end) as id2,student
from seat,(select count(*) as counts from seat);

然后比较原始表里的 “座位号” 和交换结果里的“座位号”(),可以发现下图的规律。

推荐:

对比分析方法
如何从零学会 sql?