SE本田UR-VVEMorganPlus 8数据库学习总括,数据库基础笔记分享

前言

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

  对于SQL SE大切诺基FVE奥迪Q5数据库也学了有说话了,自个儿也对协和所学做了某个总计。

本文是私家学习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.子查询

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

–把贰个询问结果作为别的贰个查询的查询源
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语句(满含了一旦有该表先删除在建表)

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

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

— 系统中常用的存款和储蓄进程 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

上面是创制约束

–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 表名

–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 约束名 约束类型 具体的羁绊说明

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

示例

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

创造外键约束

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

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

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

布署数听新闻说话如下

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)

–查询全数学生的姓名、年龄及所在班级 (班级在另二个表中)
–当多个列在分歧的表中时,要跨表查询,所以一般能够应用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(只询问四个表中都一些数据)

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

–》》》full join 是查询全数的数据(未有的为空)

开创变量语法如下是

—子查询写法
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

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

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只好一次对二个变量赋值。

–》》》右外对接
–代表要将右表(right join
侧边的表)中的全数数据都突显,左表中只显示那些相配的多寡。

全局变量只可以用无法团结创立和赋值!!!

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

出口语句

–右外联与左外联都是先将匹配的数据找到,然后再将那叁个并未有相称的数量拉长进去,(注意:不是同台查询出来的,有先后顺序)

print 和select

–》》》练习:查询全部学生(参预和未参加的考查)的学员姓名、年龄、成绩,若无到场考试展现缺考,要是小于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 德文战绩,
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

3.视图

go

视图本人并不存款和储蓄数据,只是存款和储蓄的询问语句,如若把实际表中的多寡修改后,则通过视图查询到的结果也变了。

select * from StuInfos

视图的指标是便于查询,所以一般情况下无法对视图进行增加和删除改查

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

–在视图中的查询语句,必须为每一列创造八个列名
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’)

–在视图中无法应用order by语句。除非:其它还点名了top 或for xml
–错误
create view vw3
as
select * from TblStudent order by tsage desc

drop table Classes

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

  go  

4.声称变量与行使

 create table Classes  

–》》》局地变量
–注明变量
declare @name varchar(10)
declare @age int

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

–赋值
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

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

add constraint pk_clsid_Classes   primary key(clsid)  

–》》》全局变量
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)  

–证明变量并初步化

 alter table Classes

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  

专业有多少个个性:原子性 一致性 隔开分离性 长久性
原子性:对于数据修改,要么全都实施,要么全都不施行
一致性:当数码产生时,数据必须处于同一状态
隔绝性:对数据开始展览改变的富有并发事务时相互隔断的。那标识专门的学问必须是单身的,它不应以任何措施信赖于或影响其余专门的职业
恒久性:事务完毕后,他对数据库的修改被永世保持,事务日志能够维持业务的恒久性

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

–展开工作
begin transaction

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

–提交事务
commit transaction

alter table StuInfos with nocheck –不对表现一些数据作限制操作

–回滚事务
rollback transaction

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

–账户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

6.积存进度

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

–创制二个自定义的积存进程
create proc usp_HelloWorld
as
begin
print ‘hello world’
end

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

–输出存款和储蓄进程
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  

–输出值
exec usp_Add 100,230

 go  

–存款和储蓄进度中的参数的难题
–存款和储蓄进度倘诺有参数,则调用的时候必须为参数赋值
exec usp_Add –不传参数则报错

 create table TeaInfos  

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

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

–创制分页存款和储蓄进程
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, –名称

–删除贰个仓库储存进度
drop proc usp_Add

sex char(2) check(sex=’男’ or sex=’女’) default ‘男’, –性别

7.触发器

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

尽量幸免在触发器中进行耗费时间操作,因为触发器会与sql语句认为在同五个业务中(事务不甘休,就不能够自由锁)

tel char(11) unique, –电话

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

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

  go

–插入数据
insert into Teacher values(‘网名好’,’12352536′,’Wjifdfji@qq.com’)

一:操作变量 –1– 注明变量@temp值为1并打字与印刷出来 申明变量关键字:

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

declare   declare @temp int –声明   

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

set @temp=1       –赋值  

8.游标

 print @temp       –输出   

