sql排序

SQL性能优化

我的梦境 提交于 2019-12-03 03:34:17
引言:      以前在面试的过程中,总有面试官问道:你做过sql性能优化吗?对此,我的答复是没有。一次没有不是自己的错误,两次也不是,但如果是多次呢?今天痛下决心,把有关sql性能优化的相关知识总结一下,以便在不久的将来,我的回答不是“没有”,总能多多少少说一些东西。算是长进吧。说到性能优化,本人感觉到有必要先了解sql语句的执行顺序,因为对优化或多或少的会有些帮助。 sql语句执行顺序:      sql语句和其他相关的编程语言最大不同的地方应该是执行顺序。对于大多数编程语言来说都是按照顺序进行执行,但对于sql语句,尽管select是最开始出现,但几乎总是最后一个执行,最开始执行的往往是from子句。每一步骤产生一个虚拟表,这些虚拟表对于调用者来说是不能用的,仅仅作用于下一步骤,而只有最后的查询结果表才能被调用者所使用。当有步骤没有出现时便跳过该执行步骤。下面上代码: (8)SELECT (9)DISTINCT (11)<Top Num> <select list> (1)FROM [left_table] (3)<join_type> JOIN <right_table> (2) ON <join_condition> (4)WHERE <where_condition> (5)GROUP BY <group_by_list> (6)WITH <CUBE | RollUP>

【SQL练习题】排序

匿名 (未验证) 提交于 2019-12-03 00:32:02
原表如下: 建表脚本: CREATE TABLE districtproducts ( district varchar(255), name varchar(255), price int(255) ); INSERT INTO districtproducts VALUES ('东北', '橘子', 100); INSERT INTO districtproducts VALUES ('东北', '苹果', 50); INSERT INTO districtproducts VALUES ('东北', '葡萄', 50); INSERT INTO districtproducts VALUES ('东北', '柠檬', 30); INSERT INTO districtproducts VALUES ('关东', '柠檬', 100); INSERT INTO districtproducts VALUES ('关东', '菠萝', 100); INSERT INTO districtproducts VALUES ('关东', '苹果', 100); INSERT INTO districtproducts VALUES ('关东', '葡萄', 70); INSERT INTO districtproducts VALUES ('关西', '柠檬', 70); INSERT

Oracle数据库练习题(3)

匿名 (未验证) 提交于 2019-12-03 00:27:02
一、表展示 二、 练习题及答案 31. 找出有佣金的员工的不同工作,按降序排列 select job, comm from empgj where comm is not null order by comm desc; select job, comm from empgj where comm != 0 order by comm desc; SQL中判断非空(null)不能用等号,因为null在SQL中被看作特殊符号,必须使用关键字 is和not,如第一句所示 排序写法:order by +字段名+ 排序方式(asc/desc) asc:按升序排列,也是默认排序可省略不写 desc:按降序排列 32. 找出不收取佣金或收取的佣金低于500 的员工 select ename, comm from empgj where nvl(comm, 0) = 0 or comm < 500; 33. 找出各月倒数第3 天受雇的所有员工并且按月降序排序 select ename, hirdate from empgj where last_day(hiredate) - 2 = hiredate order by to_char(hiredate, 'mm') desc; 这里to_char()函数取出了雇佣日期的月份,因为在向表插数据时已经规定好了格式: insert into

逻辑分页和排序 的思路

匿名 (未验证) 提交于 2019-12-03 00:22:01
一般分页有分页插件,排序在sql指定字段就好,但是最近我遇到一种情况,就是sql语句比较复杂。。有八十多行,两张表(7w 和 11w)数据不算多,但是sql语句嵌套的有点厉害,我特意试了试,那个sql跑完要花1.3w+秒。。。项目里用那个sql肯定不行,然后就把sql简化了,作为了四个查询单表的sql,这样的话就没有嵌套了,但是这样也导致所有的逻辑业务要在serviceImpl里处理了。。而且还不能用分页插件和指定排序字段。。业务逻辑我就不和大家bb了,说说逻辑分页和排序 的思路。 首先排序: Collections.sort(underList), Collections有个排序的方法,sort里面放的就是排序字段。另外,还需要让underList字段对应的对象实现Comparable接口,这是一个比较器接口。例如: public class Undercarriage implements Serializable , Comparable < Undercarriage > 该对象就实现了序列化接口和比较器接口两个接口,然后在该对象里面重写它的compareTo方法: @Override public int compareTo ( Undercarriage o ) { //return this.underRate.compareTo(o.underRate); if (

MySQL ORDER BY IF() 条件排序

匿名 (未验证) 提交于 2019-12-02 22:02:20
Դ 在做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的这一行放在查询结果尾部呢? DESC ,species; 正如上面一段说的,你可以把if 语句看成是独立的column,

Oracle排序(中文)

你离开我真会死。 提交于 2019-12-02 18:15:58
一、中文排序 1. 按照笔划排序 select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M'); 2. 按照部首排序 select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M'); 3. 按照拼音排序,此为系统的默认排序方式 select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M'); 二、排序字段为空 1、缺省处理 Oracle在Order by 时缺省认为null是最大值,所以如果是ASC升序则排在最后,DESC降序则排在最前 2、使用nvl函数 nvl函数可以将输入参数为空时转换为一特定值,如 nvl(employee_name,’张三’)表示当employee_name为空时则返回’张三’, 如果不为空则返回employee_name, 通过这个函数可以定制null的排序位置。 3、使用decode函数 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) decode函数比nvl函数更强大,同样它也可以将输入参数为空时转换为一特定值,如 decode(employee_name,null,’张三’,

