SQL Server的尖端知识

2019-04-05 03:53栏目:程序人生

--》》》右外对接
--代表要将右表(right join 右侧的表)中的全部数据都来得,左表中只展现这多少个相配的多少。

-- 银行转向的案例

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)
-- -> 看重临结果调用钦赐方法
-- -> 如果有参数,与参数化查询用法1样
-- -> 如若有再次来到值,设置参数方向即可(难度)

exec Exe3.usp_FenYe;

-- 触发器
-- 在您执行3个操作的时候,自动的进行的1个仓库储存进程

-- 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 与本文壹致
-- 部首(非聚集索引) 厍 约等于储存的3个键值对表

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

-- 怎样添加索引

set statistics io on;
set statistics time on;

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

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

SQL Server 执行时间:

壹.仓库储存进度只在开创时开始展览编写翻译,现在每一遍执行存款和储蓄进程都不需再另行编写翻译,而一般SQL语句每执行三次就编写翻译2次,所以利用存款和储蓄进程可增强数据库执行进程。 贰.当对数据库实行理并答复杂操作时,可将此复杂操效用存款和储蓄进程封装起来与数据库提供的事务处理结合1起利用。 三.存储进程能够重复使用,可削减数据库开发职员的工作量。 四.安全性高,可设定只有有个别用户才拥有对点名存款和储蓄进度的使用权

, @money as money

--提交事务
commit transaction

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.充值金额<十0 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;

-- 表表明式
-- 就是经过表与表的演算,获得3个结出集作为from前面包车型地铁数据源
-- 一、派生表 再次来到结果集的子查询
-- 语法: select ... from (select 查询) as 别名;
-- 注意: 无法应用游标
-- 二、公用表表达式CTE
-- 3、视图
-- 四、内联表值函数

-- 查询学生信息
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 = '吉安语儿';


 

end

10.(补充)约束

-- 分页

select * from TestDataBase..Student;
-- 当前页数、每页展现的条数 ⑩
-- SQL Server 2005 row_number() 能够为表生成3个接连的数字列
-- 语法 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;

-- 内联表值函数
-- 带有参数的视图
-- 作用: 将2个可变条件的询问封装成多个函数对象,执行结果是一张表
/*
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 方今3次插入数据的自发性拉长编号
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

 

 

 


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

go

--二.开辟游标
open cur_Student

-- 事务

-- 最基本的操作以工作为单位
-- 将1个早就形成的数据库操作行为规定为一个政工
-- 特点:
-- 原子性——执行的结果是0一天性(要么实现、要么战败)
-- 持久性——执行的结果不可翻盘
-- 1致性——一旦成功业务,各种版本的结果都1律
-- 隔离性——事务与事务之间不冲突

-- 事务严峻定义: 找三个操作,如若满足原子性、持久性、1致性和隔开性就称为五个事务

select * from Exe2.LoginTbl;

insert into Exe2.LoginTbl(uid, pwd)
values
('苏坤', 'susu123')
, ('Nicolas洛夫斯基斯巴达司机四司机开车员司机司机', '1二三')
, ('牛亮亮', '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;
;

 

-- 存款和储蓄进度
-- 简单的作为数据库中的方法
-- 函数、视图、存款和储蓄进程

-- 正是一段实施代码

--convert(varchar,@age)

when 值2 then 返回值

--四.保释能源
deallocate cur_Student

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

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

-- 将四个查询的结果作为另1个询问的标准化

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

select className from TestDataBase..Course where classId in
(
select top 一 classId from TestDataBase..Student where stuName='内江语儿'
);

-- 多少个单值 外部查询 where 字段 in (子查询)
select '营口语儿' , (select className from TestDataBase..Course where classId in
(
select top 一 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 一 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 '英语'

二.外键约束   为学习者表添加三个clsid列来表示其班级   alter table StuInfos add clsid int   外键约束   

, classId

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

-- 子查询
-- 就是在二个询问中嵌套三个询问
-- 1般意义便是选取多张表查询3个音信
-- 例如查询"孝感语儿"的实际业绩
select * from TestDataBase..Student;
select * from TestDataBase..Score;
-- 在上学的小孩子表中查得stuId,然后再到分数表中询问分数
select stuId from TestDataBase..Student where stuName ='开封语儿';

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

update bank set balance=balance - 900 where cid='0002'

--创制四个仓库储存进度计算七个数的和
create procedure usp_Add
@num1 int,
@num2 int
as
begin
print @num1 @num2
end

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

--一-- 请宣示变量@name表示学生姓名,对该学生年龄进行划等级 具体如下: 11周岁前显示:'小学生' 1二-①柒显得'初级中学生'  1八-2贰来得'高级中学生' 2叁-28来得'学士' 28以上'超人' 结果格式:xxx是二个xxx

 

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

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

with encryption

-- 将结果集举行演算,获得一个新的结果集,并将其用作数据源举行询问

--壹》突显第三页的数码
--分页查询的时候首先是将数据排序
select * from Student order by id desc

CPU 时间 = 1陆 飞秒,占用时间 = 3一 微秒。

SQL Server 分析和编写翻译时间:
CPU 时间 = 0 微秒,占用时间 = 0 飞秒。
SQL Server 分析和编写翻译时间:
CPU 时间 = 0 飞秒,占用时间 = 0 阿秒。
SQL Server 分析和编写翻译时间:
CPU 时间 = 0 皮秒,占用时间 = 0 飞秒。

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

SQL Server 执行时间:
CPU 时间 = 一五 皮秒,占用时间 = 贰4 飞秒。
*/

