屌丝学编程,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#等语言一致。