zoukankan      html  css  js  c++  java
  • Mysql 语句执行顺序

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

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

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

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

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

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

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

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

    select[distinct]  
    from  
    join(如left join)  
    on  
    where  
    group by  
    having  
    union  
    order by  
    limit  
    

      

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

    from  
    on  
    join  
    where  
    group by  
    having  
    select  
    distinct  
    union  
    order by   

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

    建立如下表格orders:

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

    语句一:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. select a.Customer  
    2. from orders a  
    3. where a.Customer='Bush' or a.Customer = 'Adams'  

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


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

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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)

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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的结果进行合并(默认去掉重复的记录):

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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):

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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;

  • 相关阅读:
    Post和Get的区别(兼谈页面间传值的方式)
    ClickOnce部署Winform程序的方方面面
    TSQL查询进阶深入浅出视图
    一个java volatile测试揭开的陷阱
    java volatile的一个验证反例
    [Swing扩展组件分享]为JTable添加选择列(CheckBox)的包装类
    JTextField限制输入长度的完美解决方案
    swing程序的关闭机制看好你的swing.Timer,别让它成为程序不能退出的原凶
    举例理解单元测试
    打印出txt中出现频率最高的十个词——软件工程个人项目C语言
  • 原文地址:https://www.cnblogs.com/lyftest/p/6400369.html
Copyright © 2011-2022 走看看