SQL Server如何执行查询的?
标准的查询语句结构
按照结构顺序介绍数据库的操作
1. SQL Server如何执行查询的?
数据库管理系统都包括:查询引擎和存储引擎
查询引擎:(传入一个sql语句,得到一个查询计划)
1)语法分析
2)生成查询树(1个数学结构)
3)生成查询计划(生成代码的执行顺序)
先到内存池中检测是否存在满足要求的查询集计划,如果有直接拿来用,
否则对生成的查询计划进行处理优化
存储引擎:
1)是查询--Query
内存池中是否有?拿出来用:执行查询;
2)是更新--Execute
--进行事物管理操作(相当于搞了个副本,如果后面更新成功,那么就更改完成
如果后面失败,那么就还原回去)
--修改内存中的数据
--触发惰性读写器
--标记事物结束
2. 一个完整的查询语句
SELECT TOP 表达式| distinct
字段
,字段表达式
,单值子查询
,函数表达式
FROM
表表达式
WHERE
初步筛选条件
GROUP BY
分组条件
HAVING
分组后筛选条件
ORDER BY
排序依据[ASC, DESC]
执行的先后顺序是什么?
From --> where --> group by --> having --> select --> order by --> top
select子句是可以包含需要计算的表达式的
案例--一个查询的案例
3. 查询的各个子句分析
1) from子句 --用来设定数据源 要保证数据是一个集合
select avg(stuScore) as avgScore from...
关联子查询 -- 将一个查询做为另一个查询的一部分
select * from (select * from xxx) as t; --从结果集里面select
order by --> cursor 不是结果集
2) where子句 --对结果集进行第一次筛选
逻辑表达式, = > < >= <= <> (Microsoft:T-SQL扩充出的 != !> !<)
not and or
模糊处理, 字段 like '模糊字符串' name like '张%'
模糊字符串中使用 _表示任意一个字符 %表示任意多个字符
[] 表示出现在方括号中的一个字符 [^] 否定用法
范围处理, age > 18 and age < 24 (T-SQL: age between 18 and 24 两边都能取到)
in运算符 age in (18, 23, 24) --离散值
空值判断 SQL Server使用三值逻辑 true false unknown
not(name is null)
数据库中0.3表示为.3
3) group by子句
使用group by对字段中的数据进行汇总(聚合--多条同结果数据聚合成一行)
使用group by必须保证select子句中只包含分组的字段,聚合函数和常量
聚合函数有哪些?
count(*) --有多少条
sum(字段) max(字段) min(字段) avg(字段)
4. 开窗函数
1)为每条数据显示聚合信息 聚合函数 over() as 别名
select *, avg(stuScore) as avgScore from... --在学生表中的每条数据后面加上班级平均分
聚合函数只有一行数据,而学生有4条数据,两者不统一
所以使用开窗函数 语法:聚合函数 over() as 别名
2)为每条数据提供分组的聚合函数结果(聚合函数() over(partition by 字段) as 别名)
3)与排名函数一起使用(row_number() over(order by 字段) as 别名)
5. HAVING子句
对group by聚合后的新的表结构 进行 筛选
对年龄的处理 -- 数据库中存的是出生日期
6. SELECT子句
加别名 使用 列数据 as 别名
sql语句底层select的做法
每一个子句都是对一个结果集进行处理
处理的步骤有筛选、计算、排序、聚合、函数等操作
通过变换改变结果集的结构,最终在内存中依旧是一个表结果
最后使用select子句将结果一一取出,展示出来
7. DISTINCT 去除完全相同的数据
select distinct * from ...
用途并不大,因为有了主键,所以很少出现完全相同的数据
8. TOP + 数字 (percent) 常与 order by联合使用
9. ORDER BY
10. 结果集 和 游标
在SQL语句中,如果没有order by的查询(执行计划中没有sort这个步骤)
结果称为"结果集" (是集合)
如果使用了order by就将结果称为游标 --> 有序数据集(不是集合)
有top的含有order by语句的sql语句的结果是 结果集(因为top在最后执行)
11. 联合结果集
查询语句(结果集) union 查询语句(结果集)
union all --> 两张表有冗余的数据,用union all会保留冗余的数据
12. 插入数据的语法
1)insert into xxx from (结果集)
2)select * into 新表名 from 表名
采用这个方法复制表结构(主键之类的约束是不会复制的)
标准的查询语句结构
按照结构顺序介绍数据库的操作
1. SQL Server如何执行查询的?
数据库管理系统都包括:查询引擎和存储引擎
查询引擎:(传入一个sql语句,得到一个查询计划)
1)语法分析
2)生成查询树(1个数学结构)
3)生成查询计划(生成代码的执行顺序)
先到内存池中检测是否存在满足要求的查询集计划,如果有直接拿来用,
否则对生成的查询计划进行处理优化
存储引擎:
1)是查询--Query
内存池中是否有?拿出来用:执行查询;
2)是更新--Execute
--进行事物管理操作(相当于搞了个副本,如果后面更新成功,那么就更改完成
如果后面失败,那么就还原回去)
--修改内存中的数据
--触发惰性读写器
--标记事物结束
2. 一个完整的查询语句
SELECT TOP 表达式| distinct
字段
,字段表达式
,单值子查询
,函数表达式
FROM
表表达式
WHERE
初步筛选条件
GROUP BY
分组条件
HAVING
分组后筛选条件
ORDER BY
排序依据[ASC, DESC]
执行的先后顺序是什么?
From --> where --> group by --> having --> select --> order by --> top
select子句是可以包含需要计算的表达式的
案例--一个查询的案例
3. 查询的各个子句分析
1) from子句 --用来设定数据源 要保证数据是一个集合
select avg(stuScore) as avgScore from...
关联子查询 -- 将一个查询做为另一个查询的一部分
select * from (select * from xxx) as t; --从结果集里面select
order by --> cursor 不是结果集
2) where子句 --对结果集进行第一次筛选
逻辑表达式, = > < >= <= <> (Microsoft:T-SQL扩充出的 != !> !<)
not and or
模糊处理, 字段 like '模糊字符串' name like '张%'
模糊字符串中使用 _表示任意一个字符 %表示任意多个字符
[] 表示出现在方括号中的一个字符 [^] 否定用法
范围处理, age > 18 and age < 24 (T-SQL: age between 18 and 24 两边都能取到)
in运算符 age in (18, 23, 24) --离散值
空值判断 SQL Server使用三值逻辑 true false unknown
not(name is null)
数据库中0.3表示为.3
3) group by子句
使用group by对字段中的数据进行汇总(聚合--多条同结果数据聚合成一行)
使用group by必须保证select子句中只包含分组的字段,聚合函数和常量
聚合函数有哪些?
count(*) --有多少条
sum(字段) max(字段) min(字段) avg(字段)
4. 开窗函数
1)为每条数据显示聚合信息 聚合函数 over() as 别名
select *, avg(stuScore) as avgScore from... --在学生表中的每条数据后面加上班级平均分
聚合函数只有一行数据,而学生有4条数据,两者不统一
所以使用开窗函数 语法:聚合函数 over() as 别名
2)为每条数据提供分组的聚合函数结果(聚合函数() over(partition by 字段) as 别名)
3)与排名函数一起使用(row_number() over(order by 字段) as 别名)
5. HAVING子句
对group by聚合后的新的表结构 进行 筛选
对年龄的处理 -- 数据库中存的是出生日期
6. SELECT子句
加别名 使用 列数据 as 别名
sql语句底层select的做法
每一个子句都是对一个结果集进行处理
处理的步骤有筛选、计算、排序、聚合、函数等操作
通过变换改变结果集的结构,最终在内存中依旧是一个表结果
最后使用select子句将结果一一取出,展示出来
7. DISTINCT 去除完全相同的数据
select distinct * from ...
用途并不大,因为有了主键,所以很少出现完全相同的数据
8. TOP + 数字 (percent) 常与 order by联合使用
9. ORDER BY
10. 结果集 和 游标
在SQL语句中,如果没有order by的查询(执行计划中没有sort这个步骤)
结果称为"结果集" (是集合)
如果使用了order by就将结果称为游标 --> 有序数据集(不是集合)
有top的含有order by语句的sql语句的结果是 结果集(因为top在最后执行)
11. 联合结果集
查询语句(结果集) union 查询语句(结果集)
union all --> 两张表有冗余的数据,用union all会保留冗余的数据
12. 插入数据的语法
1)insert into xxx from (结果集)
2)select * into 新表名 from 表名
采用这个方法复制表结构(主键之类的约束是不会复制的)