数据库实践总复习

restore database school from disk ='c:school.bak'
restore database xjl from disk='c:冰人集团.bak'
use xjl
restore database school from disk='c:school.bak'
use school
select @@language   --查询当前语言信息
select @@version    --查看当前版本
create database yaozefeng --创建数据库
on primary     --ON定义数据文件
(
name='yaozefeng_data',
filename='d:\yaozefeng_data.mdf',
size=3,
maxsize=100mb,
filegrowth=20%     --注意这里没逗号
),
(
name='yaozefeng_date2',
filename='d:\yaozefeng_data.ndf',
size=20500kb,
maxsize=unlimited,
filegrowth=10mb
),
(
name='yaozefeng_data3',
filename='d:\yaozefeng_data.ndf',
size=20mb,
maxsize=unlimited,
filegrowth=10mb
)
log on
(
name='yaozefeng_log',
filename='c:\yaozefeng_log.ldf',
size=2500kb,                   --表示文件大小不可以使用小数
maxsize=unlimited,
filegrowth=10mb
)
sp_helpdb yaozefeng       --查看数据库的属性
alter database yaozefeng   --添加数据文件
add file
(
name='yao',
filename='c:\yao.ndf',
size=10mb,
maxsize=100mb,
filegrowth=10%
)
sp_helpdb yaozefeng

alter database yaozefeng   --添加日志文件
add log file
(
name='yaozefeng_log2',
filename='c:\yaozefeng_log2',
size=10mb,
maxsize=100mb,
filegrowth=10%
)
alter database yaozefeng   --添加文件组
add filegroup yao
alter database ze     --将新建的数据文件加入文件组
add file
(
name='abc',
filename='c:\abc.ndf',
size=10mb,
maxsize=100mb,
filegrowth=10%
) to filegrowth feng    --使用to filegroup 关键字将新建文件加入文件组
alter database yaozefeng
modify file
(
name='yaozefeng', --注意:在修改文件时,逻辑文件名需要写在括号中,以确定修改的对象
size=11mb
)
alter database yao  --移除数据/日志文件
remove file abc
alter database yaozefeng
remove filegroup yaozefeng  --移除文件组
--注意:只能移除空文件组
--数据库的备份和还原
--在sql server中的备份方式:
--1.完全备份:备份数据库中所有的内容
--2.差异备份:备份数据库中上一次完全备份之后新增所有内容
--3.事务日志备份:只备份数据库中的日志文件(不可靠)
--4.文件和文件组
backup database yaozefeng to disk='c:\1.bak'  --默认为完全备份
backup database yaozefeng to disk='c:\1.bak' with differential --differential关键字表示差异备份
                                                               --with关键字表示带参数进行备份
--查看备份文件的内容
restore headeronly from disk='e:\1.bak'
/*
对于查看出来的内容,注意一下字段
          backuptype   1表示完全备份   5表示差异备份
          position     表示备份文件的位置
*/

--还原数据库
--步骤一:
restore database xjl from disk='e:\1.bak'
with file=1,norecovery             --file关键字表示还原备份文件中的哪个备份动作
                                   --norecovery关键字表示,备份未完成,数据库暂不可使用
--步骤二:
restore database xjl from disk='e:\1.bak'
with file=2,recovery                 --recovery表示数据库可以在还原后正常运行,其为默认选项