TP5多字段排序

痞子三分冷 提交于 2019-12-02 16:37:51
有业务需求如下: select * from table where id IN (3,6,9,1,2,5,8,7) order by field(id,3,6,9,1,2,5,8,7); 这里直入主题,用TP的order方法写的话,可能不太好写,但是也可以写成这样 ->order("field(id,3,6,9,1,2,5,8,7)") 但是官方文档说了, 当你的order排序中使用了SQL函数的时候,请使用orderRaw方法替代order 所以并不太好实现。 所以查阅资料找到方法, 资料 $exp = new \think\db\Expression('field(id,3,6,9,1,2,5,8,7)'); $result = $query->where(['id'=>['in','3,6,9,1,2,5,8,7']])->order($exp)->select(); 这里我直接引用资料中的回答,如果使用模型查询的话就是: Model::where("id","in","3,6,9,1,2,5,8,7")->order("field(id,3,6,9,1,2,5,8,7)")->select(); 还可以用 orderRaw("field(users.id, $ids)"),或者 order(Db::raw("field(users.id, $ids)")) 标题说了

TP5 按照汉字的拼音排序

十年热恋 提交于 2019-12-02 16:34:40
业务需求:接口返回一个列表,但是这个列表要求按一定的条件排序,条件如下: 1,某字段(field1)为null的排前面 2,某字段(field2)为null的排前面 3,姓名(field3)按照汉字的拼音排序 4,某字段(field4)按照ID倒序排序 乍一听有点复杂,其他的不多说,这篇文章主要讲怎么在TP5里实现按照汉字的拼音排序 多字段排序这里要介绍到TP5 一个类 想了解的可以参考这篇文章 《文章名字》 查阅了资料,网上千篇一律,总结了两点: 1,如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字3755个采用拼音排序,二级汉字就不是了,但考虑到人名等都是常用汉字,因此只是针对一级汉字能正确排序也够用了),直接在查询语句后面 添加 order by name asc; 查询结果按照姓氏的升序排序; 2,如果存储姓名的字段采用的是 utf8字符集,需要在排序的时候对字段进行转码;对于的代码是 order by convert(name using gbk) asc; 同样,查询的结果也是按照姓氏的升序排序; 我相信大多数人用的应该是用的utf8字符集,所以这里就使用第二种方法 但是在TP中,如果使用不当,就会报错 正确的写法应该使用这篇文章 《文章名字》 中的方法,TP中的一个类,超级简单超级好用。 //实例化这个类

一个通用的sql server分页查询

蓝咒 提交于 2019-12-02 15:28:32
CREATE PROCEDURE dbo.P_viewPage_A @TableName VARCHAR(200), --表名 @FieldList VARCHAR(2000), --显示列名,如果是全部字段则为* @PrimaryKey VARCHAR(100), --单一主键或唯一值键 @Where VARCHAR(2000), --查询条件 不含'where'字符,如id>10 and len(userid)>9 @Order VARCHAR(1000), --排序 不含'order by'字符,如id asc,userid desc,必须指定asc或desc --注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷 @SortType INT, --排序规则 1:正序asc 2:倒序desc 3:多列排序方法 @RecorderCount INT, --记录总数 0:会返回总记录 @PageSize INT, --每页输出的记录数 @PageIndex INT, --当前页数 @TotalCount INT OUTPUT, --记返回总记录 @TotalPageCount INT OUTPUT --返回总页数 AS SET NOCOUNT ON IF ISNULL(@TotalCount,'') = '' SET @TotalCount = 0

提交 PostgreSQL 简体中文性能改进补丁

半城伤御伤魂 提交于 2019-12-02 15:22:36
昨天把写好的程序整理出来发给社区,不出意料的,他们又在念叨如何通过API来提高,而不是自己写,原因……我也想不出为什么。 其他语言不清楚,简体中文面临几个问题: 1、排序依赖操作系统,但是不同系统字符顺序是不一样的,Linux下甚至多音字还有问题; 2、性能倒是次要,确实如他们所说,可以通过修改gcc来解决,但是宁愿等gcc补丁也不去解决现在的问题? 3、个人觉得数据库字符集处理还是内置比较好,正如Oracle,另外SQL Server和DB2我想也是如此做的; Windows 2008字母顺序: A a B b C c ... 而不是 a b c ... A B C ... 这样排也有道理,只是会引起一些不一致。 Linux多音字,目前发现一个,其他估计一样: “腌”取 a 音排序,而不是yan,虽然这个字是有这个发音,但是在中文里边几乎很少用;就算不是错误,至少也会引起不同平台下排序不一致。 来源: oschina 链接: https://my.oschina.net/u/1159948/blog/146308