首页 > 试题广场 >

已知员工表如下图所示,员工编号依次递增,现需改变相邻员工的编

[单选题]
已知员工表如下图所示,员工编号依次递增,现需改变相邻员工的编号,当员工总人数为奇数是,不需要改变最后一个员工的编号。下列SQL语句不正确的是()

表employee:

+-----+-----------+

| eno | ename |

+-----+-----------+

| 1 | 小李 |

| 2 | 小王 |

| 3 | 小刚 |

| 4 | 小虎 |

+----+------------+


  • SELECT

    ROW_NUMBER() OVER(ORDER BY(eno+1-2*POWER(0,eno%2))) AS eno,ename

    FROM employee

  • SELECT

    ROW_NUMBER() OVER(ORDER BY(eno-1+2*MOD(0,eno%2))) AS eno,ename

    FROM employee

  • SELECT

    IF(eno%2=0,eno-1,

    IF(eno=(SELECT COUNT(DISTINCT eno) FROM employee),eno,eno+1))

    AS eno,ename

    FROM employee

    ORDER BY eno

  • SELECT

    IF(eno%2=0,eno+1,

    IF(eno=(SELECT COUNT(DISTINCT eno) FROM employee),eno,eno-1))

    AS eno,ename

    FROM employee

    ORDER BY eno

首先理解什么叫做改变相邻员工编号:
比如  | 1 | 小李 |   | 2 | 小王 |  | 3 | 小刚 |  | 4 | 小虎 |更改后就是 | 2 | 小李 |   | 1 | 小王 |  | 4 | 小刚 |  | 3 | 小虎 |
所以,如果原来的eno 是偶数,应该减1;(如果原来的eno是奇数,而且不是最后一个员工的话,应该加1;如果原来的eno 是奇数而且是最后一个,eno不改变)
其次是流程控制函数IF()。IF(expr1,expr2,expr3)  如果expr1为真,则返回expr2,否则返回expr3
 eno=(SELECT COUNT(DISTINCT eno) FROM employee) 就是eno 恰好等于员工人数(而员工编号其实没有重复的,所以distinct 意义不大)的情况
发表于 2022-06-28 20:51:11 回复(0)
A选项:POWER(0,eno%2)   eno%2是eno除2取余数,奇数为1偶数为0。power() 是返回给定表达式乘指定次方的值,0的0次幂是1,0的1次幂是0。所以eno+1-2*POWER(0,eno%2)就是奇数+1,偶数-1,顺序会颠倒。最后一个是奇数时会+1,再ROW_NUMBER()排序,就还是最后一个奇数,相当于没变。

B选项:Mod(a,b)  意思是 a / b 的余数,eno-1+2*MOD(0,eno%2)也就是奇数会+1,偶数会-1,跟A选项一致。

C选项:if(a,b,c) a表达式TRUE就返回b,否则返回c。所以语句就是偶数-1,奇数是最大值时就不变,其他情况就+1。和AB选项符合

D选项和C反了,语句就是偶数+1,奇数就-1,这样就不是相邻互换了

编辑于 2022-03-16 21:41:33 回复(6)
看不懂,有无大佬解释下
发表于 2022-02-26 18:25:56 回复(0)

1.排名开窗函数

  • ROW_NUMBER、DENSE_RANK、RANK属于排名函数。
  • 排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。
  • PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。
  • ORDER BY 指定排名开窗函数的顺序,在排名开窗函数中必须使用ORDER BY语句。
  • ROW_NUMBER()为每一组的行按顺序生成一个连续序号。
  • RANK()也为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号2,那么接下来会生成序号4。
  • DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。也就是说如果两个相同的行生成序号2,那么接下来生成的序号还是3。