-- 索引不肯定好

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

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

, @isSuccess int outputas

--右外联与左外联都以先将合营的数目找到,然后再将那个从没匹配的数码增加进去,(注意:不是共同查询出来的,有先后顺序)

-- 系统中常用的蕴藏进度 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='my三thDataBase', @newname='作者的第四个数据库';

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

ca888会员登录,-- 存款和储蓄进程的语法
/*
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 '今每2二日气很好';
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

Select StudentName,Gender,GradeId,Phone from dbo.Student

原子性:不可划分,要么全体打响依然全体未果

笔记不全,还请见谅!希望对您有所进步。

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

 print @temp         --输出   

 

--打开工作
begin transaction

go

 

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

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

go

--》》》全局变量
print @@language
print @@version
print 'aaa' 100
--通过判断@@error变量中是还是不是不为0,就能够判明上一条sql语句执行是还是不是出错了
--假若@@error为0,表示上一条sql语句执行没出错,假诺@@error不为0,则代表上一条sql语句出错了。
print@@error

输出语句

*/

--查询全部学生的姓名、年龄及所在班级 (班级在另3个表中)
--当两个列在差异的表中时,要跨表查询,所以一般能够应用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(只询问多少个表中都局地数据)

create proc proc_temp_encryption

, avg(testBase testBeyond testPro) as final 

--成立插入数据触发器
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

declare   declare @temp int --声明   

from vw_FenYeable

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

 一. set叁次只好为二个变量赋值,而select能而且为五个变量赋值  

else 值

大局最近表:表名以##为开首。多少个会话可共享全局权且表。当创立全局权且表的对话断开,并且未有用户正在访问全局一时表时删除

begin transaction

3.SQL操纵语句

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

    select * from student;

go

--把其它二个查询的结果作为当下询问的尺度来行使。
--子查询中=、!= 、< 、> 、<= 、>=之后只好回到单个值,尽管三个值就会报错
--消除办法 能够用in 代替
select * from Student
where tbage in(select tbage from Student where tbname=3)

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)

with 别名

--为性别增添3个暗中认可约束,暗中同意为男
alter table Class add constraint DF_Class_EmpGender default('男') for EmpGender

成立外键约束

@pageIndex int = 1        -- 第几页

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

with encryption

from

视图自己并不存款和储蓄数据,只是存款和储蓄的查询语句,倘诺把真实表中的数目修改后,则透过视图查询到的结果也变了。

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

TestDataBase..Student as t1

--》》》局部变量
--评释变量
declare @name varchar(10)
declare @age int

as

