在做sqlzoo的時候,碰到一個SQL的排序問題,他把符合條件的單獨幾行,可以放在查詢結果的開始,或者查詢結果的尾部
通過的方法就是IN語句(也可以通過IF語句)
自己做了個測試,如下,這個是表的所有內容

使用ORDER BY配合IF語句
比如我想將species為snake的行數,單獨列出來,我可以這樣查詢
SELECT * FROM pet ORDER BY if (species='snake',0,1),species;
結果如下

我們可以看到,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排序的時候,就被放置在了最后。
========================================================================================
關於order by后面接條件查詢
適用場景,如表tab_a 有三個字段,
如果field1非空則按升序排列,
如果field1是空再排field2,
如果 field2非空升序排列,
如果field2是空再排field3,
如果field3非空則升序排列,
如果field3是空。。。。。。。。
例子1 排序boolean類型
CREATE TABLE `tab_b` (
`field` varchar(255) default NULL,
`id` int(11) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tab_b` VALUES ('1', 'ture');
INSERT INTO `tab_b` VALUES ('2', 'ture');
INSERT INTO `tab_b` VALUES ('3', 'false');
INSERT INTO `tab_b` VALUES ('4', 'false');
SELECT * from TAB_B ORDER BY field='true' desc
注意:ORDER by 后接的字段如果是boolean屬性,則false比ture ‘大’!!!!!
########################################################
DROP TABLE IF EXISTS `tab_a`;
CREATE TABLE `tab_a` (
`id` int(11) NOT NULL,
`field3` int(11) default NULL,
`field2` int(11) default NULL,
`field1` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tab_a` VALUES ('1', '1', '1', '1');
INSERT INTO `tab_a` VALUES ('2', '2', '2', '2');
INSERT INTO `tab_a` VALUES ('3', '3', '3', null);
INSERT INTO `tab_a` VALUES ('4', '4', null, null);
INSERT INTO `tab_a` VALUES ('5', '5', '5', null);
INSERT INTO `tab_a` VALUES ('6', null, null, null);
INSERT INTO `tab_a` VALUES ('7', null, null, null);
INSERT INTO `tab_a` VALUES ('8', '8', null, null);
SELECT * FROM TAB_A ORDER BY
field1='' desc , field1 asc,
field2='' desc , field2 asc,
field3='' desc ,field3 asc
此處field1='' 可以看成boolean排序 desc 排序,field1=''為真的排在下面(因為看上面"注意"),否則排在上面(即field1!='');
而后面的field1 asc相當於排序field1!=''數據,依次排序field2,field3..........
---------------------
作者:changliangwl
來源:CSDN
原文:https://blog.csdn.net/changliangwl/article/details/42777551
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