--数据表管理(增、删、改、查)
--表(table):是数据库中保存数据的最基本单位
--数据类型:数据保存在计算机内存中的形式
--sql server中常见的数据类型
/*1.数值类
  整数型:   int(最常用,4byte长度)   bigint   smallint   tinyint
  浮点型:   float
  货币型:   money
  位型:     bit  所保存的数据只有1或0   类似于布尔型
2.字符类
   char(n)  固定长度的字符型,n代表当前字段的字节数
   varchar(n)  可变长度的字符型,n代表当前字段的最大字节数  --只有VARCHAR,CHAR后面能加字节数
   text   文本型,其长度无限制
   支持unicode字符集的字符类型
   nchar(n)   nvarchar(n)   ntext
3.日期类
  datetime        smalldatetime
--注意:需要用户自定义数据类型长度的有  char(n)  varchar(n)   nchar(n)  nvarchar(n)
--注意:在插入数据时,只有字符型和日期型需要使用单引号括起数据
*/
use yaozefeng  --跳转数据库
create table feng   --新建数据表
(
序号 int not null,
学号 char(4) not null,
姓名 varchar(30) not null,
性别 char(2) not null,

--列-名称  列-数据类型  列1数据条件
sp_help feng --查看数据表
 
--查看表中的所有记录
select * from 表名
select * from student1

--向数据表中插入数据(记录)
insert into 表名(字段1名称,字段2名称,...,字段n名称) values(字段1值,字段2值,...,字段n值)

insert into student1 values(1,'0001','张三','男',1.80,'[email protected]','八一大道','13588888888','未婚',null)
--约束 constraints
--用于控制数据表中数据的完整性
--七大约束
--标识列:   identity
/*语法: identity(标识种子,标识增量)
设置为标识列的字段,由系统自动填充,不允许用户编辑
标识列只允许设置在整型字段中
--非空约束   not null
用于控制字段中是否允许输入空值
--主关键字约束(主键约束)   primary key
主键字段的查询效率最高,要求字段值非空  唯一
一张数据表中只能有一个主键字段
--唯一约束   unique
要求字段中的内容不能重复
唯一约束中允许存在空值,但不能重复
--默认值约束   default
语法:  default(默认值)
用于设置字段内容的默认值
--检查约束  check
语法:   check(检查条件)
用于设置字段内容的检查条件
--外关键字约束   foreign key references
语法:    在从表中设置外键关系  foreign key references 主表名(主字段名)
用于设置不同数据表之间的关系
主表(主字段)     从表(从字段)
外键约束的设置要求:
1.要求主字段与从字段的数据类型和长度必须完全一致
2.要求主字段必须为主键字段或唯一字段

--示例:创建数据表(应用约束)
create table student
(
id int identity(1,1),
姓名 varchar(20) not null,
学号 char(4) primary key,
性别 varchar(4) check(性别='男' or 性别='女' or 性别='保密'),
家庭住址 varchar(50) default('江西省'),
email varchar(50) unique,
出生日期 datetime check(出生日期<getdate()),
个性签名 text default('吓死人!')
)
--查看数据表结构(注意看约束)
sp_help student
sp_help 成绩
--示例:实验外键约束
--创建数据表成绩表
create table 成绩
(
id int identity(1,1),
学号 char(4) foreign key references student(学号),
成绩 int check(成绩<=100 and 成绩>=0)
)
--检验外键关系效果
--先在主表中插入一条记录
insert into student values('jack','0001','男','南昌市','[email protected]','1990-1-1','你好!')
select * from student
select * from 成绩
--效果1:从表中插入相同学号记录时,插入成功
insert into 成绩 values('0001',90)
--效果2:如果从表插入的记录学号在主表中不存在,则违反了外键约束,报错,执行不成功
insert into 成绩 values('0002',85)
 
--------------------------------------------------------------------------
--数据表记录的管理(增、删、改、查)
--添加记录
insert into 表名 values(字段1值,字段2值,...字段n值)
--修改记录
语法: 
update 表名 set 字段名=字段新值 where 筛选条件
    --注意:如果不加where筛选,则表示修改所有记录
update 成绩 set 成绩=95
update 成绩 set 成绩=80 where 学号='0001'
update 成绩 set 成绩=成绩+10  where 学号='0001'
update student set 家庭住址='江西省',出生日期='2000-1-1' where 姓名='jack'
--删除记录   (慎用!!!!!!)
语法:
delete from 表名 where 筛选条件
delete from 成绩   --如果不加入where筛选,则表示清空表中所有记录
delete from student where id=1
 
--数据表的查询
--基本查询
select   需要查询的字段名称
from     表名
where    查询的筛选条件
order by 查询结果的排序条件      asc 升序(默认)   /   desc  降序
use br
--查询所有职工的基本信息
select * from 职工    --*表示查看所有字段
--查询所有职工的姓名,性别,籍贯
select 姓名,性别,籍贯 from 职工
--查询所有男职工个人信息
select 性别
from 职工
where 性别='男'
--查询所有职工8折后的基本工资
select 职工号,基本工资*0.8    --select 后可以跟字段,也可以跟表达式
from 工资

--别名
select 职工号,基本工资*0.8 as 折后工资 from 工资
select 职工号,基本工资*0.8 折后工资 from 工资
select 职工号,折后工资=基本工资*0.8 from 工资  --推荐使用

--查询所有职工的实际工资
select * from 工资
select 职工号,实际工资=基本工资+津贴+补助+奖金-扣除-税收
from 工资
--查询实际工资在3500元以上的职工号,实际工资
select 职工号,实际工资=基本工资+津贴+补助+奖金-扣除-税收
from 工资
where 基本工资+津贴+补助+奖金-扣除-税收>=3500
--查询实际工资在3500元以上的职工号,实际工资,按照实际工资升序排列
select 职工号,实际工资=基本工资+津贴+补助+奖金-扣除-税收
from 工资
where 基本工资+津贴+补助+奖金-扣除-税收>=3500
order by 实际工资 asc
   --注意:where后不可以使用别名,但order by 可以使用别名

--查询所有籍贯为北京市的职工姓名,籍贯
--精确查找
select 姓名,籍贯
from 职工
where 籍贯='北京市'
update 职工 set 籍贯='北京' where 姓名='孙梅'   --何意思?
/*
sql server中通配符
%  表示任意个任意字符
_  表示一个任意字符
*/
--模糊查询
select 姓名,籍贯
from 职工
where 籍贯 like '%北京%'   --注意:=表示精确查找  like表示带通配符的模糊查找

--查询所有北京市的男职工
select 姓名,籍贯,性别
from 职工
where 籍贯 like '%北京%' and 性别='男'

--注意:在一个查询中只能存在一个where,多个查询条件使用逻辑运算符连接
--sql server中的逻辑运算符
and    并且(与)
or     或者(或)
not    非
--查询所有非北京籍的职工姓名,籍贯
select 姓名,籍贯
from 职工
where 籍贯 not like '%北京%'
    --在以上查询中,空值记录未参与筛选判断
--isnull函数
作用:将字段中为空的值临时替换成其他值
语法:isnull(字段名称,临时替换值)
select 姓名,isnull(籍贯,'未填写')
from 职工
where isnull(籍贯,'黑户') not like '%北京%'

--查询所有职工的职工姓名,年龄
select 姓名,年龄=year(getdate())-year(出生日期)
from 职工
    --注意:sql server中时间函数
          /*
  getdate()  取得当前系统时间
  year()      取得年份
  month()     月份
  day()       取得日期
*/

--查询所有籍贯为河北省,天津市,山东省的职工信息(使用精确查询)
select * from 职工
where 籍贯='河北省' or 籍贯='天津市' or 籍贯='山东省'
select * from 职工
where 籍贯 in('河北省','天津市','山东省')  --注意 in关键字为在范围中任取其一

--查询所有年龄在30-35岁之间的职工姓名,年龄
select 姓名,年龄=year(getdate())-year(出生日期)
from 职工
where year(getdate())-year(出生日期)>=30 and year(getdate())-year(出生日期)<=35
select 姓名,年龄=year(getdate())-year(出生日期)
from 职工
where  year(getdate())-year(出生日期) between 30 and 35
   --注意:between..and..关键字等同于大于等于..小于等于

--------------------
--复习
第一题
1.针对冰人集团的职工表,做如下操作:

<1.3.1>1-5号职工,基本工资增加200
update 工资 set 基本工资=基本工资+200 where 职工号 between 0001 and 0005
<1.3.5>有“扣除”项的职工,没有奖金
select * from 工资
update 工资 set 奖金='0' where 扣除>0
select * from 职工
sp_help 职工
 

4:查询不是信息系和计算机系学生的姓名和性别
select  * from 学生
select 姓名,性别
from 学生
where 所在系<>'信息系' and 所在系<>'计算机系'
select 姓名,性别
from 学生
where not(所在系='信息系' or 所在系='计算机系')

 
7:查询名字中第2个字为”敏”字的学生姓名和学号
select * from where 姓名 like '_敏%'
 

8:查询全体学生情况,结果按所在系升序排列,同一系中的学生按年龄降序
select *
from 学生
order by 所在系 asc,年龄 desc

--基本查询(续)
--求职工表中的前五条记录
select * from 职工 where id<=5
--列出所有职工中年龄最大的5名职工信息
select top 5 *           --注意:关键字top N的使用
from 职工
where 出生日期 is not null
order by 出生日期 asc
select top 50 percent 基本工资
from 工资
order by 基本工资 desc
--查询公司职工的基本工资等级
select * from 工资
select distinct 基本工资 from 工资
  --注意:关键字distinct作用为去除重复项

----------------------------------------------------------------------------
--分组查询
--根据所需求的字段进行分组,在分组完成后,针对于每一个小组进行统计
--语法:
select     分组字段/聚合函数
from       表
where      分组前的筛选条件
group by   分组字段
having     分组后的筛选条件
order by   排序字段
--函数:是完成某种功能的代码集合
--在sql server中常用的统计函数(聚合函数)
  
--统计记录数量
count(字段名称)
--查询公司的人数
select count(*) from 职工
select count(email) from 职工    --注意:count(字段名称)表示统计该字段非空记录数量
select * from 职工
--求和、求平均值、最大值、最小值
  sum()   avg()    max()    min()
--查询公司职工基本工资的总和
select sum(基本工资) from 工资
--查询公司年龄最大的职工的年龄
select 最大年龄=max(year(getdate())-year(出生日期)) from 职工
select top 1 年龄=year(getdate())-year(出生日期) from 职工 order by 年龄 desc
 

--查询公司男女职工的人数
select 性别,count(*)
from 职工
group by 性别
--查询公司各个部门的人数
select 所在部门,count(*)
from 职工
group by 所在部门
--查询部门人数在3人以上的部门号及人数,按照人数降序排列
select 所在部门,人数=count(*)
from 职工
group by 所在部门
having count(*)>3
order by 人数 desc
--统计各个部门的男女职工人数
select 性别,所在部门,count(*)
from 职工
group by 所在部门,性别
--查询各个部门中男职工数量在2人以上的部门号
select 性别,所在部门,count(*)
from 职工
group by 所在部门,性别
having count(*)>2 and 性别='男'
select 性别,所在部门,count(*)
from 职工
where 性别='男'
group by 所在部门,性别
having count(*)>2
--注意:以上两种查询均可成立,但注意,后一种查询效率更高
--注意分组原则,能不分组完成的查询就不分组,能在分组前进行筛选就不选择分组后筛选
 

select * from 职工
 
-- 统计出各地区的员工数,将结果创建到新表
select 籍贯,数量=count(*) into t1
from 职工
group by 籍贯
select * from t1
select * from t2
sp_help t2
--将查询结果插入一张新表中
--语法:
select 字段名 into 新表名
from 表
..

--将职工表的表结构复制到一张新表中
select * into t2
from 职工
where 1=2
--将查询结果插入到一张已经存在的表中
--语法:
insert into 旧表名 查询语句
insert into t2
select * from 职工 where id=1

--总结:sql查询语句中关键字的执行顺序
--from > where > group by > select > having >order by
 
--多表查询
--需要查询的字段来自于两张以上的数据表
--查询职工的职工号,姓名,基本工资
select * from 职工
select * from 工资
select * from 部门
select 职工.职工号,姓名,基本工资
from 职工,工资
where 职工.职工号=工资.职工号
select 职工.职工号,职工.姓名,工资.基本工资
from 职工,工资
where 职工.职工号=工资.职工号
--注意:以上两种查询均可,在多表查询中,如果字段名在多张表中唯一,即可将"表名.字段名"简写为"字段名"

--查询所有职工姓名,所在部门名称
select 职工.姓名,部门.部门名称
from 职工,部门
where 职工.所在部门=部门.部门号
--在多表查询中,where后为多张表的连接条件
 
--查询基本工资在2000元以上的职工号,姓名,所在部门名称
select 职工.职工号,职工.姓名,部门.部门名称,工资.基本工资
from 职工,工资,部门
where 职工.职工号=工资.职工号 and 职工.所在部门=部门.部门号 and 工资.基本工资>2000
-- 列出女工数超过1人的部门名称和女工数
select 部门.部门名称,count(*)
from 职工,部门
where 性别='女' and 职工.所在部门=部门.部门号
group by 部门.部门名称
having count(*)>1
 
--子查询(嵌套查询)
--一个查询的筛选条件来自于另一个查询的查询结果
--查询与孙华在同一部门的职工姓名
1.
select 姓名
from 职工
where 所在部门=?
2.
select 所在部门 from 职工 where 姓名='孙华'
3.
select 姓名
from 职工
where 所在部门=(select 所在部门 from 职工 where 姓名='孙华')

--查询人事处职工的基本工资(方法一)
1.
select 基本工资
from 工资
where 职工号 in (?)
2.
select 职工号
from 职工
where 所在部门=?
3.
select 部门号
from 部门
where 部门名称='人事处'
4.
select 基本工资
from 工资
where 职工号 in (select 职工号
from 职工
where 所在部门=(select 部门号
from 部门
where 部门名称='人事处'))

--查询人事处职工的基本工资(方法二)
select 基本工资
from 部门,工资,职工
where 职工.职工号=工资.职工号 and 职工.所在部门=部门.部门号 and 部门.部门名称='人事处'

--查询高于公司平均基本工资的职工号,基本工资
1.
select 职工号,基本工资
from 工资
where 基本工资>?
2.
select avg(基本工资)
from 工资
3.
select 职工号,基本工资
from 工资
where 基本工资>(select avg(基本工资)
from 工资)
--复习
select * from 学生
select * from 课程
select * from 选修课 order by 课程号

针对school数据库,执行以下查询
练习1:使用统计函数
2、查询选修了课程的学生人数
select count(distinct 学号) from 选修课
 
5、求成绩排名前三名的学生号、课程号、成绩。
 select top 3 *
from 选修课
order by 成绩 desc
 
练习2:分组查询
5、 求平均成绩大于86分的课程的课程号及课程平均成绩
select 课程号,平均成绩=avg(成绩)
from 选修课
group by 课程号
having avg(成绩)>86
 
9、 查询各学分等级的课程数目
select 学分,数量=count(*)
from 课程
group by 学分
针对school数据库,执行以下查询
练习:多表联接查询
 
3. 查询选修“数学”课程的学生的平均分
select avg(成绩)
from 选修课,课程
where 选修课.课程号=课程.课程号 and 课程名称='数学'
 
4. 查询学生“李敏勇”,成绩大于80分的课程号、成绩
select 课程号,成绩
from 学生,选修课
where 学生.学号=选修课.学号 and 姓名='李敏勇' and 成绩>80
 
6. 查询没有一门考试科目成绩低于85分的学生的姓名
select 姓名
from 选修课,学生
where 学生.学号=选修课.学号
group by 姓名
having min(成绩)>=85
-----------------------------------------------------------------------------
--T-SQL编程
--变量
--即为保存数据的容器,在sql server中变量分为系统(全局)变量和用户(局部)变量
--全局变量:由系统默认创建,变量名以@@开头,变量内容不可以由用户编辑
print @@version
print @@language
--用户变量:由用户自行创建,变量名以@开头,变量在被创建后其内容可以由用户自定编辑
--示例:
declare @a1 char(5)   --创建(声明)变量
set @a1='tom'      --给变量赋值
print @a1        --调用变量

--函数:完成某种特定功能的代码集合
--时间函数:
getdate()
year()
month()
day()
--聚合函数
count()   --统计记录数量
sum()    --求和
avg()
max()   min()
--转换数据类型函数
str(变量)   --将数值型转换成字符型
convert(目标数据类型,变量)   --将任意数据类型转换成所需要的目标数据类型
--示例:
--方法1
declare @a1 money
set @a1=1000
print rtrim(ltrim(str(@a1)))    --使用str()函数转换数据类型
--方法二:
declare @a1 money
set @a1=1000
print convert(varchar(10),@a1)   --使用convert()函数转换数据类型

--字符型函数
ltrim()   --去除字符左边空格的函数
rtrim()   --去除字符右边空格的函数
len()     --求位数
--科学运算函数
abs()   --返回绝对值
floor() --取整
rand()  --返回一个0--1之间的随机小数

--程序控制流程(共3种)
--1、顺序执行(默认)
--2、条件选择执行
--条件判断
if 判断条件
    结果1      --当判断条件为真时,则执行结果1
else
    结果2      --如果判断条件为假时,则执行结果2
--示例1:举重比赛
declare @志鹏 int
declare @小宇 int
set @志鹏=300
set @小宇=400
if @志鹏>@小宇
    print '胜者是zp'
else
     if @志鹏=@小宇
        print '并列冠军'
     else
        print '胜者是xy'
--示例:模拟用户登录过程
--创建一张用户表
create table users
(
id int identity(1,1),
用户名 varchar(10) primary key,
密码 varchar(10) not null
)
select * from users
--用户注册
insert into users values('abc','abc')
--验证用户登录的核心查询
select count(*) from users where 用户名=用户输入的用户名 and 密码=用户输入的密码
--根据验证结果返回给用户登录成功或失败的提示信息
declare @结果 int
select @结果=count(*) from users where 用户名='abc' and 密码='abc'
if @结果=1
   print '登录成功'
else
   print '登录失败'

--多重条件判断   case...when...then...end
语法:
case
when 条件1 then 结果1      --当满足条件1时,执行结果1
when 条件2 then 结果2
..
..
..
when 条件n then 结果n      --当满足条件n时,执行结果n
else 结果n+1               --当以上条件均不满足时,则执行结果n+1
end                        --结束当前多重条件判断
--示例1:重写"举重比赛"条件判断代码
print
case
when @志鹏>@小宇 then print 'zp'
when @志鹏=@小宇 then print '并列'
else  print 'xy'
end
/*
示例2:查询公司的职工号,基本工资,基本工资水平
高收入水平   2500以上
中等收入水平  2000--2500之间
低收入水平   2000以下
*/
select 职工号,基本工资,基本工资水平=
case
when 基本工资>2500 then '高收入水平'
when 基本工资 between 2000 and 2500 then '中等收入水平'
else '低收入水平'
end
from 工资

--示例3:抽奖程序
--算法:1.通过rand()函数,生成一个1-6之间的随机整数
     --2.根据不同的数字取值,返回不同的中奖信息
--声明两个变量
declare @num int    --用于保存随机整数
declare @message varchar(30)   --用于保存中奖信息
--取得1-6之间的随机整数
set @num=convert(int,floor(rand()*1000000000))%6+1
--根据不同的随机数,设置不同的中奖信息
set @message=
case
when @num=1 then '一等奖,俯卧撑100个'  
when @num=2 then '2等奖,俯卧撑80个'
when @num=3 then '3等奖,俯卧撑50个'
when @num=4 then '4等奖,俯卧撑30个'
when @num=5 then '5等奖,俯卧撑10个'
else '不要灰心,下次再来!'
end
print @message        --给用户返回中奖信息

--循环:重复性完成相同的工作
/*循环原则:当循环条件为真时,则执行循环体的内容,循环体执行完成后,返回检查循环条件,如此往复;
;如果循环条件为假,则跳出循环,继续执行后续语句;*/
--循环三要素:
1.循环的开始条件
2.循环的结束条件
3.开始到结束的递增过程
语法:
while 循环条件
 begin
 循环体     --循环体为重复执行的动作
 end
 

--重复打印"你好!!!"10次
--傻子办法
print '你好!!!'
print '你好!!!'
print '你好!!!'
print '你好!!!'
print '你好!!!'
print '你好!!!'
print '你好!!!'
print '你好!!!'
print '你好!!!'
print '你好!!!'
--利用循环完成
--声明一个变量,用于保存打印次数
declare @计数器 int  
set @计数器=0   --初始化计数器变量
while @计数器<10
 begin
 print '你好!!!'
 set @计数器=@计数器+1
 end

--循环示例:计算1--100的累加和
1+2+3+4+5+。。。+100
--声明两个变量
declare @num int  --用于保存参与运算的数字
declare @result int --用于保存上一次加法运算的结果
--初始化变量
set @num=1    --由1开始
set @result=0  --初始运算结果为0
while @num<=100      --循环条件为:到100结束
 begin
 set @result=@result+@num    --一次加法运算
 set @num=@num+1             --递增运算数
 end
print '1到100的累加和为:'+str(@result)
--复习
4、查询出职工姓名,性别,年龄,部门名称和年龄层次。
其中:
中年:35岁以上
中青年:25岁至35岁
青年:25岁以下

select 姓名,年龄=year(getdate())-year(出生日期),性别,部门名称,年龄层次=
case
when year(getdate())-year(出生日期)>35 then '中年'
when year(getdate())-year(出生日期) between 25 and 35 then '中青年'
when year(getdate())-year(出生日期)<25 then '青年'
end
from 职工,部门
where 职工.所在部门=部门.部门号

/*T-SQL编程中的核心概念
变量
函数
条件判断
循环结构  循环三要素
*/
-----------------------------------------------------------------------
应用程序
数据支撑软件
操作系统
--视图  view
--根据用户的筛选条件,从原始表中生成的一张虚拟表
select * from 工资
--创建视图
--语法:
create view 视图名称
as
sql查询语句
create view v3
as
select 职工号,基本工资 from 工资 where 职工号='0010'
select * from v3
--视图的作用
1.屏蔽敏感字段或记录
2.简化查询代码
注意:在视图中不存在任何数据,其保存的只是与原始表对应的查询语句
--示例:
create view v2
as
select 姓名,基本工资,部门名称
from 工资,职工,部门
where 职工.职工号=工资.职工号 and 职工.所在部门=部门.部门号
select * from v2
--删除视图
drop view 视图名称
drop view v3
--修改视图
alter view 视图名称
as
新的sql查询语句
--查看视图创建的代码
sp_helptext 视图名称
sp_helptext v1
 
------------------------------------------------------------------------
--索引  index
--索引的分类:聚集索引、非聚集索引
--1.一张表中只能存在一个聚集索引,一般为主键(primary key)
--2.一张表中还可以新建249非聚集索引,相对聚集索引,非聚集索引的查询效率稍低
-------------------------------------------------------------------------
--事务  tran
--为了保证数据完整性
select * from 工资
--开启事务
begin tran t1
update 工资 set 奖金=奖金+500 where 职工号='0001'
--回滚事务
rollback tran t1
--提交事务
commit tran t1
--注意:一个事务的开启对应着一个回滚或提交动作

--------------------------------------------------------
--存储过程  porc
--是一类特殊的函数,用于完成某种特定功能
--系统存储过程和用户自定义存储过程
--系统存储过程:
exec sp_help   --调用存储过程的完整方法需要使用exec(execute)关键字
sp_helpdb
sp_helptext
--用户自定义存储过程:
语法:
create proc 存储过程名称
as
   sql代码集合
--示例:创建计算1-100累加和的存储过程
create proc sum1_100
as
declare @num int  --用于保存参与运算的数字
declare @result int --用于保存上一次加法运算的结果
--初始化变量
set @num=1    --由1开始
set @result=0  --初始运算结果为0
while @num<=100      --循环条件为:到100结束
 begin
 set @result=@result+@num    --一次加法运算
 set @num=@num+1             --递增运算数
 end
print '1到100的累加和为:'+str(@result)
--调用存储过程
exec sum1_100
--存储过程的优势:
1.占用网络带宽小
2.执行速度快,存储过程在被创建时被编译,而且只编译一次

--删除存储过程
drop proc 存储过程名称
--查看存储过程创建代码
sp_helptext 存储过程名称
sp_helptext sum1_100

--创建带输入参数的存储过程
create proc 存储过程名称 @变量1名称 变量1数据类型,..,变量N 变量N的数据类型
as
 sql代码
--示例:创建一个计算1-N的累加和的存储过程
create proc sum1_n @num1 int
as
declare @num int  --用于保存参与运算的数字
declare @result int --用于保存上一次加法运算的结果
--初始化变量
set @num=1    --由1开始
set @result=0  --初始运算结果为0
while @num< =@num1     --循环条件为:到100结束
 begin
 set @result=@result+@num    --一次加法运算
 set @num=@num+1             --递增运算数
 end
print '1到'+str(@num1)+'的累加和为:'+str(@result)

drop proc sum1_n
--调用
exec sum1_n 10

--创建如下的带输入参数的存储过程:
--①根据用户输入的学号,删除该学生选课成绩记录;
select * from 选修课
sp_help 选修课
--创建存储过程
create proc abc @参数 int
as
  declare @num int
  select @num=count(*) from 选修课 where 学号=@参数   --查询出符合输入参数学号的成绩记录数量并赋值与@num
  if @num=0 --根据变量的取值,选择完成相应的动作,此时为无记录时的状态
 print '找不到相关记录'
  else          --表示存在相关记录,执行删除动作,并返回用户相应提示信息
 begin
    delete from 选修课 where 学号=@参数
    print str(@参数)+'学号记录已被删除成功!'
 end
--带输入参数调用存储过程
execute abc 95004
 

------------------------------------------------------------------------
--sql server的权限管理
--数据库管理任务中比重最大的三个任务:
1.查询
2.备份和还原
3.权限管理
sql server的分层结构
操作系统(OS)  <===========>   windows用户/组
sql server 服务器   <===========>  sql server服务器登录名(login name)
     server                                   服务器角色(server role)
DB  数据库       <===========>  }  
TABLE  表       <===========>   }
                                   数据库用户(db user)/数据库角色(db role)
record 记录    <===========>    }
field  字段    <===========>    }
 
--注意:
1.数据库用户和数据库角色可以被新建,但是服务器角色不允许用户自定义,全部都为系统默认存在
2.数据库用户在创建时,需要对应一个服务器登录名
3.sql server的权限管理和windows中权限管理的规则完全一致,同样包括权限的继承、组合及拒绝
 
---------------------------------------------------------------------
--sql server agent   代理服务
--用于控制sql server中的警报、操作员、作业
--警报:在服务器触发了相应的预警时,则可以设置通知相应的操作员
--操作员:不是具体某个管理员,而是一种通知方式(email、net send等)
--作业:sql server中的计划任务,可以安排任务周期性的在未来某个时刻完成,并且可以设置成功或失败所作的后续操作。
 

你可能感兴趣的:(数据库,职场,休闲)