SQlServer数据库基础

目录

SQlServer数据库基础... 1

一、       创建语句... 3

(1)创建数据库... 3

(2)创建表格... 3

二、删除语句... 5

(1)删除数据库... 5

(2)删除表格... 5

(3)清空数据... 5

(4)删除某行数据... 5

(5)删除某列数据... 6

三、修改语句... 6

(1)修改表格... 6

四、查询语句... 8

(1)单表查询... 8

(2)多表查询... 9

(3)嵌套查询... 11

(4)聚合查询... 12

(5)排序... 13

(6)常用的系统函数... 14

五、插入语句... 15

(1)给表格添加新的列... 15

(2)添加表格数据... 16

六、约束... 17

(1)主键约束... 17

(2)外键约束... 18

(3)唯一约束... 19

(4)检查约束... 19

(5)初建表格多个约束同时进行... 19

(6)删除约束... 20

七、视图... 20

(1)创建视图... 20

(2)删除视图... 21

(3)更新视图... 21

(4)查询视图... 22

八、存储过程... 22

(1)创建存储过程... 23

(2)删除存储过程... 27

(3)存储过程,视图,聚合查询综合应用... 27

 

一、创建语句

(1)创建数据库

1.检查系统中是否存在这个数据库,存在则删除

格式:

if exists(select * from sysdatabases where name='数据库名')

drop database 数据库名

go

例子:

if exists(select * from sysdatabases where name='musicDB')

drop database musicDB

go

2.创建数据库

格式:

create database 数据库名

go

例子:

create database musicDB

go

(2)创建表格

1. 检查数据库中是否存在这个表,存在则删除

格式:

if exists(select * from sysobjects where name='表名')

drop table 表名

例子:

if exists(select * from sysobjects where name='T_speciality')

drop table T_speciality;

2.创建表

格式:

create table 表名(

列名1 数据类型,

列名2 数据类型

…………

)

go

例子:

create table T_speciality(

specialityid varchar(20) primary key,

specialityname varchar(20)

)

go

二、删除语句

(1)删除数据库

格式:

drop database 数据库名

例子:

drop database mystyle

(2)删除表格

格式:

drop table 表格名称

例子:

drop table tbl_Music

(3)清空数据

格式:

truncate table 表名

例子:

truncate table tbl_Music

(4)删除某行数据

格式:

delete from 表名 where 列名='条件'

例子:

delete from tbl_Music where musicName='菊花台'

注意:当没有where条件时则会清空整张表的数据

 

(5)删除某列数据

格式:

alter table 表名 drop column 列名

例子:

alter table tbl_Music drop column singer_id

注意:使用该语句则会将该列的所有的数据都删除,包括列名

三、修改语句

(1)修改表格

1.修改表名

格式:

exec sp_rename '旧表名', '新表名';

例子:

exec sp_rename 'tbl_Music', 'musics';

注意:更改对象名的任一部分都可能会破坏脚本和存储过程。所以不赞成修改表名

 

2.修改表属性

增加一列

格式:

alter table 表名

add 列名 字符类型

例子:

alter table tbl_Music

add score varchar(20)

 

3.修改列名名字

格式:

exec sp_rename '表名.旧列名','新列名','column'

例子

exec sp_rename 'musics.musicid','id','column'

注意:这样修改同样会破坏储存过程,建议先删除这一列再添加新的列。

 

4.修改列数据类型

格式:

alter table 表名 alter column 列名 新的数据类型

例子:

alter table musics alter column clicknumber varchar(20)

注意:主键不能修改,字符型的不能转为int型的。

 

5.修改表格数据

格式:

update  表名 set 列名='修改的值'  

where 条件

例子:

update  musics set clicknumber='200'  

where id=3

注意:主键不能修改

四、查询语句

数据库查询的基本格式为:

select          ----输出(显示)你要查询出来的值

from           -----查询的依据,数据来源

where         -----筛选条件(对依据(数据库中存在的表))

group by      -----对筛选后的数据 进行分组

having         ----- 筛选条件(对分组后的结果再次筛选)

