您的位置:首页 > 数据库

SQL_Server_Day02_select查询语句

2015-07-19 15:16 260 查看
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 表名

        采用这个方法复制表结构(主键之类的约束是不会复制的)        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: