在做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附加一个

什么意思呢?就是在对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
版权声明:本文为博主原创文章,转载请附上博文链接!

MySQL ORDER BY IF() 条件排序的更多相关文章

  1. Mysql order by 多字段排序

    mysql单个字段降序排序: select * from table order by id desc; mysql单个字段升序排序: select * from table order by id ...

  2. mysql order by 多样依照排序

    如果先按a排序升序,a相同时按b降序排序 则order by a,b desc

  3. mysql order by多个字段

    Mysql order by 多字段排序 mysql单个字段降序排序: select * from table order by id desc; mysql单个字段升序排序: select * fr ...

  4. MYSQL order by排序与索引关系总结

    MySQL InnoDB B-Tree索引使用Tips 这里主要讨论一下InnoDB B-Tree索引的使用,不提设计,只管使用.B-Tree索引主要作用于WHERE和ORDER BY子句.这里讨论的 ...

  5. Oracle order by case when 多条件排序

    ORACLE sql 排序 根据两个条件排序,根据id号由小到大排序,同时country字段是北京的排最前面前面,其次上海,..大连,最后是其他城市,怎么写? 写法如下:select * from p ...

  6. Mysql Order By 字符串排序,mysql 字符串order by

    Mysql Order By 字符串排序,mysql 字符串order by ============================== ©Copyright 蕃薯耀 2017年9月30日 http ...

  7. mysql order by 排序的问题

    参考博客http://blog.csdn.net/hollboy/article/details/13296601 mysql order by 的排序在今天时候遇到了问题 情景是:将排序的字段设置成 ...

  8. mysql order by 中文 排序

    mysql order by 中文 排序 1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都 ...

  9. Mysql order by 排序 varchar 类型数据

    Mysql order by 排序 varchar 类型数据 varchar 类型字段排序,  会將数字当成字符串来处理.  排序规则一般是从左到右一位位来比较. +0之后 就转化成INT 类型排序 ...

随机推荐

  1. MARGIN-BEFORE MARGIN-AFTER MARGIN-START MARGIN-END

    总的来说:这是CSS3.0的对于文章段P容器的定义方法语句!display:block这个样式,只定义了P容器为一个块;后面四句是CSS3中的样式定义方法:-webkit-margin-before: ...

  2. 动态点分治入门 ZJOI2007 捉迷藏

    传送门 这道题好神奇啊……如果要是不带修改的话那就是普通的点分治了,每次维护子树中距离次大值和最大值去更新. 不过这题要修改,而且还改500000次,总不能每改一次都点分治一次吧. 所以我们来认识一个 ...

  3. 从0开始学习Hadoop(2) 环境准备-Win7主机与Ubuntu虚拟机共享文件夹设置

    主机要跟虚拟机共享文件夹设置有很多种办法,这里提供一种本地用户的方式 1. 新增一个本地用户,密码等其他设置如下 2.选择文件目录,这是共享属性 Ubuntu端设置: 文件夹->连接到网络-&g ...

  4. 2-12 tensorflow运算原理

    #opencv tensorflow #类比 语法 api 原理 #基础数据类型 运算符 流程 字典 数组 import tensorflow as tf #data1 = tf.constant(2 ...

  5. 字节流与字符流简单操作(OutputStream、InputStream、Writer、Reader)

    操作流程 使用File类打开一个文件 通过字节流或者字符流的子类.指定输出的位置. 进行读/写操作 关闭输入/出 字节流与字符流 在java.io包中操作文件内容主要有两大类:字节流字符流.两大类分为 ...

  6. Unity3d 应用系统分析

  7. spoj 1693 COCONUTS - Coconuts【最小割】

    s向所有信仰1的人连(s,i,1),所有信仰0的人连(i,t,1),对于朋友关系,连接双向边,流量为1.跑最大流的结果即为答案. 考虑这样做的意义.最小割就是把总点集分割为两个点集S,T,使得所有\( ...

  8. poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】

    扩展BSGS的板子 对于gcd(a,p)>1的情况 即扩展BSGS 把式子变成等式的形式: \( a^x+yp=b \) 设 \( g=gcd(a,p) \) 那么两边同时除以g就会变成: \( ...

  9. Ocelot(十一)- 服务发现

    Ocelot允许您指定服务发现提供程序,并使用它来查找Ocelot正在将请求转发给下游服务的主机和端口.目前,这仅在GlobalConfiguration部分中受支持,这意味着所有ReRoute将使用 ...

  10. apicloud运行机制

    1 首先在官网apicloud中,创建项目生成config.xml文件,预设风格. 2 将config.xml文件放在项目跟目录中,Vue项目,必须先打包生产dist文件, 3 本地或者云编译(官方工 ...