当前位置:Gxlcms > 数据库问题 > Mysql 语句执行顺序

Mysql 语句执行顺序

时间:2021-07-01 10:21:17 帮助过:21人阅读

   技术分享技术分享
  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    技术分享技术分享
  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    技术分享技术分享
  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    技术分享技术分享
  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    技术分享技术分享
  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    技术分享技术分享
  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    技术分享技术分享
  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    技术分享技术分享
  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;

Mysql 语句执行顺序

标签:tools   left join   学习   idt   strong   技术   ada   XML   code   

人气教程排行