二
2.4 创建数据库
create database LtsDatabase
on /*对数据文件的描述*/
(
name=LtsDatabase_data,
filename='d:\temp\LtsDatabase_data.mdf',
size=6,/*数据库文件初始化大小*/
maxsize=12,/*数据库最大空间多大*/
filegrowth=10%/*数据库文件超过现有的最小初始化大小后的增长百分之多少*/
)
log on/*对数据事物日志的描述*/
(
name=LtsDatabase_log,
filename='d:\temp\LtsDatabase_data.ldf',
size=1,
maxsize=8,
filegrowth=10%
)
2.7 创建表
useLtsDatabase /*打开数据库*/
create table Teacher
(
教师编号 int,
教师名称 varchar(50),
教师职称 varchar(50),
教师工资 money
)
2.8 查询数据
select 教师编号,教师职称from dbo.Teacher
2.9编辑前多少行 (编辑前200行,以SQL语句来显示)
SELECT TOP (200) 教师编号, 教师名称, 教师职称, 教师工资
FROM 教师表
2.10 增加文件
alter database LtsDatabase/*修改数据库文件,这是必须的,要取得这个数据库的权限*/
add file /*增加文件*/
(
name = LtsDabase2,
filename='d:\temp\LtsDatabase.mdf',
size=6
)
/*增加事物日志文件
add logfile
(
name=LtsDatabase_log2,
filename = 'd:\temp\LtsDatabase_log2.ldf',
filegrowth=10%
)
*/
2.11 删除数据库
alter database LtsDatabase
删除事物数据文件
remove file LtsDabase2
删除事物日志文件
/*
removefile LtsDatabase_log2
*/
2.12 修改数据库表
将Teacher表的表名,改成教师表
exec sp_rename"Teacher","教师表"
2.13 修改数据库表–增加列字段
打开数据库--修改表--增加列字段
useLtsDatabase
alter table 教师表
addEmail varchar(60)default'ZhangKuixun@yeah.net'
2.14 修改数据库表–修改列字段
useLtsDatabase
alter table 教师表
alter column 教师薪金int /*把之前的类型改成int*/
删除表的字段
useLtsDatabase
alter table 教师表
drop column 家庭住址 /*删除家庭住址这一列*/
2.15 往数据库插入一条数据库记录
useLtsDatabase
insert into 教师表(教师编号,教师名称,教师职称,教师工资)values(1,'张老师','ios',2000)
2.17 指定条件,更新数据库的某项记录
use LtsDatabase
update 教师表 set 教师编号=160,教师名称='孙老师',教师职称='高级教师',教师工资=2000where 教师编号=120/*设置教师编号=160,...,教师工资=2000,更新条件:教师编号=120的这一列*/
2.22
useLtsDatabase
create table 网站职员表
(
职员编号 int,
姓名 varchar(50),
年龄 int,
毕业院校 varchar(50),
家庭住址 varchar(50),
工资 money
)
2.24 插入一行数据
useLtsDatabase
insert into dbo.网站职员表(职员编号,姓名,年龄,毕业院校,家庭住址,工资)values(1,'小伟',22,'黑河学院','黑龙江省北安市',2800)
insert into dbo.网站职员表(职员编号,姓名,年龄,毕业院校,家庭住址,工资)values(2,'小张',23,'黑河学院','黑龙江省北安市',2800)
insert into dbo.网站职员表(职员编号,姓名,年龄,毕业院校,家庭住址,工资)values(3,'小宽',24,'黑河学院','黑龙江省北安市',2800)
2.25 逻辑或运算符
select *from 网站职员表where 工资< 2700or 工资 = 2700/*查询网站职员表中的工资大于2700或工资等于2700元的数据*/
2.26 逻辑与运算符
select *from 网站职员表where 年龄=25and 毕业院校='黑河学院'/*查询网站职员表中的年龄=25并且毕业院校是黑河学院的的数据*/
2.27 not运算符
select *from 网站职员表wherenot 工资>2700/*工资不大于2700元的数据 where工资!>2700*/
2.28 模糊查询
运算符的优先级:
括号
not(非)、正好、负号
乘、除
加、减
比较运算符
and
or
//先查询括号里面的。查询网站职员表中毕业院校=黑大或者毕业院校=浙大并且查询年龄=25
select *from 网站职员表 where(毕业院校='黑大'or 毕业院校='浙大') and 年龄=25
2.32 in()(在什么范围内);not in()(不在什么范围之内)
select *from 网站职员表where 毕业院校in('黑大','浙大','哈工程学院') /*查询网站职员表中的毕业院校是'黑大','浙大','哈工程学院'的数据*/
is null /*是空值*/ is not null /*不是空值*/
select *from 网站职员表where 家庭住址isnull
2.33 between 在谁和谁之间
// between
select *from 网站职员表where 工资between 2000and 2600/*网站职员表中工资在2000到2600之间的数据*/
not between 不在谁和谁之间
select *from 网站职员表where 工资notbetween 2000 and 2600/*网站职员表中工资不在2000到2600之间的数据*/
between和 in 比较:in要把所有的值都列举出来,between只指定一个范围值
2.34 distinct
消除已查询出的重复字段记录
/*查询网站职员表中的毕业院校数据,去除重复的院校*/
select distinct 毕业院校from 网站职员表
2.35 in(…) 或者 = (…)
都是查询谁和谁相同的数据
/*查询网站职员表中的和小江相同工资的员工*/
select *from 网站职员表where 工资=(select 工资from 网站职员表 where 姓名='小江')
2.36 identity (1,1)
创建标识列,包括标识种子和标识自增量为1 primarykey 创建主键
create table 网站经营项目
(
项目编号 int identity (1,1) primarykey,
项目名称 varchar (50),
负责人 varchar (50),
合作单位 varchar (50)
)
insert into 网站经营项目(项目名称,负责人,合作单位)values('远程教学','小赵','独立开发')
insert into 网站经营项目(项目名称,负责人,合作单位)values('远程教学','小江','独立开发')
insert into 网站经营项目(项目名称,负责人,合作单位)values('软件开发','小伟','独立开发')
2.37 多表联合查询
/*查询网站职员表中的符合条件的数据,条件是姓名在这个集合中==>>查询出网站经营项目表中的负责人这个字段的值,并且去除重复的字段(负责人)*/
select *from 网站职员表where 姓名in(selectdistinct 负责人 from 网站经营项目)
2.38 多表联合查询-排序asc从低到高排序,desc从高到低排序
/*查询网站职员表中的符合条件的数据,条件是姓名在这个集合中==>>查询出网站经营项目表中的负责人这个字段的值,并且去除重复的字段(负责人),按照工资从高到低排序*/
select *from 网站职员表where 姓名in(selectdistinct 负责人 from 网站经营项目)
order by 工资desc
2.39 多级排序
select *from 网站职员表orderby 年龄 asc,工资asc/*查询网站职员表中的内容,年龄从低到高排序,工资从低到高排序*/
统计函数COUNT:统计查询出来的数据有多少行
select COUNT(*) from 网站职员表/*查询网站职员表中符合条件的记录有多少行*/
select COUNT(*) as 记录行数from 网站职员表/*查询网站职员表中记录有多少行,查询出来的数据列名用“记录行数”显示*/
2.40 COUNT(家庭住址) 如果家庭住址有6行,有一行为NULL,则不计算为NULL的那一行记录,查询出来的总行数为5
select COUNT(家庭住址)as 住址行数from 网站职员表/*查询网站职员表中家庭住址的行数为多少行,查询出来的数据列名用“住址行数”显示。如果家庭住址列有一行为NULL,则不计算为NULL的那一行*/
SUM求总和
select SUM(工资) as 工资总和 from 网站职员表 /*查询网站职员表中工资总和,查询出来的数据列名用“工资总和”显示*/
2.41 AVG求品均值
select AVG(工资) as 平均工资 from 网站职员表 /*查询网站职员表中平均工资,查询出来的数据列明用“平均工资”显示*/
max求最大值
select max(工资) as 最高工资 from 网站职员表 /*查询网站职员表中最高工资,查询出来的数据列明用“最高工资”显示*/
min求最小值
select min(工资) as 最低工资 from 网站职员表 /*查询网站职员表中最低工资,查询出来的数据列明用“最低工资”显示*/
2.42 通过统计值作为查询条件
select *from 网站职员表where 工资>(selectAVG(工资)from 网站职员表)/*查询网站职员表中符合条件的记录,条件是工资大于平均工资的记录*/
2.43
alter database LtsDatabase
add 奖金 money/*增加表字段奖金*/
update 网站职员表 set 奖金=500/*更新网站职员表,设置网站职员表的奖金等于500*/
select 职员编号,姓名,工资+奖金as 总收入from 网站职员表/*查询网站职员表中的职员编号,姓名,总收入(工资+奖金)。总收入的列名用“总收入”显示*/
2.44 模糊查询
select *from 网站职员表where 毕业院校like'%黑%'/*模糊查询出网站职员表中的毕业院校的名字中包括“黑”字的记录*/
select *from 网站职员表where 毕业院校like'黑%'/*模糊查询出网站职员表中的毕业院校的名字中以“黑”字开头的记录*/
select *from 网站职员表where 毕业院校like'%黑'/*模糊查询出网站职员表中的毕业院校的名字中以“黑”字结尾的记录*/
2.46 汇总分组(汇总查询) order by “年龄” compute by“年龄”要求查询的列名前后对应
select *from 网站职员表orderby 年龄 compute max(工资),min(工资),sum(工资),avg(工资)by 年龄/*查询网站职员表重中符合条件的记录,根据年龄排序,通过年龄进行分表汇总*/
2.48 group by分组查询
select 毕业院校,max(工资)as 最高工资,min(工资)as 最低工资,avg(工资)as 平均工资,sum(工资)as 工资总额,sum(工资+奖金)as 收入总额from 网站职员表groupby 毕业院校/*对同一个毕业院校做如上的统计*/
having 只显示部分记录
select 毕业院校,max(工资)as 最高工资,min(工资)as 最低工资,avg(工资)as 平均工资,sum(工资)as 工资总额,sum(工资+奖金)as 收入总额from 网站职员表groupby 毕业院校 having sum(工资)> 5000 /*对同一个毕业院校做如上的统计,只显示工资大于5000元的分组*/
2.49
select *from 网站职员表where 毕业院校in(select 毕业院校from 网站职员表groupby 毕业院校 having sum(工资)> 5000)
/*查询网站职员表中,在某一个毕业院校毕业的所有学员总收入超过一个指定值,查看在这样毕业院校毕业的学员的经济情况。
查询网站职员表符合条件的记录,毕业院校的值在这个范围之内(只查询网站职员表中每个毕业院校总工资>5000元的记录,并通过毕业院校分组)*/
2.50 谓词: exists=存在 not, exists=不存在 (in和not in 也是谓词)
select *from 网站职员表whereexists(select*from 网站职员表where 毕业院校='哈工大')
/*网站职员表中只要有一个哈工大的学生存在,就把网站职员表中所有的记录都查询出来。
查询网站职员表中符合条件的记录,条件是:由exists限制,后面括号中是一个集合,只要这个集合中包含毕业院校=‘哈工大’,这个条件就为true,为true就把网站职员表中的记录全部查询出来*/
select *from 网站职员表wherenot exists(select*from 网站职员表where 毕业院校='哈工大')
/*查询网站职员表中符合条件的记录,条件是:由not exists限制,后面括号中是一个集合,只要这个集合中包含毕业院校=‘哈工大’,这个条件就为true,由于前面是not exists,所以前面的记录就不被查询出来*/
exists
和in
比较
in
:前面的字段必须在后面的集合中所包含,前面的记录才会白查询出来exists
:只要后面的集合中为true,就是后面集合中只要有值,前面的记录都会被查询出来
2.51量词 any前面的值大于后面任意一个值 all前面的值大于后面所有的值
select *from 网站职员表where 工资>any(select 工资from 网站职员表where 毕业院校='北京大学')
/*先把后面括号查询出来的值看成一个集合。然后在理解,查询网站职员表中符合条件的记录,条件是:前面查询的网站职员表中的记录中工资大于后面括号查询的集合中任意一个值。*/
select *from 网站职员表where 工资>all(select 工资from 网站职员表where 毕业院校='北京大学')
/*先把后面括号查询出来的值看成一个集合。然后在理解,查询网站职员表中符合条件的记录,条件是:前面查询的网站职员表中记录中的工资字段的值大于后面括号查询的集合中每一个值。*/
2.52 percent:前百分之几
select top 2percent*from 网站职员表/*查询前百分之2*/
2.53 查询的结果如何保存
select *into 第二网站职员表from 网站职员表where 工资>2800/*将网址职员表中查询出来的工资大于2800元的记录,存到一个新的表“第二网址职员表”中*/
2.54
update 第二网站职员表 set 姓名='网站职员表之'+姓名/*将表中所有的指定字段记录做更改*/
2.55 union:集合并运算 interset:集合交运算
select *from 网站职员表unionselect *from 第二网站职员表/*查询网站职员表和第二网站职员表中的记录,合并为一个表显示*/
select *from 网站职员表 intersetselect*from 第二网站职员表 /*查询网站职员表和第二网站职员表中的记录,分成两个表显示*/
2.56 连接查询
select *from 网站职员表,网站经营项目
2.57 按条件连接查询
select *from 网站职员表,网站经营项目where 网站职员表.姓名=网站经营项目.负责人
/*条件:查询网站职员表和网站经营项目表中,手里有项目的员工,以及他个人的信息
如果表中没有重复字段可以直接用姓名=负责人,如果有有相同字段名就用网站职员表.姓名=网站经营项目.负责人*/
2.58 超连接查询 内连接:
select *from 网站职员表innerjoin 网站经营项目on 网站职员表.姓名=网站经营项目.负责人
/*连接网站职员表和网站经营项目表,查询网站职员表.姓名=网站经营项目.负责人的记录,组合成新的表显示*/
2.59 左连接
select *from 网站职员表leftjoin 网站经营项目 on 网站职员表.姓名=网站经营项目.负责人
/*连接网站职员表和网站经营项目表,查询出的结果组合成新的表显示:先显示左边网站职员表中的所有记录,然后再显示“网站职员表.姓名=网站经营项目.负责人”的记录;如果没有“网站职员表.姓名”对应的“网站经营项目.负责人”,则只显示左边“网站职员表.姓名”的数据,右边不显示“网站经营项目.负责人”数据,右边只显示NULL*/
右连接
select *from 网站职员表rightjoin 网站经营项目on 网站职员表.姓名=网站经营项目.负责人
/*连接网站职员表和网站经营项目表,查询出的结果组合成新的表显示:先显示右边网“站经营项目表”中的所有记录,然后再显示左边“网站职员表.姓名=网站经营项目.负责人”的记录;如果没有“网站职员表.姓名”对应的“网站经营项目.负责人”,则只显示右边“网站经营项目.负责人”的数据,左边不显示“网站职员表.姓名”数据*/
全连接
select *from 网站职员表fulljoin 网站经营项目 on 网站职员表.姓名=网站经营项目.负责人
/*连接网站职员表和网站经营项目表,查询出的结果组合成新的表显示:显示出所有的网站职员表和网站经营项目表的记录*/
三
3.2 Check
约束修改数据库字段的值
1.工具–>选项–>设计器–>表设计器和数据库设计器–>取消选中 阻止保存要求重新创建表的更改
2.选中需要更改的表–>右键–>设计–>选中数据类型–>右键–>选择CHECK约束–>添加–>常规–>设定值
3.3主键:不允许有重复值
外部键:一个表中的人对应其他表的多条记录
3.4 创建为一键:不允许有重复值
选中需要更改的表–>右键–>设计–>选中需要设置的列名–>添加–>IX_网站职员表–>常规–>类型–>选择为一键
3.5 索引:
优点:可以加速数据的检索;加速连接;查询优化;
缺点:作为单独数据库对象,增加数据库空间;减慢修改速度,每次插入或者修改表结构,需要维护索引指向;
3.6 索引的类型:
聚集索引:排序表的物理数据,数据和索引在一起;查找数据比较快;需要的空间大(数据:索引==1:1.2);一个表只有一个聚集索引;
非聚集索引:不用排序物理数据,数据和索引分离(比如:仓库的货物和账本);储存表中列的字段名和行的index;需要空间更大;一个表可以建立多个非聚集索引(最多建立249个索引);
唯一索引:确保索引字段的值,无重复值;
非唯一索引:允许保存在列中的字段值有重复值;
单列索引:将列中的一个字段,单独建成索引;
多列索引:把表中多个字段组合建成索引;
3.7 创建索引
exec sp_helpindex网站职员表/*执行查看网站职员表中建立了多少个索引*/
create index new_index on 网站职员表(工资 desc)/*在网站职员表中创建索引,索引的名称new_index,指定索引的字段是工资,并且是正序排列*/
3.8 创建唯一索引
create unique indexnew_index2 on 网站职员表(姓名)/*创建唯一索引,索引的名称new_index,指定在网站职员表中创建索引,指定索引的字段为姓名*/
3.9 创建索引公式
[unique]唯一索引,指定字段值不能重复
[clustered]指明创建的索引为 true索引,默认为true索引
[NonClustered]指明创建的索引为 非true索引
Create [unique] [c lustered][NonClustered]
index index_name on Table或者View的名称
3.10 如何对索引进行修改
exec sp_rename'网站职员表.new_index','新new_index','index'/*将索引的名称'网站职员表.new_index'改为'新new_index'*/
3.11 如何删除索引
drop index 网站职员表.new_index/*删除索引,指定表和索引名称*/
3.12 视图:查询后显示的记录,虚拟表
标准视图:从一个或者多个表查询出来的记录
索引视图:根据视图创建一个聚集索引
分区视图:多台服务器上的数据像处理一个表一样处理,就用分区视图
视图优点:操作简单,查询时直接调用视图,不用写查询语句;定制数据,可以让不同用户使用同一个数据库;合并和分割数据;安全性高,让不同用户查看的数据不同;
视图确定:性能不高,必须转换成底层原表的查询;视图修改受限;
3.13 创建视图:
修改视图的内容,等于修改表的视图
3.16 SQL语句创建视图
create View test_view2 as select 姓名,年龄,职员编号 from 网站职员表 where 工资>2300/*创建网站职员表的视图,视图的列名:姓名,年龄,职员编号,条件是工资大于2300*/
3.17 修改视图
alter View test_view2 as select * from 网站职员表 where 工资<2300/*修改test_view2,条件是工资小于2300*/
drop view test_view2/*删除视图test_view2*/
四
4.3 数据类型
整数:
bigint (-2^63 ~ 2^63-1) 8个字节
int (-2^32 ~ 2^32-1) 4个字节
smallint (-2^15 ~ 2^15-1) 2个字节
tinyint (0 ~ 255)
浮点数据类型:
real 精确7位小数 4个字节
float 精确15位小数 8个字节
decimal (-10^38 ~ 10^37) 2-17个字节
numreic (-10^38 ~ 10^37) 2-17个字节
4.4 二进制数据类型
binary binary(n) n:数据的长度1~8000
vartinary vartinary(n) n:数据长度 Ox
uniqueidentifier uniqueidentifier()
二进制大型对象(binary large object)
逻辑数据类型:1个字节,输入其他数据类型默认为1
文本数据类型:
text 1 ~2^31-1
ntext 1 ~2^30-1
图形数据类型:image 1 ~2^31 Ox
4.5 字符数据类型
char char(n)1~ 8000
nchar nchar(n)1~ 4000
varchar varchar(n)可变长度
nvarchar nvarchar(n)1~ 4000
datetime 8个字节,前4个字节储存日期,后4个字节存储时间;公约1793.1.1 0时0分0秒 -9999.12.31 23时59分59秒
smalldatetime 4个字节;时间范围1900.1.1-2079.6.6
货币型:
money -2^36 ~2^36-1 8个字节
smallmoney -2^31~ 2^31-1 4个字节
sysname nvarchar(128)
可变数据类型和表数据类型:
sql-variant 储存任何合法数据
table 查询后的结果
4.6 变量
declare@test_Var int
set@test_Var=1000
select@test_Var
/*申明局部变量,定义数据类型为int
给变量赋值为1000的整数(给变量赋值可用:set、select)
查询变量中的值*/
4.7 局部变量
局部变量以@开头
declare 申明
set 单一一个变量赋值
select 同时为多个变量赋值
print 单独输出一个
select 同时输出多个
declare@test_Var int,@test_Var2char(60)
select@test_Var=1000,@test_Var2='我是一个中国人'
print@test_Var
print@test_Var2
输出结果:
declare@test_Var int,@test_Var2char(60)
select@test_Var=1000,@test_Var2='我是一个中国人'
select@test_Var,@test_Var2
输出结果:
4.8 全局变量
两个@@作为前缀
4.9
--这是一个Begin...end程序块
Begin
declare@test_Var int,@test_Stringvarchar(60)
select@test_Var=2000,@test_String='大家好,我是张奎勋'
if@test_Var=2000
print@test_String
end
/**
开始
申明两个变量@test_Var和@test_String,分别定义为int类型和varchar类型
开始赋值
如果test_Var变量的值等于2000
输出test_String
*/
--这是一个Begin...end程序块
Begin
declare@test_Var int,@test_String1varchar(30),@test_String2varchar(30)
select@test_Var=100,@test_String1='录取',@test_String2='未录取'
if@test_Var=100
print@test_String1
else
print@test_String2
end
Begin
declare@test_Var1 int,@test_Stringvarchar(60)
select@test_Var1=2000,@test_String='大家好,我是张奎勋'
if@test_Var1=2000
print@test_String
end
4.11
Begin
declare@test_Var int,@test_String1varchar(30),@test_String2varchar(30)
select@test_Var=100,@test_String1='录取',@test_String2='未录取'
if@test_Var=100
print@test_String1
else
print@test_String2
end
4.12
--这是一个Begin...end程序块
Begin
declare@test_Var int,@test_String1varchar(30),@test_String2varchar(30),@test_String3varchar(30),@test_String4varchar(30)
select@test_Var=90,@test_String1='优秀',@test_String2='良好',@test_String3='及格',@test_String4='差'
if@test_Var>=90and@test_Var<=100
print@test_String1
else if @test_Var>=80and @test_Var<90
print@test_String2
else if @test_Var>=60and @test_Var<80
print@test_String3
else if @test_Var<60
print@test_String4
end
4.14
--case 根据不同的条件给@test_String赋不同的值
Begin
declare@test_Var int,@test_Stringvarchar(30)
set@test_Var=100
set@test_String=
case
when@test_Var>=90and@test_Var<=100then'优秀'
when@test_Var>=80and@test_Var<90then'良好'
when@test_Var>=60and@test_Var<80then'及格'
else '不及格'
end
select '学院成绩为: '+@test_String
end
4.17
--while 循环,只要while后面的条件满足,就一直循环begin...end里面的代码,直到while后面条件不满足,然后输出语句
declare @test_Varint,@Sumint
select@test_Var=0,@Sum=0
while@test_Var<=200
begin
set @Sum= @Sum+@test_Var
set@test_Var = @test_Var +1
end
select '200以内所有整数之和为:',@Sum
4.18 break
--while 循环,只要while后面的条件满足,就一直循环begin...end里面的代码,直到while后面条件不满足,然后输出语句
--begin...end里的代码:
--一旦test_Var的值加到30,就跳出整个循环.
declare@test_Var int,@Sumint
select@test_Var=0,@Sum=0
while@test_Var<=200
begin
set @Sum= @Sum+@test_Var
set@test_Var = @test_Var +1
if@test_Var=30 /*先赋值,后+1,判断,再跳出整个循环*/
break
end
select '200以内所有整数之和为:',@Sum
--while 循环,只要while后面的条件满足,就一直循环begin...end里面的代码,直到while后面条件不满足,然后输出语句
--begin...end里的代码:
--一旦test_Var的值加到30,sum值的再加一次test_Var,就跳出整个循环
declare@test_Var int,@Sumint
select@test_Var=0,@Sum=0
while@test_Var<=200
begin
set @Sum= @Sum+@test_Var
if @test_Var=30 /*先+1,后赋值,判断,再跳出整个循环*/
break
set@test_Var = @test_Var +1
end
select '200以内所有整数之和为:',@Sum
4.19 continue
declare@test_Var int,@Sumint
select@test_Var=0,@Sum=0
while@test_Var<200
begin
set@test_Var = @test_Var +1
if@test_Var=100/*先+1,后赋值,判断,再跳出当前循环*/
continue
set @Sum= @Sum+@test_Var
end
select '200以内所有整数之和为:',@Sum
4.20 Goto语句
--goto test_Target直接跳到test_Target:
print '大家好,这是一次goto语句测试'
gototest_Target
print '当前没有使用沟通跳转'
test_Target:
print '我是学习sqlserver的学员'
4.21
--goto test_Target直接跳到test_Target:
declare@test_Var int ,@sum int
select@test_Var=0,@sum=0
test_Target:
set@test_Var=@test_Var+1
set @sum=@sum+@test_Var
while@test_Var<200gototest_Target/*先+1,后赋值,判断循环条件,再跳出当前循环*/
select '200以内所有整数之和为:',@sum
五
5.1三角函数:SIN
declare@test_Var float,@test_Value float
set@test_Var=60
set@test_Value=SIN(@test_Var)
select '60弧度角的正弦值为:',@test_Value
三角函数
SIN(浮点表达式)
COS(浮点表达式)
TAN(浮点表达式)
COT(浮点表达式)
反三角函数
ASIN(浮点表达式)
ACOS(浮点表达式)
ATAN(浮点表达式)
角度弧度转换函数
DEGREES 角度转弧度
RADIANS 弧度转角度
冥函数
EXP(浮点表达式) 返回指定表达式的指定值
LOG(浮点表达式) 返回指定表达式的自然对数
LOG10(浮点表达式) 返回以表达式以10为底的指定值
SQRT(浮点表达式) 返回指定表达式的平方根
近似值函数
CEILING(数字表达式) 返回大于或等于表达式的最小整数
FLOOR(数字表达式) 返回小于等于表达式的最大整数
ROUND(数字表达式)
5.4
declare@test_var float,@test_var2float
set@test_var=76.2356
set@test_var2=ROUND(@test_var,2)
print@test_var2
输出:76.24
符号函数
ABS(数字表达式)
SIGN(数字表达式)
RAND()随机函数
PI()圆周率函数
declare@test_var float,@test_var2float
set@test_var=-76.2356
set@test_var2=ABS(@test_var)
print@test_var2
输出为:76.2356
declare @test_varfloat,@test_var2float
set@test_var=-76.2356
set@test_var2=SIGN(@test_var)
if@test_var2=1
print '当前为正值'
else
print '当前为负值'
输出为:当前为负值
5.5
declare@test_var float,@test_var2float
set@test_var=RAND()
print@test_var
输出为:任意一个随机数
declare@test_var float,@test_var2float
set@test_var=PI()
print@test_var
输出为:3.14159
5.6 二进制函数
declare@test_string1 char(60)
set@test_string1='a'
select 'H的ASSCII码是:',ASCII(@test_string1)
输出为:H的ASSCII码是: 97
declare@test_string1 char(60)
set@test_string1='a'
select 'ASSCII码97转成字符是:',CHAR(97)
输出为:ASSCII码97转成字符是: a
所有的字符串转换成大写:
declare@test_string1 char(60),@test_string2 varchar(60)
set@test_string1='Hello,world!'
set@test_string2=UPPER(@test_string1)
print@test_string2
输出为:HELLO,WORLD!
大写转换为小写:
declare@test_string1 char(60),@test_string2 varchar(60)
set@test_string1='HELLO,WORLD!'
set@test_string2=LOWER(@test_string1)
print@test_string2
输出为:hello,world!
5.7 数字转换成字符:str()
declare@test_string1 int,@test_string2varchar(60)
set@test_string1=1000.23223232323
set@test_string2='HELLO,WORLD!'
print@test_string2+str(@test_string1,20,2)/*参数2:转换后字符的总长度;参数3:转换后保留的小数位数*/
输出为:HELLO,WORLD! 1000.00
5.8 测试字符串长度LEN()
declare@test_string1 int,@test_string2varchar(60)
set@test_string2='HELLO,WORLD!'
set@test_string1=LEN(@test_string2)
select '字符串Hello,Wrld!长度为:',@test_string1
输出为:字符串Hello,Wrld!长度为: 12
去掉首部空格:
declare@test_string1 int,@test_string2varchar(60)
set@test_string2=' Hello,World!'
set@test_string1=LEN(ltrim(@test_string2))
select '字符串Hello,Wrld!长度为:',@test_string1
输出为:字符串Hello,Wrld!长度为: 12
去掉尾部空格:
declare@test_string1 int,@test_string2varchar(60)
set@test_string2='Hello,World! '
set@test_string1=LEN(rtrim(@test_string2))
select '字符串Hello,Wrld!长度为:',@test_string1
输出为:字符串Hello,Wrld!长度为: 12
5.9 截取左边的字符串:
declare@test_string1 varchar(60),@test_string2 varchar(60)
set@test_string1='Hello,World!'
set@test_string2=LEFT(@test_string1,5)
select '截取字符串为:',@test_string2
输出为:截取字符串为: Hello
截取右边的字符串:
declare@test_string1 varchar(60),@test_string2 varchar(60)
set@test_string1='Hello,World!'
set@test_string2=right(@test_string1,8)
select '截取字符串为:',@test_string2
输出为:截取字符串为: o,World!
5.10 截取字符串:
declare@test_string1 varchar(60),@test_string2 varchar(60)
set@test_string1='Hello,World!'
print SUBSTRING(@test_string1,2,6)/*参数2:从哪一个字符开始截取;参数3:截取几个字符*/
输出:ello,W
将指定字符重复多少次:
declare@test_string1 varchar(60)
set@test_string1='Hello,World!'
print REPLICATE(@test_string1,3)
输出:Hello,World!Hello,World!Hello,World!
5.11 将制定字符串倒过来:
declare@test_string1 varchar(60)
set@test_string1='Hello,World!'
print REVERSE(@test_string1)
输出:!dlroW,olleH
替换指定字符串:
declare@test_string1 varchar(60)
set@test_string1='Hello,World!'
print REPLACE(@test_string1,'l','a')/*将所有的l替换成a*/
输出:Heaao,Worad!
5.12 空格
declare@test_string1 varchar(60)
set@test_string1='Hello,World!'
print@test_string1+space(10)+'空格后的内容'/*space(10)参数:空格数量*/
输出:Hello,World! 空格后的内容
替换指定位置的字符串:
declare@test_string1 varchar(60)
set@test_string1='Hello,World!'
print stuff(@test_string1,2,3,'这是替换的内容') /*参数2:指定从哪个字符开始;参数3:截取几个字符*/
输出:H这是替换的内容o,World!
5.13数据类型转换cast
declare@test_string1 int,@test_string2varchar(30)
set@test_string1=3000
print cast(@test_string1as varchar(30))
5.14
declare@test_string1 int,@test_string2varchar(30)
set@test_string1=3000
print 'hello'+convert(varchar(30),@test_string1)/*参数1:要转换的数据类型;参数2:要转换的变量;*/
输出:hello3000
5.15 日期时间函数
declare@test_string1 varchar(60)
set@test_string1=GETDATE()
print@test_string1
输出:04 26 2017 10:45PM
获取当前年份:
declare@test_string1 varchar(60)
set@test_string1=year(GETDATE())
print@test_string1
输出:2017
获取当前小时:(返回的是字符,不是int)
declare@test_string1 varchar(60)
set@test_string1=DATENAME(HOUR,GETDATE())
print@test_string1
输出22
5.17 增加日期
declare@test_string1 datetime
set@test_string1=DATEADD(DAY,10,GETDATE())/*日期加10天,基于当前的日期*/
print cast(@test_string1as varchar(60))
5.18 利用sql创建函数
DATEDIFF(datepart,startpart,endpart)间隔日期
利用sql创建函数:
create function 函数名(变量类型) return 变量类型 as begin 命令和程序块 end
5.19 创建函数、方法
/*创建函数、方法*/
create function test_functionA(@test_varint) returns int
as
begin
declare @sumint
set @sum=@test_var*8
return @sum
end
/*调用函数*/
print dbo.test_functionA(5)
输出:40
5.21 调用函数循环语句
declare@test_var int
set@test_var=0
while@test_var<=4
begin
print dbo.test_functionA(@test_var)
set@test_var=@test_var+1
end
输出:0
8
16
24
32
5.22 修改函数
alter function test_functionA(@test_varint) returns int
as
begin
declare @sumint
set @sum=@test_var*20
return @sum
end
/*调用函数*/
print dbo.test_functionA(10)
输出:200
六
6.1 常用系统存储过程
sp_attact_db 附加数据库
sp_detach_db 分离数据库
sp_rename给对象改名
sp_help显示数据库相关数据
sp_changedbowner改变数据库所有者
sp_password改密码
6.2
exec sp_detach_db'newlts'/*分离数据库*/
6.3
exec sp_attach_db@dbname='newlts',@filename1='D:\Program Files\Microsoft SQLServer\MSSQL12.MSSQLSERVER\MSSQL\DATA\newlts.mdf'/*附加数据库*/
6.4
exec sp_renamedbnewlts,newltsA/*改变数据库名称*/
exec sp_rename'网站职员表','新网站职员表'/*改变表名称*/
6.6
随时修改存储过程;
控制对用户的访问权限;
提高sql执行效率;
减轻网络负担(本地发命令到服务器执行存储过程);
6.7
/*创建存储过程*/
create proc newProc
as
begin
print 'hello,world'
end
/*调用存储过程*/
execnewProc
6.9 对存储过程使用普通参数
/*创建存储过程*/
create proc newproc2
/*调用时要传递进来的两个参数*/
@testString1varchar(60),
@testString2varchar(60)
as
begin
print '第一个参数为:'+@testString1
print '第二个参数为:'+@testString2
end
/*调用存储过程*/
execnewproc2'大家好','我是张奎勋'
输出:
第一个参数为:大家好
第二个参数为:我是张奎勋
6.10 对存储过程使用输出参数
/*创建存储过程,定义普通参数A和普通参数B,并定义输出参数*/
create proc newProc3
@testVarAint,
@testVarBint,
@testSumint Output
as
begin
set @testSum=@testVarA+@testVarB
end
6.11
/*调用上面已创建的存储过程:*/
declare@testA int
set@testA=60
print@testA
executenewProc3600,300,@testA Output
print@testA
输出:
60
900
6.12
/*创建存储过程,查询数据*/
create proc newProcA
@testNameAvarchar(30)
as
begin
select * from 第二网站职员表 where 姓名=@testNameA
end
/*执行上面的存储过程*/
executenewProcA'网站职员表之小孙'
6.14 修改存储过程
选中存储过程表,右键,修改
ALTER proc [dbo].[newProcA]
@testMoneymoney output
as
begin
select@testMoney=Max(工资) from 第二网站职员表
end
/*调用存储过程,申明变量,执行存储过程,输出变量*/
declare@MaxMoney money
executenewProcA@MaxMoney output
select@MaxMoney as 工资最高的员工工资
6.16
/*重命名存储过程*/
sp_rename newProc,reNameProc
/*删除存储过程*/
drop Proc reNewProc
6.17 创建存储过程的实例
create proc ProcSimple1
@testVarint,
@testVar1int
as
begin
if@testVar>@testVar1
print cast(@testVar as varchar(10))+'大于'+cast(@testVar1 as varchar(10))
else if @testVar<@testVar1
print cast(@testVar as varchar(10))+'小于'+cast(@testVar1 as varchar(10))
else
print cast(@testVar as varchar(10))+'等于'+cast(@testVar1 as varchar(10))
end
/*调用存储过程*/
execProcSimple1100,300
6.19 创建用户名和密码的存储过程实例
create proc testUser
@testPassWordvarchar(60),
@testUservarchar(60)
as
begin
declare@testMsg varchar(100)
if@testUser='user1'
begin
if@testPassWord='123'
set @testMsg='欢迎user1进入我的世界'
else
set @testMsg='对不起,密码错误'
end
else if @testUser='user2'
begin
if@testPassWord='abc'
set @testMsg='欢迎user2进入我的世界'
else
set @testMsg='对不起,密码不正确'
end
else
set @testMsg='请输入正确的用户名和密码!'
print@testMsg
end
/*调用上面的执行过程*/
exectestUser123,'user1'
七
7.2
/*创建游标testCursorA,把testCursorA看成存放游标的容器,查询网站职员表的游标记录放入testCursorA,约束为制度游标*/
declare testCursorA cursor for
select *from AddressInfos
for read only/*当前为只读游标;去掉for read only,是标准游标;for update,是更新游标*/
/*打开游标*/
open testCursorA
/*使用游标,从testCursorA依次拿出放在testCursorA里面的游标*/
fetch nextfrom testCursorA
7.3 游标定义格式
declare 游标名称cursor
[Local|Global]//游标的作用范围:局部|全局
[Forward_only|Scroll]//只进游标(从前往后走)|任意滚动
[Stattic|Keyset|Dynamic|Fast_froward]
[Reae Only|Scroll_Locks|Optimistic]
[Type_warning]
for
...Sql语句...
for [read only|update]
7.4
/*创建任意滚动游标*/
declare testCursorA cursor scroll for
select *from 网站职员表
/*调用查询下一个游标*/
fetch nextfrom testCursorA
/*调用查询第一个游标*/
fetch firstfrom testCursorA
/*调用查询最后一个游标*/
fetch lastfrom testCursorA
7.5
/*创建可滚动游标*/
declare testCursorB cursorscroll for
select *from AddressInfos
/*调用游标,从前往后获取游标记录*/
fetch priorfrom testCursorB
7.07
/*创建游标*/
declaretestCursorA cursor scrollfor
select *from dbo.第二网站职员表
/*打开游标*/
opentestCursorA
/*执行*/
fetch absolutefromtestCursorA
/*relative把游标向前或者向后移动一个位置;relative -1把游标向前移动一个位置;relative 1把游标向后移动一个位置*/
fetch relative-1 from testCursorA
7.08
declare@testvar1 int,@testVar2varchar(100),@testVar3int,@testVar4 varchar(100),@testVar5money
fetch relative-2 from testCursorAinto@testVar1,@testVar2,@testVar3,@testVar4,@testVar5
7.09
/*关闭游标*/
closetestCursorA
/*释放游标*/
deallocatetestCursorA
八
8.1
触发器:表的操作会触发多个触发器
调用存储过程;调用外部过程;跟踪数据库内数据的变化,判断数据是否符合数据库的要求,是数据库的修改和更新更安全;数据条件的约束,约束数据的完整性;并发性高;
8.2
事后触发器:应用到表上;替代触发器:应用到表上和视图上;
8.3 创建事后触发器
/*create trigger testTriggerA创建触发器,名字为:testTriggerA
on AddressInfos这个触发器为AddressInfos创建
for Insert as针对这个触发器做Insert操作时,会调用触发器
执行插入操作会执行触发器代码块里面的操作
begin
print 'testTriggerA被调用'
end
*/
create trigger testTriggerAon AddressInfosforInsertas
begin
print 'testTriggerA被调用'
end
/*插入操作,会调用触发器,执行
begin
print 'testTriggerA被调用'
end
*/
insert into AddressInfos(AI_Id)values('0816e948-95da-4a30-a169-ca577c7d85ec')
输出:testTriggerA被调用
注意:插入几条记录,触发器就调用几次
8.5
在一个表中创建多个触发器,被调用
create trigger testTriggerBon AddressInfosforinsertas
begin
print '第二个触发器被调用'
end
create trigger testTriggerCon AddressInfosforinsertas
begin
print '第三个触发器被调用'
end
执行触发器,会调用创建出的多个触发器:
8.6
/*创建更新触发器*/
create trigger testTriggerDon 网站职员表forinsert as
begin
print '更新触发器被调用!'
end
/*调用更新触发器*/
update 网站职员表set 工资=3800where 姓名='小伟'
8.7
/*创建删除触发器*/
create triggertestDeleteTriggerAon 网站职员表fordeleteas
begin
print 'testDeleteTriggerA触发器被调用'
end
/*调用删除触发器*/
delete from 网站职员表where 姓名='小吴'
8.8 触发器的调用顺序
/*先创建6个触发器。然后做插入操作,执行触发器*/
insert into 网站职员表(职员编号,姓名,年龄,工资,毕业院校)values(101,'小许',27,600,'哈工大')
8.9 执行顺序
sp_settriggerorder:触发器的执行顺序;
sp_settriggerorder:只能指定第一个和最后一个触发器的顺序,不能指定中间;
/*参数1:触发器的名称是,testTriggerF;
参数2:触发器的显示位置;
参数3:执行的操作;
触发器的名称是:testTriggerF,执行insert操作时,testTriggerF是第一个被调用的触发器*/
sp_settriggerorder @triggername='testTriggerF',@order='first',@stmttype='insert'
/*sp_settriggerorder:触发器的执行顺序;
触发器的名称是:testTriggerA,执行insert操作时,testTriggerA是第一个被调用的触发器*/
sp_settriggerorder
@triggername='testTriggerA',@order='last',@stmttype='insert'
执行
8.10
@order='none':取消执行顺序
/*执行insert操作时,取消testTriggerF第一次显示的资格*/
sp_settriggerorder @triggername='testTriggerF',@order='none',@stmttype='insert'
/*执行insert操作时,取消testTriggerF最后一次显示的资格*/
sp_settriggerorder @triggername='testTriggerA',@order='none',@stmttype='insert'
执行
8.12
事件后触发器:事件必须先完成
替代触发器:执行触发器中的代码
/*创建替代触发器:用当前的触发器代码替代对表的删除操作*/
create TriggertestInsteadTriggerAon 网站职员表insteadofdeleteas
begin
print '替代触发器调用'
end
当前表
/*删除网站职员表中的职员编号未1000的记录,执行的触发器的代码*/
delete from 网站职员表where 职员编号=1000
再次查询当前表,内容依然没有改变
8.14 有插入功能的触发器
/*在“网站职员表”中创建一个触发器,执行的内容是插入“网站经营项目表”的一条记录*/
create trigger triggerTestInsertA on新网站职员表 for insert as
begin
insert into 网站经营项目表(项目编号,项目名称,负责人,合伙单位) values (1,'发明java','akui','bat')
end
查询被调用的表:
8.18 更新时,使用触发器改变其他表某一列的内容
修改触发器:
/*更新网站职员表时,将“网站经营项目表”中的项目名称都改成“软件开发”*/
create trigger [dbo].[testTriggerC] on[dbo].[网站职员表] forupdate as
begin
update 网站经营项目表set 项目名称='软件开发'
end
/*查询 网站经营项目表*/
/*更新 网站职员表*/
/*查询 网站职员表*/
/*查询 网站经营项目表*/
8.19 删除表中记录时调用触发器
/*创建删除触发器*/
create triggertestTriggerDeleteA on 网站职员表 for Deleteas
begin
delete from 网站经营项目表
end
/*修改网站职员表*/
/*查询网站经营项目表,全部被删除*/
8.21 通过sql语句修改和删除触发器
/*在网站职员表插入时,触发触发器*/
alter triggertriggerTestInsertA on 网站职员表 for Insertas
begin
print 'triggerTestInsertA 触发器修改后被调用!'
end
/*在网站职员表插入一条记录*/
insert into 网站职员表(职员表号,年龄,工资,毕业院校) values (1,22,3000,'哈工大')
/*查询网站职员表*/
/*删除触发器*/
drop triggertriggerTestInsertA
8.22 存储过程:查看触发器的信息;查看触发器的代码;
/*执行查看testTriggerDeleteA的信息*/
exec sp_helptestTriggerA
/*执行查看testTriggerDeleteA中的代码*/
exec sp_helptexttestTriggerA
九 数据库的安全
9.9
/*执行修改账号和密码的存储过程
参数1:旧密码
参数2:新密码
参数3:用户名*/
execute sp_password'123456','abc','newAdmin3'
9.10
/*更改默认数据库
参数1:被替换的账号名称
参数2:需要打开的默认数据名称*/
execute sp_defaultdb'newAmin3','master'
9.11
/*更改默认语言
参数1:账号名称
参数2:被修改成什么语言*/
execute sp_defaultlanguage'newAmin3','simplified Chinese'
/*删除登录账号
参数1:账号名称*/
execute sp_droplogin'newAmin3'
9.13
/*
数据库用户的创建
参数1:登录账号
参数2:当前数据库所添加的用户名*/
exec sp_grantdbaccess'newAdmin8','newUser1'
9.14
/*
查看数据库的信息
参数1:登录账号*/
exec sp_helpuser'guest'
/*
删除数据库用户
参数1:登录账号*/
exec sp_revokedbaccess'guest'
9.15
角色和权限
服务器角色:
bulkadmin 大容量的插入操作
dbcreater 创建和更改数据库
diskadmin 管理磁盘文件
processadmin 管理运行在sql中的进程
public 提供数据库中用户的默认权限
securityadmin 管理服务器的登录
serveradmin 管理配置服务器范围的设置
setupadmin 管理扩展的存储过程
sysadmin 执行sqlserver中的任何操作
9.16
/*
给当前登录名添加管理角色
参数1:登录账号
参数2:分配的角色*/
exec sp_addsrvrolemember'newAdmin8','sysadmin'
9.17
/*
给当前登录名删除管理角色
参数1:登录账号
参数2:需要删除的角色*/
exec sp_dropsrvrolemember'newAdmin8','sysadmin'
9.19 数据库角色
/*
创建数据库角色
参数1:数据库角色名称
参数2:数据库角色的所有者*/
exec sp_addrole'test_databaseA','dbo'
/*
删除数据库角色
参数1:数据库角色名称*/
exec sp_droprole'test_databaseA'
9.20 创建好的数据库角色添加给数据库用户
/*先创建数据库角色*/
exec sp_addrole'test_datebase','dbo'
/*然后将数据角色转存到newuserA用户上*/
exec sp_addrolemember'test_datebase','newuserA'
/*删除newuserA用户上面的数据库角色*/
exec sp_droprolemember'test_datebase','newuserA'
2.22
/*赋予权利;将指定的某一权限,赋予某一服务器角色或者用户
grant:赋予权限;
对网站职员表的更新权限,将权限赋予服务器角色(test_datebase)。
with grant option: 该权限授予者可以向其他用户授予访问数据库对象的权限;
如果不需要将权限授予其他角色,不需要写(with grant option)
*/
grant update on 网站职员表 to test_database
2.24
/*剥夺权利;
grant:剥夺权利;
剥夺对“网站职员表”更新的权利,以及把权利授予别人的权利
*/
revoke update on 网站职员表 from test_databasecascade
9.25
/*剥夺权利;
拒绝他人赋予我的权限,以及自己的赋予的权限
*/
deny update on 网站职员表 to test_databasecascade
9.26 备份数据库
/*备份数据库
备份数据库"newlts2"到"d:\backA\databackA"目录下,
后面都是:备份的类型是完整数据库备份
*/
backup database newlts2to disk=N'd:\backA\databackA'WITHNOFORMAT,NOINIT,NAME=N'multidatabase-完整数据库备份',SKIP,NOREWIND,NOUNLOAD,STATS=10
9.29
/*差异备份数据库
备份数据库"newlts2"到"d:\backA\databackA"目录下,
后面都是:备份的类型是差异数据库备份
*/
backup database newlts2to disk=N'd:\backA\databackA'WITHDIFFERENTIAL,NOFORMAT,NOINIT,NAME=N'multidatabase-差异数据库备份',SKIP,NOREWIND,NOUNLOAD,STATS=10
9.30
/*事务日志备份*/
Backup database newlts2 to disk=N'd:\backA\logback' with noformat,noinit,name=N'multidatabase-事务日志备份',skip,norewind,nounload,stats=10