1.这样一个问题,作为一个开发人员需要掌握数据库的哪些东西?  在开发中涉及到数据库,基本上只用到了sql语句,如何写sql以及对其进行优化就比较重要,那些mysql的厚本书籍针对的是DBA,我们只需要学习其中的sql就可以了。

2.既然会写sql是目标,那么怎么才能写好sql.学习下面几点:

1)Mysql的执行顺序,这个是写sql的核心,之前遇到的一些错误就是因为对其不了解;

2)如何进行多表查询,优化,这个是很重要的部分;

3)sql语句的函数,sql提供的函数方便了很多操作;

3.这篇对Mysql语句执行顺序的学习做了总结:

1)Mysql语法顺序,即当sql中存在下面的关键字时,它们要保持这样的顺序:

  1. select[distinct]
  2. from
  3. join(如left join)
  4. on
  5. where
  6. group by
  7. having
  8. union
  9. order by
  10. limit

2)Mysql执行顺序,即在执行时sql按照下面的顺序进行执行:

  1. from
  2. on
  3. join
  4. where
  5. group by
  6. having
  7. select
  8. distinct
  9. union
  10. order by

3)针对上面的Mysql语法顺序和执行顺序,循序渐进进行学习:

建立如下表格orders:

注:下面所有语句符合语法顺序(也不可能不符合,因为会报错^_^),只分析其执行顺序:(join和on属于多表查询,放在最后展示)

语句一:

  1. select a.Customer
  2. from orders a
  3. where a.Customer='Bush' or a.Customer = 'Adams'

分析一:首先是from语句找到表格,然后根据where得到符合条件的记录,最后select出需要的字段,结果如下:


语句二groupby:groupby要和聚合函数一起使用

  1. select a.Customer,sum(a.OrderPrice)
  2. from orders a
  3. where a.Customer='Bush' or a.Customer = 'Adams'
  4. group by a.Customer

分析二:在from,where执行后,执行group by,同时也根据group by的字段,执行sum这个聚合函数。这样的话得到的记录对group by的字段来说是不重复的,结果如下:

语句三having:

  1. select a.Customer,sum(a.OrderPrice)
  2. from orders a
  3. where a.Customer='Bush' or a.Customer = 'Adams'
  4. group by a.Customer
  5. having sum(a.OrderPrice) > 2000

分析三:由于where是在group之前执行,那么如何对group by的结果进行筛选,就用到了having,结果如下:

语句四distinct: (为测试,先把数据库中Adams那条记录的OrderPrice改为3000)

  1. select distinct sum(a.OrderPrice)
  2. from orders a
  3. where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
  4. group by a.Customer
  5. having sum(a.OrderPrice) > 1700

分析四:将得到一条记录(没有distinct,将会是两条同样的记录):

语句五union:完全是对select的结果进行合并(默认去掉重复的记录):

  1. select distinct sum(a.OrderPrice) As Order1
  2. from orders a
  3. where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
  4. group by a.Customer
  5. having sum(a.OrderPrice) > 1500
  6. union
  7. select distinct sum(a.OrderPrice) As Order1
  8. from orders a
  9. where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
  10. group by a.Customer
  11. having sum(a.OrderPrice) > 2000

分析五:默认去掉重复记录(想保留重复记录使用union all),结果如下:

语句六order by:

  1. select distinct sum(a.OrderPrice) As order1
  2. from orders a
  3. where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
  4. group by a.Customer
  5. having sum(a.OrderPrice) > 1500
  6. union
  7. select distinct sum(a.OrderPrice) As order1
  8. from orders a
  9. where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
  10. group by a.Customer
  11. having sum(a.OrderPrice) > 2000
  12. order by order1

分析:升序排序,结果如下:

语句七limit:

  1. select distinct sum(a.OrderPrice) As order1
  2. from orders a
  3. where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
  4. group by a.Customer
  5. having sum(a.OrderPrice) > 1500
  6. union
  7. select distinct sum(a.OrderPrice) As order1
  8. from orders a
  9. where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
  10. group by a.Customer
  11. having sum(a.OrderPrice) > 2000
  12. order by order1
  13. limit 1

分析七:取出结果中的前1条记录,结果如下:


