精华内容
下载资源
问答
  • mysql查询顺序
    千次阅读
    2018-07-18 00:25:30

    mysql查询时的书写顺序:

          select...from...where...group by...having...order by...

    mysql的执行顺序:

          from...where...group by...having...select...order by...

    from:需要从哪个数据表检索数据 

    where:过滤表中数据的条件 

    group by:如何将上面过滤出的数据分组 

    例句:select cid,count(*) from product group by cid     //注释:cid为product表的外键,可以模拟查询统计每个分类产品的数量

    having:对上面已经分组的数据进行过滤的条件  

    例句:select cid,avg(price) from product group by cid having avg(price)>60

    select:查看结果集中的哪个列,或列的计算结果 

    order by :按照什么样的顺序来查看返回的数据 (desc为降序,asc为升序)

    更多相关内容
  • 主要介绍了详解 Mysql查询结果顺序按 in() 中ID 的顺序排列的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
  • MySQL语句执行顺序

    一、sql查询语句执行顺序

    8Select9distinct 字段名1,字段名2,
    (6[fun(字段名)]1from13<join类型>join22on <join条件>4where <where条件>5group by <字段>7having <having条件>10order by <排序字段>11limit <起始偏移量,行数>
    
    

    二、关键字执行顺序

    也就是说, 先进行on的过滤, 而后才进行join, 这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据.

    这些步骤执行时, 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。

    MySQL会先执行from,根据on关键字去筛选表,筛选出的结果再进行join,生成一个临时表。然后去执行where条件去筛选临时表。然后就可以对数据进行group by进行分组,执行having对数据进行进一步筛选,然后select去筛选目标列了,之后需要使用distinct进行去重这样一个表的查询基本就结束了。然后就是对数据进行排序的order by ,排完顺序自然就是取分页了。这样就会将一个完整的sql执行完毕了。

    三、on为什么执行在join前面?

    对于left jion 和 right join
    首先from可以获得主表信息,然后join此时也获得了另一个表信息,执行join时要生成中间表,如果先进行join而不是on,此时则是两个大表之间进行笛卡尔乘积(sql里面表与表之间进行关联时是通过笛卡尔乘积生成中间表),而如果先通过on进行条件筛选,然后再进行join关联,则计算量会大大减少。虽然没有执行join,但是可以通过jion知道是哪些表进行关联,然后通过执行on进行筛选,然后再执行join进行表与表之间的笛卡尔乘积。
    对于inner join 和 cross join
    对于inner join 和 cross join 在他们后面使用on条件时,mysql都会将on后面的条件优化到where里,on条件相当于是一个where条件

    四、关键字对于sql优化的启示

    我们知道更多的数据在越早的阶段被过滤掉越好,sql性能也越高。

    1.能写在on里的条件,不要写在where里,能写在where里的条件不写在having里
    很容易就可以看出来先执行on再执行where最后执行haing,所以条件越靠前月有利于sql的执行。
    2.能使用left join 或者right join 的不使用inner join 或者 cross join
    其实我们在inner join 或者cross join中使用on其实就是使用where,因为mysql的执行优化器最后都回将on解析成where

    展开全文
  • 写代码中的某一天,我写下了如下的代码:publicConnection getConn() {String driver= "com.mysql.jdbc.Driver";String url= "***";String username= "***";String password= "***";Connection conn= null;...

    写代码中的某一天,我写下了如下的代码:

    publicConnection getConn() {

    String driver= "com.mysql.jdbc.Driver";

    String url= "***";

    String username= "***";

    String password= "***";

    Connection conn= null;

    PreparedStatement pst= null;try{

    Class.forName(driver);//classLoader,加载对应驱动

    conn =(Connection) DriverManager.getConnection(url, username, password);

    String sql = "select * from info info , info_extend extend where info.id = extend.infoid "

    + " order by (CASE WHEN info.pid=1006 THEN 1 ELSE 0 END) asc ,(CASE WHEN info.pid = 1006 THEN info.intext ELSE extend.intext END) desc "

    + " limit 0,10";

    System.out.println(sql);

    pst = (PreparedStatement) conn.prepareStatement(sql);//准备执行语句       ResultSet rs = pst.executeQuery(); while(rs.next()){ System.out.println(rs.getString(1)+"-----"+rs.getString(2) + "-----" + rs.getString(3) + "----" + rs.getString(4)); } } catch (Exception e) { e.printStackTrace(); } return conn; }

    很明显,上面这段sql是连表查询了两张表 info 和 extend ,有两个字段进行order by ,如果pid=1006的话那就排在上面,如果pid不是1006那就按extend表的intext字段来排序,我们可以认为这两个order by 是没有问题的。

    但是查询出来的结果就存在一点奇怪了,请看!

    第一次执行:

    3ea41bfdc5e2b96ec5f4cc791893c654.png

    第二次执行,在看:

    aa71c7b27c808ec32b14bec41d36a860.png

    请注意细看,两次执行的数据的顺序发生了改变。虽然他还是按照我们的orderby的顺序排的(只是在intext值一样的时候,他就开始随机的排序了)

    看到了吧,同一段sql居然会有不一样的结果(),是不是很奇葩~

    我觉得很奇怪,就把sql粘下来,拿到mysql客户端去执行,结果如下

    8794878d43529f2d5d2656688b128d4a.png

    无论执行多少次,他们的顺序也不会发生变化。这就真的很奇怪了,sql都是一样的,为什么就会有不一样的结果呢。

    查询了很多资料,也没找到一个比较确认的理由,只是较多人认为是由于缓存的存在。

    引用一下别人的回答:

    根数据库系统的算法有关,早期版本的算法是自然的多个线程二分法,那个线程先查到满足条件的数据就先输出出来,这样就是乱序的,后期经过改进按照主键自然排序输出。

    如果order by的值相同,一般是按自然排序,就是首个字符的字母或汉字的发音的首字母的s排序。

    order by的字段自然排序,如果你的order by 字段是resort,resort值相同的情况下,是可能有两种结果,一种就是你列出的随机排序,还有一种就是按主键来排序。这个问题不是固定的,还可能跟你的服务器性能都有关系,如果内存足够大,执行mysql的时候会提供足够大的缓冲池,也可能会出现另一种结果。

    所以很有可能是因为缓存的存在,在mysql客户端存在缓存,然后每一次查询都走缓存所以他的顺序不会发生改变。然而执行java程序顺序不一致,可能就是因为没有走缓存,每一次都是实时查询。也许java程序的这种结果本身就具有更多的可靠性。

    还有一个很奇怪的现象:有时候java程序的结果是不会变的,有时候就是会发生变化的。这一点很令人疑惑,但同时也更肯定了缓存的因素。

    那如何解决这个问题?

    很简单,他不是顺序有时会不一致吗,那我们再给他一个顺序进行排序就好了。在order by 后面加上 id desc  , 那么我们的查询结果就是一致了的。

    展开全文
  • mysql对无索引字段进行排序后limit ,当被排序字段有相同值时并且在limit范围内,取的值并不是正常排序后的值,有可能第一页查询的记录,重复出现在第二页的查询记录中,而且第二页的查询结果乱序,导致分页结果查询...

    本文目录

    一、问题现象

    二、问题复现

    2.1 表结构

    2.2 数据来源

    2.3 问题复现

    三、问题原因

    四、解决方案

    4.1 官网推荐的 order by 索引列

    4.2 order by 后多添加一个id字段排序


    一、问题现象

    mysql对无索引字段进行排序后limit ,当被排序字段有相同值时并且在limit范围内,取的值并不是正常排序后的值,有可能第一页查询的记录,重复出现在第二页的查询记录中,而且第二页的查询结果乱序,导致分页结果查询错乱问题。

    二、问题复现

    2.1 表结构

    以下是这次问题出现的创建的表结构SQL语句,可以直接执行

    DROP TABLE IF EXISTS `unlp_hot_dictionary`;
    CREATE TABLE `unlp_hot_dictionary`  (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `word` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '词',
      `nature` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '词性',
      `weight` int(10) NOT NULL DEFAULT 1 COMMENT '权重',
      `order_num` int(10) NOT NULL DEFAULT 0 COMMENT '排序码',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 72 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = COMPACT;

    2.2 数据来源

    表里的数据,随便填写即可。

    2.3 问题复现

    执行排序后分页查询的SQL语句如下:

    SELECT id,word,nature,weight,order_num FROM unlp_hot_dictionary ORDER BY order_num, id DESC LIMIT 0,10;
    
    SELECT id,word,nature,weight,order_num FROM unlp_hot_dictionary ORDER BY order_num, id DESC LIMIT 10,10;

    查询出的结果参考下图:

    三、问题原因

    mysql官网对limit的详细说明及优化建议:https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

    以下内容摘录自mysql官网:

    If multiple rows have identical values in the ORDER BY columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns.

    ......

    If it is important to ensure the same row order with and without LIMIT, include additional columns in the ORDER BY clause to make the order deterministic. For example, if id values are unique, you can make rows for a given category value appear in id order by sorting like this:

    四、解决方案

    以下有两种方式都可以完美解决这个问题:一个是Mysql官网推荐的,另外一个比官网推荐的更加简单。

    4.1 官网推荐的 order by 索引列

    官网推荐的解决方案是 order by 的列中包含一个索引列(如果没有,则需要把这个列改为索引列)

    创建索引方法官网上有写,或者使用数据库可视化工具(如Navicat、SqlYog等)创建

    4.2 order by 后多添加一个id字段排序

    SQL语句为:

    SELECT id,word,nature,weight,order_num FROM unlp_hot_dictionary ORDER BY order_num, id DESC LIMIT 0,10;
    
    SELECT id,word,nature,weight,order_num FROM unlp_hot_dictionary ORDER BY order_num, id DESC LIMIT 10,10;

    结果如下,完美解决

     

    完结!

    展开全文
  • mysql查询条件的先后顺序问题?

    千次阅读 2021-01-19 11:10:51
    听一个讲座,说查询条件的顺序影响查询速度,比如一个先运行一个高门槛的条件,后低门槛,运行速度会相对快,请问有这种事么?那么我在写thinkphp的查询语句的时候,是不是应该把高门槛的放在前面查询?数据库没这么...
  • MySQL执行顺序

    千次阅读 2022-02-26 22:52:43
    mysql执行顺序
  • mysql中的查询语句的执行顺序

    千次阅读 2021-03-10 19:40:49
    一、sql语句的执行顺序 1.sql语句的执行顺序 (7)select (8)distinct 字段名1,字段名2... (5)[fun 字段名] (1)from 表名 (2)inner|left|right|full|cross join on 连接条件 (3)where 筛选条件 (4)group by 分组条件...
  • 这样的情况取出来后,其实,i Java开源项目【ali1024.coding.net/public/P7/Java/git】 d还是按1,2,3,4,5,6,7,8,9,排序的,但如果我们真要按IN里面的顺序排序怎么办?SQL能不能完成?是否需要取回来后再foreach一下...
  • MySQL查询语句语法虽然是描述性语言,但是在使用的时候,我发现如果语句书写顺序不正确的话,还是很容易发生报错的,如果您已经学了查询语句的概念,但是写代码的时候有些模糊,那我后面写的可能会对您有所帮助!...
  • Mysql----SQL查询语句执行顺序

    千次阅读 2016-08-22 16:17:17
    SQL查询语句执行顺序
  • SELECT * FROM USER WHERE user_id IN (1, 5, 8, 12, 9) ORDER BY FIELD(user_id, 1, 5, 8, 12, 9) ;
  • 打乱数据库表内的数据顺序

    千次阅读 2021-02-03 12:10:15
    【问题】What is a best way to shuffle a database column using pl/sql. how to shuffle a database column eg first name with around 70000 of rows . TIA针对此问题,有人给了下面的方案:DECLARESUBTYPE Name ...
  • 看到有资料说,where条件的顺序会影响查询的效率,根据的逻辑是:where条件的运行是从右到左的,将选择性强的条件放到最右边,可以先过滤掉大部分的数据(而选择性不强的条件过滤后的结果集仍然很大),在根据其它条件...
  • Mysql 语句执行顺序

    千次阅读 2022-01-19 15:46:31
    一、Mysql 语法顺序 select[distinct] from join(如left join) on where group by having union order by limit 二、Mysql执行顺序 from on join where group by having select distinct union ...
  • mysql的书写顺序与执行顺序

    千次阅读 2021-11-14 17:30:28
    1.书写顺序 select * | 列名 -- 查询的列 from 表名 --查询哪些表 where 条件 --剔除不符合条件的 group by 分组的列 --指定根据哪些列分组 having 条件 --对分组之后的数据进行操作 order by --排序的列 limit a,b ...
  • 对redo log、binlog这种日志进行的磁盘顺序读写 对表空间的磁盘文件里的数据页进行的磁盘随机读写 1 磁盘随机读 MySQL执行增删改操作时,先从表空间的磁盘文件里读数据页出来, 这就是磁盘随机读。 如下图有个磁盘...
  • mysql查询保持in的顺序

    千次阅读 2018-03-16 18:00:00
    目的:解决mysql的in语法查询顺序问题mysql数据库总,使用in语句查询查询结果默认会根据主键id排序。示例:SELECT * FROM user_seller where store_id IN(1816,1817,1815,1813);运行结果如下:如果想按照in()里的...
  • 无论什么语言,不管什么框架,在这个大数据的时代,最终都会和...今天我们一起讨论一下mysql查询语句的执行顺序,这对项目开发中编写sql语句非常重要,知道sql语句里各个关键字的作用,从此写sql不是问题!!!...
  • mysql查询语句join、on、where执行顺序

    千次阅读 2022-02-18 15:51:55
    MySQL 的执行顺序 一、典型SELECT语句完整的执行顺序 1)from子句组装来自不同数据源的数据; 2)使用on进行join连接的数据筛选 3)where子句基于指定的条件对记录行进行筛选; 4)group by子句将数据划分为多个分组...
  • MySQL查询语句各关键字的执行顺序

    千次阅读 2018-08-20 21:21:50
    一、书写顺序和执行顺序 书写sql语句时各关键字的顺序: select from where group by having order by 执行顺序: from where group by having select order by 二、实例分析 SELECT lord 主公ID,...
  • MySQL,SQL语句执行顺序

    千次阅读 2021-01-19 16:30:59
    1.SQL执行顺序:select 考生姓名, max(总成绩) asmax总成绩fromtb_Gradewhere 考生姓名 is not nullgroup by考生姓名having max(总成绩) > 600order by max总成绩(1). 首先执行 FROM 子句, 从 tb_Grade 表组装...
  • MySQL 各语句执行顺序

    千次阅读 2022-01-10 11:14:42
    目录 语句中各子句完整执行顺序概括(按照顺序号执行): 每个子句执行顺序分析 语句中各子句完整执行顺序概括(按照顺序号执行): ...所有的 查询语句都是从from开始执行的,在执行过程中,每个步骤都会为
  • mysql 如何改变列的顺序

    千次阅读 2021-02-02 09:38:28
    mysql改变列顺序的方法:首先打开数据表;然后把id放在在前面,并且数据不动,语法为【alter table 表名 modify 字段名 字段类型 after 字段】。mysql改变列顺序的方法:创建了一个这样的数据表,想把id放到第一列,...
  • Mysql 查询数据并按顺序添加序号

    万次阅读 2017-10-10 14:14:01
    建表并导入数据: ...MYSQL查询语句: SELECT province_id, province_name, gdp, (@i :=@i + 1) AS No FROM province, (SELECT @i := 0) AS it ORDER BY gdp DESC 查询结果:
  • 连接查询、子查询、关键字顺序、存储引擎
  • 我们在用mysql查询in操作的时候,你会发现返回的数据,并不是我们想要的排序。如果情况是这样的话,那么在取回来之后还要通过foreach重新的在排序。这样即显得笨拙,也造成不必要的数据运行。这时,我们就在想如果在...
  • MySQL查询语句的执行顺序WHERE、JOIN等

    千次阅读 2018-12-12 23:36:37
    执行顺序 from join on where group by (从此处开始可以使用select中指定的别名) avg、sum、max having select distinct order by 举例 select sum(goods.number) from order left join goods on goods.order_id ...
  • mysql查询列表,默认是按照主键排序的, 查询user2列表,根据主键降序排列 根据ids查询列表,根据id升序排列 根据传入的list排序, order by field(字段,值1,值2,值3),根据idlist排序 根据usernamelist排序 ...
  • 之前我们已经了解的mysql按照中文进行排序的实现方法了:https://www.wj0511.com/site/detail.html?id=420 那么如何按照指定字段的指定顺序进行排序呢? 例如有一个用户表user,有id,username,status字段,status...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 388,070
精华内容 155,228
关键字:

mysql查询顺序

mysql 订阅
友情链接: modal_message.zip