重点:游标 存储过程 自定义函数 触发器

局部变量

  1. 规则

    • 字母或_、@、#开头的字母数字或_、@、$序列
    • 不与保留字相同
    • 长度小于128
    • 不符合规则的标识符必须加以界定(双引号""或方括号[])
  2. 注意
    • 不能在声明的时候赋值
    • 赋值: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:表示提取的数据不存在

步骤

  1. 声明一个游标 declare,cursor
  2. 打开游标:open
  3. 从游标中提取数据 fetch,@@FETCH_STATUS
  4. 关闭游标:close
    • 如果没有释放,可以用open重新打开
    • 关闭后仍会有内存消耗,所以要释放,释放后不可以用open打开
  5. 释放游标: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


自定义函数

标量 内嵌表
多语句(不讲)

注:

  1. function不可以简写
  2. 参数要用括号
  3. returns 返回的什么类型
  4. return 返回值
  5. 调用的时候要有架构名

标量值函数

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语句中


触发器

  1. 由事件触发
  2. 用来保证数据的完整性
  3. 两张临时表 inserted deleted
    1. 用于存放临时修改的数据(只存放一条
    2. 字段和被作用的表一样
  4. 关于update:先删除,再插入
  5. 外键约束高于触发器约束,会先执行外键约束
  6. for=after before = inistead of
  7. 触发器不会管之前的记录
  8. raiserror:抛出错误提示
  9. 回滚事务(rollback transaction):之前做的操作全不算
  1. 在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 数据库编程相关推荐

  1. 对比.Net PetShop和Duwamish来探讨Ado.Net的数据库编程模式

    作者:卢彦 .NET PetShop和Duwamish简单介绍 相信大家一定听说过有名的"宠物店大战",没错,本文的主角之一就是获胜方.NET PetShop,微软号称以27倍的速 ...

  2. python3数据库编程_python3+PyQt5 数据库编程--增删改实例

    本文通过python3+pyqt5改写实现了python qt gui 编程变成15章的excise例子. #!/usr/bin/env python3 import os import sys fr ...

  3. Scala入门到精通——第二十九节 Scala数据库编程

    本节主要内容 Scala Mavenproject的创建 Scala JDBC方式訪问MySQL Slick简单介绍 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程 ...

  4. 数据库编程入门培训(二)

    本文为数据库编程入门培训的第二讲,主要讲述一下数据库编程具体怎么实现.示例代码在本文后面的附件中可以下载. 如上篇文章所描述的那样,由于Microsoft Access数据库比较直观,适合初学者入门学 ...

  5. python数据库编程(1):潦草的开篇

    一.前言 关于数据库编程,涉及知识点广而杂,所以我并非一遍就能掌握,这里汲取了我的实践和认识,算是对python数据库编程的做一个铺垫吧.在以后的学习过程中会不断地完善数据库编程的知识点,鉴于此,另当 ...

  6. Python环境下的数据库编程

    数据库编程 简介 数据库三种数据模型 ADO.DAO.ODBC 使用DAO访问数据库 使用ODBC 访问数据库 三者区别 简介 在应用程序中有很多信息需要存储起来,存储的方式有多种,数据库就是其中的一 ...

  7. Delphi数据库编程一日通

    Delphi数据库编程一日通. 通常情况下,利用 Delphi 开发数据库应用程序,可以使用TTable.TDataSource.TDBEdit.TDBNavigator等构件.只要正确设置了构件的某 ...

  8. Asp.Net数据库编程-10条最优方法[翻译]

    Asp.Net数据库编程-10条最优方法[翻译] 原文标题:Using Data with ASP.Net - 10 of my 'Best Practices' 原文链接:http://www.de ...

  9. mysql 数据库编程_MySQL数据库编程(C++语言)

    MySQL数据库编程(C++语言) 发布时间:2018-05-24 21:06, 浏览次数:452 , 标签: MySQL 本文主要介绍使用C++语言连接和操作 MySQL 数据库的方法. 1. 准备 ...

  10. 有关数据库MySQL的演讲_有关Mysql数据库编程的文章推荐10篇

    在Python网络爬虫中,通常是通过TXT纯文本方式存储,其实也是可以存储在数据库中的:同时在WAMP(Windows.Apache.MySQL.PHP或Python)开发网站中,也可以通过Pytho ...

最新文章

  1. 赋茶计算机基础知识,计算机基础知识选择题_new解析.doc
  2. ActiveMQ入门案例-生产者代码实现
  3. 十年前,他如何自学技术进阿里?
  4. Struts2自定义标签——示例
  5. linux 下nc-verilog 仿真环境搭建,Cadence NC Verilog仿真教程
  6. mysql string agg_postgresql – 如何使array_agg()像mySQL中的group_concat()一样工作
  7. 思步网6月底再次重磅出击:《CrystalBall User Manual 7.3(水晶球操作手册7.3)中英文对照版》
  8. ib网卡命令_InfiniBand 网卡测试
  9. vue中虚拟dom和diff算法
  10. nyoj 54-小明的存钱计划
  11. MongoTemplate实现mongodb聚合管道查询
  12. Android Notification 详解——基本操作
  13. LCD屏幕,IPS屏幕,TFT屏幕,SLCD屏幕和AMOLED手机屏幕介
  14. java小游戏 飞翔的小鸟,校园新手入门,分分钟带你玩转编程
  15. 【云宏大讲坛】超融合,融合的不仅是基础架构
  16. Lorem在HTML的使用
  17. 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。
  18. Mall商城后台管理系统——(Vue+SSM)
  19. RSS从入门到精通 .
  20. 阿里校园招聘前端面试

热门文章

  1. (转)对冲基金投身“另类数据”淘金热
  2. (转)FOF、MOM投资模式与金融科技应用展望
  3. 中讯环亚开始招大客户销售啦
  4. php随机函数给字加颜色,四种php随机字生成符串的方法
  5. 【时间序列预测】基于matlab LMS麦基玻璃时间序列预测【含Matlab源码 1443期】
  6. 【图像重建】基于matlab GUI投影法图像重建【含Matlab源码 861期】
  7. 【图像修复】基于matlab GUI约束最小二乘方滤波图像复原【含Matlab源码 852期】
  8. 【语音合成】基于matlab线性预测系数和基音参数语音合成【含Matlab源码 563期】
  9. 怎样理解电脑评分_电脑可以理解我们的情绪吗?
  10. 语音通话视频通话前端_无需互联网即可进行数十亿视频通话