–1.定义游标
declare cur_Student cursor fast_forward for select * from Student

  declare @temp int=1 –注脚的还要赋值  

–2.开荒游标
open cur_Student

 print @temp         –输出   

–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   –输出

–3.平息游标
close cur_Student

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

–4.保释财富
deallocate cur_Student

2– 注脚多个变量存款和储蓄’姓名、性别、年龄’,再打字与印刷新闻,格式如下:
姓名:杰达姆,性别:男,年龄:18 –申明

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

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

有的有时表:表名以#为始发。只在现阶段对话中有效,无法跨连接访问。假如平昔在接连会话中成立,则当前接连断开后删除,假设是在存款和储蓄进程中创建的,则存款和储蓄进程施行完毕后删除

–赋值 select @name=’杰达姆’,@sex=’男’,@age=18

全局有时表:表名以##为始发。八个会话可分享全局有的时候表。当成立全局有的时候表的对话断开,况兼未有用户正在访问全局临时表时删除

–输出 print  ‘姓名:’+@name+’,性别:’+@sex+’,年龄:’   +cast(@age as
varchar)   

10.(补充)约束

–convert(varchar,@age)

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

–四个转型函数:   1.convert — 语法:  convert(类型,数据)   2.cast   

–增添一列(扩充一列EmpAddr varchar(一千))
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

–为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能并且为四个变量赋值  

后记

 2. set只好赋贰个定位的值,而select能动态的赋值(值来自于表内)
select的功用  

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

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

 

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

 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

declare @age int set @age=21

if(@age<18) print ‘未成人’ else if(@age<30)

print ‘青年人’

else if(@age<60)

print ‘成年人’

else if(@age<100)

print ‘老年人’

else print ‘超人’

select * from StuInfo select * from StuExam

–3– 计算笔试平均分,固然平均分超过70分打字与印刷’优良’
同不常间出示前三名学员的考试音讯不然      打字与印刷’比较糟糕’展现后三名学员音讯

declare @avgScore int select @avgScore=AVG(writtenExam) from StuExam
if(@avgScore>=70) begin print ‘本班战表优异’

select top 3 * from StuExam order by writtenExam desc end else begin
print ‘本班战绩很差’ select top 3 * from StuExam order by writtenExam
end

三:循环结构 –1– 输出九柒次’笔者爱你’ declare @i int=1  while(@i<=99)
begin print ‘第’+convert(varchar,@i)+’小编爱你’ set @i+=1 end

–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)

–3– 不停的进步学生笔试成绩2分,让具备学生的笔试成绩都过关

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

四:多分支语句

–1– 请宣示变量@name表示学生姓名,对该学生年龄举行划品级 具体如下:
13岁前展现:’小学生’ 12-17呈现’初级中学生’  18-22显得’高级中学生’
23-28显得’硕士’ 28以上’超人’ 结果格式:xxx是二个xxx

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

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

–输出 print @name+’是一个’+@result

–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分以下
        

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    

–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

查询

子查询:查询中再查询,平常是以三个询问作为基准来供另一个查询利用
语法:
   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

rollback transaction

视图

创设视图索引

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

drop view 视图名

create view  视图名

as

SQL语句

索引

if exists(select name from sysindex where name=’索引’)

drop index 表名。索引名

create 索引类型 index 索引名

on 表名(列名)

with fillfactor=30

GO

一 存款和储蓄进度的概念

储存进程是在数据库管理体系保留的,预先编写翻译的,能兑现某种意义的SQL程序,它是数据库应用中利用相比普及的一种多少对象。

何以须要仓库储存进度?

1.积累进度只在开创时开始展览编写翻译,今后每一回推行存款和储蓄进度都不需再另行编译,而相似SQL语句每实践一回就编译三遍,所以选用存款和储蓄进程可增加数据库试行进程。
2.当对数据库举行理并答复杂操作时,可将此复杂操效用存款和储蓄进度封装起来与数据库提供的事务管理结合一同利用。
3.存款和储蓄过程能够重复使用,可减掉数据库开垦职员的职业量。 4.安全性高,可设定独有少数用户才有所对点名存款和储蓄进度的使用权

累积进度的优点:

1.模块化程序设计

2.施行进度块,效用高

