SQL_Server_Day02_select查询语句

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 表名
        采用这个方法复制表结构(主键之类的约束是不会复制的)        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值