屌丝学编程,SQL视频学习笔记
一、信息打印
print 'hello,sql' --直接打印消息
select 'hello,sql' --在表格中打印消息,可以设置多列,以及每一列的名字
二、变量
T-SQL中变量分为局部变量和全局变量
局部变量: (1)以@作为前缀 (2)先声明,在赋值
declare @str varchar(20)
set @str='I like sql'
print @str
==备注:set赋值和select赋值区别:==
set:赋给变量指定的值
select:一般用于从表中查询出的数据,查询记录如果有多条,将最后一条记录的值赋给变量。例如:
select @变量名 = 字段名 from 表名
在赋值过程中,如果是表中查询的数据,如果记录只有一条,使用set和select都可以,但是习惯上使用select。
全局变量: (1)以@@作为前缀 (2)由系统进行定义和维护,只读
- @@ERROR:返回执行的上一个语句的错误号
- @@IDENTITY:返回最后插入的标识值
- @@MAX_CONNECTIONS:返回允许同时进行的最大用户连接数
- @@ROWCOUNT:返回受上一语句影响的行数
- @@SERVERNAME:返回运行 SQL Server 的本地服务器的名称
- @@SERVICENAME:返回 SQL Server 正在其下运行的注册表项的名称
- @@TRANCOUNT:返回当前连接的活动事务数
- @@LOCK_TIMEOUT:返回当前会话的当前锁定超时设置(毫秒)
变量示例: (1)为赵云此人进行开户开卡操作,赵云身份证:420107199904054233
insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime)
values('420107199904054233','13554785965','赵云',GETDATE())
declare @AccountId int
set @AccountId=@@IDENTITY
insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState)
values('6225125478544588',@AccountId,'123456',0,1)
(2)需要求出张飞的银行卡卡号和余额,张飞身份证:420107199602034138
select CardNo 卡号,CardMoney 余额 from BankCard
inner join AccountInfo on BankCard.AccountId=AccountInfo.AccountId
where AccountCode='420107199602034138'
或者
declare @AccountId int
select @AccountId =
(select AccountId from AccountInfo where AccountCode='420107199602034138')
select CardNo 卡号,CardMoney 余额 from BankCard
where AccountId=@AccountId
三、go语句
go语句:
(1)等待go语句前的代码执行完成后,再执行go后面的代码。
(2)批处理语句的结束标志。
--下面的@num变量作用域为全局
--declare @num int
--set @num = 0
--下面的@num变量的作用域是局部,只在两个go之间可以使用,最后一行代码会报错
--.........sql代码
--go
--declare @num int
--set @num = 0
--go
--set @num = 1
四、运算符
T-SQL中使用的运算符分为7种:
- 算数运算符:加(+)、减(-)、乘(*)、除(/)、模(%)
- 逻辑运算符:AND、OR、LIKE、BETWEEN、IN、EXISTS、NOT、ALL、ANY、
- 赋值运算符:=
- 字符串运算符:+
- 比较运算符:=、>、<、>=、<=、<> (不等于)
- 位运算符:|、&、^
- 复合预算符:+=、-=、/=、%=、*=
1、运算符示例
(1)已知长方形的长和宽,求长方形的周长和面积
declare @c int=5
declare @d int=10
declare @zc int
declare @mj int
set @zc=(@c+@d)*2
set @mj=@c*@d
print '周长'+convert(varchar(10),@zc)
print '面积'+convert(varchar(10),@mj)
--或者
print '周长'+cast(@zc as varchar(10))
print '面积'+cast(@mj as varchar(10))
(2)查询银行卡状态为冻结,并且余额超过1000000的银行卡信息
select*from BankCard where CardState=3 and CardMoney>1000000
(3)查询出银行卡状态为冻结或者余额等于0的银行卡信息
select*from BankCard where CardState=3 or CardMoney=0
(4)查询出姓名中含有'刘'的账户信息以及银行卡信息
select*from AccountInfo
inner join BankCard on AccountInfo.AccountId=BankCard.AccountId
where RealName like '%刘%'
(5)查询出余额在2000-5000之间的银行卡信息
select*from BankCard where CardMoney in(2000,5000)
(6)查询出银行卡状态为冻结或者注销的银行卡信息
select*from BankCard where CardState in(3,4)
(7)关羽身份证:420107199507104133,关羽到银行来开户,查询身份证在账户表是否存在,不存在则进行开户开卡,存在则不开户直接开卡。
declare @AccountId int
if Exists(select AccountId from AccountInfo where AccountCode='420107199507104133')
--存在此人
begin
set @AccountId=(select AccountId from AccountInfo where AccountCode='420107199507104133')
insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState)
values('6225547858741264',@AccountId,'123456',0,1)
end
else--不存在此人
begin
insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime)
values('420107199507104133','13656565656','关羽',getdate())
set @AccountId=@@IDENTITY
insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState)
values('6225547858741264',@AccountId,'123456',0,1)
end
select*from AccountInfo
select*from BankCard
上述代码也可以使用not exists进行判断,表示不存在。
扩展:上面需求添加一个限制即一个人最多只能开3张银行卡。
declare @AccountId int
declare @CardCount int
if Exists(select AccountId from AccountInfo where AccountCode='420107199507104133')
--存在此人
begin
set @AccountId=(select AccountId from AccountInfo where AccountCode='420107199507104133')
set @CardCount=(select count(*) from BankCard where AccountId=@AccountId)
if @CardCount<=2
begin
insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState)
values('6225547858741266',@AccountId,'123456',0,1)
end
else
begin
print'您名下的银行卡太多了,最多只能有3张银行卡'
end
end
else--不存在此人
begin
insert into AccountInfo(AccountCode,AccountPhone,RealName,OpenTime)
values('420107199507104133','13656565656','关羽',getdate())
set @AccountId=@@IDENTITY
insert into BankCard(CardNo,AccountId,CardPwd,CardMoney,CardState)
values('6225547858741266',@AccountId,'123456',0,1)
end
(8)查询银行卡账户余额,是不是所有的账户余额都超过了3000。
if 3000<all(select CardMoney from BankCard)
begin
print'所有的银行卡余额都超过了3000'
end
else
begin
print'不是所有的银行卡余额都超过了3000'
end
(9)查询银行卡账户余额,是否含有账户余额超过30000000的信息
if 30000000<any(select CardMoney from BankCard)
begin
print'有银行卡余额超过30000000'
end
else
begin
print'没有银行卡余额超过30000000'
end
五、流程控制
1、选择分支结构
(1)某用户银行卡号为“6225547854125656”,该用户执行取钱操作,取钱5000元,余额充足则进行取钱操作,并提示"取钱成功",否则提示“余额不足”。
declare @balance money
select @balance=(select CardMoney from BankCard where CardNo='6225547854125656')
--可以取钱
if @balance>=5000
begin
update BankCard set CardMoney=CardMoney-5000
where CardNo='6225547854125656'
insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime)
values('6225547854125656',0,5000,GETDATE())
end
--不能取钱
else
begin
print'余额不足'
end
select*from CardExchange
(2)查询银行卡信息,将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”,并且根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户",显示列分别为卡号,身份证,姓名,余额,用户等级,银行卡状态。
select CardNo 卡号,AccountCode 身份证号,RealName 姓名,CardMoney 余额 ,
case
when CardMoney>=300000 then 'VIP用户'
else'普通用户'
end 用户等级,
case CardState
when 1 then '正常'
when 2 then '挂失'
when 3 then '冻结'
when 4 then '注销'
else '异常'
end 银行卡状态
from BankCard
inner join AccountInfo on BankCard.AccountId=AccountInfo.AccountId
或如下写法:
select CardNo 卡号,AccountCode 身份证,RealName 姓名,CardMoney 余额,
case
when CardMoney < 300000 then '普通用户'
else 'VIP用户'
end 用户等级,
case
when CardState = 1 then '正常'
when CardState = 2 then '挂失'
when CardState = 3 then '冻结'
when CardState = 4 then '注销'
else '异常'
end 卡状态
from BankCard inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId
2、循环结构
(1)循环打印1-10。
declare @i int=1
while @i <=10
begin
print @i
set @i=@i+1
end
(2)循环打印九九乘法表
declare @i int=1
while @i<9
begin
declare @str varchar(1000)=''
declare @j int=1
while @j<=@i
begin
set @str=@str+cast(@i as varchar(1))+'*'+cast(@j as varchar(1))+
'='+cast(@i*@j as varchar(2))+char(9)
set @j=@j+1
end
set @i=@i+1
print @str
end
==备注:==
(1)特殊字符:制表符 CHAR(9);换行符 CHAR(10);回车 CHAR(13);
(2)循环中若出现break和CONTINUE,作用与Java,C#等语言一致。