3.回降互联网流量

4.有所卓越的安全性

 

二 系统存款和储蓄进度

SQL_SE奥迪Q7VE中华V 提供系统存储进程,它们是一组预编写翻译的T-SQL语句,系统存款和储蓄进度提供了管理数据库和更新表的建制,并担负从系统表中检索音信的飞速格局。

常用的系统存储过程

系统存储过程

说明

sp_databases

列出服务上的所有数据库

sp_helpdb

报告有关指定数据库或所有数据库的信息

sp_renamedb

更改数据库的名称

sp_tables

返回当前环境下可查询的对象的列表

sp_columns

返回某个表列的信息

sp_help

返回某个表的所有信息

sp_helpconstraint

查看某个表的约束

sp_helpindex

查看某个表的索引

sp_stored_procedures

列出当前环境中的所有存储过程

sp_password

添加或修改登录账户的密码

 

三 用户自定义的寄存进度

1.创办不带参数的存储进度

Create proc usp_selectstu

As

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

 

调用存款和储蓄进程:exec
usp_selectstu

2.创办带入参数的囤积过程

Create proc usp_stuInfo @gradeid int=2       (默认)

As

Select * from student where gradeId=@gradeid

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

3.创制带出参数的累积进程

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

As

Select @gradeid=gradeid from student where  studentname=@name

print @gradeid

 

调用存款和储蓄进度:

declare @id int

exec usp_selectGrade ‘李小龙’,@id output 

 

  4、 带通配符参数存储进程

Create proc usp_one  @name nvarchar(10)

as

select * from dbo.Student where StudentName like @name

 

exec usp_one ‘李%’

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

缓存便是数据交流的缓冲区(称作Cache),当某一硬件要读取数据时,会率先从缓存中搜索要求的多寡,假若找到了则一直施行,找不到的话则从内部存款和储蓄器中找。由于缓存的运行速度比内部存款和储蓄器快得多,故缓存的作用正是帮扶硬件更快地运营。

Sql
Server系统内部存款和储蓄器管理在一贯不配置内部存款和储蓄器最大值,相当多时候大家会意识运转Sql
Server的系统内部存款和储蓄器往往只扩大不收缩。那是出于他对此内部存款和储蓄器使用的方针是有稍许闲置的内部存款和储蓄器就攻下多少,直到内部存款和储蓄器使用虑达到系统峰值时(预留内部存款和储蓄器根据系统暗中认可预留使用为准,至少4M),才会消除一些缓存释放一点点的内部存款和储蓄器为新的缓存腾出空间。

那个内部存款和储蓄器一般都以Sql Server运转时候作为缓存的,比如你运转多少个select语句,
试行个存款和储蓄进程,调用函数;

  1. 数据缓存:实践个查询语句,Sql Server会将相关的数据页(Sql
    Server操作的数目都以以页为单位的)加载到内部存款和储蓄器中来,下二遍借使重新呼吁此页的数额的时候,就不需求读取磁盘了,大大提升了速度。

2.实施命令缓存:在实行存款和储蓄进程,自定函数时,Sql
Server必要先二进制编写翻译再运转,编写翻译后的结果也会缓存起来,
再度调用时就没有供给重新编写翻译。

 

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

 

6,加密存款和储蓄进度

exec sp_helptext 积存进度名      能够查看储存进程代码

create proc proc_temp_encryption

with encryption

as

    select * from student;

go

–存款和储蓄进度的剧情不会被随机看出(就算解密也可能有希望的)。

–应用那一个,我们能够对某个关键的仓库储存进程进展加密。

–但此时,存款和储蓄进度依然能被execute、alter和drop。

exec proc_temp_encryption;

exec sp_helptext ‘proc_temp’

exec sp_helptext ‘proc_temp_encryption’

(注意:加密仓库储存进程前应当备份原始存款和储蓄进程,且加密应该在安顿到生产条件前产生。) 

 

一 存款和储蓄进程的定义

存款和储蓄过程是在数据库处理体系保留的,预先编写翻译的,能完结某种意义的SQL程序,它是数据库应用中央银行使相比广泛的一种多少对象。

怎么须求仓库储存进度?