order by       -----将结果进行排序

基本语法格式顺序不能变,但可以缺省

(1)单表查询

1.查询全部

格式:

select * from 表名

“*”代表所有列

例子:

select * from musics

 

2.查询指定列

格式:

select 列名 as '别名',列名

from 表名

也可以不给列取别名

例子:

select id as '账号',musicname

from musics

(2)多表查询

内连接

全连接

左连接

右连接

Inner join

Full Outer join

Left join

Right join

 

内连接:此语句的结果为同时匹配表a和表b的记录集。即内连接取的是两个表的交集。

外连接:(全连接,左右连接)语句的结果为表a与表b的并集,即任意一个表的内容都将被查询出来,如果另一个表无对应的项,则显示为null

三种连接只是表格的对应顺序不一样

  1. 内连接

格式:

select *

from 表名1 别名1

inner join 表名2 别名2

on 别名1.主键=别名2.外键

例子:

select *

from [dbo].[tbl_Music] t1

inner join [dbo].[tbl_Menu] t2

on t1.musicId=t2.musicId

结果展示:

  1. 外连接

格式:

select *

from 表名1 别名1

[full/left/right]join 表名2 别名2

on 别名1.主键=别名2.外键

例子:

select *

from [dbo].[tbl_Music] t1

full join [dbo].[tbl_Menu] t2

on t1.musicId=t2.musicId

结果展示:

 

(3)嵌套查询

格式:

select *

from 表名1 别名1

inner join(

子查询语句

) 别名2

on 别名1.共同拥有的键名=别名2. 共同拥有的键名

go

例子:

select t4.userName as '用户名',t4.menuName as'歌单名',t3.musicName as '歌曲名',t3.clickNumber as'点击数量'

from [dbo].[tbl_Music] t3

inner join(

select t1.userId,t1.userName,t2.musicId,t2.menuName

from [dbo].[tbl_User] t1

inner join [dbo].[tbl_Menu] t2

on t1.userId=t2.userId) t4

on t3.musicId=t4.musicId

go

注意:

子查询语句中不能使用select *,应为使用select * 查询了所有的内容,就会由两个相同的列,并且在查询中必须把与主查询相同的键给查询出来,否则无法进行连接查询。

(4)聚合查询

1.聚合函数

聚合函数如下所示:

min  ---最小     max  ---最大

sum  ---和    avg  ---平均

count ---统计(个数)

聚合函数一般和分组group by一起使用

例:select avg(age)from student group by sex

2.聚合查询

SELECT 所有查询的内容

FROM

GROUP BY 分组条件

例子:

- • 统计每个客户经理所经手的质押业务数

SELECT t1.agency_id AS '客户经理编号',COUNT(*)AS '客户数量'

FROM

t_agency_info t1

RIGHT JOIN

t_impawn_info t2

ON t1.agency_id=t2.agency_id

GROUP BY t2.agency_id

结果展示:

注意:

一旦使用min ,max ,sum,avg ,count 只能查询相对应的聚合数,和分组条件,其他的都不能再查询了。

 

(5)排序

排序分为降序和升序。

升序:

select *  from emp order by id asc

降序:

select * from emp order by id desc

按多列排序:

select * from emp order by id asc,name asc

限制固定行数显示:

select top 2 id,name from emp where deptno=2

返回百分之多少行:

select top 20 percent id,name from emp where deptno=2

(6)常用的系统函数

日期参数及缩写如下表所示

日期部分

缩写

year 

yy, yyyy

month

mm, m

day

dd, d

week

wk, ww

weekday

dw

hour

hh

minute

mi, n

second

ss, s

例子:

-- 获取当前年份

 select datename(yy,GETDATE());

 select datename(yyyy,GETDATE());

 select datename(year,GETDATE());

 

五、插入语句

(1)给表格添加新的列

格式:

alter table 表名

add 列名 数据类型

go

 

例子:

alter table tbl_Music

add score varchar(20)

go

 

(2)添加表格数据

方法一:安照列名依次给出数据值,不能交换顺序,数据类型不能出错

