详述SQL中查询语句的执行过程

本文详细介绍了SQL Select语句的执行顺序,从from子句开始,经过where子句筛选,再到group by和having子句对数据进行分组和过滤,接着计算表达式,选择字段,最终order by进行排序。SQL语言的处理顺序与常规编程语言不同,其特点在于先处理from子句。同时,文章还解释了group by和having子句在数据库操作中的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 对结果集进行排序。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值