/*

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

   5、 不缓存存款和储蓄进度

 

局地一时表:表名以#为开端。只在时下对话中立竿见影,无法跨连接待上访问。假诺直接在连年会话中开创,则当前总是断开后去除,假若是在蕴藏进程中开创的,则存款和储蓄进度进行实现后去除

exec sp_helptext 'proc_temp_encryption'

汇编语言:机器型语言

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

 

->WHILE

8.游标

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

update bank set balance=balance @money where cid=@to

3.视图

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

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

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

一.创造不带参数的蕴藏进程

 

--回滚事务
rollback transaction

exec sp_helptext 'proc_temp_encryption'

, stuAddress

--2.壹.壹将游标向后运动一条
fetch next from cur_Student

贰.执行命令缓存:在推行存储进程,自定函数时,Sql Server必要先2进制编写翻译再运营,编写翻译后的结果也会缓存起来, 再一次调用时就无需重新编写翻译。

因为必须是批处理实施的语句 ,所以要求在前后加go

后记

 

return

--一.定义游标
declare cur_Student cursor fast_forward for select * from Student

SQL_SE景逸SUVVE哈弗 提供系统存款和储蓄进程,它们是壹组预编写翻译的T-SQL语句,系统存款和储蓄进度提供了管制数据库和更新表的机制,并担任从系统表中检索消息的快捷格局。

 

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

select top 3 * from StuExam order by writtenExam desc end else begin print '本班成绩较差' select top 三 * from StuExam order by writtenExam end

update bank set balance=balance @money where cid=@to

--删除两个储存进程
drop proc usp_Add

下边是创设表的SQL语句(包罗了壹旦有该表先删除在建表)

-- 逻辑处理与流程序控制制

本文是私房学习SQL Server 数据库时的过去笔记的盘整,内容重点是对数据库的主导增加和删除改查的SQL语句操作封锁,视图,存款和储蓄进度,触发器的着力理解。

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

 

尽量幸免在触发器中实践耗费时间操作,因为触发器会与sql语句认为在同一个事务中(事务不甘休,就一点都不大概自由锁)

示例

1.Case的用法

--账户A给账户B转账 当1方出难点时,七个语句都不执行
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

 print @temp       --输出   

意思:将三个实践的进度(恐怕会很复杂)封装成三个名字,然后使用这几个名字就足以实施那几个进度

事务有多个特性:原子性 1致性 隔开性 持久性
原子性:对于数据修改,要么全都执行,要么全都不履行
一致性:当数码形成时,数据必须处于同壹状态
隔开分离性:对数码举办修改的有着并发事务时互相隔开分离的。那申明工作必须是独立的,它不应以别的形式正视于或影响别的事情
永久性:事务完毕后,他对数据库的改动被永久保持,事务日志能够维持工作的永久性

exec usp_one '李%'

, stuSex

--查询学生姓名、年龄、班级及成绩(成绩属于第一张表)
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

As

两张一时表

二.连表查询

print 和select

begin

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

go

)

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

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

一张表中有M条数据,另一张表中有N条记录,那么内两次三番后的数额不鲜明条数,要依照外键去研究

1.子查询

add constraint df_clsnums_Classes   default 30 for clsnums   

 

前言

贰.开立带入参数的储存进程

begin

--查询未有插手考试的学习者的人名与号码
--把左表(left join 关键字左侧的表)中的全体笔录都展现出来,对于那1个在右表中能找到相称的记录,展现对应合营数据,对于那几个右表中找不到十分的笔录显示为null
select
ts.tsid,
ts.tsname,
TblScore.*
from TblStudent as ts
left outer join TblSore.tsid=ts.tsid   --outer可以不写

drop table TeaInfos  

end

--扩展1列(扩充一列EmpAddr varchar(1000))
alter table Class Add EmpAddr varchar(1000)

add constraint 约束名 约束类型 具体的封锁表明

-- 选用结构

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

陆,加密存款和储蓄进程

, stuIsDel

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

Sql Server系统内部存储器管理在一贯不配备内存最大值,很多时候大家会发觉运营Sql Server的系统内部存款和储蓄器往往越多。那是由于她对此内部存款和储蓄器使用的策略是有微微闲置的内部存款和储蓄器就占有多少,直到内存使用虑达到系统峰值时(预留内部存款和储蓄器依据系统暗中认可预留使用为准,至少四M),才会免去一些缓存释放少量的内存为新的缓存腾出空间。

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

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

tel char(11) unique, --电话

TestDataBase..Student

--输出值
print @name
print @age

--应用这些,大家得以对壹些首要的蕴藏进程进行加密。

when DelFlag=1 then N'删除'

--3.关闭游标
close cur_Student

  go

->执行存款和储蓄进程

7.触发器

 

, stuSex

视图的目的是便宜查询,所以1般景况下不能对视图实行增加和删除改查

alter table StuInfos drop constraint fk_StuInfos_Classes

, stuId

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

create proc proc_temp with recompile as     select * from student exec proc_temp

as

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

exec proc_temp_encryption;

四.数额的连日

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

exec proc_temp_encryption;

代码

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

一 存款和储蓄进度的概念

from

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

一:非相关子查询是独自于表面查询的子查询,子查询总共执行二回,执行完成后将值传递给外部查询。  2:相关子查询的进行重视于外部查询的数目,外部查询执行1行,子查询就实行3遍。数据是还是不是存在,如若不设有重返真

-- 语法

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

declare @id int

, stuPhone

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

 

语法:

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

三.建表同时建约束,老师表   编号     (主键 标识列)   名称     (非空)

create proc usp_test4

6.囤积进度

go  

(@参数名 as 类型, @参数名 as 类型, ...)

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

何以要求仓库储存进程?

, stuName

四.声明变量与行使

select * from StuInfo select * from StuExam

 

 

缓存正是数据交流的缓冲区(称作Cache),当某一硬件要读取数据时,会率先从缓存中寻找需求的数量,假若找到了则平昔实施,找不到的话则从内部存款和储蓄器中找。由于缓存的运行速度比内部存款和储蓄器快得多,故缓存的功用正是支援硬件越来越快地运维。

End

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

Select * from student where gradeId=@gradeid

 

--为EmpName增添1个唯1约束
alter table Class add constraint UQ_Class_EmpName unique(EmpName)

一 存款和储蓄进程的定义

returns table

5.事务

二.创办带入参数的存储进度

create peoc[edure] 存储进度名字

 

  1. 数量缓存:执行个查询语句,Sql Server会将相关的数据页(Sql Server操作的多寡都以以页为单位的)加载到内部存款和储蓄器中来,下贰回假若重复呼吁此页的数量的时候,就无需读取磁盘了,大大进步了快慢。

总共有陆万条数据,二次体现会崩溃,所以分页呈现

--输出值
exec usp_Add 100,230

else if(@age<60)

->declare @变量名 变量类型

--第7页数据 每页伍条数据
--over属于开窗函数

总结: set和select的区别  

select @num;

正文

As

set @isSuccess = 0;

--用一条语句为表增加三个约束
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

print '老年人'

set @myError = (select @@ERROR);

--存款和储蓄进度中的参数的难点
--存储进度假如有参数,则调用的时候必须为参数赋值
exec usp_Add --不传参数则报错

print '青年人'

where stuId between M*(N-1) and M*N;

--》》》通过while总结1-100里边全体奇数的和

 事物视图索引

, sum(case when 课程='英语' then 成绩 else 0 end) as '英语'

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

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

end

--为岁数扩大3个反省约束,年龄必须在1—120岁时期(包括)
alter table Class add constraint CK_Class_EmpAge check(EmpAge>=0 and EmpAge<=120)

 

……

--》》》演习:查询全部学生(参与和未到场的调查)的学员姓名、年龄、成绩,假如未有参预考试呈现缺考,假设小于english也许math 小于五拾陆分展现不如格
select
ts.tsname,
ts.tsage,
tscore.tsid,
case
when tscore.tenglish is null then '缺考'
else convert(varchar(10),tscore.tenglish)
end as 匈牙利(Magyarország)语成绩,
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

缓存正是数据调换的缓冲区(称作Cache),当某一硬件要读取数据时,会率先从缓存中摸索须要的多少,尽管找到了则直接执行,找不到的话则从内部存款和储蓄器中找。由于缓存的运作速度比内部存款和储蓄器快得多,故缓存的效应正是帮扶硬件更加快地运作。

end                

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

--存款和储蓄进度的内容不会被专擅看出(尽管解密也是有希望的)。

 

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

2.执行命令缓存:在履行存款和储蓄进度,自定函数时,Sql Server供给先二进制编写翻译再运营,编写翻译后的结果也会缓存起来, 再次调用时就无需另行编写翻译。

->不生效

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

 

create proc usp_test3

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

print @gradeid

set @i = @i 1;

--》》》full join 是查询全数的数量(未有的为空)

Create proc usp_one  @name nvarchar(10)

 

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

调用存款和储蓄进度:exec usp_stuInfo 2

 

--成立二个自定义的储存过程
create proc usp_HelloWorld
as
begin
print 'hello world'
end

select @变量名=value

go

--申明变量并开首化

  设计数据库步骤:供给分析阶段,概要设计阶段,详细设计阶段,

set @sum = @sum @i;

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

  四、 带通配符参数存款和储蓄进度

begin transaction

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

视图

select * from vw_FenYeable where vw_FenYeable.num between 9 * 10 1 and 10 * 10;

--创造分页存款和储蓄进程
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
--查询第伍页内容每页呈现10条数据
exec usp_PageBum 10,5

二 系统存款和储蓄进程

end

九.(补充)全局一时半刻表,局地权且表

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

 

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

四.独具杰出的安全性

create proc usp_test1

--几个转型函数:   壹.convert -- 语法:  convert(类型,数据)   贰.cast   

代表将表1和表贰通过“列名”作为对应关系展开再而三,尽管有数量尚未有关对应,就看中间的连接格局right/left/full,假如是right就以右手的数码为主,假设是left就以左手的数额为主,假设是full就全体都显得,未有对应就补null;

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

, stuStudydate

--二-- 总括1-100的丰盛和,结果格式:一-十0的拉长和为:xxx declare  @i int=一, @sum int=0 while(@i<=100) begin set @sum =@i set @i =一 end print '壹-100的增加和为:' convert(varchar,@sum)

select @sum;

二.实行进度块,作用高

group by

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

as

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

, stuId

use MySchool

5.子查询

 go  

之所以不管是大商厦可能小店铺都会用存款和储蓄进程,不过也有的公司会供给全副用C#的逻辑来写

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

end

select * from dbo.Student where StudentName like @name

 

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

将SQL语句封装起来,就像C#中的方法一致

-二-- 依照输入的年纪显得人的发育阶段 未成年人<1捌,青年人<30,成年人<60,老年人<100,超人>=100

1一.逻辑与流程序控制制

为了创建优质的数据库需满意三大范式。

if        表达式

create proc usp_selectGrade @name nvarchar(10),@gradeid int output

--row_number() over(order by 字段)

As

select -- 紧跟查询

 create table Classes  

*/