1.存款和储蓄进程只在创马上打开编写翻译,以往每一回推行存款和储蓄进程都不需再重复编写翻译,而貌似SQL语句每施行二遍就编写翻译一回,所以选拔存款和储蓄进程可增加数据库实施进程。
2.当对数据库进行复杂操作时,可将此复杂操成效存款和储蓄进度封装起来与数据库提供的事务管理结合一同行使。
3.存款和储蓄进程能够重复使用,可减弱数据库开拓职员的专门的职业量。 4.安全性高,可设定唯有某个用户本领备对点名存款和储蓄过程的使用权

积累进程的帮助和益处:

1.模块化程序设计

2.实施进程块,功效高

3.滑坡互联网流量

4.负有非凡的安全性

 

二 系统存款和储蓄进程

SQL_SE奥德赛VEENVISION 提供系统存款和储蓄进程,它们是一组预编译的T-SQL语句,系统存款和储蓄进程提供了保管数据库和更新表的体制,并充当从系统表中检索音讯的急速格局。

常用的系统存储过程

系统存储过程

说明

sp_databases

列出服务上的所有数据库

sp_helpdb

报告有关指定数据库或所有数据库的信息

sp_renamedb

更改数据库的名称

sp_tables

返回当前环境下可查询的对象的列表

sp_columns

返回某个表列的信息

sp_help

返回某个表的所有信息

sp_helpconstraint

查看某个表的约束

sp_helpindex

查看某个表的索引

sp_stored_procedures

列出当前环境中的所有存储过程

sp_password

添加或修改登录账户的密码

 

三 用户自定义的积攒进度

1.创造不带参数的囤积进程

Create proc usp_selectstu

As

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

 

调用存款和储蓄进程:exec
usp_selectstu

2.开立带入参数的积攒进度

Create proc usp_stuInfo @gradeid int=2       (默认)

As

Select * from student where gradeId=@gradeid

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

3.开立带出参数的仓储进程

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

As

Select @gradeid=gradeid from student where  studentname=@name

print @gradeid

 

调用存款和储蓄进度:

declare @id int

exec usp_selectGrade ‘李小龙’,@id output 

 

  4、 带通配符参数存储进度

Create proc usp_one  @name nvarchar(10)

as

select * from dbo.Student where StudentName like @name

 

exec usp_one ‘李%’

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

缓存正是数据调换的缓冲区(称作Cache),当某一硬件要读取数据时,会率先从缓存中寻觅要求的数码,固然找到了则直接实践,找不到的话则从内存中找。由于缓存的运转速度比内部存款和储蓄器快得多,故缓存的成效正是协助硬件越来越快地运作。

Sql
Server系统内存管理在尚未配备内部存款和储蓄器最大值,非常多时候我们会发掘运维Sql
Server的种类内部存款和储蓄器往往更加的多。那是由于她对于内存使用的攻略是有微微闲置的内部存款和储蓄器就据有多少,直到内部存款和储蓄器使用虑到达系统峰值时(预留内部存储器根据系统暗许预留使用为准,至少4M),才会化解一些缓存释放一点点的内部存款和储蓄器为新的缓存腾出空间。

这么些内部存款和储蓄器一般都是Sql Server运营时候作为缓存的,举个例子你运行三个select语句,
施行个存款和储蓄进度,调用函数;

  1. 数码缓存:实践个查询语句,Sql Server会将相关的数据页(Sql
    Server操作的数据都以以页为单位的)加载到内部存款和储蓄器中来,下二回倘诺重新必要此页的数量的时候,就无需读取磁盘了,大大升高了进度。

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

 

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

 

6,加密存款和储蓄进度

exec sp_helptext 积攒进程名      能够查看累积进程代码

create proc proc_temp_encryption

with encryption

as

    select * from student;

go

–存款和储蓄进程的故事情节不会被专断看出(就算解密也有相当的大大概的)。

–应用这一个,咱们能够对少数重大的积累进程进展加密。

–但此时,存款和储蓄进程还是能被execute、alter和drop。

exec proc_temp_encryption;

exec sp_helptext ‘proc_temp’

exec sp_helptext ‘proc_temp_encryption’

(注意:加密仓库储存进度前应当备份原始存款和储蓄进程,且加密应该在布置到生产条件前形成。) 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website