diff --git "a/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0920\346\270\270\346\240\207\347\273\203\344\271\240.md" "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0920\346\270\270\346\240\207\347\273\203\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..cb4a2d9d24732dc91bf3619df8461126e32280ea --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0920\346\270\270\346\240\207\347\273\203\344\271\240.md" @@ -0,0 +1,161 @@ +数据库; + +```sql +create database STUDENTS +go +use STUDENTS +go + +CREATE TABLE tb_student ( + stu_num char(8) primary key, + name char(20) NOT NULL, + gender bit DEFAULT NULL, + birth date DEFAULT NULL, + school char(20) DEFAULT NULL, + major char(20) DEFAULT NULL, +); +go +insert into tb_student values('16100101','马诗',1,'1998-03-16','理学院','统计'); +insert into tb_student values('16130201','博文',0,'1998-04-24','信息学院','计算机科学与技术'); +insert into tb_student values('16130203','魏波',1,'1998-10-29','信息学院','计算机科学与技术'); +insert into tb_student values('16130205','黄弘',1,'1998-08-06','信息学院','数据科学与大数据技术'); +insert into tb_student values('17100104','易高明',0,'1999-05-29','理学院','信息与计算科学'); +insert into tb_student values('17100105','万承承',0,'1999-09-11','理学院','信息与计算科学'); +insert into tb_student values('17110101','黄弘',0,'2000-07-25','文法学院','法学'); +insert into tb_student values('17130202','邹睿睿',1,'1998-06-29','信息学院','计算机科学与技术'); +insert into tb_student values('17130204','马又云',1,'1999-03-27','信息学院','数据科学与大数据技术'); +insert into tb_student values('18100103','邓承明',1,'2000-07-25','理学院','信息与计算科学'); + + +CREATE TABLE tb_inf_student( + stu_num char(8) primary key foreign key references tb_student(stu_num), + hobby varchar(120) DEFAULT NULL, + speciality varchar(120) DEFAULT NULL, + ori_loca char(16) DEFAULT NULL, + prize int DEFAULT NULL, +); +go + +insert into tb_inf_student values('16100101','听音乐','艺术特长','北京',2); +insert into tb_inf_student values('16130201','看小说',null,'湖南',3); +insert into tb_inf_student values('16130203','硬笔书法','艺术特长','新疆',1); +insert into tb_inf_student values('16130205','听音乐','艺术特长','北京',2); +insert into tb_inf_student values('17100104','打篮球',null,'北京',3); +insert into tb_inf_student values('17100105','编程','科技特长','北京',2); +insert into tb_inf_student values('17110101','打篮球','科技特长','河北',2); +insert into tb_inf_student values('17130202','编程','科技特长','天津',3); +insert into tb_inf_student values('17130204','看电影',null,'北京',1); +insert into tb_inf_student values('18100103',null,null,'河南',null); +go + + +CREATE TABLE tb_bibliography ( + ISBN char(13) primary key, + name char(32) DEFAULT NULL, + author char(32) DEFAULT NULL, + publishing char(32) DEFAULT NULL, + pub_time date DEFAULT NULL, + intro varchar(200) DEFAULT NULL, + category char(8) DEFAULT NULL, + price money DEFAULT NULL, +); +go + +insert into tb_bibliography values('7040409659','大学计算机','李凤霞','高等教育出版社','2014','教育部大学计算机课程改革项目规划教材','TP',28); +insert into tb_bibliography values('7301046065','刑法学','高明轩','北京大学出版社','2000','刑法_法学高等学校中国教材','O',69); +insert into tb_bibliography values('7806553312','射雕英雄传','金庸','广州出版社','2018','金庸作品集','I',67.9); +insert into tb_bibliography values('9788020002207','红楼梦','曹雪芹','人民文学出版社','2008','学术研究或个人阅读都非常合适','I',31.25); +insert into tb_bibliography values('9787113254100','Python语言及其应用','赵广辉','中国铁道出版社','2019','本书介绍Python语言的基础知识及其在各个领域的具体应用','TP',62.2); +insert into tb_bibliography values('9787115266156','管理信息系统实用教程(第2版)','王若宾','人民邮电出版社','2012','普通高等教育\十一五\国家级规划教材','TP',36); +insert into tb_bibliography values('9787115356840','管理信息系统实用教程(第3版)','王若宾','人民邮电出版社','2015','普通高等教育\十一五\国家级规划教材','TP',45); +insert into tb_bibliography values('9787302252955','人工智能:一种现代的方法(第3版)','黄今夏','清华大学出版社','2011','《人工智能:一种现代的方法(第3版)》为大学计算机教育著名教材系列之一','TP',132.6); +insert into tb_bibliography values('9787513030953','信息论','田甜','知识产权出版社','2015','文理科公选课指定教材','TP',126); +insert into tb_bibliography values('9787569302585','计算统计(第2版)','冯新奇','西安交通大学出版社','2018','本书涵盖了计算统计的所有核心内容','TP',67.5); +insert into tb_bibliography values('9789113268712','新编数据库技术','王若宾','中国铁道出版社','2018','本书重构了课程内容结构','TP',38.5); + + + +CREATE TABLE tb_book( + barcode char(9) primary key, + ISBN char(13) foreign key references tb_bibliography(ISBN), + [status] bit default null, +); + +insert into tb_book values('O924.01','7301046065',0); +insert into tb_book values('O924.02','7301046065',1); +insert into tb_book values('O924.03','7301046065',1); +insert into tb_book values('I13.212','9788020002207',1); +insert into tb_book values('I13.213','9788020002207',1); +insert into tb_book values('I247.56','7806553312',1); +insert into tb_book values('I247.59','7806553312',0); +insert into tb_book values('TP122.32','9787569302585',1); +insert into tb_book values('TP122.33','9787569302585',1); +insert into tb_book values('TP311.11','9787113254100',1); +insert into tb_book values('TP311.12','9787113254100',0); +insert into tb_book values('TP311.13','9787115356840',1); +go + + +CREATE TABLE tb_record( + rid int primary key identity(1,1), + stu_num char(8) references tb_student(stu_num), + barcode char(9) references tb_book(barcode), + borrow_time datetime DEFAULT NULL, + return_time datetime DEFAULT NULL, +); +go + +insert into tb_record values('16130203','I247.56','2019-04-09','2019-04-13'); +insert into tb_record values('17130204','I247.56','2019-04-15','2019-04-17'); +insert into tb_record values('16130205','I247.59','2019-04-17','2019-04-20'); +insert into tb_record values('16100101','I247.56','2019-04-17','2019-04-18'); +insert into tb_record values('17100105','TP311.11','2019-04-29',null); +insert into tb_record values('16130201','I247.59','2019-05-01','2019-05-20'); +insert into tb_record values('17130202','TP311.12','2019-05-03',null); +insert into tb_record values('18100103','I13.212','2019-05-04','2019-05-15'); +insert into tb_record values('18100103','I13.213','2019-05-20','2019-05-30'); +insert into tb_record values('17110101','O924.01','2019-05-25',null); +go + + +select * from tb_student +select * from tb_inf_student +select * from tb_bibliography +select * from tb_book +select * from tb_record + +``` + +# 游标练习 + +```sql +-- 创建学生游标,该游标包含(学生姓名,兴趣爱好,生源地,荣誉总数) +declare student cursor scroll for +(select name,hobby,ori_loca,prize from tb_student stu +inner join tb_inf_student istu on stu.stu_num=istu.stu_num ) +-- 循环遍历161开头的学生信息 +declare stu cursor scroll for +(select * from tb_student where stu_num like '161%') +open stu +declare @num varchar(10),@name varchar(10),@sex varchar(2),@birth date, @school varchar(20),@major varchar(20) +fetch first from stu into @num,@name,@sex,@birth,@school,@major +while @@FETCH_STATUS=0 + begin + print @num+','+@name+','+@sex+','+convert(varchar(20),@birth)+','+@school+','+@major + fetch next from stu into @num,@name,@sex,@birth,@school,@major + end +close stu + +-- 使用游标统计生源地为北京的荣誉总数 +declare prize cursor scroll for +(select sum(prize) 荣誉总数 from tb_inf_student where ori_loca='北京') +open prize +declare @prize int +fetch first from prize into @prize +begin + print '北京的荣誉总数'+convert(varchar(20),@prize) +end +close prize +deallocate prize +``` + diff --git "a/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0921\345\207\275\346\225\260\347\273\203\344\271\240.md" "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0921\345\207\275\346\225\260\347\273\203\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..377389f921c748c94a59eceeeea908e781dae855 --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\344\275\234\344\270\232/0921\345\207\275\346\225\260\347\273\203\344\271\240.md" @@ -0,0 +1,235 @@ +数据库 + +```sql +create database BankTest; +go +use banktest; +go +--账户信息表:存储个人信息 +create table AccountInfo +( + AccountId int primary key identity(1,1), --账户编号 + AccountCode varchar(20) not null, --身份证号码 + AccountPhone varchar(20) not null, --电话号码 + RealName varchar(20) not null, --真实姓名 + OpenTime smalldatetime not null, --开户时间 +) +--银行卡表:存储银行卡信息 +create table BankCard +( + CardNo varchar(30) primary key, --银行卡卡号 + AccountId int not null, --账户编号(与账户信息表形成主外键关系) + CardPwd varchar(30) not null, --银行卡密码 + CardMoney money not null, --银行卡余额 + CardState int not null,--1:正常,2:挂失,3:冻结,4:注销 + CardTime smalldatetime default(getdate()) --开卡时间 +) +--交易信息表(存储存钱和取钱的记录) +create table CardExchange +( + ExchangeId int primary key identity(1,1), --交易自动编号 + CardNo varchar(30) not null, --银行卡号(与银行卡表形成主外键关系) + MoneyInBank money not null, --存钱金额 + MoneyOutBank money not null, --取钱金额 + ExchangeTime smalldatetime not null, --交易时间 +) +--转账信息表(存储转账信息记录) +create table CardTransfer +( + TransferId int primary key identity(1,1),--转账自动编号 + CardNoOut varchar(30) not null, --转出银行卡号(与银行卡表形成主外键关系) + CardNoIn varchar(30) not null, --转入银行卡号(与银行卡表形成主外键关系) + TransferMoney money not null,--交易金额 + TransferTime smalldatetime not null, --交易时间 +) +--状态信息变化表(存储银行卡状态变化的记录,状态有1:正常,2:挂失,3:冻结,4:注销) +create table CardStateChange +( + StateId int primary key identity(1,1),--状态信息自动编号 + CardNo varchar(30) not null, --银行卡号(与银行卡表形成主外键关系) + OldState int not null, --银行卡原始状态 + NewState int not null, --银行卡新状态 + StateWhy varchar(200) not null, --状态变化原因 + StateTime smalldatetime not null, --记录产生时间 +) + + + +--为刘备,关羽,张飞三个人进行开户开卡的操作 +--刘备身份证:420107198905064135 +--关羽身份证:420107199507104133 +--张飞身份证:420107199602034138 +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107198905064135','13554785425','刘备',GETDATE()) +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('6225125478544587',1,'123456',0,1) + +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107199507104133','13454788854','关羽',GETDATE()) +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('6225547858741263',2,'123456',0,1) + +insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime) +values('420107199602034138','13456896321','张飞',GETDATE()) +insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState) +values('6225547854125656',3,'123456',0,1) + +select * from AccountInfo +select * from BankCard + + + +--进行存钱操作,刘备存钱2000元,关羽存钱:8000元,张飞存钱:500000元 +select * from AccountInfo +update BankCard set CardMoney = CardMoney + 2000 where CardNo = '6225125478544587' +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225125478544587',2000,0,GETDATE()) + +update BankCard set CardMoney = CardMoney + 8000 where CardNo = '6225547858741263' + +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225547858741263',8000,0,GETDATE()) + +update BankCard set CardMoney = CardMoney + 500000 where CardNo = '6225547854125656' +insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) +values('6225547854125656',500000,0,GETDATE()) + +--转账:刘备给张飞转账1000元 +update BankCard set CardMoney = CardMoney -1000 where CardNo = '6225125478544587' +update BankCard set CardMoney = CardMoney + 1000 where CardNo = '6225547854125656' + +insert into CardTransfer(CardNoOut,CardNoIn,TransferMoney,TransferTime) +values('6225125478544587','6225547854125656',1000,GETDATE()) + + + +select * from AccountInfo --个人信息 +select * from BankCard --银行卡信息 +select * from CardStateChange --银行卡状态更改表 +select * from CardTransfer --转账表 +select * from CardExchange --交易记录 +``` + +# 函数练习 + +```sql +--( 1)编写一个函数求该银行的金额总和 +go +create function [money]() +returns money +as +begin + return (select sum(CardMoney) from BankCard) +end +go +select dbo.money() +--(2)传入账户编号,返回账户真实姓名 +go +create function accid(@id int) +returns varchar(10) +as +begin + return (select RealName from AccountInfo where AccountId=@id) +end +go +select dbo.accid(1) +--(3)传递开始时间和结束时间(某个时间段),返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 +go +create function Exchange(@stare date,@end date) +returns @ExchangeInfo table(name varchar(20),carno varchar(20),inmoney money,outmoney money,exchangetime date) +as +begin + insert @ExchangeInfo + select RealName,bc.CardNo,MoneyInBank,MoneyOutBank,ExchangeTime from AccountInfo ac + inner join BankCard bc on ac.AccountId=bc.AccountId + inner join CardExchange ex on bc.CardNo=ex.CardNo + where ExchangeTime between @stare and @end + return +end +go + +select * from Exchange('2022.09.20','2022.09.22') +--方案一(逻辑复杂,函数内容除了返回结果的sql语句还有其他内容,例如定义变量等): + +--(4)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”, +--根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户", +--分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +--方案一:直接在sql语句中使用case when +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额, +case + when CardMoney>300000 then 'VIP用户' + else '普通用户' +end 用户等级, +case + when CardState = 1 then '正常' + when CardState = 2 then '挂失' + when CardState = 3 then '冻结' + when CardState = 4 then '注销' +end 银行卡状态 +from BankCard b +inner join AccountInfo a on a.AccountId=b.AccountId +--方案二:将等级和状态用函数实现 + +--等级函数 +go +create function great(@myMoney int) +returns varchar(10) +as +begin + declare @result varchar(10)--声明用户等级 + if @myMoney < 300000 + set @result = '普通用户' + else + set @result = 'VIP用户' + return @result --返回用户等级 +end +go +--状态函数 +go +create function [status](@myNum int) +returns varchar(10) +as +begin + declare @result varchar(10) --声明状态 + if @myNum = 1 + set @result = '正常' + else if @myNum = 2 + set @result = '挂失' + else if @myNum = 3 + set @result = '冻结' + else if @myNum = 4 + set @result = '注销' + else + set @result = '异常' + return @result --返回状态 +end +go + +--查找 +select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额, +dbo.great(CardMoney) 账户等级,dbo.[status](CardState) 银行卡状态 +from BankCard inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId +--(5)编写函数,根据出生日期求年龄,年龄求实岁,例如: + +-- 生日为2000-5-5,当前为2018-5-4,年龄为17岁 +-- 生日为2000-5-5,当前为2018-5-6,年龄为18岁 +go +create function f_birthdayToAge --定义函数f_birthdayToAge +(@BirthDate datetime,@ThisDate datetime) --@BirthDate 第一个参数 datetime @ThisDate第二个参数 datetime +returns int --返回值类型 +as +begin + declare @nYear int --定义年龄 + select @nYear = datediff(yy, @BirthDate, @ThisDate) --计算当前日期和出生日期的年份差值 + select @nYear = case + when datediff(dd, dateadd(yy, @nYear, @BirthDate), @ThisDate) < 0 then @nYear - 1 + else @nYear + end --当前日期加上年份差值再和当前日期比较,如果小于当前日期,就把年份减去1,否则就取年份差值 + return @nYear -- 返回年龄 +end +go +select dbo.f_birthdayToAge('2000-5-5','2018-5-4') +select dbo.f_birthdayToAge('2000-5-5','2018-5-6') +``` + diff --git "a/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-19\344\272\213\345\212\241.md" "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-19\344\272\213\345\212\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..1472194108cbd96f878049762964ed44496b74ae --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-19\344\272\213\345\212\241.md" @@ -0,0 +1,43 @@ +#事务 + +## 定义 + +**事务中的所有 SQL 语句是一个整体,共同进退,不可分割,要么全部执行成功,要么全部执行失败。** + +## 语法 + +```sql +begin transaction --开始事务 +commit transaction --提交事务 +rollback transaction --事务回滚 +``` + +例子: + +1. + +```sql +--假设取款6000,(添加check约束,设置账户余额必须>=0),要求:使用事务实现,修改余额和添加取款记录两步操作使用事务 +begin transaction +declare @mon money = 6000 +declare @no varchar(20) +declare @err int = 0 --一开始所有语句都没有错误 +select @no = cardno from BankCard where AccountId=(select AccountId from AccountInfo where RealName='刘备') +update BankCard set CardMoney=CardMoney-@mon where AccountId=(select AccountId from AccountInfo where RealName='刘备') +set @err += @@ERROR +insert CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime) values(@no,0,@mon,getdate()) + + +if @err>0 + begin + print '事务提交失败' + rollback transaction + end +else + begin + print '事务提交成功' + commit transaction + end + +``` + diff --git "a/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-20 \346\270\270\346\240\207.md" "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-20 \346\270\270\346\240\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..106334d55d24a71f60acf168591968d3b8479d41 --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-20 \346\270\270\346\240\207.md" @@ -0,0 +1,62 @@ +# 游标 + +## 定义 + +游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成**单个记录处理方式**。 + +## 创建游标 + +```sql +创建游标(Scroll代表滚动游标,不加Scroll则是只进的,只能支持fetch next) +declare <游标名> cursor scroll for select stuname from stuinfo +``` + +## 打开游标 + +```sql +open <游标名> +``` + +## 关闭游标 + +```sql +close <游标名> +``` + +## 删除游标 + +```sql +deallocate <游标名> +``` + +## 提取数据 + +```sql +fetch first from <游标名> --结果集的第一行 +fetch last from <游标名> --最后一行 +fetch absolute 1 from <游标名> --从游标的第一行开始数,第n行。 +fetch relative 3 from <游标名> --从当前位置数,第n行。 +fetch next from <游标名> --当前位置的下一行 +fetch prior from <游标名> --当前位置的上一行 +``` + +##游标指向某行多列数据 + +```sql +declare 游标名 cursor [scroll] for (select 列1,列2,列3,列4 from 表名) + +把数据赋给变量 + +fetch **first** from 游标名 into 变量1,变量2,变量3,变量4 +``` + +## 全局变量 @@FETCH_STATUS + +```sql +@@FETCH_STATUS=0,提取成功 + +@@FETCH_STATUS=-1,提取失败 + +@@FETCH_STATUS=-2,行不存在 +``` + diff --git "a/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-21\345\207\275\346\225\260.md" "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-21\345\207\275\346\225\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..fa083c10bff79690b0af30a87543d822e2f8ab75 --- /dev/null +++ "b/\347\224\260\351\221\253\345\274\272/\347\254\224\350\256\260/09-21\345\207\275\346\225\260.md" @@ -0,0 +1,103 @@ +# 函数 + +##定义 + +1. 系统函数 +2. 自定义函数(方法:将一个功能封装成可重用的函数)。类似于Java中的方法 + +## 标量值函数(返回单个值) + +语法 + +```sql +CREATE FUNCTION function_name(@parameter_name parameter_data_type) --(@参数名 参数的数据类型) +RETURNS date_type --返回返回值的数据类型 + +[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密 + +[AS] + +BEGIN + + function_body --函数体 + + RETURN 表达式; + +END +``` + +例子 + +```sql +--实现两个值的加和 1+....+ 10 +go +create function Totalsum(@A int , @B int) +returns int +as +begin + declare @i int = @A + declare @sum int = 0 + while @i<=@B + begin + set @sum += @i --sum = sum + i + set @i += 1 + end + + return @sum +end +go + +select dbo.Totalsum(1,10) +``` + + + +##表值函数(返回查询结果) + +语法 + +```sql +create function 名称 + +([{@参数名称 参数类型[=默认值]}[,n]]) + +returns @局部变量 table(参数名 参数类型) + +[with encryption] + +[as] + +begin + +函数体 + +return 函数返回值 + +end +``` + +例子 + +```sql +--求总分,返回学生的所有信息 +--返回一张表 +--输入学号 输出该学生信息:学号,姓名,总分 +go +create function GetInfoById(@id varchar(20)) +returns @tableInfo table(stuid varchar(20),stuName varchar(30), sumscore int) +as +begin + --往新表中插入数据 + insert into @tableInfo + --查询语句 + select StuScore.StuID,StuName,(Chinese+English+Math) total + from StuScore join StuInfo on StuInfo.StuNo=StuScore.StuID where StuName like '%'+@id+'%' + --返回 + return +end +go + +select * from dbo.GetInfoById('无') + +``` +