演示:检索出在work表中每3个机构的万丈基本工资的员报酬料  select * from work a where 基本工资=(select max(基本薪资) from work b where a.部门名称=b.部门名称)

end

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

as

go

, stuIsDel

else print '超人'

begin

 alter table Classes

可持久化的派生表

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

begin

性别     (男或女,暗许男)   年龄     (1二-60)   电话     (唯1)   班级编号 (外键)   

数据文件分块存款和储蓄 文件存款和储蓄模型:文件块

  四、 带通配符参数存款和储蓄进度

, stuSex

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    

隔开分离性:假使工作在实践操作时还未形成,别的贰个思想政治工作供给执行那一个操作相关时要求等待(阻塞)

1.模块化程序设计

 

上边是创造约束

存款和储蓄进度是为了用三个名字代替一串Sql语句,传输会快,解析不须求也会快

 

->IF ELSE

一.存款和储蓄进度只在创制时开始展览编写翻译,现在每便执行存储过程都不需再另行编写翻译,而相似SQL语句每执行2遍就编写翻译一回,所以选择存款和储蓄进程可抓好数据库执行进程。 2.当对数据库实行理并答复杂操作时,可将此复杂操功效存款和储蓄进程封装起来与数据库提供的事务处理结合一起利用。 三.存款和储蓄进度能够重复使用,可减掉数据库开发人士的工作量。 四.安全性高,可设定唯有少数用户才具有对点名存款和储蓄进程的使用权

