Chapter08 数据库编程
重点:游标 存储过程 自定义函数 触发器
局部变量
- 规则
- 字母或_、@、#开头的字母数字或_、@、$序列
- 不与保留字相同
- 长度小于128
- 不符合规则的标识符必须加以界定(双引号""或方括号[])
- 注意
- 不能在声明的时候赋值
- 赋值:set赋值一个,select赋值多个
- 输出:print(以文本形式) / select(以表格形式)
例子
declare @myvar char(12)
set @myvar = 'Hello World!'/*注意不要超过指定长度范围*/
print @myvar
declare @var1 date,@var2 char(10)
set @var1 = getdate() /*获取日期*/
set @var2 = CONVERT(char(10),@var1,102)/*目标类型 变量名 风格(可以省略) 将var1转成字符型 */
print @var2 /*以文本形式输出*/
/*注:char和varchar可以相互转换,不用convert*/
declare @var1 date,@var2 char(10)
set @var1 = getdate()
set @var2 = CONVERT(char(10),@var1,102)/*目标类型 变量名 风格(可以省略) 将var1转成字符型 */
select @var2 /*会以表格形式输出*/
全局变量
全局变量是SQL Server系统内部使用的变量,以@@开头
全局变量不是由用户的程序定义的,它们是在服务器级定义的
用户只能使用预先定义的全局变量
print @@version
print @@servername
print @@servicename
查找学号为201215120的学生信息
if exists(select * from student where sno = '201215120')beginselect *from studentwhere sno='201215120'end
elseprint '没找到'
case 语句
select sno,ssex=case ssexwhen '男' then 'M'when '女' then'F'end
from student
declare @x int,@sum int
set @x=0
set @sum=0
while @x<10begin set @x=@x+1set @sum=@sum+@xend
print '1-10的和是'+convert(char(2),@sum)/*不可以直接连,需要转换类型*/
waIt for
delay表示延迟的时长 ;time表示具体的时间
delay
waitfor delay'00:00:5'begin select *from studentend
time
waitfor time '11:00:50'begin select *from studentend
时间日期函数
--从某个日期到现在的差值
print datediff(DD,'2000-05-07',getdate())
--获取当前年份
print year(getdate())
ASCII(字符串) 函数返回字符表达式最左端字符的ASCII 码值
CHAR(整数表达式) 函数用于将ASCII 码转换为字符
LOWER(字符串) 函数把字符串全部转换为小写
UPPER(字符串) 函数把字符串全部转换为大写
print ascii('abcd')
substring
--从第2位开始往后截取4位
print substring('student',2,4)
查询学生基本信息表student中的学号、姓名、年龄,并且将这三个字段通过“+”运算符连接显示在查询结果中
select sno+sname+cast(sage as char(2)) 基本信息
from student
游标
一种能从包括多条数据记录的结果集中每次提取一条记录的机制
fetch可通过@@FETCH_STATUS全局变量返回游标当前的状态。
0:FETCH 语句执行成功
-1:FETCH 语句执行失败或者行数据超出游标数据结果集的范围
-2:表示提取的数据不存在
步骤
- 声明一个游标 declare,cursor
- 打开游标:open
- 从游标中提取数据 fetch,@@FETCH_STATUS
- 关闭游标:close ;
- 如果没有释放,可以用open重新打开
- 关闭后仍会有内存消耗,所以要释放,释放后不可以用open打开
- 释放游标:deallocate ; 释放后不可以用open重新打开
1.声明一个游标,统计没有选修课程的学生人数
---1.声明游标:定位在student的sno字段
declare num_cursor cursor
forselect snofrom student
for read only
---2.打开游标
open num_cursor
---3.从游标中提取数据
declare @sno char(9),@num int /*存学号,人数 ;注意长度,可以多但不能少;是游标体系之外的变量*/
set @num = 0/*如果不声明,一般会认为0,为了严谨要赋上初值*/
fetch next from num_cursor into @sno
while @@FETCH_STATUS = 0/*提取到了数据*/begin if not exists (select * from sc where sno = @sno)beginset @num = @num + 1 /*一条语句的时候可以不加begin end*/endfetch next from num_cursor into @sno/*游标下移*/end
print '没有选课的学生人数有' + convert(char(2),@num) + '人'
---4.关闭游标;如果没有释放,还可以用open打开游标
close num_cursor
---5.释放游标/*关闭后仍有耗费内存,所以要关闭*/
deallocate num_cursor
2.统计各个阶段的学生人数
---1.声明游标
declare level_cursor cursor
for select grade from sc
---2.打开游标
open level_cursor
---3.从游标中提取数据
declare @mygrade int,@a int,@b int,@c int,@d int,@e int
select @a=0,@b=0,@c=0,@d=0,@e=0
fetch next from level_cursor into @mygrade
while @@FETCH_STATUS=0beginif @mygrade is nullset @e= @e + 1else if @mygrade <60set @e= @e + 1else if @mygrade <70set @d= @d + 1else if @mygrade <80set @c= @c + 1else if @mygrade <90set @b= @b + 1else if @mygrade <100set @a= @a + 1fetch next from level_cursor into @mygradeend
select @a,@b,@c,@d,@e
---4.关闭游标
close level_cursor
---5.释放游标
deallocate level_cursor
3.计算个人所得税
---1.声明游标
declare tax_cursor cursor
for select 员工编号,工资 from 工资表
---2.打开游标
open tax_cursor
---3.从游标中提取数据
declare @cno char(4),@salary int
fetch next from tax_cursor into @cno,@salary
while @@FETCH_STATUS=0beginif @mysalary > 3000update 工资表set 个人所得税 = (@salary-3000) * 0.1 where 员工编号 = @cno/*不可以没有where,否则数据会按照第一个符合条件的数据复制,而且游标会失效*/fetch next from salary_cursor into @mygradeend
---4.关闭游标
close tax_cursor
---5.释放游标
deallocate tax_cursor
存储过程
定义:存储过程(Stored Procedure)是一组完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行存储过程
1.查询不及格课程超过三门的学生信息
create proc myproc /*proc/procedure*/
as beginselect *from studentwhere sno in(select snofrom scwhere grade<60group by sno having count(*)>3)
end
--需要通过exec来执行
exec myproc
2.在student表中插入一条记录的存储过程
create proc proc_insert_student
@sno char(9), /*形参*/
@sname char(10),
@ssex char(2)='男',/*默认是 男*/
@sage int,
@sdept varchar(10)
as
begininsert into student(sno,sname,ssex,sage,sdept)values(@sno,@sname,@ssex,@sage,@sdept)
end--执行
exec proc_insert_student '201215138','李星渊','男',21,'IS'/*这种传参不可以省略参数*/
exec proc_insert_student @sno='201215138',@sname='李星渊',@sage=21,@sdept='IS'/*这种传参可以省略参数 */
3.求指定学号学生的平均成绩(含有输出型参数)
create proc proc_avgegrade
@sno char(9),
@savg int output /*用来带出结果;输出型参数*/
asbeginselect @savg=avg(grade)from sc where sno = @snoend
--执行(需要有局部变量来接收)
declare @avg int /*输出型变量需要定义局部变量来接收*/
set @avg = 0 /*这步可以省略*/
exec proc_avgegrade '201515121',@avg out/*注意out标注*/
select @avg
4.1 统计每个学生的平均成绩
create proc proc1
as
begin select AVG(grade)from scgroup by sno
end
4.2 统计特定学生的平均成绩
create proc proc2
@sno char(9)
as
begin select AVG(grade)from scwhere sno = @sno
end
4.3 统计特定学生的平均成绩并输出
create proc proc3
@sno char(9),
@savg int out
as
begin select @savg=AVG(grade)from scwhere sno=@sno
end
5.查找特定系的学生人数
create proc proc_sum
@sdept varchar(10),
@num int output
as
begin select @num = count(*)from studentwhere sdept = @sdept
end
自定义函数
标量 内嵌表
多语句(不讲)
注:
- function不可以简写
- 参数要用括号
- returns 返回的什么类型
- return 返回值
- 调用的时候要有架构名
标量值函数
1.返回一个不带时间的日期
create function dateonly(@date datetime)
returns varchar(12) /*是一种类型*/
asbegin return convert(varchar(12),@date ,101)/*类型转换*/end
--执行
select dbo.dateonly(GETDATE())/*必须写架构名称*/
2.判断出生年代 80 ,90 ,too old
判断出生年代 80 ,90 ,too old
create function whichgeneration(@birthday datetime)
returns varchar(10)
as begin if year(@birthday)<1980return 'too old'else if (@birthday)<1990return '80s'else return '90s'return 0 /*必须有这句话,否则执行不成功:最后一条语句必须是返回语句*/end
--执行
select dbo.whichgeneration('2000-05-07')
内嵌表值函数
1.返回学生的学号和姓名
create function fun1()
returns table/*返回的是一个表*/
as
return select sno,snamefrom student
--执行
select *
from fun1() /*fun1()执行的结果是表,所以可以出现在from中*/
2.查询制定学院学生的基本情况,定义成一个函数
create function fun_student(@sdept char(10))
returns table
asreturn select *from studentwhere Sdept = @sdept
--执行
select *
from fun_student('CS')
3.查找制定学院的平均成绩
create function attdance(@sdept varchar(20))
returns table
as
return select avg(grade) savg/*必须指定名字,否则查询的时候就无法指代了*/from student,scwhere student.sno = sc.sno and sdept = @sdept
比较
视图 | 存储过程 | 自定义函数 | |
---|---|---|---|
语句 | 只能是SELECT语句 | 可以包含程序流、逻辑以及SELECT语句 | 可以包含程序流、逻辑以及SELECT语句 |
输入 | 不能接受参数 | 可以有输入输出参数 | 有输入参数 |
返回值 | 只能返回结果集 | 只能是整数 | 可以返回标量值、表 |
典型应用 | 多个表格的连接查询 | 完成某个特定的较复杂的任务 | 可以完成比较复杂的任务,可以出现在select语句中 |
触发器
- 由事件触发
- 用来保证数据的完整性
- 两张临时表 inserted deleted
- 用于存放临时修改的数据(只存放一条)
- 字段和被作用的表一样
- 关于update:先删除,再插入
- 外键约束高于触发器约束,会先执行外键约束
- for=after before = inistead of
- 触发器不会管之前的记录
- raiserror:抛出错误提示
- 回滚事务(rollback transaction):之前做的操作全不算
- 在SC表中插入记录后,去检查STUDENT表中是否有相应学号
create trigger tr_sc_insert /*外键的约束高于触发器*/
on sc
after insert
as
begindeclare @sno char(9)select @sno = sno from inserted/*inserted表和scstudent表结构一样*/if not exists(select * from student where sno = @sno)delete from sc where sno=@sno
end
2.检查新插入的学生成绩记录,如果不在0到100,就删除
create trigger tr_sc_grade
on sc
after insert,update
as
begindeclare @grade intselect @grade=grade from insertedif(@grade>100 or @grade<0)beginraiserror('成绩必须在0—100之间',16,10)/*(错误信息,消息级别,错误号)抛出一个错误*/rollback transaction/*回滚事务,之前执行的操作会被回滚*/end
end
3.不允许修改sno
create trigger tr_student_update
on student
after insert
as
beginif update(sno)beginraiserror('不允许修改sno',16,10)rollback transactionend
end
Chapter08 数据库编程相关推荐
- 对比.Net PetShop和Duwamish来探讨Ado.Net的数据库编程模式
作者:卢彦 .NET PetShop和Duwamish简单介绍 相信大家一定听说过有名的"宠物店大战",没错,本文的主角之一就是获胜方.NET PetShop,微软号称以27倍的速 ...
- python3数据库编程_python3+PyQt5 数据库编程--增删改实例
本文通过python3+pyqt5改写实现了python qt gui 编程变成15章的excise例子. #!/usr/bin/env python3 import os import sys fr ...
- Scala入门到精通——第二十九节 Scala数据库编程
本节主要内容 Scala Mavenproject的创建 Scala JDBC方式訪问MySQL Slick简单介绍 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程 ...
- 数据库编程入门培训(二)
本文为数据库编程入门培训的第二讲,主要讲述一下数据库编程具体怎么实现.示例代码在本文后面的附件中可以下载. 如上篇文章所描述的那样,由于Microsoft Access数据库比较直观,适合初学者入门学 ...
- python数据库编程(1):潦草的开篇
一.前言 关于数据库编程,涉及知识点广而杂,所以我并非一遍就能掌握,这里汲取了我的实践和认识,算是对python数据库编程的做一个铺垫吧.在以后的学习过程中会不断地完善数据库编程的知识点,鉴于此,另当 ...
- Python环境下的数据库编程
数据库编程 简介 数据库三种数据模型 ADO.DAO.ODBC 使用DAO访问数据库 使用ODBC 访问数据库 三者区别 简介 在应用程序中有很多信息需要存储起来,存储的方式有多种,数据库就是其中的一 ...
- Delphi数据库编程一日通
Delphi数据库编程一日通. 通常情况下,利用 Delphi 开发数据库应用程序,可以使用TTable.TDataSource.TDBEdit.TDBNavigator等构件.只要正确设置了构件的某 ...
- Asp.Net数据库编程-10条最优方法[翻译]
Asp.Net数据库编程-10条最优方法[翻译] 原文标题:Using Data with ASP.Net - 10 of my 'Best Practices' 原文链接:http://www.de ...
- mysql 数据库编程_MySQL数据库编程(C++语言)
MySQL数据库编程(C++语言) 发布时间:2018-05-24 21:06, 浏览次数:452 , 标签: MySQL 本文主要介绍使用C++语言连接和操作 MySQL 数据库的方法. 1. 准备 ...
- 有关数据库MySQL的演讲_有关Mysql数据库编程的文章推荐10篇
在Python网络爬虫中,通常是通过TXT纯文本方式存储,其实也是可以存储在数据库中的:同时在WAMP(Windows.Apache.MySQL.PHP或Python)开发网站中,也可以通过Pytho ...
最新文章
- 赋茶计算机基础知识,计算机基础知识选择题_new解析.doc
- ActiveMQ入门案例-生产者代码实现
- 十年前,他如何自学技术进阿里?
- Struts2自定义标签——示例
- linux 下nc-verilog 仿真环境搭建,Cadence NC Verilog仿真教程
- mysql string agg_postgresql – 如何使array_agg()像mySQL中的group_concat()一样工作
- 思步网6月底再次重磅出击:《CrystalBall User Manual 7.3(水晶球操作手册7.3)中英文对照版》
- ib网卡命令_InfiniBand 网卡测试
- vue中虚拟dom和diff算法
- nyoj 54-小明的存钱计划
- MongoTemplate实现mongodb聚合管道查询
- Android Notification 详解——基本操作
- LCD屏幕,IPS屏幕,TFT屏幕,SLCD屏幕和AMOLED手机屏幕介
- java小游戏 飞翔的小鸟,校园新手入门,分分钟带你玩转编程
- 【云宏大讲坛】超融合,融合的不仅是基础架构
- Lorem在HTML的使用
- 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。
- Mall商城后台管理系统——(Vue+SSM)
- RSS从入门到精通 .
- 阿里校园招聘前端面试
热门文章
- (转)对冲基金投身“另类数据”淘金热
- (转)FOF、MOM投资模式与金融科技应用展望
- 中讯环亚开始招大客户销售啦
- php随机函数给字加颜色,四种php随机字生成符串的方法
- 【时间序列预测】基于matlab LMS麦基玻璃时间序列预测【含Matlab源码 1443期】
- 【图像重建】基于matlab GUI投影法图像重建【含Matlab源码 861期】
- 【图像修复】基于matlab GUI约束最小二乘方滤波图像复原【含Matlab源码 852期】
- 【语音合成】基于matlab线性预测系数和基音参数语音合成【含Matlab源码 563期】
- 怎样理解电脑评分_电脑可以理解我们的情绪吗?
- 语音通话视频通话前端_无需互联网即可进行数十亿视频通话