insert into demo values

 ('zhang',25,1)

('li',28,2)

方法二:安照指定顺序给出数据值

insert into demo (nname,age,sex) values ('san',18,0)

方法三:交换顺序,数值按照列名给就行

insert into demo (nname,sex,age) values ('san',1,22)

方法四:没给数值的列显示null

insert into demo (nname) values ('li')

2.复制表中数据到另一个表中:

insert into demo1(nname,nage,asex) select nname,age,sex from demo

注意事项

1:每次插入一行数据,不可能只插入半行或者几列数据,因此,插入的数据是否有效将按照整行的完整性的要求来检验;

2:每个数据值的数据类型、精度和小数位数必须与相应的列匹配;

3:不能为标识列指定值,因为它的数字是自动增长的;

4:如果在设计表的时候就指定了某列不允许为空,则必须插入数据;

5:插入的数据项,要求符合检查约束的要求

6:具有缺省值的列,可以使用default(缺省)关键字来代替插入的数值

六、约束

(1)主键约束

  1. 单一主键

格式:

alter table 表名

add constraint 主键名 primary key (列名)

go

例子:

alter table t_student

add constraint pk_t_student primary key (stud_id)

go

注意:在建表的时候主键不能为空

  1. 复合主键

复合主键即两个字段可以不唯一,但是两个字段联合起来必须是唯一的,例如一些手机,华为p10,魅族Pro10,iphone pro12,只有商标和型号联合起来才是一个唯一且不重复的值.

格式:

alter table 表名

add primary key(列名1,列名2)

go

例子:

alter table [dbo].[phone]

add primary key(brand,type)

go

注意:

在建表的时候这两个字段必须非空,因为主键非空且唯一.

  1. 主键标识列

标示列为非空自动增长且 不可自行修改的 主关键字一般用来在一个表中引用来自于另一个表中的特定记录 其为非空 唯一的 其可以有一个以上的列合为主键 相同点就是都不可为空且都是唯一的 能理解这些就够用了 给分吧!

格式:

create table 表名(标识列名 int identity(1,1) primary key not null )

其中(1,1)是表示从1开始,每行自增1

例子:

create table phone(id int identity(1,1) primary key not null )

(2)外键约束

格式:

alter table 表名 add constraint 外键关系名foreign key (外键名) references

主键表名 (主键)

例子:

alter table t_user add constraint FK_t_user_t_group_id foreign key (groupid) references t_group (id)

(3)唯一约束

格式:

alter table 表名 add constraint 约束关系名unique(列名)

例子:

alter table Users add constraint UQ_Users_Name unique(Name)

 

(4)检查约束

  1. 普通检查约束

格式:

alter table Users add constraint 约束关系名 check(约束条件)

例子:

alter table Users add constraint CK_Users_Age check(Age>0 and Age<100)

(5)初建表格多个约束同时进行

例子:

create table Users (

Id int  identity(1,1) primary key ,

Name nvarchar(32) unique,

Phone nvarchar(16) not null,

Email nvarchar(128) default('[email protected]'),

Age  int check(Age>0 and Age<100),

Sex  char(2) check(Sex in('男','女')),

createtime datetime default(getdate())

foreign key(pid)references partment(pid)

)

(6)删除约束

alter table 表名 drop constraint 约束名

七、视图

视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上,视图中并不存放数据,而是存放在视图所引用的原始表(基表)中,同一张原始表,根据不同用户的不同需求,可以创建不同的视图

视图的用途:

  筛选表中的行

  防止未经许可的用户访问敏感数据

  降低数据库的复杂程度

  将多个物理数据库抽象为一个逻辑数据库

(1)创建视图

格式:

 create view 视图名称

 as

sql语句

例子:

-- 4.5编写视图查询借书人的姓名,手机号码和地址;

 create view VW_borrow_student

 as

select c.card_name as '姓名',c.mobile as '电话号码'

from  [dbo].[T_borrow] B

left join [dbo].[T_card] as C

 on b.card_no=c.card_no

 go

(2)删除视图

格式:

drop view  视图名

