diff --git "a/08\345\273\226\346\237\217\346\210\220/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232/2022-9-29\347\254\224\350\256\260.txt" "b/08\345\273\226\346\237\217\346\210\220/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232/2022-9-29\347\254\224\350\256\260.txt" index 90166f57483e74c0e569a2c102d9a01066d29b1d..822dcc1fa91fa7f5a3296d9b5f979a88299092a5 100644 --- "a/08\345\273\226\346\237\217\346\210\220/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232/2022-9-29\347\254\224\350\256\260.txt" +++ "b/08\345\273\226\346\237\217\346\210\220/\347\254\254\344\271\235\346\254\241\344\275\234\344\270\232/2022-9-29\347\254\224\350\256\260.txt" @@ -45,31 +45,5 @@ dbcc useroptions set transaction isolation level <隔离级别> -unpivot:列转行函数 - -select name,subject,score from -test -unpivot( ---list = [0,1,2,3] --- for x in [0,1,2,3] x:0 --> 1 --> 2 -->3 - -- ---for ... in (eng,math,c) ---新列名 for 新列名1 in (原来表的列名) -score for [subject] in (eng,math,chinese) --- subject in eng --> score --- subject in math --> score --- subject in chinese --> score -) as T - - - -pivot:行转列 - -select * from test1 -pivot( ---聚合函数(旧列名) for 旧列名 in (原有数据表的值当做新列名) -count(isvic) for isVic in (胜,负) -) as T1 - diff --git "a/08\345\273\226\346\237\217\346\210\220/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232/2022-10-6\347\254\224\350\256\260.txt" "b/08\345\273\226\346\237\217\346\210\220/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232/2022-10-6\347\254\224\350\256\260.txt" new file mode 100644 index 0000000000000000000000000000000000000000..71e40fdcd75233ec33422956cf7e3f5b86205b2c --- /dev/null +++ "b/08\345\273\226\346\237\217\346\210\220/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232/2022-10-6\347\254\224\350\256\260.txt" @@ -0,0 +1,16 @@ + 函数 + +函数分为 +(1)系统函数: +(2)自定义函数(方法:将一个功能封装成可重用的函数) + +其中自定义函数又可以分为 +(1)标量值函数(返回单个值) +(2)表值函数(返回查询结果) + +有些函数是在表值函数下写的有些是在标量值下写的, +区别是表值函数只能返回一个表,标量值函数可以返回基类型 + +-1.标量值函数: 1.returns 数据类型 2.return 标量(某个值) +- +--2.多语句表值函数 1.returns 表名 table(字段 数据类型) 2.return diff --git "a/08\345\273\226\346\237\217\346\210\220/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232/SQLQuery2022-10-7.sql" "b/08\345\273\226\346\237\217\346\210\220/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232/SQLQuery2022-10-7.sql" new file mode 100644 index 0000000000000000000000000000000000000000..41ed5c6eabf346d6558c947375d8ee12dbd5ca8b --- /dev/null +++ "b/08\345\273\226\346\237\217\346\210\220/\347\254\254\345\215\201\346\254\241\344\275\234\344\270\232/SQLQuery2022-10-7.sql" @@ -0,0 +1,123 @@ +select * from AccountInfo --个人信息 +select * from BankCard --银行卡信息 +select * from CardStateChange --银行卡状态更改表 +select * from CardTransfer --转账表 +select * from CardExchange --交易记录 + + +--(1)编写一个函数求该银行的金额总和 +go + create function func_GetSumm() +returns @su table( + CardMoney money +) +as +begin + insert into @su + select sum(CardMoney) from BankCard + return +end +go +select * from func_GetSumm() + + +--(2)传入账户编号,返回账户真实姓名 + go + create function xxx(@accountId int) +returns @info table( + RealName varchar(20) +) +as +begin + insert into @info + select RealName from AccountInfo where AccountId = @accountId + return + end +go + select * from xxx(1) + + + +--(3)传递开始时间和结束时间,返回交易记录(存钱取钱),交易记录中包含 真实姓名,卡号,存钱金额,取钱金额,交易时间。 + +--方案一(逻辑复杂,函数内容除了返回结果的sql语句还有其他内容,例如定义变量等): +go + create function jiao(@begin smalldatetime,@end smalldatetime) + returns @btime table( + RealName varchar(20), + CardNo varchar(20), + MoneyIn money, + MoneyOut money, + CardTime smalldatetime + ) +as +begin + insert into @btime + select na.RealName,na.CardNo,c.MoneyInBank,c.MoneyOutBank,c.ExchangeTime from CardExchange c + inner join ( select b.CardNo,a.RealName from AccountInfo a inner join bankcard b on a.AccountId=b.AccountId + )na on na.CardNo =c.CardNo + where ExchangeTime>=@begin and ExchangeTime<=@end + return + end + go + select * from jiao('2022-09-19 18:02:00','2022-09-19 18:05:00') + + +--(4)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户",分别显示卡号,身份证,姓名,余额,用户等级,银行卡状态。 + +--方案一:直接在sql语句中使用case when +go +create function mes(@id int) + returns @message table( + 银行卡状态 varchar(50), + 银行卡等级 varchar(50) + )as + begin + insert into @message + select + case CardState + when 1 then '正常' + when 2 then '挂失' + when 3 then '冻结' + when 4 then '注销' + end 银行卡状态, + case + when cardmoney>300000 then 'VIP用户' + else '普通用户' + end 银行卡等级 + from BankCard where AccountId=@id + return + end +go + select * from mes(3) + +--方案二:将等级和状态用函数实现 + +--(5)编写函数,根据出生日期求年龄,年龄求实岁,例如: + +​ -- 生日为2000-5-5,当前为2018-5-4,年龄为17岁 +​ -- 生日为2000-5-5,当前为2018-5-6,年龄为18岁 +go +create function age(@id int) + returns @age table( + 年龄 int + ) + as + begin + insert into @age + select + case + when month(GETDATE())>month(OpenTime) + then YEAR(GETDATE())-YEAR(OpenTime) + when month(GETDATE())day(OpenTime) + then YEAR(GETDATE())-YEAR(OpenTime) + when month(GETDATE())=month(OpenTime) and day(GETDATE())