您的位置:68399皇家赌场 > 虚拟主机 > SQL Server的尖端知识

SQL Server的尖端知识

发布时间:2019-08-03 11:45编辑:虚拟主机浏览(107)

    前言

    select语句
    语法:select distinct | top 数字 [percent] 字段1 as 外号,蕴含字段表明式,函数,常量
    from 表或结果集
    where 逻辑条件 | 模糊管理 | 范围管理 | null值处理
    group by 分组字段
    having 筛选规范
    order by 排序依赖;

      对于SQL SECR-VFVEPAJERO数据库也学了有说话了,本身也对协和所学做了某些计算。

    DataSet的剧情介绍,二种单例情势(并发量的记挂),SQL高端中的case语句、连接操作、子查询、派生表

    正文是私家学习SQL Server 数据库时的早年笔记的股价整理,内容器重是对数据库的主干增加和删除改查的SQL语句操作自律,视图,存款和储蓄进程,触发器的为主理解。

    执行流程:
    from子句 -> where子句 ->group by子句 ->having子句 ->select子句 ->order by子句

       大家率先学习数据库设计的有的知识点和用SQL语句建库。

     

    注:内容比较基础,适合入门者对SQL Server 数据库的问询!!!

    -- 名字
    -- 作用(例子)
    -- 语法

      设计数据库步骤:要求剖判阶段,概要设计阶段,详细设计阶段,

    ————————————————————————————————

    正文

    -- 子查询
    -- 正是在一个询问中嵌套二个询问
    -- 一般意义就是采用多张表查询一个新闻
    -- 例如查询"通辽语儿"的大成
    select * from TestDataBase..Student;
    select * from TestDataBase..Score;
    -- 在学生表中查得stuId,然后再到分数表中查询分数
    select stuId from TestDataBase..Student where stuName ='十堰语儿';

       建数据库的SQL语句如下(包括了假如有该数据库先删除在创建数据库)

    1.Case的用法

    1.子查询

    select * from TestDataBase..Score where stuId = 5723;

    -- 外界查询
    select *
    from TestDataBase..Score
    where stuId in
    ( -- 子查询、内部查询
    select stuId from TestDataBase..Student where stuName ='马鞍山语儿'
    );
    -- 外界查询(子查询)

    -- 将一个查询的结果作为另一个询问的基准

    -- 考试战绩与课程查出来 Course
    select * from TestDataBase..Course;

    select className from TestDataBase..Course where classId in
    (
    select top 1 classId from TestDataBase..Student where stuName='日照语儿'
    );

    -- 多少个单值 外界查询 where 字段 in (子查询)
    select '宣城语儿' , (select className from TestDataBase..Course where classId in
    (
    select top 1 classId from TestDataBase..Student where stuName='亳州语儿'
    ));

    -- 表值 select * from (子查询) as 别名
    select * from (
    select stuName, case stuSex when 'f' then '女' else '男' end as stuSex, DATEDIFF(YEAR, stuBirthdate, GETDATE()) as stuAge from TestDataBase..Student where stuId <= 10
    ) as t
    where t.stuAge between 20 and 30;

    --
    -- 职员和工人编号 基本薪金 请假扣款 补贴 业绩奖金 项目奖金 社会养老保险扣款
    /*
    select
    来自职员和工人表的询问
    , 来自薪给品级表的询问
    , 考勤表的询问
    ... ...
    */

    -- 独立子查询(标量、多值)

    -- 相关子查询
    -- 查询邵阳语儿的三科平均分
    select AVG(testBase), AVG(testBeyond), AVG(testPro) from TestDataBase..Score where stuId = (select top 1 stuId from TestDataBase..Student where stuName='张家口语儿');

    select
    stuName
    , (select AVG(TestBase) from TestDataBase..Score where stuId = t.stuId) as 基础平均分
    , (select AVG(testBeyond) from TestDataBase..Score where stuId = t.stuId) as 中级平均分
    , (select AVG(testPro) from TestDataBase..Score where stuId = t.stuId) as 高档平均分
    from
    TestDataBase..Student as t
    where
    stuName = '孝感语儿';


    use HeiMa8;

    create table Score
    (
    学号 nvarchar(10),
    课程 nvarchar(10),
    成绩 int
    )

    insert into Score values('0001','语文',87);
    insert into Score values('0001','数学',79);
    insert into Score values('0001','英语',95);
    insert into Score values('0002','语文',69);
    insert into Score values('0002','数学',84);

    case表达式:
    --if-else结构
    case
    when 条件1 then 值1
    when 条件2 then 值2
    。。。
    else 值n
    end

    --switch-case结构
    case 字段
    when 匹配1 then 值1
    when 匹配2 then 值2
    。。。
    else 值n
    end
    Set statistics io on;--张开监视磁盘IO操作
    Set statistics time on;

    select * from Score;
    -- 分组
    select 学号, '语文', '数学', '英语' from Score group by 学号;
    --先是种结构示例:switch--case
    select
    学号
    , case when 课程='语文' then 成绩 else 0 end as '语文'
    , case when 课程='数学' then 成绩 else 0 end as '数学'
    , case when 课程='英语' then 成绩 else 0 end as '英语'

    use master
    GO
    if exists(select * from sysdatabases where name='Wages')
    DROP database Wages
    CREATE DATABASE Wages
     ON
     (
      NAME='Wages_data',
      FILENAME='e:projectWages_data.mdf',
      SIZE=5mb,
      FILEGROWTH=15%
     )
     LOG ON
     (
      NAME= 'Wages_log',
      FILENAME='e:projectWages_log.ldf',
      SIZE=3mb,
      FILEGROWTH=15%
     )
    GO

    行使方法一:(类似C#中的case的用法)

    --把多个查询结果作为另外一个询问的查询源
    select * from (select * from Student where tbage between 3 and 5)
    as ct where tbname=5 --ct是新创的表名

    from Score

    select
    学号
    , sum(case when 课程='语文' then 成绩 else 0 end) as '语文'
    , sum(case when 课程='数学' then 成绩 else 0 end) as '数学'
    , sum(case when 课程='英语' then 成绩 else 0 end) as '英语'
    from Score
    group by 学号;

    其次种结构示例:if--else
    select
    sum(case when T.充钱金额>=500 then T.充钱金额 end) as '鲸鱼用户'
    ,sum(case when T.充钱金额>=100 and T.充钱金额<500 then T.充钱金额 end) as '海豚用户'
    ,sum(case when T.充钱金额>=10 and T.充钱金额<100 then T.充钱金额 end) as '小鱼用户'
    from
    (
    select [ChannelUserKey] as 用户ID,sum(convert(float,[RechargeAmount])/100) as 充钱金额,sum([RechargeCount]) as 充钱用户
    from [dbo].[FactRecharge]
    where datekey>=20141201 and datekey<=20141210
    and ChannelKey=1
    group by [ChannelUserKey]
    ) T


    -- 透视转变

    select * from Score pivot(
    sum(成绩) for 课程 in (语文,数学,英语)
    ) as t


    -- 表连接
    -- 功效:将多张表产生一张表
    -- 用法与分类(案例)
    -- 分类:交叉连接、内三翻五次、外接连

    create table joinPerson
    (
    pId int identity(1,1) not null
    , pName nvarchar(10) not null
    , titleId int null
    );
    alter table joinPerson
    add constraint PK_joinPerson_pId primary key(pId);

    create table joinTitle
    (
    titleId int identity(1,1) not null
    , titleName varchar(10) not null
    );
    alter table joinTitle
    add constraint PK_joinTitle_titleId primary key(titleId);

    insert into joinTitle(titleName) values('Teacher'),('Master');
    insert into joinPerson(pName, titleId) values('牛亮亮', 1),('苏坤', 2),('杨中科', NULL);

    select * from joinPerson;
    select * from joinTitle;

    select pName, titleName from joinPerson cross join joinTitle;
    -- 假使两章表中有重名的字段,就能够出难点,就要求给表加小名
    select t1.pName, t2.titleName from joinPerson as t1 cross join joinTitle as t2;

    -- 内连接
    select
    *
    from
    joinPerson as t1
    inner join
    joinTitle as t2
    on t1.titleId = t2.titleId;

    -- 左外连接
    select
    *
    澳门皇家赌场55533网址,from
    joinPerson as t1
    left join
    joinTitle as t2
    on t1.titleId = t2.titleId;

    -- 右外接连
    insert into joinTitle(titleName) values('班主任');

    select
    *
    from
    joinPerson as t1
    right join
    joinTitle as t2
    on t1.titleId = t2.titleId;

    -- 全连接
    select
    *
    from
    joinPerson as t1
    full join
    joinTitle as t2
    on t1.titleId = t2.titleId;

    -- 表表明式
    -- 正是经过表与表的演算,获得贰个结出集作为from前边的数据源
    -- 1、派生表 重回结果集的子查询
    -- 语法: select ... from (select 查询) as 别名;
    -- 注意: 不可能应用游标
    -- 2、公用表表达式CTE
    -- 3、视图
    -- 4、内联表值函数

    -- 查询学生音讯
    select * from
    TestDataBase..Student as t1
    inner join
    TestDataBase..Course as t2
    on t1.classId = t2.classId
    inner join
    TestDataBase..Score as t3
    on t1.stuId = t3.stuId
    where
    stuName = '泰安语儿';


    select * from
    (
    select
    t1.stuId
    , t1.stuName
    , case t1.stuSex when 'f' then '女' else '男' end as stuSex
    , datediff(year, t1.stuBirthdate, GETDATE()) as stuAge
    , t1.stuEmail
    , t1.stuAddress
    , t1.stuPhone
    , t2.className
    , t3.testBase
    , t3.testBeyond
    , t3.testPro
    from
    TestDataBase..Student as t1
    inner join
    TestDataBase..Course as t2
    on t1.classId = t2.classId
    inner join
    TestDataBase..Score as t3
    on t1.stuId = t3.stuId
    ) as t
    where t.stuName = '张家口语儿';


    为了创制美好的数据库需满意三大范式。

    ->语法:

    --把其余一个询问的结果作为当前查询的规格来行使。
    --子查询中=、!= 、< 、> 、<= 、>=之后只可以回去单个值,借使多少个值就能报错
    --化解办法 能够用in 替代
    select * from Student
    where tbage in(select tbage from Student where tbname=3)

    -- 分页

    select * from TestDataBase..Student;
    -- 当前页数、每页显示的条数 10
    -- SQL Server 2005 row_number() 可以为表生成多个连连的数字列
    -- 语法 row_number() over(order by 字段)
    -- select ROW_NUMBER() over(order by stuId), * from TestDataBase..Student

    select top 10 * from TestDataBase..Student;

    select top 10 * from TestDataBase..Student
    where stuId not in(select top 10 stuId from TestDataBase..Student);

    set statistics io on;
    set statistics time on;

    select top 10 * from TestDataBase..Student
    where stuId not in(select top ((100-1)*10) stuId from TestDataBase..Student);

    --
    select * from
    (
    select ROW_NUMBER() over(order by stuId) as num, * from TestDataBase..Student
    ) as t
    where
    t.num between 1 and 10;

    select * from
    (
    select ROW_NUMBER() over(order by stuId) as num, * from TestDataBase..Student
    ) as t
    where
    t.num between 21 and 30;
    /*
    select * from
    (
    select ROW_NUMBER() over(order by stuId) as num, * from TestDataBase..Student
    ) as t
    where
    t.num between (n-1) * m 1 and n * m;
    */

    -- 公用表表达式(CTE)
    -- 语法
    /*
    with 别名
    as
    (
    结果集
    )
    使用别称的一个查询;
    */
    with t
    as
    (
    select
    t1.stuId
    , t1.stuName
    , case t1.stuSex when 'f' then '女' else '男' end as stuSex
    , datediff(year, t1.stuBirthdate, GETDATE()) as stuAge
    , t1.stuEmail
    , t1.stuAddress
    , t1.stuPhone
    , t2.className
    , t3.testBase
    , t3.testBeyond
    , t3.testPro
    from
    TestDataBase..Student as t1
    inner join
    TestDataBase..Course as t2
    on t1.classId = t2.classId
    inner join
    TestDataBase..Score as t3
    on t1.stuId = t3.stuId
    )
    select * from t where t.stuName = '焦作语儿';

    -- t能够援用
    -- 自交差
    -- 生成一个数字表

    select num from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) as t(num);

    -- 自交差 10000
    select
    t1.num * 10 t2.num 1
    from
    (select num from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) as t(num)) as t1
    cross join
    (select num from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) as t(num)) as t2
    ;
    -- 用公用表表达式
    with t
    as
    (
    select num from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) as tt(num)
    )
    select
    t1.num * 1000 t2.num * 100 t3.num * 10 t4.num 1 as orderId
    from
    t as t1
    cross join
    t as t2
    cross join
    t as t3
    cross join
    t as t4
    order by
    orderId;

    select * from HeiMa8..AreaFull as t1 inner join HeiMa8..AreaFull as t2 on t1.AreaPid = t2.AreaId ;

    --
    -- 在急需一再的操作一些表说明式的时候
    -- 视图和内联表值函数

    -- 视图
    -- 正是将查询的言语封装成三个目的,每一趟查询的时候平素操作这些指标就可以
    -- 虚拟表
    -- 使用派生表
    select * from
    (
    select
    t1.stuId
    , t1.stuName
    , case t1.stuSex when 'f' then '女' else '男' end as stuSex
    , datediff(year, t1.stuBirthdate, GETDATE()) as stuAge
    , t1.stuEmail
    , t1.stuAddress
    , t1.stuPhone
    , t2.className
    , t3.testBase
    , t3.testBeyond
    , t3.testPro
    from
    TestDataBase..Student as t1
    inner join
    TestDataBase..Course as t2
    on t1.classId = t2.classId
    inner join
    TestDataBase..Score as t3
    on t1.stuId = t3.stuId
    ) as t
    where t.stuName = '抚州语儿';

    -- 成立视图
    -- 语法:
    /*
    create view vw_视图名
    as
    select语句
    ;
    */

    use TestDataBase;
    go
    create view vw_StuInfo
    as
    select
    ROW_NUMBER() over(order by t1.stuId) as n
    , t1.stuId
    , t1.stuName
    , case t1.stuSex when 'f' then '女' else '男' end as stuSex
    , datediff(year, t1.stuBirthdate, GETDATE()) as stuAge
    , t1.stuEmail
    , t1.stuAddress
    , t1.stuPhone
    , t2.className
    , t3.testBase
    , t3.testBeyond
    , t3.testPro
    from
    TestDataBase..Student as t1
    inner join
    TestDataBase..Course as t2
    on t1.classId = t2.classId
    inner join
    TestDataBase..Score as t3
    on t1.stuId = t3.stuId
    ;
    go

    -- 虚构的表
    select * from vw_StuInfo where stuName='榆林语儿';

    select * from vw_StuInfo where stuId = 304;

    update Testdatabase..Student set stuName = '嘉嘉' where stuId=304;

    --
    -- 视图能够立异数据,但是不建议更新和充实以及去除
    -- 连接多张表、视图并从未显式全体的字段

    --
    -- 视图的四个重大功能(数据安全)
    use HeiMa8;
    go
    create view Exe3.vw_StuInfo
    as
    select * from TestDataBase..vw_StuInfo;
    go

    -- HeiMa8
    select * from Exe3.vw_StuInfo;

    -- select * from sys.databases;

    -- 内联表值函数
    -- 带有参数的视图
    -- 功效: 将三个可变条件的查询封装成多少个函数对象,实施结果是一张表
    /*
    create function fn_函数名
    (@参数名 as 类型, ...)
    returns table
    as
    return 查询语句;
    */
    -- 分页
    -- @pageIndex 当前页码
    -- @pageSize 每页条数
    use TestDataBase;
    go

    create function fn_FenYe
    (@pageSize as int, @pageIndex as int)
    returns table
    as
    return
    select * from
    (
    select ROW_NUMBER() over(order by stuId) as num, * from Student
    ) as t
    where t.num between (@pageIndex-1) * @pageSize 1 and @pageIndex * @pageSize;
    go
    -- 分页

    -- 1008
    select * from fn_FenYe(10, 1008);

    -- 视图怎么提供权限,怎么安全
    -- 角色 访问工夫的成团
    -- 架构 可访谈对象的集结
    -- 视图 表的三个结出集

     

    -- 变量
    -- int num = 10;
    -- 声明 赋值 使用
    -- declare @变量名 类型;
    -- set @变量名 = 值;

    declare @num varchar(2);
    set @num = '10';

    select @num 'a';
    go

    -- SQL Server 2008
    declare @num int = 10;
    -- 局地变量
    -- 系统变量 @@开始

    select @@connections
    select @@CPU_BUSY;

    -- @@error 近来一遍施行SQL语句的错误码
    select @@ERROR;
    -- @@version
    select @@version
    print @@version;

    -- @@identity 方今二次插入数据的自发性增加编号
    select @@IDENTITY;
    use HeiMa8 ;
    select * from Exe3.newStudent where stuId = (select @@IDENTITY);

    insert into Exe3.newStudent
    (stuName, stuSex, stuBirthdate, stuStudydate, stuAddress, stuEmail, stuPhone, classId)
    values('牛亮亮', 'm', '1999-9-9 9:9:9.123', '2001-1-1 1:1:1.111','123', '123', '12345678909', 2);

    insert into Exe3.newStudent(stuName, stuSex, stuBirthdate, stuStudydate, stuAddress, stuEmail, stuPhone, classId)
    output inserted.*
    values('刘琦', 'm', '1999-9-9 9:9:9.123', '2001-1-1 1:1:1.111','123', '123', '12345678909', 2);

    -- @@trancount
    select @@TRANCOUNT -- 得到当前业务的深浅

    -- @@SPID
    select @@SPID; -- session_id
    kill 54

    -- set
    -- select
    -- select @变量=值
    go

    declare @num int;
    select @num = 10;
    select @num;
    go

    select top 3 * from Exe3.newStudent

    declare @name nvarchar(1000) = '';
    -- set @name = (select top 1 stuName from Exe3.newStudent);
    select @name =stuName from Exe3.newStudent where stuId<10;
    select @name;

    select @@ERROR;

    select * from sys.messages where message_id = 208;

    -- 流程序调节制(C#的编程)
    -- 采用结构 if-else
    -- 循环结构 while
    /*
    if (bool表达式)
    begin -- {
    脚本
    end -- }
    else if bool表达式
    begin
    -- 脚本
    end
    */

    declare @num int;
    --set @num = 12;

    if @num is null
    select '是NULL';
    else if @num % 2 = 0
    begin
    select '是偶数';
    end
    else
    begin
    select '是奇数';
    end
    go
    -- 循环结构
    /*
    while bool表达式
    begin
    脚本
    end
    */
    declare @sum int;-- = 0;
    declare @i int = 0;

    while @i <= 100
    begin
    set @sum = @i;
    set @i = 1; -- 没有 @i 的语法
    end
    select @sum;

    -- 注意set

     

     

     


    下边是成立表的SQL语句(包罗了一旦有该表先删除在建表)

    Case  表达式

    select * from Student
    where tbage=(select tbage from Student where tbname=3)

    -- 事务

    -- 最基本的操作以职业为单位
    -- 将三个一度做到的数据库操作行为规定为一个职业
    -- 特点:
    -- 原子性——实行的结果是01特色(要么达成、要么战败)
    -- 长久性——试行的结果不可翻盘
    -- 一致性——一旦变成业务,种种版本的结果都未有差距
    -- 隔绝性——事务与业务之间不争执

    -- 事务严峻定义: 找二个操作,要是满意原子性、长久性、一致性和隔开性就叫做多少个事情

    select * from Exe2.LoginTbl;

    insert into Exe2.LoginTbl(uid, pwd)
    values
    ('苏坤', 'susu123')
    , ('Nicolas洛夫斯基斯巴达司机四司机司机司机司机', '123')
    , ('牛亮亮', 'niuniu123');


    -- 本人写的政工
    --事务
    create table bank
    (
    cId char(4) primary key,
    balance money, --余额
    )

    alter table bank
    add constraint CH_balance check(balance >=10)

    go
    --delete from bank
    insert into bank values('0001',1000)
    insert into bank values('0002',10)
    go

    select * from bank

    -- 0001 -> 0002 1000元

    -- 默许的作业方式——隐式事务
    update bank set balance=balance - 1000 where cid='0001';
    update bank set balance=balance 1000 where cid='0002';
    -- 手动施行专门的职业
    -- 开启事务 -> 施行语句 -> 决断满足与否 -> 提交或回滚
    -- 语法
    -- 开启 begin transaction
    -- 提交 commit
    -- 回滚 rollback

    select @@TRANCOUNT;

    begin transaction

    delete from TestDataBase..Score;
    delete from TestDataBase..Student;

    select * from HeiMa8.Exe3.vw_StuInfo;

    rollback

    --
    select * from bank;

    begin tran
    declare @myError int;
    update bank set balance=balance - 900 where cid='0001';
    set @myError = @@ERROR;
    update bank set balance=balance 900 where cid='0002';
    set @myError = @@ERROR;
    if @myError > 0
    rollback
    else
    commit
    ;

    -- try-catch
    --begin try
    --end try
    --begin catch
    --end catch

    begin tran
    begin try
    update bank set balance=balance - 1000 where cid='0001';
    update bank set balance=balance 1000 where cid='0002';
    commit;
    end try
    begin catch
    rollback;
    end catch
    ;

    -- 怎么知道成功未有? -- 使用变量
    -- 怎么利用工作? -- 存款和储蓄进度
    declare @isSuccess bit;
    begin tran
    begin try
    update bank set balance=balance - 900 where cid='0001';
    update bank set balance=balance 900 where cid='0002';
    commit;
    set @isSuccess = 'true';
    end try
    begin catch
    rollback;
    set @isSuccess = 'false';
    end catch
    select @isSuccess;
    ;

     

    -- 存款和储蓄进程
    -- 轻松的当作数据库中的方法
    -- 函数、视图、存款和储蓄进度

    -- 正是一段施行代码

    USE Wages
    GO
    if exists(select * from sysobjects where name='WageInfo')
    DROP table WageInfo
    CREATE TABLE WageInfo 
    (
      CompanyID INT primary key IDENTITY(1,1),
      CompanyName varchar(50) NOT NULL,
      Poste varchar(50) NOT NULL,
    )
    GO
    if exists(select * from sysobjects where name='StudentInfo')
    DROP table StudentInfo
    CREATE TABLE StudentInfo
    (
      ID  INT primary key IDENTITY(1,1),
      Name  VARCHAR(50) NOT NULL,
      CompanyID INT ,
      PosteDate  DATETIME ,
      Wage  int,
    )
    GO

    when 值1 then 返回值

    》》》》》》子查询分页《《《《《《

    -- 系统中常用的仓库储存进程 sp_ stored procedure

    --sp_renamedb -- 修改数据库的名字
    --sp_detach_db -- 分离
    -- sp_attach_db -- 附加

    --sp_executesql

    -- sp_renamedb

    -- exec 存储进程名 参数;
    exec sp_renamedb 'MyThirdDataBase', 'my3thDataBase';

    exec sp_renamedb @dbname='my3thDataBase', @newname='我的第三个数据库';

    -- sp_executesql
    exec sp_executesql N'select @@version'; -- unicode编码
    exec('select ''张三'', ''李四''');

    -- 存款和储蓄进程的语法
    /*
    create proc[edure] usp_积存进度名
    参数名 类型名 [= 默认值] [output]
    , 参数名 类型名 [= 默认值] [output]
    , ...
    as
    begin
    脚本
    end
    */
    -- 无参无再次来到值的储存进度
    go
    create proc Exe3.usp_StuInfo
    as
    select * from vw_StuInfo;
    go
    exec Exe3.usp_StuInfo;
    go

    -- 有参有私下认可值的仓储进度
    -- 带有参数的
    create proc Exe3.usp_StuSearch
    @stuName nvarchar(10)
    as
    select * from Exe3.vw_StuInfo where stuName = @stuName;
    go

    exec Exe3.usp_StuSearch @stuName='邵阳语儿';

    exec Exe3.usp_StuSearch '宿州语儿';

    -- 包括默许值的仓储进度
    -- 分页
    go

    create proc Exe3.usp_FenYe
    @pageIndex int = 1
    , @pageSize int = 10
    as
    begin
    select '今每日气很好';
    select * from
    (
    select ROW_NUMBER() over(order by stuId) as num
    , * from Exe3.newStudent
    )as t
    where t.num between (@pageIndex - 1) * @pageSize 1 and @pageIndex * @pageSize;
    end
    go

    exec Exe3.usp_FenYe 2, 5;

    exec Exe3.usp_FenYe @pageSize=11, @pageIndex=3;

    -- 有参有再次回到值的积累进度
    -- return output

    go
    -- return 返回值
    create proc Exe3.usp_ReturnTest
    as
    return 123;
    go

    /*
    public string Func()
    {
    return "赵晓虎正是牛,你让牛亮亮怎么做?";
    }
    */
    declare @num int;
    exec @num = Exe3.usp_ReturnTest;

    select @num;
    go

    下边是创制约束

    when 值2 then 返回值

    --1》彰显第一页的数目
    --分页查询的时候首先是将数据排序
    select * from Student order by id desc

    -- 银行转账的案例

    create proc Exe3.usp_ZhuanZhang
    @from char(4)
    , @to char(4)
    , @money money
    as
    begin
    begin tran
    begin try
    update bank set balance=balance - @money where cid=@from;
    update bank set balance=balance @money where cid=@to;
    commit;
    end try
    begin catch
    rollback;
    end catch
    end
    go

    --
    select * from bank;

    exec Exe3.usp_ZhuanZhang '0002', '0001', 900;

    go
    -- 思虑重返值
    create proc Exe3.usp_ZhuanZhangExt
    @from char(4)
    , @to char(4)
    , @money money
    , @isSuccess int output -- 表示要求在存款和储蓄进度中赋值,传出去
    as
    begin
    begin tran
    begin try
    update bank set balance=balance - @money where cid=@from;
    update bank set balance=balance @money where cid=@to;
    commit;
    set @isSuccess = 1;
    end try
    begin catch
    rollback;
    set @isSuccess = 0;
    end catch
    end
    go

    -- 关键使用法
    -- 定义叁个变量,不赋值,调用存款和储蓄进度,将参数传入 后跟output

    declare @isSuccess int;

    -- exec Exe3.usp_ZhuanZhangExt '0001', '0002', 500, @isSuccess output;
    exec Exe3.usp_ZhuanZhangExt
    @from = '0001',
    @to = '0002',
    @money = -500,
    @isSuccess = @isSuccess output;

    select @isSuccess;

    -- 注意,不要将变量名命名叫与积存进度的参数一致
    go

    create proc Exe2.usp_Login
    @uid nvarchar(20)
    , @pwd varchar(20)
    , @isLogin int output
    as
    select @isLogin=COUNT(*) from Exe2.LoginTbl
    where uid=@uid and pwd=@pwd;
    go

    --
    select * from Exe2.LoginTbl;

    declare @isTrue int;

    exec Exe2.usp_Login '苏坤1', '1234', @isTrue output;

    select @isTrue;

    -- 用C#实行存储进度
    -- 步骤
    -- -> 将sql语句改为存款和储蓄进度名
    -- -> 修改CommandType命令(text)
    -- -> 看重回结果调用钦命方法
    -- -> 假若有参数,与参数化查询用法一样
    -- -> 若是有再次来到值,设置参数方向就可以(难度)

    exec Exe3.usp_FenYe;

    -- 触发器
    -- 在您实施二个操作的时候,自动的举行的四个积攒进度

    -- DML DDL
    -- 对表现的分类 update、delete、insert
    -- 爆发格局 after | instead of

    -- 语法
    /*
    create trigger tr_in|del|up_触发器的名字 on 表名
    for | after | instead of
    update | delete | insert
    as
    begin
    脚本
    end
    */

    -- inserted deleted

    select * from inserted;

    --
    select * from Exe2.LoginTbl;
    go
    create trigger Exe2.tr_del_deleteReturn on Exe2.loginTbl
    after delete
    as
    insert into Exe2.LoginTbl(uid, pwd)
    select uid, PWD from deleted;
    go

    delete from Exe2.LoginTbl;

    -- 作为数据证实的补给

    --

    -- 索引正是数量的目录
    -- 新华字典
    -- 拼音(集中索引) she 与本文一致
    -- 部首(非聚焦索引) 厍 相当于积累的三个键值对表

    -- 字 拼音 意思 词组。。。

    -- 如何增多索引

    set statistics io on;
    set statistics time on;

    select * from Exe3.newStudent where stuName='苍昊天';
    /*
    SQL Server 深入分析和编写翻译时间:
    CPU 时间 = 0 皮秒,占用时间 = 0 阿秒。
    SQL Server 解析和编写翻译时间:
    CPU 时间 = 0 飞秒,占用时间 = 20 皮秒。

    (2 行受影响)
    表 'newStudent'。扫描计数 1,逻辑读取 2264 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

    SQL Server 实践时间:

    语法如下

    --2》第一页 显示5条数据
    select Top 5 * from Student order by id desc

    CPU 时间 = 16 飞秒,占用时间 = 31 皮秒。

    SQL Server 解析和编译时间:
    CPU 时间 = 0 微秒,占用时间 = 0 纳秒。
    SQL Server 剖析和编写翻译时间:
    CPU 时间 = 0 阿秒,占用时间 = 0 阿秒。
    SQL Server 深入分析和编写翻译时间:
    CPU 时间 = 0 微秒,占用时间 = 0 皮秒。

    (2 行受影响)
    表 'newStudent'。扫描计数 1,逻辑读取 5 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

    SQL Server 实行时间:
    CPU 时间 = 15 纳秒,占用时间 = 24 阿秒。
    */

    -- 索引不必然好

    create unique nonclustered index ix_目录名字 on 表
    (字段 desc, 字段 desc)

    alter table 表名

    End

    --3》第二页
    select top 5 * from Student
    where id not in (select top 5 * from Student order by id desc)
    order by id desc

    add constraint 约束名 约束类型 具体的自律表达

    ->案例:把用户表中数据,全体查询出来,须求把DelFlag=0的显得成未删减

    --4》第三页
    select top 5 * from Student
    where id not in (select top (2*5) * from Student order by id desc)
    order by id desc

    示例

    select *,case DelFlag

    》》》开窗函数分页《《《

    开创外键约束

    when 0 then N'未删除'

    --第七页数据 每页5条数据
    --over属于开窗函数

    alter table StudentInfo
    add constraint pk_CompanyID foreign key(CompanyID) references WageInfo(CompanyID)
    GO

    when 1 then N'删除'

    select * from
    (
    select * ,row_number() over( order by id desc) as paixu from Student
    ) as tbl
    where tbl.paixu between 6*5 1 and 7*5

    布署数据他们说话如下

    end as 删除状态

    2.连表查询

    insert into WageInfo(CompanyName, Poste)values
    ('微软','职员'),
    ('百度','职员'),
    ('腾讯','职员'),
    ('爱奇艺','职员'),
    ('华为','职员')
    insert into StudentInfo(Name, CompanyID, PosteDate, Wage)values
    ('张三',1,'2016-05-05',2500),
    ('李四',2,'2016-05-06',2600),
    ('王五',3,'2016-05-07',3000),
    ('赵二',4,'2016-05-08',4000),
    ('钱一',5,'2016-05-09',5000)
    insert into StudentInfo(Name, CompanyID, PosteDate, Wage)values('钱二',null,'2016-05-09',NULL)

    ,UserName

    --查询全数学生的全名、年龄及所在班级 (班级在另一个表中)
    --当三个列在差别的表中时,要跨表查询,所以一般能够应用inner join
    --tc ts是对表名起的小名
    select
    ts.tsname,
    ts.tsage,
    tc.tclassname
    from TblStudent as ts
    inner join TblClass as tc on ts.tsclassid=tc.tclassid(只询问八个表中都有些数据)

    接下来大家上学了变量,变量分全局变量和一些变量。

    from

    --》》》full join 是询问全部的数目(未有的为空)

    创办变量语法如下是

    UserInfo

    ---子查询写法
    select
    tsname,
    tsage,
    班级名称=(select tclassname from TblClass where TblClass.tclassid=TblStudent.tsclassid)
    from TblStudent

    declare @变量名 数据类型

     

    --查询学生姓名、年龄、班级及战表(战表属于第三张表)
    select
    ts.tsname,
    ts.tsage,
    tc.tclasssname,
    tscore.tenglish,
    tscore.tmath
    from TblStudent as ts
    inner join TblClass as tc on ts.tsclassid=tc.tclassid 
    inner join TblScore as tscore on tscore.tsid=ts.tsid

    部分变量有三种赋值方法

     

     

    set @变量名=value

    运用方式二:(类似C#中的四个if else)

    --》》》左外联接(中国左翼小说家联盟接)

    select @变量名=value

    ->语法

    --查询未有参与考试的学习者的人名与数码
    --把左表(left join 关键字左侧的表)中的全部记下都展现出来,对于那三个在右表中能找到匹配的笔录,显示对应合作数据,对于那么些右表中找不到非凡的笔录彰显为null
    select
    ts.tsid,
    ts.tsname,
    TblScore.*
    from TblStudent as ts
    left outer join TblSore.tsid=ts.tsid   --outer能够不写

    区分是select可叁遍对四个变量赋值,set只可以三次对一个变量赋值。

    Case

    --》》》右外对接
    --代表要将右表(right join 侧面的表)中的全体数据都展现,左表中只呈现那三个相称的数额。

    全局变量只可以用不能够团结创制和赋值!!!

    when 表达式 then 返回值

    select
    ts.tsid,
    ts.tsname,
    TblScore.*
    from TblStudent as ts
    right outer join TblSore.tsid=ts.tsid

    出口语句

    when 表达式 then 返回值

    --右外联与左外联都以先将匹配的多少找到,然后再将那么些并没有匹配的多寡拉长进去,(注意:不是同台查询出来的,有先后顺序)

    print 和select

    else 值

    --》》》练习:查询全体学生(插足和未参与的考查)的学员姓名、年龄、成绩,如果未有加入考试显示缺考,若是小于english也许math 小于60分展现不如格
    select
    ts.tsname,
    ts.tsage,
    tscore.tsid,
    case
    when tscore.tenglish is null then '缺考'
    else convert(varchar(10),tscore.tenglish)
    end as 匈牙利(Hungary)语成绩,
    case
    when tscore.tmath id null then '缺考'
    else convert (varchar(10),tscore.tmath)
    end as 数学战绩,
    是还是不是报考=
    case
    when tscore.tscoreid is null then '是'
    else '否'
    end
    from TblStudent as ts
    left join TblScore as tscore on ts.tsid=tscore.tsid

    use MySchool

    ->案例:把用户表中数据总体查询出来,要求把DelFlag=0的展现成删除

    3.视图

    go

    select *,case

    视图自个儿并不存款和储蓄数据,只是存储的查询语句,即便把实际表中的数量修改后,则经过视图查询到的结果也变了。

    select * from StuInfos

    when DelFlag=0 then N'未删除'

    视图的指标是利于查询,所以一般景观下不能够对视图进行增加和删除改查

    1.班级表   班级编号 (主键)   班级名   (长度固定3位)   班级人数 (暗中认可30)

    when DelFlag=1 then N'删除'

    --在视图中的查询语句,必须为每一列创设一个列名
    create view vw2
    as
    select
    tsname,
    case
    when tsage>13 and tsage<=16 then '少年'
    when tsage>50 then '老年'
    else '青壮年'
    end as 称呼
    from TblStudent

      if exists(select * from sysobjects where name='Classes')

    else N'未知'

    --在视图中不能够利用order by语句。除非:别的还点名了top 或for xml
    --错误
    create view vw3
    as
    select * from TblStudent order by tsage desc

    drop table Classes

    end as 删除状态

    --正确
    create view vw3
    as
    select top 3 * from TblStudent order by tsage desc

      go  

    ,UserName

    4.宣称变量与行使

     create table Classes  

    from

    --》》》局地变量
    --注脚变量
    declare @name varchar(10)
    declare @age int

     (   clsid int identity(1,1), --班级编号  

    UserInfo

    --赋值
    set @name='yhz'
    set @age=17

    ' clsname varchar(3), --班级名称   clsnums int --班级人数   )   

     

    --输出值
    print @name
    print @age

    go   

     

    --使用set与select为变量赋值的分化
    declare @rcount int
    set @rcount=(select count(*) from TblStudent)
    print @rcount

    'alter table Classes

    2.补给:ISNULL(表达式,替换的值)

    declare @rcount int
    select @rcount=count(*) from TblStudent
    print @rcount

    add constraint pk_clsid_Classes   primary key(clsid)  

    select CreateDate,ISNULL(CreateDate,getdate()) from UserInfo

    --》》》全局变量
    print @@language
    print @@version
    print 'aaa' 100
    --通过推断@@error变量中是或不是不为0,就能够剖断上一条sql语句试行是不是出错了
    --如若@@error为0,表示上一条sql语句实践没出错,借使@@error不为0,则象征上一条sql语句出错了。
    print@@error

     alter table Classes

     

    --》》》通过while总结1-100中间全体奇数的和

    add constraint ck_clsname_Classes   check(len(clsname)=3)  

    3.SQL说了算语句

    --评释变量并初叶化

     alter table Classes

    ->SQL中的变量

    declare @sum int=0
    declare @i int =1
    while @i<=100
    begin
    if @i%2<>0
    begin
    set @sum=@sum @i
    end
    end
    print @sum

    add constraint df_clsnums_Classes   default 30 for clsnums   

    ->定义变量:

    5.事务

    go  

    ->declare @变量名 变量类型

    业务有多个天性:原子性 一致性 隔绝性 漫长性
    原子性:对于数据修改,要么全都实践,要么全都不举办
    一致性:当数码产生时,数据必须处于同一状态
    隔断性:对数据开始展览退换的持有并发事务时相互隔断的。那标记专门的学业必须是独自的,它不应以另外方法依赖于或影响另外业务
    长久性:事务完结后,他对数据库的改变被永恒保持,事务日志能够保险职业的恒久性

     insert into Classes select 't10',25 union select 't11',18 union select 't12',23

    ->给变量赋值:

    --展开职业
    begin transaction

    2.外键约束   为学生表增添二个clsid列来代表其班级   alter table StuInfos add clsid int   外键约束   

    ->set @参数名=值

    --提交事务
    commit transaction

    alter table StuInfos with nocheck --不对表现存个别数据作限制操作

    ->select @参数名=值

    --回滚事务
    rollback transaction

    add constraint fk_StuInfos_Classes    foreign key(clsid) references Classes(clsid)   

    select @i=count(1) from UserInfo;

    --账户A给账户B转账 当一方出难题时,八个语句都不奉行
    begin tran
    declare @sum int=0
    update bank set balance =balance-1000 where cid='0001'
    set @sum=@sum @@error
    update banl set balance =balance 1000 where cid='0002'
    set @sum=@sum @@error

    删去约束   

     

    if @sum<>0
    begin
    rollback tran
    print '回滚'
    end
    else
    begin
    commit tran
    print '提交了'
    end

    alter table StuInfos drop constraint fk_StuInfos_Classes

    ->打印 : Print @变量名

    6.存款和储蓄进程

    3.建表同一时常候建约束,老师表   编号     (主键 标记列)   名称     (非空)

     

    --创立一个自定义的蕴藏进度
    create proc usp_HelloWorld
    as
    begin
    print 'hello world'
    end

    性别     (男或女,暗中同意男)   年龄     (12-60)   电话     (独一)   班级编号 (外键)   

    ->IF ELSE

    --输出存款和储蓄进程
    exec usp_HelloWorld

    if exists(select * from sysobjects where name='TeaInfos')

    ->语法格式:

    --创设一个存款和储蓄进度总计多少个数的和
    create procedure usp_Add
    @num1 int,
    @num2 int
    as
    begin
    print @num1 @num2
    end

    drop table TeaInfos  

    if(表达式)

    --输出值
    exec usp_Add 100,230

     go  

    begin

    --存款和储蓄进度中的参数的主题材料
    --存款和储蓄进程固然有参数,则调用的时候必须为参数赋值
    exec usp_Add --不传参数则报错

     create table TeaInfos  

    SQL语句

    --次之个参数假使用户不传,则有一个暗许值
    create procedure usp_Add
    @num1 int,
    @num2 int 一千 --为存款和储蓄进度的参数设置私下认可值
    as
    begin
    print @num1 @num2
    end

     ( id int primary key identity(1,1), --编号

    end  

    --成立分页存款和储蓄进程
    create proc usp_PageBum
    @pageSize int, --每页呈现的数据
    @pageIndex int --第几页
    as
    begin
    select * from (select *,row_number()over (order by CityID asc)as num from S_City )as s
    where s.num between (@pageIndex -1)*@pageSize 1 and @pageIndex *@pageSize
    end
    --查询第5页内容每页显示10条数据
    exec usp_PageBum 10,5

    name varchar(10) not null, --名称

    else

    --删除一个囤积过程
    drop proc usp_Add

    sex char(2) check(sex='男' or sex='女') default '男', --性别

    begin

    7.触发器

    age int check(age>=12 and age<=60), --年龄

    语句

    尽量防止在触发器中实施耗费时间操作,因为触发器会与sql语句以为在同三个政工中(事务不结束,就不恐怕自由锁)

    tel char(11) unique, --电话

    end                

    --创制插入数据触发器
    create trigger tri_Teacher_insert_after
    on Teacher after insert
    as
    begin
    declare @id int
    declare @name varchar(10)
    declare @phone int
    declare @mail varchar(50)
    select @id=tcid,@name=tcname,@phone=tcphone,@mail=tcmail from inserted

    clsid int foreign key references Classes(clsid) --班级   )

    ->WHILE

    print @id
    print @name
    print @phone
    print @mail
    end

      go

    ->语法:

    --插入数据
    insert into Teacher values('网名好','12352536','Wjifdfji@qq.com')

    一:操作变量 --1-- 证明变量@temp值为1并打字与印刷出来 评释变量关键字:

    While(表达式)

    --创设删除数据触发器
    --不能有主键
    create trigger tri_Teacher_after
    on Teacher after delete
    as
    begin
    insert into TeacherBak
    select * from deleted
    end

    declare   declare @temp int --声明   

    begin

    --删除数据
    --sql server中的触发器是表级触发器,无论删除多少行依然插入多少行,只触发三遍
    --是按语句来触发的,每一遍试行一遍讲话,触发贰回触发器
    delete from Teacher where tcid>18

    set @temp=1       --赋值  

    SQL语句

    8.游标

     print @temp       --输出   

    end

    --1.概念游标
    declare cur_Student cursor fast_forward for select * from Student

      declare @temp int=1 --表明的还要赋值  

     

    --2.开荒游标
    open cur_Student

     print @temp         --输出   

    4.多少的连接

    --2.1 对游标的操作
    --将每条数据读取并出口

     

    主键不参与工作逻辑

    --2.1.1将游标向后运动一条
    fetch next from cur_Student

    赋值格局一:用set 输出形式一:用print   declare @temp int --注脚   

    ->交叉连接

    --将游标循环向后移动,直到最后
    while @@fetch_status=0
    begin
    fetch next from cur_Student
    end

    select @temp=1 --赋值   select @temp   --输出

    一张表中有M条数据,另一张表中有N条记录,那么交叉连接后就是M*N

    --3.安歇游标
    close cur_Student

    赋值情势二:用select 输出格局二:用select --

     

    --4.保释财富
    deallocate cur_Student

    2-- 注解两个变量存款和储蓄'姓名、性别、年龄',再打字与印刷音讯,格式如下: 姓名:杰达姆,性别:男,年龄:18 --注明

    ->内连接

    9.(补充)全局一时表,局地一时表

    declare @name varchar(10),         @sex char(2),         @age int

    一张表中有M条数据,另一张表中有N条记录,那么内连接后的数据不明确条数,要基于外键去切磋

    有的临时表:表名以#为开头。只在方今对话中央银立见成效,不能够跨连接待上访谈。借使一直在延续会话中开创,则当前连连断开后去除,假若是在蕴藏进程中开创的,则存款和储蓄进度实行完成后去除

    --赋值 select @name='杰达姆',@sex='男',@age=18

    ->外连接

    大局一时表:表名以##为初始。八个会话可分享全局不常表。当创设全局一时表的对话断开,何况未有用户正在访谈全局有的时候表时删除

    --输出 print  '姓名:' @name ',性别:' @sex ',年龄:'    cast(@age as varchar)   

    select * from 表1 as t1 right jion 表2 as t2 on t1.列名=t2.列名;

    10.(补充)约束

    --convert(varchar,@age)

    代表将表1和表2通过“列名”作为对应关系张开三番五次,即便有数量尚未有关对应,就看中间的连日形式right/left/full,即便是right就以右边手的多寡为主,借使是left就以左臂的数据为主,要是是full就全部都显示,未有对应就补null;

    --删除一列(EmpAddress列)
    alter table Class drop column EmpAddress

    --八个转型函数:   1.convert -- 语法:  convert(类型,数据)   2.cast   

     

    --扩大一列(增添一列EmpAddr varchar(1000))
    alter table Class Add EmpAddr varchar(1000)

    -- 语法:  case(数据 as 类型)

     

    --修改一下Emp 的数据类型(varchar(200))
    alter table Class alter column Emp varchar(200)

    --3-- select * from StuInfo

     

    --为EmpId扩张贰个主键约束
    alter table Class add constraint PK_Class_EmpId primary key(EmpId)

    打字与印刷张秋丽的新闻(来自于student数据库的数额),格式如下: 姓名:张秋丽 性别:男 年龄:18

    5.子查询

    --为EmpName增添三个独一约束
    alter table Class add constraint UQ_Class_EmpName unique(EmpName)

    --声明 declare  @name varchar(10)='张秋丽', @sex char(2), @age int

    内需将叁个三个查询的结果作为另一个询问的尺度

    --为性别扩展一个私下认可约束,默以为男
    alter table Class add constraint DF_Class_EmpGender default('男') for EmpGender

    --赋值:来自于表内 select @sex=stuSex,@age=stuAge from stuinfo  where stuName=@name

     

    --为岁数扩充叁个检查约束,年龄必须在1—120岁以内(包括)
    alter table Class add constraint CK_Class_EmpAge check(EmpAge>=0 and EmpAge<=120)

    --输出 print '姓名:' @name print '性别:' @sex print '年龄:' cast(@age as varchar)

    平凡,将内部的查询叫做子查询,外面包车型客车查询叫做外部查询

    --扩充外键约束,表Class中有一列EmpDeptId援用Student表中的DeptId
    alter table Class add EmpDeptId int not null
    alter table Student add constraint PK_Student_DeptId primary key(DeptId)

    --4-- 查询李文才的左右校友的音信 declare @seat int select @seat=stuSeatfrom stuinfo where stuname='李文才' select * from stuinfo  where stuSeat=@seat-1 or stuSeat=@seat 1

    瞩目:子查询内部 必须询问贰个数量

    alter table Class add constraint FK_Class_Student foreign key(EmpDeptId)
    references Student(DeptId)

    --5-- 查询比张秋丽大10岁以上的学员消息 declare @age int  select @age=stuAge from stuinfo where stuName='张秋丽' select * from stuinfo where stuAge>=10 @age 

     

    --一条语句删除多少个约束,约束名用 逗号 隔开分离
    alter table Class drop constraint
    PK_Student_DeptId,
    FK_Class_Student,
    CK_Class_EmpAge

    总结: set和select的区别  

    归来结果

    --用一条语句为表扩大多少个约束
    alter table Class add
    constraint PK_Student_DeptId primary key(DeptId),
    constraint CK_Class_EmpAge check(EmpAge>=0 and EmpAge<=120),
    add constraint DF_Class_EmpGender default('男') for EmpGender

     1. set贰遍只可以为三个变量赋值,而select能何况为多少个变量赋值  

    单值(贰个单元格)    标量子查询(平时放在where子句中作为标准,也许在select中作为贰个值)

    后记

     2. set只可以赋二个定位的值,而select能动态的赋值(值来自于表内) select的效率  

    多值    多值子查询

    笔记不全,还请见谅!希望对你有所提升。

     1. 查询SQL语句,如: select * from 表名  

    行(略)

     

     2. 赋值操作,   如: select 变量名=值  

    列    一般位于in中作为批量剔除、修改等操作或询问

     3. 输出操作,   如: select 变量名 二:调控流程结构:if,else

    表    一般作为数据源进行再一回寻觅

    --1-- 注明变量number,并赋值,然后推断是偶数仍然奇数,结果如下: 当前值为11,它是八个奇数 declare @number int set @number=12 if(@number%2=0) print '该数为偶数' else print '该数为奇数' -

     

    -2-- 依据输入的年龄显得人的发育阶段 未中年人<18,青少年人<30,成人<60,花甲之年人<100,超人>=100

    6.表表明式

    declare @age int set @age=21

    ->派生表

    if(@age<18) print '未中年人' else if(@age<30)

    select top 30

    print '青年人'

    t1.stuId as 编号

    else if(@age<60)

    , t1.stuName as 姓名

    print '成年人'

    , case t1.stuSex when 'm' then '男' else '女' end as 性别

    else if(@age<100)

    , t3.final as 期末总评

    print '老年人'

    , t2.className as 课程

    else print '超人'

    , t1.stuPhone as 电话

    select * from StuInfo select * from StuExam

    , t1.stuAddress as 家庭住址

    --3-- 总括笔试平均分,要是平均分超越70分打字与印刷'杰出' 同时呈现前三名学员的试验新闻不然      打字与印刷'相当糟糕'突显后三名学童新闻

    from

    declare @avgScore int select @avgScore=AVG(writtenExam) from StuExam if(@avgScore>=70) begin print '本班战绩卓绝'

    TestDataBase..Student as t1

    select top 3 * from StuExam order by writtenExam desc end else begin print '本班战绩非常糟糕' select top 3 * from StuExam order by writtenExam end

    inner join

    三:循环结构 --1-- 输出九五遍'小编爱你' declare @i int=1  while(@i<=99) begin print '第' convert(varchar,@i) '作者爱您' set @i =1 end

    TestDataBase..Course as t2

    --2-- 总结1-100的丰硕和,结果格式:1-100的增进和为:xxx declare  @i int=1, @sum int=0 while(@i<=100) begin set @sum =@i set @i =1 end print '1-100的丰盛和为:' convert(varchar,@sum)

    on t1.classId = t2.classId

    --3-- 不停的巩固学员笔试战表2分,让具备学生的笔试战表都合格

    inner join

    declare @count int --用来记录不如格的人数 while(1=1) begin --总结比不上格的人头 select @count=COUNT(*) from StuExam   where writtenExam<60 --剖断 if(@count=0)   break --退出死循环 else   update StuExam set writtenExam =2 end select * from StuExam

    (select

    四:多分支语句

    stuId

    --1-- 请宣示变量@name表示学生姓名,对该学员年龄进行划等第 具体如下: 11虚岁前展现:'小学生' 12-17出示'初级中学生'  18-22出示'高级中学生' 23-28展现'大学生' 28以上'超人' 结果格式:xxx是三个xxx

    , avg(testBase testBeyond testPro) as final 

    declare  @name varchar(20)='小强', @age int=23, @result varchar(10)

    from

    --多分支 set @result=case     when @age<12 then '小学生'     when @age<17 then '初中生'     when @age<22 then '高中生'     when @age<28 then '大学生'     else '超人'    end

    TestDataBase..Score

    --输出 print @name '是一个' @result

    group by

    --2-- 显示学号、笔试战表、等第,数据如下:  笔试战表:90之上的--A等         80上述的-- B等         70上述的-- C等         60以上的-- D等         60之下的-- E等 stuNo   writtenExam   grade s25303  60            D等 s25302  40            E等 s25301  77            C等 s25318  45            E等 select  stuNo, writtenExam, grade=case    when writtenExam>=90 then 'A等'    when writtenExam>=80 then 'B等'    when writtenExam>=70 then 'C等'    when writtenExam>=60 then 'D等'    else 'E等'     end from StuExam --3-- 请依据平均分和下部的评分准绳,编写T-SQL语句询问学员的大成 优 :90分以上    良 :80-89分     中 :70-79分     差 :60-69分     极差 :60分以下         

    stuId) as t3

    select AVG(writtenExam),A=case      when Avg(writtenExam)>90 then '优'      when Avg(writtenExam)>80 and Avg(writtenExam)<89 then '良'      when Avg(writtenExam)>70 and Avg(writtenExam)<79 THEN '中'      when Avg(writtenExam)>60 and Avg(writtenExam)<69 then '差'      when Avg(writtenExam)<60 then '极差'      end      from stuExam    

    on t1.stuId = t3.stuId

    --4-- 难题: 根据如下准绳对机试战表举办再三加分,       直到机试平均分超越85分成止       请编写T-SQL语句完结,注:(循环 多分支) 90分以上:  不加分 80-89分:   加1分 70-79分:   加2分 60-69分:   加3分 60分以下:  加5分 declare @a int   while(1=1) begin select @a=AVG(labExam)from dbo.stuExam if(@a<85) begin update dbo.stuExam set labExam =case          when labExam>=90 then  labExam          when labExam>=80 then labExam 1          when labExam>=70 then labExam 2          when labExam>=60 then labExam 3          else          labExam 5         end end else break end select AVG(labExam) AS 机试战绩平均分 from dbo.stuExam

    order by

    查询

    t3.final desc;

    子查询:查询中再查询,日常是以二个查询作为规范来供另二个查询利用
    语法:
       select 列表 from 表名 
     where >(子查询)
    注意:
     使用相比较运算符时,要求子查询只可以回去一条或空的笔录!
    示例:
     要求获知比小编小的学生新闻
     select * from student
     where studentno in
     (select studentno from student
     where studentname='我')

    个中,将结果集作为一张表来使用的采用就叫做派生表

    NOT IN:分明给定的值是或不是与子查询或列表中的值相相配,如若不包容则反回真。
    行使办法:
     在供给子查询重返多多少时选拔。
    语法:
     select 列表 from 表名 
     where 列名 not in(子查询)
    示例:
     查询未到庭过考试的学习者消息
     select  * from student 
     where studentno not in
     (select studentno from Result)

    实际上那张表是不设有的,

    1.EXISTS 子查询
     EXISTS: exists 关键字能够检查测验数据是不是留存,就算存在再次来到真。
    语法
     if exists(子查询)
     语句
    示例:
     查询这一个大学学生有未有叫张三的
     if exists( select * from student
     where studentname='张三' )
     begin
     print '有叫张三的'
     end

    汇编语言:机器型语言

    1. NOT EXISTS 子查询
       NOT EXISTS: exists 关键字能够检查实验数据是不是留存,假设不设有再次回到真
      语法
       if not exists(子查询)
       语句
      示例:
       查询这几个大学学生是否向来不叫张三的
       if not exists( select * from student
       where studentname='张三' )
       begin
       print '未有叫张三的'
       end

    高级语言:描述性语言

    1:非相关子查询是单身于外界查询的子查询,子查询总共推行二次,推行实现后将值传递给外界查询。  2:相关子查询的实施注重于表面查询的数目,外界查询推行一行,子查询就实施一遍。数据是还是不是存在,假如海市蜃楼再次回到真

    其三种语言:任务型语言

    示范:检索出在work表中每三个部门的参天基本薪金的职报酬料  select * from work a where 基本薪俸=(select max(基本薪俸) from work b where a.部门名称=b.部门名称)

     

     事物视图索引

    表表明式的意趣是表加入运算获得的结果照旧表,常用的表表明式:

    语法

    ->派生表

    begin transaction

    ->分页(重要)

    commit transaction

    引出:Taobao京东购物网址,第一页显示不断 ,会分页展现

    rollback transaction

    select * from Student;

    视图

    总共有6万条数据,二次显示会崩溃,所以分页展现

    创设视图索引

    标题:每页有M条记录,要显示第N页,如何促成?

    if exists(select * from sysobjects where name='视图名')

    实际上不好写,凡是境遇这种有规律性难题的时候,你必要给和煦安装具体的数字,依据数字的原理先写个二次、六遍的结果,从中找到结果;

    drop view 视图名

    每页10条,第1页

    create view  视图名

    select top 10 * from TestDabase..Student;

    as

    每页10条,第2页

    本文由68399皇家赌场发布于虚拟主机,转载请注明出处:SQL Server的尖端知识

    关键词: 68399皇家赌场 SqlServer Sql Server 一条SQL语句