例子:

drop view  VW_borrow_student

(3)更新视图

视图是一张虚拟表不适合更新,可以先删除再修改.我只遇到过这种情况可以更新.

create view  VW_1

as

select * from [dbo].[musics]

where musicName='菊花台'

 

update VW_1

set score='100'

where id='3'

 

select * from VW_1

其中的score被更新至200

(4)查询视图

格式:

select * from 视图名

例子:

select * from VW_1

八、存储过程

存储过程(procedure)用来执行管理任务或应用复杂的业务规则,存储过程可以带参数,也可以返回结果。

存储过程可以包含数据操纵语句、变量、逻辑 控制语句等,比如:单个select语句,select语句块,select语句与逻辑控制块。

存储过程优点: 

  执行速度更快

  允许模块化程序设计

  提高系统安全性

  减少网络流通量

(1)创建存储过程

  1. 不带参数的存储过程

格式:

创建:

create proc 存储过程名

as

sql语句

查询:

exec 存储过程名

例子:

create proc proc_1

as

select * from [dbo].[musics]

 

exec proc_1

 

  1. 带参数的存储过程

格式:

创建:

create proc 存储过程名

 @参数名 参数类型

 as

带有数据的sql语句,其中参数又@参数名代替

go

查询:

exec 存储过程名 参数

例子:

-- 4.6 编写存储过程,查询指定图书名称的借阅次数。

 create proc book_times

 @num int

 as

 select bookname from [dbo].[T_book] where loan=@num

 -- end

 go

 

exec book_times 30

  1. 带输入参数,输出参数的存储过程

例1:

create proc P_Titles_ByTitleID_SelectPrice2

@title_id varchar(6), --输入参数

@price money output   --输出参数

as

select @price=price from titles where  title_id=@title_id

go

 

----执行

declare @price2 money               ----1,先声明变量

exec P_Titles_ByTitleID_SelectPrice2    ----2.之后在调用

@title_id='BU1032',

@price=@price2 output               ----3.配参后面要加output标识

select @price2                        ----4.之后在查声明变量

 

例2:

create proc my_musice

@score varchar(20),

@musicName varchar(40) output

as

select @musicName=musicName

from [dbo].[musics]

where score=@score

go

 

declare @musicName2 varchar(40)

exec my_musice

@score='20',

@musicName=@musicName2 output

select @musicName2

结果展示:

 

4.带变量和返回值的存储过程

--创建

use test

go

create proc testReturn

 @deptno char(10),

 @deptname char(10)

 as

 declare @dname char(10)

 select @dname=name from dept where id=@deptno

 if (@dname=@deptname)

  return 1

  else

  return 0

go

--执行

DECLARE @rs char(10)

 exec @rs=testReturn @deptno='1', @deptname='soft'

 select @rs

 

(2)删除存储过程

格式:

drop proc 存储过程名

例子:

drop proc my_musice

 

(3)存储过程,视图,聚合查询综合应用

例子:

--将点击数最高的那首歌插入某个歌单。

-- 创建视图查找到点击量最高的歌曲id

create view vw_maxclick

as

select musicid

from [dbo].[tbl_Music]

where clickNumber=(select max(clickNumber)

-- 利用子查询查到最高点击量,根据点击量查找点击量最高的歌曲

from [dbo].[tbl_Music])

go

 

-- 创建带参数的存储过程,将查询的结果赋值给参数

create proc inser_music

@menuName varchar(40),

@userid int,

@musicid int

as

ins

四、查询语句

数据库查询的基本格式为:

select          ----输出(显示)你要查询出来的值

from           -----查询的依据,数据来源

where         -----筛选条件(对依据(数据库中存在的表))

group by      -----对筛选后的数据 进行分组

having         ----- 筛选条件(对分组后的结果再次筛选)

order by       -----将结果进行排序

基本语法格式顺序不能变,但可以缺省

(1)单表查询

1.查询全部

格式:

select * from 表名

“*”代表所有列

例子:

select * from musics

 

2.查询指定列

格式:

select 列名 as '别名',列名

