zoukankan      html  css  js  c++  java
  • SQLserver 连接+开窗函数+视图+事务

    今天学习SQLserver 连接以及开窗函数..加油!

    1、复习:查询(检索)
    -》筛选列
    -》筛选行:distinct top where
    运算符与关键字:比较运算符,逻辑运算符,between...and...,like '%_[^]'
    -》分组与聚合函数
    group by ... having ...
    max,min,avg,sum,count
    -》系统内置函数
    类型转换函数:cast(值 as 类型) convert(目标类型,值[,格式])
    字符串函数:len()
    日期时间函数:getdate() datediff(关键字,日期1,日期2) datepart(关键字,日期)
    -》联合查询:将多个结果集合并成一个结果集
    要求:列相同,列类型相同
    union:会排序,会去重复
    union all:所有数据都取出来,并且不排序
    -》连接查询:结果集中包含的数据分布于多个表中,则需要将多个表根据关系连接起来查询
    何时使用连接查询?
    关键:找出多个表的关系
    join on
    内连接inner join

    2、自连接
    分公司-company
    cid
    名称
    1 总部
    部门-department
    did
    名称
    属于某个分公司cid
    1 北京分公司 1
    事业部-depart
    deit
    名称
    属于某个部门did
    ->观察发现表的结构非常类似,于是考虑将这些表合成一张表
    ->组织架构表groups
    gid
    gname
    gparent--对于没有上级的信息,可以使用0来填充
    -》特点:关系列的值引用的本表中主键列信息
    -》示例数据
    1 总部 0
    2 北京分公司 1
    3 上海分公司 1
    4 深圳分公司 1
    5 广州分公司 1
    6 .net部门 2
    7 .net部门 5
    -》查询部门及所对应的公司的名称
    3、外连接
    -》left join:左表中的信息全部出现,右表中的信息必须能够匹配的才出现
    未匹配的项使用null填充
    -》right join:右表中的信息全部出现,左表中的信息必须能够匹配的才出现
    未匹配的项使用null填充
    -》full join:所有数据都会出现,不匹配的项使用null填充
    -》只要想做连接查询,必须分析出两个表间的关系

    4、t-sql
    -》case:用于在select子句中进行判断
    两种格式:判断相等,判断不等
    -》全局变量
    @@identity:与一个insert语句连用,表示最新生成的标识
    @@error:返回最近一个语句的错误编号,如果没有错误返回0,结合if替代try---catch的使用
    -》开窗函数over
    用途一:排序order by ,row_number
    用途二:划区partition by,结合聚合函数针对某部分数据进行汇总
    -》视图
    用于存储封装一个select语句
    使用:和使用表一样
    注意:视图并不是一个存储数据的容器,而只是存储了一个查询
    -》事务

    在sqlserver中事务是自动提交的
    通过set implicit_transactions on阻止自动提交
    --开启事务:begin tran
    --提交事务:commit tran
    --回滚事务:rollback tran
    -》存储过程
    功能:完成一段代码的封装
    语法:create proc 名称
    参数列表
    as
    代码段
    调用:exec 名称 参数列表
    知识1:可以使用output修饰参数
    知识2:可以使用默认值,注意需要将最后的参数设置成默认值
    -》索引
    作用:提高查询速度
    注意:不是越多越好,会损耗存储空间
    应用:对于出现在where子句中的列建立索引

     

    下面是学习的代码

     

    declare @uname nvarchar(10)='sk'
    set @uname='yzk'
    print @uname
    select @uname

    --全局变量
    select @@VERSION
    select * from Employee

    insert into Employee(eName,eCode,edid) values('zjy',14,4)
    select @@IDENTITY

    insert into Employee values('yhb')
    print @@error

    print @@rowcount
    ---================if语句
    --判断一个值是奇数还是偶数
    declare @i int=10
    if(@i%2=0)
    begin
    print '偶数'
    end
    else
    begin
    print '奇数'
    end

    --===========循环语句
    --求1-100的和
    declare @j int=1
    declare @sum int=0
    while(@j<=100)
    begin
    set @sum+=@j
    set @j+=1
    end
    print @sum


    --=============开窗函数
    --排序
    select *,RANK() over(order by tenglish desc) from TblScore
    --order by tEnglish desc
    --划区
    select * from TblOrders
    --传统的统计汇总
    --这个语句表示对整个数据进行划区
    select oname,SUM(ocount)
    from TblOrders
    group by oname

    select *,SUM(ocount) over(partition by oname)
    from TblOrders
    --36
    select *,SUM(ocount) over() from TblOrders
    --196
    --排号
    select * from TblOrders
    delete from TblOrders where oname='糖果'
    select *,row_number() over(order by oprice desc)
    from TblOrders
    --
    select distinct oname,oprice,max(ocount) over(partition by oname)
    from TblOrders
    --分页,要求3条数据显示一页
    select * from(
    select *,row_number() over(order by oprice desc) as num
    from TblOrders
    ) t1
    where num between 4 and 6
    --找各班中城市人最多的城市名称
    use ItCastCn

    select * from TblStudent

    select distinct tSClassId,MAX(counter) over(partition by tsclassid) from(
    select distinct tSClassId,tSAddress,COUNT(*) over(partition by tsaddress) as counter
    from TblStudent
    ) t1
    --
    select tSAddress ,tSClassId from(
    select rank() OVER(partition by tsclassid ORDER BY num DESC )AS number,* from
    (
    select tSAddress,tSClassId ,count(tSAddress) as num
    from TblStudent
    group by tSClassId,tSAddress
    )a
    )b where number=1


    --============视图
    use hem09
    select *,row_number() over(order by oprice desc) as num
    from TblOrders

    create view ordersWithNum
    as
    select *,row_number() over(order by oprice desc) as num
    from TblOrders

    select * from ordersWithNum
    --查看视图中的代码
    exec sp_helptext ordersWithNum

    --=============事务
    --比如订火车票
    --下一个订单,这个订单中,包含多个购买信息
    --orders,orders_detail
    --合作事务来处理这种模型
    --关键字:tran[saction]
    --开启事务:begin tran
    --提交事务:commit tran
    --回滚事务:rollback tran
    --示例
    select * from TblOrders
    declare @errornum int=0
    begin tran
    insert into tblorders values('五粮液',2,300)
    set @errornum+=@@error
    insert into TblOrders values('包子',3,1)
    set @errornum+=@@error
    if(@errornum>0)
    begin
    rollback tran
    end
    else
    begin
    commit tran
    end

    select * from TblOrders

    begin tran
    insert into tblorders values('ee',100,300)
    --commit tran
    rollback tran


    set implicit_transactions on
    --===============存储过程
    select ' abc '
    select rtrim(LTRIM(' abc '))
    --'abc'

    --存储过程完成一段sql代码的封装
    create proc trim
    --参数列表,多个间用逗号分隔
    @str varchar(10)
    as
    --自定义代码段
    declare @str1 varchar(10)
    set @str1=LTRIM(RTRIM(@str))
    print @str1

    --使用存储过程
    exec trim ' abc '
    --'abc'
    --===带输出参数的存储过程
    --求两个数的和
    create proc sum1
    @num1 int,
    @num2 int,
    @result int output--表示这个参数可以将结果带出存储过程
    as
    set @result=@num1+@num2

    declare @r1 int
    exec sum1 1,2,@r1 output--必须要写output关键字,否则调用出错
    print @r1

    --===参数带默认值的存储过程,注意:默认值必须是最后一个参数
    alter proc multi
    @num1 int,
    @num2 int=10 output--output的功能类似于C#中的ref修饰参数
    as
    set @num2=@num2*@num1
    print @num2
    --测试带出值的效果
    declare @num int=2
    exec multi 3,@num output
    select @num
    --测试默认值
    exec multi 3

    -------==============索引
    select * from TblOrders
    where oprice>100
    --创建索引
    create index index_name
    on tblorders(oname)

     

     

    这是昨天晚上看黑马视频学习的东西.感觉刘祁老师讲的挺好的.就是连着看了3-4个小时,很容易走神,可能听着听着就不知道自己想哪去了.这一点在以后的学习过程中要注意,不要一成不变的连续的看 ,可以边总结 边看

     

  • 相关阅读:
    jQuery工具函数
    jqXHR对象
    跨域获取
    Ajax :六个全局事件
    表单序列化
    Ajax : $. get()和$.post() $.getScript $.getJSON
    Ajax : load()
    列队动画
    关于MindManager显示不同级别的控制
    Mybatis 查询传多个参数(3中方法)
  • 原文地址:https://www.cnblogs.com/Mining-LiTeng/p/4567073.html
Copyright © 2011-2022 走看看