MySQL中Order By多字段排序规则代码示例
作者:xlxxcc 发布时间:2024-01-22 01:10:35
说在前面
突发奇想,想了解一下mysql order by排序是以什么规则进行的? 好了,话不多说,直接进入正题吧。
MySql order by 单字段
建一测试表如下:
CREATE TABLE `a` (
`code` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT into a values('中一', '我');
INSERT into a values('中二', '你');
INSERT into a values('高一', '我是');
INSERT into a values('高二', '我们');
INSERT into a values('高二', '我的');
测试语句如下:
-- hex(): 获取16进制字节码
select name, hex(name) from a order by name desc
结果如下:
name | hex(name) |
我的 | E68891E79A84 |
我是 | E68891E698AF |
我们 | E68891E4BBAC |
我 | E68891 |
你 | E4BDA0 |
很明显,MySQL中的排序,是以字节码进行排序的,当第一个字相同的时候,比较第二个字的字节码, 一次类推
MySql order by 多字段
有比较,才有想法,有比较才有进步,因此我们先把单字段的降序排序结果列出来,然后在看看两个字段的降序排序气矿,我们就可以从中分析出其中道理来。
-- 按照name进行降序排序
select * from a order by name desc;
-- 按照code进行降序排序
select * from a order by code desc;
左边是order by name desc, 右边是order by code desc的结果
code | name |
高二 | 我的 |
高一 | 我是 |
高二 | 我们 |
中一 | 我 |
中二 | 你 |
code | name |
高二 | 我们 |
高二 | 我的 |
高一 | 我是 |
中二 | 你 |
中一 | 我 |
结果很明显:单一字段排序的时候,其他字段出现的顺序是自然排序的。
下面我们看看多字段的排序
-- 按照code, name进行降序排序
select * from a order by code, name desc;
code | name |
中一 | 我 |
中二 | 你 |
高一 | 我是 |
高二 | 我的 |
高二 | 我们 |
结果如下:首先谢谢qq_27837327和MjayTang 的,本人在这里一次测试, 原文说这个sql排序无效的说法是错误的。实际上说order by code,name desc等同于order by code asc, name desc
经测试发现,select * from a order by code and name desc 排序效果依然无效。
我们在看看下面的语句
-- 按照code, name进行降序排序
select * from a order by code desc, name desc;
-- 该语句的效果等同于下面的语句, 其中1、2分别对应的是code、name
select code, name from a order by 1 desc, 2 desc;
code | name |
高二 | 我的 |
高二 | 我们 |
高一 | 我是 |
中二 | 你 |
中一 | 我 |
对比code,name的单个字段降序排序,我们可以发现, 使用 order by code desc, name desc的时候,MySQL会先以code进行降序排序,在code进行降序排序该基础上,再使用name进行降序排序。
另外我们还可以使用contat函数把多个字段拼接起来,在进行排序。但是要保证字段不能为null。下面我们来看一下concat的sql语句和结果。
select * from a order by concat(code,name) desc
code | name |
高二 | 我的 |
高二 | 我们 |
高一 | 我是 |
中二 | 你 |
中一 | 我 |
很明显,在这个测试例子上来看, order by concat(code, name) desc的效果等同于 order by code desc, name desc
来源:http://blog.csdn.net/xlxxcc/article/details/52250963


猜你喜欢
- 无聊,写了一个图片后加载的东东,感谢asfman帮忙<!DOCTYPE html PUBLIC "-//W3C//DTD X
- 利用zipfile模块和pandas获取数据,代码比较简单,做个记录吧:# -*- coding: utf-8 -*-""
- commit之后第一种:记住大概的时间,获取前大概时间的数据。select * from Test as of timestamp to_t
- vue-cli使用stimulsoft.reports.js(保姆级教程)第一部分:数据源准备以下是JSON数据的教程json数据结构{&q
- 1. 文件锁脚本启动前检查特定文件是否存在,不存在就启动并新建文件,脚本结束后删掉特定文件。通过文件的判断来确定脚本是否正在执行。方法实现也
- Google Chrome 的发布,使我们更加的注重基于 WebKit 核心的浏览器的表现情况,但我们很多时候“不小心”就会出现问题。考虑下
- 今天来认识一下两个我不太常用到的html标签:sub标记和sup标记。定义和用法:<sub> 标签可定义下标文本。<sup
- 方法在 Golang 中没有类,不过我们可以为结构体定义方法。我们看一个例子:package main import ( 
- 一:什么是exe?exe是Windows环境中的文件扩展名之一,它是一个可执行文件,虽然扩展程序在一般情况下是隐藏的,但是我们可以通过取消选
- 本文实例讲述了javascript将数字转换整数金额大写的方法。分享给大家供大家参考。具体实现方法如下:function digit_upp
- 一、概述spark 有三大引擎,spark core、sparkSQL、sparkStreaming,spark core 的关键抽象是 S
- label转onehot的很多,但是onehot转label的有点难找,所以就只能自己实现以下,用的topk函数,不知道有没有更好的实现on
- 分享人:月漓作为交互设计师,你是否在一个项目中花费大量的时间来沟通、修改、明确需求?其实这些前期工作(设计原型前)是我们和PD、运营、开发之
- 起步这是一个相当实用的内置模块,但是很多人竟然不知道他的存在——笔者也是今天偶然看到的,哎……尽管如此,还是改变不了这个模块好用的事实hea
- 1、面向对象【三大显著特征】: 封装、继承、多态1、封装【解释】: 封装的本质就是将有关联的代码组合在一起。【优势】:保
- 当用GOOGLE查的时候,内容几乎都是一样的。但是你想要的东西,一个也没有。例如,我就找不到中国人写的如何使用PYTHON来创建一个XML文
- python replace函数替换无效问题str = "hello,china!"str.replace("
- 1、改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改&n
- 查询操作和性能优化1.基本操作增models.Tb1.objects.create(c1='xx', c2='oo&
- 首先数据库里需要有一个自动编号字段(ID)。然后第一次访问的时候,取出所有记录,定制好每页的记录数PageSize,计算出页数,然后根据页数