from 表名

也可以不给列取别名

例子:

select id as '账号',musicname

from musics

(2)多表查询

内连接

全连接

左连接

右连接

Inner join

Full Outer join

Left join

Right join

 

内连接:此语句的结果为同时匹配表a和表b的记录集。即内连接取的是两个表的交集。

外连接:(全连接,左右连接)语句的结果为表a与表b的并集,即任意一个表的内容都将被查询出来,如果另一个表无对应的项,则显示为null

三种连接只是表格的对应顺序不一样

  1. 内连接

格式:

select *

from 表名1 别名1

inner join 表名2 别名2

on 别名1.主键=别名2.外键

例子:

select *

from [dbo].[tbl_Music] t1

inner join [dbo].[tbl_Menu] t2

on t1.musicId=t2.musicId

结果展示:

  1. 外连接

格式:

select *

from 表名1 别名1

[full/left/right]join 表名2 别名2

on 别名1.主键=别名2.外键

例子:

select *

from [dbo].[tbl_Music] t1

full join [dbo].[tbl_Menu] t2

on t1.musicId=t2.musicId

结果展示:

 

(3)嵌套查询

格式:

select *

from 表名1 别名1

inner join(

子查询语句

) 别名2

on 别名1.共同拥有的键名=别名2. 共同拥有的键名

go

例子:

select t4.userName as '用户名',t4.menuName as'歌单名',t3.musicName as '歌曲名',t3.clickNumber as'点击数量'

from [dbo].[tbl_Music] t3

inner join(

select t1.userId,t1.userName,t2.musicId,t2.menuName

from [dbo].[tbl_User] t1

inner join [dbo].[tbl_Menu] t2

on t1.userId=t2.userId) t4

on t3.musicId=t4.musicId

go

注意:

子查询语句中不能使用select *,应为使用select * 查询了所有的内容,就会由两个相同的列,并且在查询中必须把与主查询相同的键给查询出来,否则无法进行连接查询。

(4)聚合查询

1.聚合函数

聚合函数如下所示:

min  ---最小     max  ---最大

sum  ---和    avg  ---平均

count ---统计(个数)

聚合函数一般和分组group by一起使用

例:select avg(age)from student group by sex

2.聚合查询

SELECT 所有查询的内容

FROM

GROUP BY 分组条件

例子:

- • 统计每个客户经理所经手的质押业务数

SELECT t1.agency_id AS '客户经理编号',COUNT(*)AS '客户数量'

FROM

t_agency_info t1

RIGHT JOIN

t_impawn_info t2

ON t1.agency_id=t2.agency_id

GROUP BY t2.agency_id

结果展示:

注意:

一旦使用min ,max ,sum,avg ,count 只能查询相对应的聚合数,和分组条件,其他的都不能再查询了。

 

(5)排序

排序分为降序和升序。

升序:

select *  from emp order by id asc

降序:

select * from emp order by id desc

按多列排序:

select * from emp order by id asc,name asc

限制固定行数显示:

select top 2 id,name from emp where deptno=2

返回百分之多少行:

select top 20 percent id,name from emp where deptno=2

(6)常用的系统函数

日期参数及缩写如下表所示

日期部分

缩写

year 

yy, yyyy

month

mm, m

day

dd, d

week

wk, ww

weekday

dw

hour

hh

minute

mi, n

second

ss, s

例子:

-- 获取当前年份

 select datename(yy,GETDATE());

 select datename(yyyy,GETDATE());

 select datename(year,GETDATE());

 

五、插入语句

(1)给表格添加新的列

格式:

alter table 表名

add 列名 数据类型

go

 

例子:

alter table tbl_Music

add score varchar(20)

go

 

(2)添加表格数据

方法一:安照列名依次给出数据值,不能交换顺序,数据类型不能出错

insert into demo values

 ('zhang',25,1)

('li',28,2)

方法二:安照指定顺序给出数据值

insert into demo (nname,age,sex) values ('san',18,0)

方法三:交换顺序,数值按照列名给就行

insert into demo (nname,sex,age) values ('san',1,22)

