1.cast
cast(表达式 as 数据类型)
select 100.0 +cast('1000' as int) -- 1100.0 默认把字符串转换成浮整形
2.convert 万能转换
convert(数据类型,表达式)
select 100.0 + convert(int,'1000')-- 1100.0 默认把字符串转换成整形
3.select * from student order by convert (int,bid) desc --bid列按照降序来排列,bid是varchar类型
4.print convert(varchar(10),getdate(),120) --日期转换varchar(10)表示显示的字符长度,120表示style,可以在SSMS 帮助中查看详情
5.cast不可以转换日期类型,convert可以通用
--space(N)表示N个空格,是SQL的函数--convert(varchar(N),值) 表示万能转换为字符串
select SPACE(5) +CONVERT (varchar(2),23)+SPACE(5) +'你好' --把23转字符串
-------------------------------------------------------------定义变量,循环添加数据
create table a(
number varchar(10)
)
--数据库里面的批量循环更新数据
declare @i int --sql里面的定义一个变量用 declare
set @i = 1 --给变量设置一个值用 set
while @i<=100 --while 条件循环
begin
insert into a values('高:'+convert(varchar,@i)) --convert万能传换,这里int转varchar,@i是参数
set @i=@i +1
end
select number from a
*************这里来了解一下变量与输出***********
declare @y int,@y2 varchar(10) --定义两个变量
--给变量赋值的两种形式(set和select) 相对来说set才是赋值,select是存放在虚拟表
set @y=1 --同时对多个变量同时赋值时。不允许出现这样的语法: set @a='ABC',@b='EFG' ,会报错
set @y2='' ---而select可以同时对多变量赋值,set只能一个一个赋值。,set='select的一个初始值'
select @y=2020,@y2=number from a --存放值在虚拟表,返回值是多个值不会报错,会将查询到的最后一个值返回给变量
--输出值的两种形式(select和print)
select @y,@y2 --只能查询。以虚拟表显示出来。
print @y --print是输出(返回值) ,值以最长截取8000以内的字符串类型,返回给客户端。输出的值必须能隐式转换为字符串类型。
--判断闰年
if(@y%4=0 and @y%100!=0 or @y%400=0) --这个是判断每年的2月用的,成立就是28天,@i = 2018这样子判断
select convert(varchar,@y)+'是闰年'
else
select convert(varchar,@y)+'不是闰年'
示例一:@@error(返回上一个语句的错误号) 0正确 非0错误 如:if(@@ERROR = 0)
示例二:@@rowcount(返回上一个sql语句受影响的行数) 如:if(@@rowcount = 1)
示例三:@@identity(返回上一个标识值) 如:print @@identity
示例四:@@servername(服务器的名称) @@servicename(sqlserver服务名称) 如:print @@servername 和 print @@servicename
**********************************************************************额外一些SQL语句后台代码会用到*****************************************************************************
--新添加一列
alter table a add Test4 int --创建一个为int 类型的test4的列,注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
insert into a values('可不填',1)
select * from a
--删除某一列
alter table a drop column Test4; --删除后数据会丢失,尽量不用执行删除操作。
select * from a
函数
优点:
(1)模块化编程
(2)执行效率高
(3)减少网络流量
(4)提高安全性
函数分类:
系统函数
自定义函数:
(1)标量函数:函数的返回值只有一个
(2)表值函数:函数的返回为一个表
函数注意事项:一个函数最多只能返回一个值,如果返回很多值,可以用表值函数
系统函数:
--字符串函数:返回最左侧字符串的ascii码值
select ASCII('abcd')
--返回数字对应字符:
select CHAR(97)
--去掉左边空格,右边空格
select LTRIM(' aaaaaaaaaaa ')
select RTRIM(' bbbbbbbbbbb ')
select RTRIM( LTRIM(' ccccccccccc '))
--从左边开始截取指定数量的字符串:
select LEFT('abcd',2)
--从右边的开始截取指定数量的字符串:
select right('abcd',2)
--从1的位置开始,截取3位
select SUBSTRING('500231199606061258',7,8)
--求字符串长度,不计最后空格
select LEN(' ab c d ') --d后面都空格不计
-------------------------日期函数:
select GETDATE()
/*获取时间:getDate()*/
select datename(YEAR,GETDATE()) --年
select datename(MONTH,GETDATE()) --月
select datename(DAY,GETDATE()) --日
select datename(HOUR,GETDATE()) --时
select datename(MINUTE,GETDATE()) --分
select datename(SECOND,GETDATE()) --秒
--获取指定的日期部份:
select YEAR(GETDATE())
select month(GETDATE())
select day(GETDATE())
--添加时间到指定的日期部份:
select DATEADD(YEAR,3,GETDATE())
--计算时间差:
select DATEDIFF(YEAR,'2019-6-24',GETDATE()) --相差几年
select DATEDIFF(MONTH,'2019-6-24',GETDATE())--相差几个月
自定义函数:
create function fun_函数名(形参)
returns 返回值
as
方法体......
go
返回单个值:标量函数
返回一个表:表值函数
--示例一:定义函数,查找用户传入数字中的最大值(有参有返)
--有参:用户传入两个数字
--有返:最大值
if exists(select * from sys.objects where name='fun_getmax')
begin
drop function fun_getmax
end
go
create function fun_getmax(@num1 int,@num2 int)
returns int --指定返回值的类型
as
begin
declare @max int
if(@num1 > @num2)
begin
set @max = @num1
end
else
begin
set @max = @num2
end
return @max --函数返回值
end
go
--调用:两个数做比较返回最大值
select dbo.fun_getmax(10,20)
select dbo.fun_getmax(50,20)
下面需要创建一个简单的表做演示
create table cardInfo
(
cardId int primary key identity,
cardNumber varchar(20) unique not null, --学号:约束unique【唯一的】和主键一样有唯一标识,表示内容不能有重复数据
cardName varchar(20) ,
cj1 int ,
cj2 int ,
)
insert into cardInfo values('S25303','张三',20,20),('S25304','李四',60,50),('S25305','王五',50,80)
--示例二:定义函数,根据用户输入的学号,查询它的平均成绩
if exists(select * from sys.objects where name='fun_getavgbyno')
begin
drop function fun_getavgbyno
end
go
create function fun_getavgbyno(@stuno varchar(10))
returns float
as
begin
declare @avg float
select @avg=(cj1+cj2)/2 from cardInfo where cardNumber=@stuno --安输入的学号查询
return @avg
end
go
--调用:
select dbo.fun_getavgbyno('S25305')
在创建一个表做多表联接查询演示
create table stuinfo
(
stuId int primary key identity,
stuNumber varchar(20) unique not null
)
insert into stuinfo values('S25303'),('S25304'),('S25305')
--示例三:定义函数,根据用户输入的学号,查询它的:姓名,性别,笔试成绩,机试成绩(表值函数)
if exists(select * from sys.objects where name='fun_getstuinfo')
begin
drop function fun_getstuinfo
end
go
create function fun_getstuinfo(@no varchar(10))
returns table
as
return select cardNumber,
cardName,
cj1,
cj2
from cardInfo left join stuinfo on stuinfo.stuNumber=cardInfo.cardNumber where cardInfo.cardNumber=@no
go
--调用;
select * from dbo.fun_getstuinfo('S25303')
select cardNumber as 学号,cardName as 姓名 from dbo.fun_getstuinfo('S25303')
--示例四:定义函数,查询所有学生的:姓名,性别,笔试成绩,机试成绩(表值函数)
if exists(select * from sys.objects where name='fun_getstuinfo')
begin
drop function fun_getstuinfo
end
go
create function fun_getstuinfo()
returns table
as
return select cardNumber,
cardName,
cj1,
cj2
from cardInfo left join stuinfo on stuinfo.stuNumber=cardInfo.cardNumber
go
--调用:
select * from dbo.fun_getstuinfo()
select * from dbo.fun_getstuinfo() where cardName='张三'