语句八(上面基本讲完,下面是join 和 on):

  1. select distinct sum(a.OrderPrice) As order1,sum(d.OrderPrice) As order2
  2. from orders a
  3. left join (select c.* from Orders c) d
  4. on a.O_Id = d.O_Id
  5. where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
  6. group by a.Customer
  7. having sum(a.OrderPrice) > 1500
  8. union
  9. select distinct sum(a.OrderPrice) As order1,sum(e.OrderPrice) As order2
  10. from orders a
  11. left join (select c.* from Orders c) e
  12. on a.O_Id = e.O_Id
  13. where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
  14. group by a.Customer
  15. having sum(a.OrderPrice) > 2000
  16. order by order1
  17. limit 1

分析八:上述语句其实join on就是多连接了一张表,而且是两张一样的表,都是Orders。 执行过程是,在执行from关键字之后根据on指定的条件,把left join指定的表格数据附在from指定的表格后面,然后再执行where字句。

注:

1)使用distinct要写在所有要查询字段的前面,后面有几个字段,就代表修饰几个字段,而不是紧随distinct的字段;

2)group by执行后(有聚合函数),group by后面的字段在结果中一定是唯一的,也就不需要针对这个字段用distinct;

转载:https://blog.csdn.net/jintao_ma/article/details/51253356

Mysql 语句执行顺序的更多相关文章

  1. mysql 语句执行顺序问题

    今天在写程序的时候,做分页查找时无意中,将计算数据库查询数量的语句,放到了limit之中,导致出现了bug. 所以发现以下问题: select count(1) from table limit 0, ...

  2. MySQL语句执行顺序

    执行顺序:见:http://www.cnblogs.com/rollenholt/p/3776923.html 下面我们来具体分析一下查询处理的每一个阶段 FORM: 对FROM的左边的表和右边的表计 ...

  3. mysql语句执行顺序图示

  4. 关于sql和MySQL的语句执行顺序(必看!!!)

    今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及My ...

  5. (转)关于sql和MySQL的语句执行顺序(必看!!!)

    原文:https://blog.csdn.net/u014044812/article/details/51004754 https://blog.csdn.net/j080624/article/d ...

  6. MySQL的语句执行顺序

    MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...

  7. 关于sql和MySQL的语句执行顺序

    sql和mysql执行顺序,发现内部机制是一样的.最大区别是在别名的引用上. 一.sql执行顺序 (1) from (3) join (2) on (4) where (5) group by(开始使 ...

  8. python 3 mysql sql逻辑查询语句执行顺序

    python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_t ...

  9. mysql优化必知(mysql的语句执行顺序)

    MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...

随机推荐

  1. 用Hadoop,还是不用Hadoop?

    本文由 伯乐在线 - Lex Lian 翻译.英文出处:Anand Krishnaswamy.欢迎加入翻译小组. Hadoop通常被认定是能够帮助你解决所有问题的唯一方案. 当人们提到“大数据”或是“ ...

  2. np.random.seed(0)的作用:作用:使得随机数据可预测。

    >>>> numpy.random.seed(0) ; numpy.random.rand(4) array([ 0.55,  0.72,  0.6 ,  0.54]) > ...

  3. Flink学习笔记:Operators之Process Function

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

  4. Hash 日常摸鱼笔记

    本篇文章是Hash在信息学竞赛中的应用的学习笔记,分多次更新(已经有很多坑了) 一维递推 首先是Rabin-Karp,对于一个长度为\(m\)的串\(S\) \(f(S)=\sum_{i=1}^{m} ...

  5. 牌型种数-dfs-蓝桥杯2015

    牌型种数 牌型种数 小明被劫持到 X 赌城,被迫与其他 3 人玩牌. 一副扑克牌(去掉大小王牌,共 52 张),均匀发给 4 个人,每个人 13 张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花 ...

  6. linux系统编程之(一) 信号量

    信号量 一.什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明 它被占用,测 ...

  7. 基于docker+redis++urlib/request的分布式爬虫原理

    一.整体思路及中心节点的配置 1.首先在虚拟机中运行一个docker,docker中运行的是一个linux系统,里面有我们所有需要的东西,linux系统,python,mysql,redis以及一些p ...

  8. 【记录】metasploit总结

    sessions -l 查看会话 backgroud 暂时退出当前会话 注入进程: ps 查看进程migrate 注入进程 进程ID 一般选择explorer.exe对应的PID run vnc 查看 ...

  9. js中的table导出成Excel表格

    首先判断手否是IE,原因在于IE导出我用的是ActiveXObject,判断的方式很简单,只需要拿到window.navigator.userAgent即可进行判断,代码如下 function get ...

  10. 单一指责原则(Single Responsibility Principle) SRP

    using System; using System.Collections.Generic; using System.Text; namespace SingleResponsibilityPri ...