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}
(7) HAVING <having_condition>
(8) SELECT
(9) DISTINCT
(9) ORDER BY <order_by_list>
(10) <TOP_specification> <select_list>
上面黑体的关键字已经全部整理到前面的博客中----------------------------------------------------------------------------------------------->详谈SQL函数---------->https://blog.youkuaiyun.com/qq_40831381/article/details/90081262-------------------------------------------------->详谈单表查询中where条件查询的使用--------->https://blog.youkuaiyun.com/qq_40831381/article/details/90075486
下面讲一下红色字体的关键字
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
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 order by total
执行过程:首先执行 from 子句,选择student数据库表;------->然后执行where 子句基于指定的条件对记录行进行筛选,上述代码中给的条件选出来的是所有信息;------->然后执行group by 子句将数据划分为多个分组,sex组;------->使用聚集函数进行计算;将计算出来的count(sex)结果重命名为total------->使用having 子句筛选分组,选出数量>1的;-------->计算所有的表达式;------>select 的字段;------->使用order by 对结果集进行排序。