在某些特定的业务场景下,需要把符合条件的单独几行,放在查询结果的开始,或者查询结果的尾部

通过的方法就是 IN 语句(也可以通过 IF 语句)

表内容:

DB2E4464-BD3C-42AE-A5CE-ADF154FEFF1B

使用 ORDER BY 配合 IF 语句

比如我想将 species 为 snake 的行数,单独列出来,我可以这样查询

SELECT \* FROM pet ORDER BY if (species='snake',0,1),species;

结果如下

3B9857B6-DAC1-4B05-9F97-CFAEB491DF43

我们可以看到,species 为 snake 的行数,被强行放置到了查询结果开头,这是怎么做到的呢?

这里需要注意:if (species='snake',0,1),species;

这句话的意思是,我对 species 进行排序的同时,给 species 附加一个隐藏属性,这个隐藏属性,可以是 0 或者 1,什么意思呢?就是对species 排序的时候,优先级是判断 species 是否为 snake,如果是,返回 0,如果不是,返回 1.
随后,先进行 species 隐藏属性的排序,隐藏属性拍完以后,再进行剩余 species 的排序
也就是说,你可以把这个 if 语句,看成是一个独立的 column

那如果我们想把 snake 的这一行放在查询结果尾部呢?

那你可以这样写 SELECT * FROM pet ORDER BY if(species='snake',0,1) DESC,species;

正如上面一段说的,你可以把 if 语句看成是独立的 column,所以你也可以为他添加排序条件 ASC 或者 DESC,当然默认是 ASC,可以不写。这样,查询就等于第一步是查询隐藏属性 0,1,然后进行 DESC 排序,因为 species=snake 的返回值是 0,所以进行倒序排列时,就被排在了最后

以此类推,你在进行隐藏属性优先排序的同时,对于剩下的排序,你也可以另外进行 ASC 或者 DESC 的排序,就不截图了。

使用 ORDER BY 配合 IN 语句

上面一个是满足单个条件,返回 0 或者 1,那如果需要用到一个范围呢?

你可以使用 IN 语句,比如下面,我要求把出生日期为 1993-02-04 或者 1989-05-13 的行数,排在最后

SELECT * FROM pet ORDER BY birth IN('1993-02-04','1989-05-13'),birth;

这样的话,birth IN 语句会进行判断,如果 birth 满足条件,返回 1,不满足,返回 0 所以,满足条件的两行,因为返回值是 1,进行 ASC 排序的时候,就被放置在了最后。

其他情况以此类推

因为平时用的时候经常只是用 IN 来筛选,很少用到和排序相结合的,所以记录一下