方法四:没给数值的列显示null

insert into demo (nname) values ('li')

2.复制表中数据到另一个表中:

insert into demo1(nname,nage,asex) select nname,age,sex from demo

注意事项

1:每次插入一行数据,不可能只插入半行或者几列数据,因此,插入的数据是否有效将按照整行的完整性的要求来检验;

2:每个数据值的数据类型、精度和小数位数必须与相应的列匹配;

3:不能为标识列指定值,因为它的数字是自动增长的;

4:如果在设计表的时候就指定了某列不允许为空,则必须插入数据;

5:插入的数据项,要求符合检查约束的要求

6:具有缺省值的列,可以使用default(缺省)关键字来代替插入的数值

六、约束

(1)主键约束

  1. 单一主键

格式:

alter table 表名

add constraint 主键名 primary key (列名)

go

例子:

alter table t_student

add constraint pk_t_student primary key (stud_id)

go

注意:在建表的时候主键不能为空

  1. 复合主键

复合主键即两个字段可以不唯一,但是两个字段联合起来必须是唯一的,例如一些手机,华为p10,魅族Pro10,iphone pro12,只有商标和型号联合起来才是一个唯一且不重复的值.

格式:

alter table 表名

add primary key(列名1,列名2)

go

例子:

alter table [dbo].[phone]

add primary key(brand,type)

go

注意:

在建表的时候这两个字段必须非空,因为主键非空且唯一.

  1. 主键标识列

标示列为非空自动增长且 不可自行修改的 主关键字一般用来在一个表中引用来自于另一个表中的特定记录 其为非空 唯一的 其可以有一个以上的列合为主键 相同点就是都不可为空且都是唯一的 能理解这些就够用了 给分吧!

格式:

create table 表名(标识列名 int identity(1,1) primary key not null )

其中(1,1)是表示从1开始,每行自增1

例子:

create table phone(id int identity(1,1) primary key not null )

(2)外键约束

格式:

alter table 表名 add constraint 外键关系名foreign key (外键名) references

主键表名 (主键)

例子:

alter table t_user add constraint FK_t_user_t_group_id foreign key (groupid) references t_group (id)

(3)唯一约束

格式:

alter table 表名 add constraint 约束关系名unique(列名)

例子:

alter table Users add constraint UQ_Users_Name unique(Name)

 

(4)检查约束

  1. 普通检查约束

格式:

alter table Users add constraint 约束关系名 check(约束条件)

例子:

alter table Users add constraint CK_Users_Age check(Age>0 and Age<100)

(5)初建表格多个约束同时进行

例子:

create table Users (

Id int  identity(1,1) primary key ,

Name nvarchar(32) unique,

Phone nvarchar(16) not null,

Email nvarchar(128) default('[email protected]'),

Age  int check(Age>0 and Age<100),

Sex  char(2) check(Sex in('男','女')),

createtime datetime default(getdate())

foreign key(pid)references partment(pid)

)

(6)删除约束

alter table 表名 drop constraint 约束名

七、视图

视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上,视图中并不存放数据,而是存放在视图所引用的原始表(基表)中,同一张原始表,根据不同用户的不同需求,可以创建不同的视图

视图的用途:

  筛选表中的行

  防止未经许可的用户访问敏感数据

  降低数据库的复杂程度

  将多个物理数据库抽象为一个逻辑数据库

(1)创建视图

格式:

 create view 视图名称

 as

sql语句

例子:

-- 4.5编写视图查询借书人的姓名,手机号码和地址;

 create view VW_borrow_student

 as

select c.card_name as '姓名',c.mobile as '电话号码'

from  [dbo].[T_borrow] B

left join [dbo].[T_card] as C

 on b.card_no=c.card_no

 go

(2)删除视图

格式:

drop view  视图名

例子:

drop view  VW_borrow_student

(3)更新视图

视图是一张虚拟表不适合更新,可以先删除再修改.我只遇到过这种情况可以更新.

create view  VW_1

as

select * from [dbo].[musics]

where musicName='菊花台'

 

