目录
说明
最近在练习sqlzoo,遇到错题就总结到这里,让自己回顾一下
题目2
数据表如下:
题目如下:(属于sqlzoo第三个SELECT的练习最后一题)
The expression subject IN ('Chemistry','Physics') can be used as a value - it will be 0 or 1.
Show the 1984 winners and subject ordered by subject and winner name; but list Chemistry and Physics last.
将1984年的获奖者和获奖项目列出,按照项目和获奖者名字排序,但是化学和物理奖的数据排在最后;
这里卡了很长时间,虽然知道肯定用第一个提示,但是没想出用它的方法,想要将某几条数据排到最后,分成两组再排序是最好的办法,因此提示的这个subject IN ('Chemistry','Physics')就是分组最好的依据,在其中的项目会显示1,不在其中的会显示0,因此在order by中通过if或者case when语法来判断,答案如下:
答案1:
SELECT winner, subject
FROM nobel
WHERE yr=1984
ORDER BY IF(subject IN ('Physics','Chemistry'),1,0),subject,winner
根据if表达式,当subject在那两项中时,输出1,不在则输出0,然后默认按照asc格式降序排列,因此就可以做到题目要求的0的项目在前,1的项目在后边显示输出;其实这个答案有点画蛇添足,因为subject in ('Physics','Chemistry')本身就可以作为数值输出
答案2:
SELECT winner, subject
FROM nobel
WHERE yr=1984
ORDER BY CASE WHEN subject IN ('Physics','Chemistry') THEN 1 ELSE 0 END,subject,winner
和答案1一样,只是将if表达式替换为了case when,道理是一样的
答案3:
SELECT winner, subject
FROM nobel
WHERE yr=1984
ORDER BY subject IN ('Physics','Chemistry'),subject,winner
如同答案1所说的,subject in ('Physics','Chemistry')本身就可以作为数值输出,因此直接在order by中使用即可