透析sql语法
sql的执行顺序
from
on
join
where
group by(开始使用select中的别名,后面的语句中都可以使用)
avg,sum….
having
select
distinct
order by
limit
/*
mysql时从from开始执行,再执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,下一步骤操作虚拟表
*/
连接
join连接
join连接可以简单理解为按连接条件将多张表的字段横向拼接成一张表,具体实现是拿着一张表的一条记录去和另一张表的每一条数据做对比,如果两个数据满足连接条件,则进行横向拼接成一条记录放入新表,直至第一张表的每一条记录都和第二张表的每一条记录做过对比。
内连接只拼接满足条件的记录
-
user表
-
两个user表join不写on或on的条件是与字段无关的且结果为true的表达式
-
两个user表join写on条件
left join 在join连接的基础上,对左表中未匹配的记录和null进行横向拼接
right join 在join连接的基础上,对右表中未匹配的记录和null进行横向拼接
union all连接
union all连接可以简单理解为将多张表(字段的数量必须一致)纵向拼接成一张表**(最终表的字段名为第一张表的字段名)**
union连接是将union all连接的结果去重
- user表
-
两个user表union all连接
-
两个user表union连接
group by 分组字段1,分组字段2,… having 筛选条件表达式
group by 是将表中分组字段数据相同的记录合并为一条记录,可以使用分组函数对非分组字段的数据进行处理(求和,求平均…)
在使用group by的时候需注意,select结果字段中只能出现分组字段和一些聚合函数(sum,avg,max,min,count,group_concat)的结果
having是在分组的基础上再次筛选数据,保留having后的表达式为true的记录
在使用having的时候需注意,having后的字段必须是分组字段
-
user表数据
-
按name分组
-
分组后筛选数据
order by 排序字段1 排序方式,排序字段2 排序方式,…
order by是一个sql倒数第二个执行的操作,主要功能是将查询结果按照排序字段进行排序,排序方式缺省值为生序(asc),多个排序字段按照从左到右的优先级进行先后排序
- user表数据
-
user表按照name生序排序
-
上图会发现有很多name相同的记录,那么就可以再按照第二个字段排序,例如再按照age降序排序
limit m,n
limit 是一个sql最后执行的一个操作,主要的功能是略过m条记录之后取n条记录
m可省略不写,缺省值为0
- user表数据
-
user表略过0条取两条数据(即取前两条数据)
-
user表略过前两条后取两条数据