写sql的关键字顺序
select [distinct]
from
join(如left join)
on
where
group by
having
union
order by
limit
在数据库底层执行时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'
分析:首先是from语句找到表格,然后根据where得到符合条件的记录,最后select出需要的字段,结果如下:
groupby:
groupby要和聚合函数一起使用
select a.Customer,sum(a.OrderPrice)
from orders a
where a.Customer='Bush' or a.Customer = 'Adams'
group by a.Customer
分析:在from,where执行后,执行group by,同时也根据group by的字段,执行sum这个聚合函数。这样的话得到的记录对group by的字段来说是不重复的,结果如下:
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
分析:由于where是在group之前执行,那么如何对group by的结果进行筛选,就用到了having,结果如下:
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
分析:将得到一条记录(没有distinct,将会是两条同样的记录):
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
分析:默认去掉重复记录(想保留重复记录使用union all),结果如下:
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
分析:上述语句其实join on就是多连接了一张表,而且是两张一样的表,都是Orders。 执行过程是,在执行from关键字之后根据on指定的条件,把left join指定的表格数据附在from指定的表格后面,然后再执行where字句。
注: