纸上得来终觉浅
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
建立如下表格orders:
注:下面所有语句符合语法顺序(也不可能不符合,因为会报错^_^),只分析其执行顺序:(join和on属于多表查询,放在最后展示)
语句一:
- select a.Customer
- from orders a
- where a.Customer='Bush' or a.Customer = 'Adams'
语句二groupby:groupby要和聚合函数一起使用
- select a.Customer,sum(a.OrderPrice)
- from orders a
- where a.Customer='Bush' or a.Customer = 'Adams'
- group by a.Customer
语句三having:
- select a.Customer,sum(a.OrderPrice)
- from orders a
- where a.Customer='Bush' or a.Customer = 'Adams'
- group by a.Customer
- having sum(a.OrderPrice) > 2000
语句四distinct: (为测试,先把数据库中Adams那条记录的OrderPrice改为3000)
- select distinct sum(a.OrderPrice)
- from orders a
- where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
- group by a.Customer
- having sum(a.OrderPrice) > 1700
语句五union:完全是对select的结果进行合并(默认去掉重复的记录):
- select distinct sum(a.OrderPrice) As Order1
- from orders a
- where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
- group by a.Customer
- having sum(a.OrderPrice) > 1500
- union
- select distinct sum(a.OrderPrice) As Order1
- from orders a
- where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
- group by a.Customer
- having sum(a.OrderPrice) > 2000
语句六order by:
- select distinct sum(a.OrderPrice) As order1
- from orders a
- where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
- group by a.Customer
- having sum(a.OrderPrice) > 1500
- union
- select distinct sum(a.OrderPrice) As order1
- from orders a
- where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
- group by a.Customer
- having sum(a.OrderPrice) > 2000
- order by order1
语句七limit:
- select distinct sum(a.OrderPrice) As order1
- from orders a
- where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
- group by a.Customer
- having sum(a.OrderPrice) > 1500
- union
- select distinct sum(a.OrderPrice) As order1
- from orders a
- where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
- group by a.Customer
- having sum(a.OrderPrice) > 2000
- order by order1
- limit 1
语句八(上面基本讲完,下面是join 和 on):
- select distinct sum(a.OrderPrice) As order1,sum(d.OrderPrice) As order2
- from orders a
- left join (select c.* from Orders c) d
- on a.O_Id = d.O_Id
- where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
- group by a.Customer
- having sum(a.OrderPrice) > 1500
- union
- select distinct sum(a.OrderPrice) As order1,sum(e.OrderPrice) As order2
- from orders a
- left join (select c.* from Orders c) e
- on a.O_Id = e.O_Id
- where a.Customer='Bush' or a.Customer = 'Adams' or a.Customer = 'Carter'
- group by a.Customer
- having sum(a.OrderPrice) > 2000
- order by order1
- limit 1
注:
1)使用distinct要写在所有要查询字段的前面,后面有几个字段,就代表修饰几个字段,而不是紧随distinct的字段;
2)group by执行后(有聚合函数),group by后面的字段在结果中一定是唯一的,也就不需要针对这个字段用distinct;