详述SQL中查询语句的执⾏过程
SQL Select 语句完整的执⾏顺序
1、from ⼦句组装来⾃不同数据源的数据;
2、where ⼦句基于指定的条件对记录⾏进⾏筛选;
3、group by ⼦句将数据划分为多个分组;
4、使⽤聚集函数进⾏计算;
5、使⽤having ⼦句筛选分组;
6、计算所有的表达式;
7、select 的字段;
8、使⽤order by 对结果集进⾏排序。
SQL 语⾔不同于其他编程语⾔的最明显特征是处理代码的顺序
在⼤多数据库语⾔中,代码按编码顺序被处理。但在SQL 语句中,第⼀个被处理的⼦句式FROM,⽽不是第⼀出现的SELECT。SQL 查询处理的步骤序号:
(1) FROM <left_table>
(2) <join_type> JOIN <right_table>
(3) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}insert语句字段顺序
(7) HAVING <having_condition>
(8) SELECT
(9) DISTINCT
(9) ORDER BY<order_by_list>
(10) <TOP_specification> <select_list>
下⾯讲⼀下红⾊字体的关键字
group by分组
group by⽤于将表中数据划分为若⼲个组,group by后⾯⽤于指定分组的依据
操作数据库,代码如下:
create table student(
id char(1) primary key,
name varchar(8),
sex char(2) default '男' ,
age int(3) default 0
)
向表中添加数据:
insert into student values ('1','王明','男',18);
insert into student values ('2','孙丽','⼥',17);
insert into student values ('3','王明','男',27);
insert into student (id,sex,age) values ('4','男',27);
将student表学⽣按照sex分组,然后统计每组中的⼈数:
select sex,count(sex) from student group by sex
select sex,count(sex) from student group by sex
group by查询列表只能是分组依据列或多⾏函数
select name,sex,count(sex) from student group by sex
这样的表没有什么作⽤,如果是Oracle数据库直接会报错
1.只有对应列相同的多⾏数据才会归为⼀组
2.如果select语句中使⽤group by进⾏了分组,则select⼦句中只可以有组函数和分组字段,不能含有其他字段,否则SQL语句报错;
3.如果group by⼦句后⾯跟着order by⼦句,则order by⼦句⽤于排序的字段必须是组函数或分组字段;
4.如果select语句中含有where、order by,那么group by需放在where之后order by之前,即先获取符合where条件的“有效”数据,再依据group by对数据进⾏分组,最后再排序;    where------>group by------>order by
having
select name,count(name) from student group by name
where后⾯不能使⽤多⾏函数,只能使⽤单⾏函数和字段,having关键字弥补了这⼀不⾜:having⼦句⽤于对分组结果进⾏约束
查询那个名字重复,使⽤where时会报错,代码如下:
select name from student where count(name)>1
select name,count(name)from student group by name having count(name)>1
1.having⼦句⼀般和group by⼦句⼀起使⽤,MySQL数据库也可以单独使⽤,但是Oracle数据库不允许单独使⽤
2.having⼦句必须放在group by⼦句之后,order by⼦句之前:  where、group by、having、order by
分析下列代码:
select sex,count(sex) total from student where name like '%' group by sex having count(name)>1 ord
er by total
执⾏过程:⾸先执⾏ from ⼦句,选择student数据库表;------->然后执⾏where ⼦句基于指定的条件对记录⾏进⾏筛选,上述代码中给的条件选出来的是所有信息;------->然后执⾏group by ⼦句将数据划分为多个分组,sex组;------->使⽤聚集函数进⾏计算;将
计算出来的count(sex)结果重命名为total------->使⽤having ⼦句筛选分组,选出数量>1的;-------->计算所有的表达式;------>select 的字段;------->使⽤order by 对结果集进⾏排序。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。