一、关于视图
1、概念:
视图包含一张或多张表的列所组成的数据集,是一张虚拟表,储存在数据库中的查询的sql语句
2、使用原因:
限制用户只能存取表内特定的列
不用重新建表即可存取需要的数据
减少复杂性
3、创建视图时应注意:
1) 只能在当前数据库中创建,视图中记录的数目限制由其基表中的记录数决定
2)视图名称遵循标识符规则,对每个用户必须唯一,名称不能与该用户拥有的任何表的名称相同
3)视图的基表或视图被删除,视图不可再使用,直到创建新的基表或视图
4)视图中某一列为函数、数学表达式、常量或来自多张表的列名相同,则必须为列定义名称
5)不能在视图上创建索引,不能在规则、默认、触发器的定义中引用视图
6)通过视图查询数据时,数据修改语句不能违反数据完整性规则
4、创建
create view 视图名 [(列名)]
as
begin
sql语句
end
5、优点
1)视点集中
2)简化操作
3)定制数据
4)合并分割数据
5)安全性提高
二、关于索引
1、概念:
是单独、物理的数据库结构,是数据库的一张表中所包含的值的列表(相当于目录)
2、类型:
聚集索引(列连续数据连续,物理顺序与键值逻辑(索引)顺序相同,每张表只有一个该类索引):主键索引
非聚集索引(数据不必连续,不必一致,每张表小于249个该类索引):
1)唯一索引:不允许两行或多行具有相同的索引值
2)复合索引:两列合在一起变成一个索引
3)视图索引:在视图上添加索引
4)全文索引:适用于字符串长的列
5)XML索引:对二进制进行搜索的索引
3、创建索引语法
create [unique][clustered|nonclustered] index 索引名
on 表名(列名)
[
with
fillfactor=fillfactor
]
unique:指定所创建的索引是否唯一
clustered:索引的类型(聚集与非聚集)
fillfactor:索引页的填充率(填充因子)指示该索引填充空间所占用的百分比
4、索引的操作
重新生成:alter index 索引名 on 表名 rebuild
重新组织:alter index 索引名 on 表名 reorganize
5、索引的优缺点
优点:提高查询效率
缺点:需占用物理空间
三、相关习题
1、视图
use master
if DB_ID('studentDB') is not null
drop database studentDB
go
create database studentDB
go
use studentDB
go
if OBJECT_ID('classInfo','table') is not null
drop table classInfo
go
create table classInfo
(
classId int primary key identity,
className varchar(30) unique
)
--插入测试数据
insert into classInfo values('高三八班')
insert into classInfo values('高三二班')
insert into classInfo values('高三三班')
insert into classInfo values('高三四班')
insert into classInfo values('高三五班')
insert into classInfo values('高三六班')
insert into classInfo values('高三七班')
select * from classInfo
if OBJECT_ID('student','table') is not null
drop table student
go
create table student
(
stuId int primary key identity,
stuName varchar(30),
stuAge int,
stuPhone varchar(20) check(stuPhone like '139%' or stuPhone like '133%'),
classId int references classInfo(classId),
stuState int check(stuState=0 or stuState=1 or stuState=2) --0为在读 1为休学 2为转学
)
insert into student values('张三',18,'13997805814',1,0)
insert into student values('张三',17,'13397805814',1,0)
insert into student values('张三',19,'13977805814',5,0)
insert into student values('张死',20,'13987805814',1,0)
insert into student values('李四',21,'13997805914',2,0)
insert into student values('王五',28,'13997805234',3,0)
insert into student values('周六',38,'13997805845',2,0)
insert into student values('abc',15,'13378923147',1,0)
select * from student
go
--1、创建视图,显示姓名,年龄,电话,班级名,状态
if OBJECT_ID('view_student_classInfo','view') is not null
drop view view_student_classInfo
go
create view view_student_classInfo
as
select '姓名'=stuName, '年龄'=stuAge,'电话'=stuPhone,'班级名'=className,'状态'=stuState
from student s join classInfo c on s.classId=c.classId
go
--调用
select * from view_student_classInfo
--2、创建视图,显示学号,姓名,年龄,电话
if OBJECT_ID('view_student','view') is not null
drop view view_student
go
create view view_student
as
select '学号'=stuId,'姓名'=stuName, '年龄'=stuAge,'电话'=stuPhone
from student
go
--调用
select * from view_student
--3、创建视图,显示学号,姓名,班级名
if OBJECT_ID('view_show','view') is not null
drop view view_show
go
create view view_show
as
select '学号'=stuId,'姓名'=stuName,'班级'=className
from student s join classInfo c on s.classId=c.classId
go
--调用
select * from view_show
2、索引
use HR
go
select * from dbo.COUNTRIES
select * from dbo.DEPARTMENTS
select * from dbo.EMPLOYEES
select * from dbo.JOB_HISTORY
select * from dbo.JOBS
select * from dbo.LOCATIONS
select * from dbo.REGIONS
--第一题
if OBJECT_ID('view_EMPLOYEES','view') is not null
drop view view_EMPLOYEES
go
create view view_EMPLOYEES
as
select EMPLOYEE_ID,(FIRST_NAME+LAST_NAME) name,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_TITLE,SALARY,COMMISSION_PCT,MANAGER_NAME=(FIRST_NAME+LAST_NAME) ,DEPARTMENT_NAME
from dbo.EMPLOYEES e
join dbo.DEPARTMENTS d on e.MANAGER_ID=d.MANAGER_ID and e.DEPARTMENT_ID=d.DEPARTMENT_ID
join dbo.JOBS j on e.JOB_ID=j.JOB_ID
go
select * from view_EMPLOYEES
--第二题
if OBJECT_ID('view_Show','view') is not null
drop view view_Show
go
create view view_Show
as
select EMPLOYEE_ID,(FIRST_NAME+LAST_NAME) name,JOB_TITLE,SALARY,DEPARTMENT_NAME
from dbo.EMPLOYEES e
join dbo.DEPARTMENTS d on e.MANAGER_ID=d.MANAGER_ID and e.DEPARTMENT_ID=d.DEPARTMENT_ID
join dbo.JOBS j on e.JOB_ID=j.JOB_ID
go
select * from view_Show
--第三题
--为表EMPLOYEES 的first_namehe last_name 创建索引
if OBJECT_ID('index_EMPLOYEES_FL','indexes') is not null
drop index EMPLOYEES .index_EMPLOYEES
go
create nonclustered index index_EMPLOYEES_FL on EMPLOYEES(FIRST_NAME,LAST_NAME)
go
select * from EMPLOYEES
go