update VW_1

set score='100'

where id='3'

 

select * from VW_1

其中的score被更新至200

(4)查询视图

格式:

select * from 视图名

例子:

select * from VW_1

八、存储过程

存储过程(procedure)用来执行管理任务或应用复杂的业务规则,存储过程可以带参数,也可以返回结果。

存储过程可以包含数据操纵语句、变量、逻辑 控制语句等,比如:单个select语句,select语句块,select语句与逻辑控制块。

存储过程优点: 

  执行速度更快

  允许模块化程序设计

  提高系统安全性

  减少网络流通量

(1)创建存储过程

  1. 不带参数的存储过程

格式:

创建:

create proc 存储过程名

as

sql语句

查询:

exec 存储过程名

例子:

create proc proc_1

as

select * from [dbo].[musics]

 

exec proc_1

 

  1. 带参数的存储过程

格式:

创建:

create proc 存储过程名

 @参数名 参数类型

 as

带有数据的sql语句,其中参数又@参数名代替

go

查询:

exec 存储过程名 参数

例子:

-- 4.6 编写存储过程,查询指定图书名称的借阅次数。

 create proc book_times

 @num int

 as

 select bookname from [dbo].[T_book] where loan=@num

 -- end

 go

 

exec book_times 30

  1. 带输入参数,输出参数的存储过程

例1:

create proc P_Titles_ByTitleID_SelectPrice2

@title_id varchar(6), --输入参数

@price money output   --输出参数

as

select @price=price from titles where  title_id=@title_id

go

 

----执行

declare @price2 money               ----1,先声明变量

exec P_Titles_ByTitleID_SelectPrice2    ----2.之后在调用

@title_id='BU1032',

@price=@price2 output               ----3.配参后面要加output标识

select @price2                        ----4.之后在查声明变量

 

例2:

create proc my_musice

@score varchar(20),

@musicName varchar(40) output

as

select @musicName=musicName

from [dbo].[musics]

where score=@score

go

 

declare @musicName2 varchar(40)

exec my_musice

@score='20',

@musicName=@musicName2 output

select @musicName2

结果展示:

 

4.带变量和返回值的存储过程

--创建

use test

go

create proc testReturn

 @deptno char(10),

 @deptname char(10)

 as

 declare @dname char(10)

 select @dname=name from dept where id=@deptno

 if (@dname=@deptname)

  return 1

  else

  return 0

go

--执行

DECLARE @rs char(10)

 exec @rs=testReturn @deptno='1', @deptname='soft'

 select @rs

 

(2)删除存储过程

格式:

drop proc 存储过程名

例子:

drop proc my_musice

 

(3)存储过程,视图,聚合查询综合应用

例子:

--将点击数最高的那首歌插入某个歌单。

-- 创建视图查找到点击量最高的歌曲id

create view vw_maxclick

as

select musicid

from [dbo].[tbl_Music]

where clickNumber=(select max(clickNumber)

-- 利用子查询查到最高点击量,根据点击量查找点击量最高的歌曲

from [dbo].[tbl_Music])

go

 

-- 创建带参数的存储过程,将查询的结果赋值给参数

create proc inser_music

@menuName varchar(40),

@userid int,

@musicid int

as

insert into [dbo].[tbl_Menu] values

( @menuName,@userid,@musicid

)

go

-- 执行储存过程

declare @menuName varchar(40),@userid int,@musicid int

select @menuName='我喜欢的歌曲',@userid=1, @musicid=(select * from vw_maxclick)

exec inser_music @menuName ,@userid,@musicid

 

ert into [dbo].[tbl_Menu] values

( @menuName,@userid,@musicid

)

go

-- 执行储存过程

declare @menuName varchar(40),@userid int,@musicid int

select @menuName='我喜欢的歌曲',@userid=1, @musicid=(select * from vw_maxclick)

exec inser_music @menuName ,@userid,@musicid

 

 

发布了20 篇原创文章 · 获赞 13 · 访问量 9524

猜你喜欢

转载自blog.csdn.net/qq_35653657/article/details/83895442