@from as char(4)

set @变量名=value

as

全局变量只好用无法协调创设和赋值!!!

玖.存款和储蓄进度    procedure

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

set @myError = (select @@ERROR);

--4-- 查询李文才的左右同室的消息 declare @seat int select @seat=stuSeatfrom stuinfo where stuname='李文才' select * from stuinfo  where stuSeat=@seat-1 or stuSeat=@seat 1

 

1.EXISTS 子查询
 EXISTS: exists 关键字能够检查评定数据是不是留存,假使存在重回真。
语法
 if exists(子查询)
 语句
示例:
 查询本校学生有没有叫张三的
 if exists( select * from student
 where studentname='张三' )
 begin
 print '有叫张3的'
 end

 

select * from StuInfos

, classId

  go  

set @myError = (select @@ERROR);

Select StudentName,Gender,GradeId,Phone from dbo.Student

->上述执行是或不是中标不可能看到,须求有再次来到值的囤积进程

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

, @to as char(4)

  1. 多少缓存:执行个查询语句,Sql Server会将有关的数据页(Sql Server操作的数码都以以页为单位的)加载到内部存款和储蓄器中来,下2次如若重新恳请此页的多少的时候,就无需读取磁盘了,大大升高了速度。

 

赋值格局2:用select 输出格局2:用select --

-- 求1到100的和

select * from dbo.Student where StudentName like @name

, sum(case when 课程='语文' then 成绩 else 0 end) as '语文'

on 表名(列名)

, stuEmail

  1. NOT EXISTS 子查询
     NOT EXISTS: exists 关键字能够检查实验数据是不是存在,即便不存在重回真
    语法
     if not exists(子查询)
     语句
    示例:
     查询本校学生是还是不是尚未叫张三的
     if not exists( select * from student
     where studentname='张三' )
     begin
     print '未有叫张叁的'
     end

inner join

(注意:加密囤积进度前应当备份原始存款和储蓄进程,且加密应该在布置到生育环境前形成。) 

, stuId

--五-- 查询比张秋丽大10虚岁以上的学习者信息 declare @age int  select @age=stuAge from stuinfo where stuName='张秋丽' select * from stuinfo where stuAge>=10 @age 

 

版权声明:本文由ca888发布于程序人生,转载请注明出处:SQL Server的尖端知识