视图、索引、存储过程
视图——相对应的是表
查询结果。
表——真正存储数据的地方。
视图——不存数据,展示查询的结果。
视图就是为了查询数据方便。一般不要试图向视图中插入数据,容易出错。
视图可以由一个表生成,也可以由多个表生成,还可以由表各视图生成新的视图。
掌握:
1.视图是个什么东西?
2.会建视图,会查视图
3.知道视图的主要功能是查询,不是增删除改。
索引:为了提高查询效率。
簇索引,非簇索引
1.数据的默认存储次序跟簇索引的次序一样的。一个表中只有能有一个簇索引。
2.非簇索引是单独放置的,查询的时候,先查非族索引,再跟据非簇索引查询内容。,一个表可以有多个非簇索引。
要记住的:
1.索引是什么东西。
2.索引分类及效率。原理。
3.索引提升查询效率,但会影响增删改的效率。
4.如何建索引、删索引。
存储过程
SQL编程:
数据类型:列的类型
变量定义:declare 变量名 类型名
变量名:以@开头。
赋值和取值:
赋值:set/select 变量=值
取值:变量名
例:
declare @a varchar(50) --定义变量
set @a = 'hello world' --给变量赋值
--select @a = 'hello world'
print @a --取值输出
运算符:算术、关系、逻辑、其它
算术:+ - * / % 没有++ --
关系:> < >= <= = <> !=
逻辑:and or not
其它:between...and... exists like is 没有?:,也没有%= += -=....
cast(@count as decimal)类型转换
条件分支:
if 表达式
begin
end
else
begin
end
循环:略
存储过程的创建:
create procedure 存储过程名
形参名 形参类型,
形参名 形参类型,
....
形参名 形参类型
as
函数体
go
存储过程的调用:
存储过程名 实参1,实参2,...,实参n
案例一:
往Info中送入数据,如果主键已存在,则执行修改操作;否则执行插入操作
CREATE PROCEDURE TESTINFO
@code varchar(50),
@name varchar(50),
@sex bit,
@nation varchar(50),
@birthday datetime
AS
--先根据@code查一下info表中记录的个数
declare @c int
select @c=COUNT(*) from Info where Code=@code
--如果记录个数大于0
if @c > 0
begin
--执行修改操作
update Info set Name=@name,Sex=@sex,Nation=@nation,Birthday=@birthday where Code=@code
end
--否则
else
begin
--执行插入操作
insert into Info (Code,Name,Sex,Nation,Birthday) values(@code,@name,@sex,@nation,@birthday)
end
GO
select * from info
案例二:
做一个存储过程,输入水果代号,人员用户名,购买数量,把库存和账户扣掉相应的值。
select * from fruit
select * from login
select * from orders
select * from orderdetails
alter proc BUYFRUIT
@uid varchar(50), --用户名
@id varchar(50), --水果代号
@count int --购买数量
as
--一、扣库存
update fruit set numbers=numbers-@count where ids=@id
--二、扣钱
declare @cost decimal(8,2) --花费
--1.查出单价
declare @p decimal(8,2) --单价
select @p=price from fruit where Ids=@id
--2.计算花费
set @cost = cast(@count as decimal) *@p
--3.修改账户余额
update login set account=account-@cost where username=@uid
go
BUYFRUIT 'lisi','k005',5
案例三:同案例二。但要检查1.库存够不够。2.余额够不够。
select * from Fruit
select * from login
select * from Orders
select * from OrderDetails
alter proc FRUITBUY
@uid varchar(50), --用户名
@id varchar(50), --水果代号
@count decimal(8,2)
as
--一、检查余额和库存
--(一)准备数据购买数量,库存数量;总花费,余额
--1.准备库存
declare @kc int
select @kc = Numbers from fruit where Ids=@id
--2.准备余额
declare @ye decimal(8,2)
select @ye=Account from login where UserName=@uid
--3.准备花费
--(1)准备单价
declare @dj decimal(8,2)
select @dj=Price from fruit where Ids = @id
--(2)计算花费
declare @cost decimal(8,2)
set @cost = @dj*@count
--(二)比较判断
if @kc>=@count and @ye>=@cost
begin
--二、扣库存扣余额
--(一)扣库存
update Fruit set Numbers=Numbers-@count where Ids=@id
--(二)扣余额
update Login set Account = Account-@cost where UserName=@uid
--(三)向订单中加数据
declare @ordercode varchar(50)
set @ordercode=@uid+cast(YEAR(GETDATE()) as varchar(50))+cast(MONTH(getdate()) as varchar(50)) + cast(DAY(GETDATE()) as varchar(50)) + cast(DATEPART(hour,GETDATE()) as varchar(50))+cast(DATEPART(minute,GETDATE()) as varchar(50)) +CAST ( DATEPART(SECOND,GETDATE()) as varchar(50))
insert into Orders values(@ordercode,@uid,GETDATE())
--(四)向订单明细中加数据
insert into OrderDetails values(@ordercode,@id,@count)
print '购买成功'
end
else
begin
print '库存或余额不足'
end
go
select * from orders
FRUITBUY 'wangwu','k004',2