编辑于 2022-04-20 17:02:32 回复(0)
题都没看懂
发表于 2022-04-05 12:23:55 回复(4)
有问题吧,答案应该选c
发表于 2021-12-22 12:38:13 回复(3)
这里这个名字我按百家姓(赵钱孙李周吴郑王...取前五来排举的例子
A选项中的eno+1-2*POWER(0,eno%2) 表示

1+1-2*0^1=2    小赵

2+1-2*0^0=1    小钱

3+1-2*0^1=4    小孙

4+1-2*0^0=3    小李

5+1-2*0^1=6    小周

在开窗排序之后

1    小钱

2    小赵

3    小李

4    小孙

5    小周            按照题目的意思,这个A选项运行结果是没问题的

B选项中的eno-1+2*MOD(0,eno%2) 表示

(eno为偶数的时候,这里对应的第2和第4行使用mod求余的时候被除数为0,所以结果为null,mysql中默认空值最小,开窗升序排序的时候会排在最前)

1-1+2*0=0        小赵

2-1+2*null=null    小钱

3-1+2*0=2        小孙

4-1+2*null=null    小李

5-1+2*0=4        小周

开窗排序之后

1    小钱

2    小李

3    小赵

4    小孙

5    小周    所以B选项是有问题的

C选项中的IF(eno%2=0,eno-1,

IF(eno=(SELECT COUNT(DISTINCT eno) FROM empl),eno,eno+1))

这个表示如果是偶数行eno-1,奇数行就eno+1,最后一行是奇数则eno不变

1 2 3 4 5就变成2 1 4 3 5 在最后order by排序之后这个结果是没问题的

C选项这个结果就完全符合题意。

至于D选项IF(eno%2=0,eno+1,

IF(eno=(SELECT COUNT(DISTINCT eno) FROM empl),eno,eno-1))

这个表示如果是偶数行eno+1,奇数行就eno-1,最后一行是奇数则eno不变
这个思路跟C选项一样,只是弄错加减了。结果就会导致
1 2 3 4 5变成0 3 2 5 5在最后order by排序之后很明显eno序号都有问题了
D选项就是错的
最后题目要求我们说下面SQL语句不正确的是,单选题逗我玩呢..BD明显不对了,就算你多打了一个‘’字要选正确的,正确的也是AC啊,那你非要说A不严谨,只有C是正确的,那我什么也不说了
发表于 2022-09-06 17:00:11 回复(1)
ABCD运行结果分别如下:

发表于 2022-03-23 11:21:30 回复(1)
认为题中的意思是将(1,2,3,4,5)转变为(2,1,4,3,5)
选项A中POWER(0,eno%2)表示 0 的 eno%2 次方,最终结果还是0,相当于所有的eno整体+1,排序不会发生改变
选项B与选项A类似,以0为底数的计算没有意义
选项C和D的区别在于C会将(1,2,3,4,5)变成(2,1,4,3,5),满足相邻编号的置换,而D会变成(0,3,2,5,5),不满足条件
所以个人认为应该选C
发表于 2022-03-10 17:10:33 回复(1)
我选的D,给的参考答案是C,但是解析又是D,这题有问题,已提交纠错反馈。
D选项,编号为偶数的时候+1,这里弄反了,应该是-1,所以D选项是错误的,其他都可以不用看了。
发表于 2022-07-06 16:57:10 回复(0)
没看懂
发表于 2022-03-20 20:36:56 回复(0)
为社么要去重呢?员工编号还有重复的?
发表于 2024-05-26 16:33:06 回复(0)
D错了
编辑于 2024-04-13 02:36:40 回复(0)
应该选d而不是选c
编辑于 2024-03-30 10:52:09 回复(0)
选D,解析对了答案错了
编辑于 2024-03-18 11:31:09 回复(0)
解析是对的,答案错了,不正确的是D
发表于 2023-12-18 17:59:31 回复(0)
应该选D
发表于 2023-10-09 21:16:36 回复(0)
答案应该选d 解析对了答案错误
发表于 2023-09-14 17:28:18 回复(0)
你这答案就是错的吧,选D,不选C吧

发表于 2023-07-29 09:27:24 回复(0)
case when 和if的判断逻辑类似,也可以用case when来写
SELECT
case when eno % 2 = 0 then eno - 1 else (
case when eno=(select count(eno) from employee) then eno else eno + 1  end) end AS eno,ename 
FROM employee 
ORDER BY eno

发表于 2023-05-07 18:08:03 回复(0)