金沙国际唯一官网网址SQL Server 数据库基础笔记分享(下)

内容主要是对数据库的基本,的基本了解,包含字段表达式,from 表或结果集,为了创建良好的数据库需满足三大范式,  设计数据库步骤,SQL高级中的case语句、连接操作、子查询、派生表,要求把DelFlag=0的显示成未删除

前言

select语句
语法:select distinct | top 数字 [percent] 字段1 as 别称,包涵字段表明式,函数,常量
from 表或结果集
where 逻辑条件 | 模糊处理 | 范围处理 | null值处理
group by 分组字段
having 筛选标准
order by 排序依附;

  对于SQL SE帕杰罗FVECR-V数据库也学了有说话了,自身也对自身所学做了一部分计算。

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:\project\Wages_data.mdf’,
  SIZE=5mb,
  FILEGROWTH=15%
 )
 LOG ON
 (
  NAME= ‘Wages_log’,
  FILENAME=’e:\project\Wages_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
*
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 土耳其共和国(The Republic of Turkey)语成绩,
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 1000 –为存款和储蓄进程的参数设置默许值
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表示学生姓名,对该学员年龄进行划等第 具体如下:
12岁前展现:’小学生’ 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

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

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页