作为一名不会sql的商科学生,在毕业即失业的恶势力下
低头在LeetCode刷数据库……
期间有幸遇到几次位运算,留下了深刻的印象,并被它的巧妙所折服。
第一题:620.有趣的电影
某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。
作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。
例如,下表cinema:
+---------+-----------+--------------+-----------+
| id | movie | description | rating |
+---------+-----------+--------------+-----------+
| 1 | War | great 3D | 8.9 |
| 2 | Science | fiction | 8.5 |
| 3 | irish | boring | 6.2 |
| 4 | Ice song | Fantacy | 8.6 |
| 5 | House card| Interesting| 9.1 |
+---------+-----------+--------------+-----------+
对于上面的例子,则正确的输出是为:
+---------+-----------+--------------+-----------+
| id | movie | description | rating |
+---------+-----------+--------------+-----------+
| 5 | House card| Interesting| 9.1 |
| 1 | War | great 3D | 8.9 |
+---------+-----------+--------------+-----------+
来源:力扣(LeetCode)
链接:力扣
涉世未深的我,
一边吐槽着为啥要找奇数的片子
一边用mod(id,2)=1做出了答案
然后照惯例欣赏评论区的大佬答案
于是接下来我就有了第一次和位运算接触的经历:
id & 1
这个简洁的表达一下子就吸引了我,看了别人的解释我才直到原来这是位运算,二进制中,偶数最后一位是0,奇数是1,按位运算的话,0&1就是0,1&1就是1
至此,我对这种神秘又精简的运算方法留下了深刻的印象,
于是乎马上我又遇到了它,而这一次它真正的震撼了我哈哈哈哈~
第二题 626.换座位
小美是一所中学的信息科技老师,她有一张 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 |
+---------+---------+
注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。
来源:力扣(LeetCode)
链接:力扣
本渣第一次看到这题毫无头绪,满脑子想着根据奇偶分开处理,直到我看到评论区的大佬用位运算一笔带过……
select rank() over(order by (id-1)^1) as id,student from seat大佬用与1 异或,将奇数偶数互换,又用-1对最后一行为奇数行的情况进行处理。
直接秒杀!!!