Microsoft SQL Server Transact-SQL
Microsoft SQL Server Transact-SQL
1.SQL
1.1数据定义语言(DDL)
create 创建数据库或数据库对象;alter 修改数据库或数据库对象;drop 删除数据库或数据库对象;
1.2数据操纵语言(DML)
select 从表或视图中检索数据;insert 将数据插入到表或视图中;update 修改表或视图中的数据;delete 从表或视图中删除数据;
1.3数据控制语言(DCL)
grant 授予权限;revoke 收回权限;drop 禁止从其他角色中继承许可权限;
2.注释及字符编码
2.1注释
--单行注释 /* 多行注释 */
2.2字符编码
ASCLL字符;Unicode字符前面添加一个大写字符N
3.变量
3.1变量类型
常量;一般变量;局部变量@;全局变量@@;
3.2变量声明
--变量声明 DECLARE @aa int DECLARE @bb int
3.3变量赋值
--变量赋值 set或select
4.运算符和表达式
4.1算术运算符
--变量声明 declare @aa int,@bb int; --变量赋值 set或select --算术运算符 + - * / % SELECT @aa + @bb SELECT @aa - @bb SELECT @aa * @bb SELECT @aa / @bb SELECT @aa % @bb
4.2关系运算符
>
>=
=
<=
<
<>或!=
!<
!>
4.3逻辑运算符
AND 与运算,两个操作数均为真时,结果才为真。
OR 或运算,若两个操作数中有一个为真结果为真。
NOT 非运算,单目运算,结果值相反。
ALL 每个操作数值都为真时结果为真。
ANY 多个操作数中有一个为真结果为真。
BETWEEN若操作数在指定范围内则结果为真
EXISTS 若子查询包含一些行则结果为真
IN 若操作数值等于表达式列表中的一个则真
LIKE 若操作数与某种模式匹配则真
- % [] [^]
SOME 若在一系列操作数中有些值为真则真
+ 字符连接运算符
4.4位运算符
&位与运算 2个参与运算的位值均为1,结果为1或则0.
|位或运算 一个为1就为1或则0
^位异或运算 不相同时为1相同时为0
SELECT 170&75
SELECT 170|75
SELECT ~170,~75
SELECT 170^75
5.流程控制语句
5.1IF ELSE语句
--变量声明 declare @aa int,@bb int; --变量赋值 set或select --if if @aa>@bb print 'aa>bb'
--变量声明 declare @aa int,@bb int; --变量赋值 set或select --if else if @aa>@bb print 'aa>bb' else print 'bb<aa'
--if else 嵌套 declare @ee int declare @ff int print '第一象限' else print '第四象限' else print '第二象限' else print '第三象限'
5.2CASE语句
--简单CASE语句 ) ) ) ) select @a='A',@b='B',@c='C',@d='D' ) set @e=@d select case when @e=@a then 'A' when @e=@b then 'B' when @e=@c then 'C' when @e=@d then 'D' end as 成绩等级
--搜索语句 ) ) ) ) select @a='A',@b='B',@c='C',@d='D' ) set @e=null select 成绩等级= case when @e=@a then 'A' when @e=@b then 'B' when @e=@c then 'C' when @e=@d then 'D' ELSE '不在定义范围' End
DECLARE @Today int SET @Today = DATEPART(DW,GETDATE()) SELECT 今天是 = CASE @Today THEN '星期天' THEN '星期一' THEN '星期二' THEN '星期三' THEN '星期四' THEN '星期五' THEN '星期六' END
5.3GOTO语句
--无条件转移语句
declare @q int
set @q=1
loving:
print @q
select @q=@q+1
while @q<=3
goto loving
5.4WHILE BREAK和CONTINUE语句
--while 语句
declare @s int
declare @n int
select @s=0,@n=1
while @n<=100
begin
set @s=@s+@n
set @n=@n+1
end
print '1+2+3...+100='+convert(char,@s)
go
--break 语句一般用于退出本次循环
declare @i int
declare @s int
select @i=1,@s=0
while @i<=100
begin
set @s=@s+@i
if @s>1000
break
set @i=@i+1
end
select @i,@s
go
--continue 语句 跳出本次循环
declare @i int
declare @s int
select @i=0,@s=0
while @i<10
begin
set @i=@i+1
if @i%2=0
set @s=@s+@i
else
continue
print @i
end
print @s
5.5WAITFOR语句
--waitfor 语句 延迟一段时间执行
waitfor delay '00:00:06'
print '执行触发器或存储过程'
5.6RETURN语句
--return语句用于从过程,批处理或语句块中无条件的推出位于return语句之后语句不再执行
declare @q int
set @q=3
if @q>1
print '能输出'
return
print '不能输出'
5.7TRY CATCH语句
begin try
create database aa
end try
begin catch
print '已经存在'
drop database aa
print '已删除'
create database aa
print '再次创建'
end catch
5.7BEGIN END语句
if exists语句
--1.判断数据库是否存在 if exists (select name from sys.databases where name = 'database_name') print 'true' else print 'false'; --2.判断表是否存在 ) print 'true' else print 'false'; --3.判断存储过程是否存在 ) print 'true' else print 'false'; --4.判断临时表是否存在 if OBJECT_ID('tempdb..#temptable_name') is not null print 'true' else print 'false'; --5.判断视图是否存在 if exists (select object_id from sys.views where object_id = (select object_id(N'[dbo].[view_name]'))) print 'true' else print 'false'; --6.判断自定义函数是否存在 if exists (select * from dbo.sysobjects where id = (select object_id(N'[dbo].[Fun_name]')) and xtype in (N'FN',N'IF',N'TF')) print 'true' else print 'false'; --7.判断列是否存在 if exists(select * from syscolumns where id=object_id('table_name') and name='Columns_name') print 'true' else print 'false'; --8.判断列是否自增列 print 'auto_columns' else print 'unauto_columns' --9.判断表中是否存在索引 if exists(select * from sysindexes where id=object_id('table_name') and name='Index_name') print 'Index' else print 'unindex'
函数
6.1数学函数
--ABS(数值表达式)为绝对值函数,返回数值表达式的绝对值
SELECT N'-100的绝对值'=ABS(-100),N'0的绝对值'=ABS(0),N'100的绝对值'=ABS(100)
--RAND()为随机函数返回0-1之间的float数值
SELECT N'随机数'=RAND()
--PI()圆周率函数返回14位小数的圆周率常量值
SELECT N'14位小数的圆周率数值'=PI()
--SQRT(数值表达式)平方根函数返回表达式的平方根
SELECT N'64的平方根'=SQRT(64)
--EXP(数值表达式)指数函数,返回表达式的指数值
SELECT N'e的10次方'=EXP(10)
--LOG(数值表达式)自然对数函数,返回表达式的自然对数值
SELECT
N'e的10次方'=EXP(10),
N'5的自然对数'=LOG(5),
SELECT CEILING(13.4),FLOOR(13.4),ROUND(13.4567,3)
--数学函数RAND()用于返回介于0与1之间的伪随机float值; select RAND(); --输出10个伪随机float值; ; begin print RAND(); ; end; --输出1001~1500中的数值 ; ; ; begin set @result = CEILING(RAND()*@endno); if @result >= @begno and @result <=@endno begin print @result; break; end; end; --增加脚本的重用性,写成自定义函数 create view getrand as select RAND() as rand; create function choujian( , ) returns int as begin ; begin select @result=ceiling([rand]*@endno) from getrand; if @result>=@begno and @result<=@endno begin break; end; end; return @result; end; ; begin ,); ; end;
6.2字符串函数
--ASCII(字符表达式)ASCII函数返回字符串表达式中最左端字符的ASCII码值
SELECT ASCII('a'),ASCII('ADD')
--CHAR(整型表达式)ASCII码转换函数,参数为介于0~255之间的整数,返回整数的ASCII码
SELECT CHAR(97)
--LOWER(字符表达式)小写字母函数,将大写字母转换为小写字母,返回表达式的小写字母表示
SELECT LOWER('A')
--UPPER(字符表达式)大写字母函数,返回指定表达式的大写字母表示
SELECT UPPER('a')
--LEN(字符表达式)字符串长度函数返回字符串表达式中字符的个数
SELECT LEN('A'),LEN('ASDC')
--LEFT(字符表达式,n)左子串函数返回从字符串左边开始的n个字符
SELECT LEFT('SFSFS',2)
--RIGHT(字符表达式,n)右子串函数返回从字符串右边开始的n个字符
SELECT RIGHT('ADASDADADA',6)
--LTRIM(字符表达式) 删除前导空格函数,返回删除了前导空格的字符表达式
SELECT LTRIM(' aaaaaaa')
--RTRIM(字符表达式) 删除尾随空格函数,返回删除所有尾随空格的字符表达式
SELECT RTRIM('AAAAAA ')
--REPLACE(字符表达式1,字符表达式2,字符表达式3)字符替换函数,
--用第三个表达式替换第一个字符串表达式中包含的所有第二个字符表达式,并返回替换后的表达式
SELECT REPLACE('AABBCCDD','BBCC','EEFF')
--STR()函数用于将数值型数据转换为字符串
--str(数字类型的表达式[,表达式总长度][,小数点后面的位数])表达式总长度和小数点后面的位数为可选择参数
--将244533.3344转换为长度为11位,小数点后有3位的字符串
SELECT STR(244533.3344,11,2),STR(1234.56789,11,2)
--SUBSTRING(字符串表达式,起始位置,长度)字符串截取函数
SELECT SUBSTRING('abcde',1,0)
SELECT SUBSTRING('abcde',0,8)
--Replicate函数用于指定的次数重复字符串表达式
SELECT replicate('loving',3)
--字符串替换函数格式:STUFF(字符表达式1,起始位置,长度,字符表达式2)
--功能:用“字符表达式2”的值替换“字符表达式1”中由“起始位置”和“长度”指明的一个子串。
select STUFF('计算机等级考试',4,2,'专业')
select STUFF('计算机等级考试',6,0,'二级')
--Charindex函数返回字符串指定表达式的起始位置。
select charindex('l','I like football') --搜索的起始位置是1
select charindex('l','I like football',4) --搜索的起始位置是4
select charindex('l','I like football',15) --搜索的起始位置是15
--EVENTDATA()函数 SELECT EVENTDATA();
6.3日期和时间函数
--GETDATE(日期时间型数据)以标准格式返回本地服务器的DATETIME值
SELECT GETDATE()
--YEAR(日期时间型数据)返回指定日期的“年”部分的整数
SELECT YEAR('2018-09-10'),YEAR(GETDATE())
--MONTH(日期时间型数据)返回指定日期的“月”部分的整数
SELECT MONTH('2018-09-10'),MONTH(GETDATE())
--DAY(日期时间型数据)返回指定日期的"天"部分的整数
SELECT DAY('2018-09-10'),DAY(GETDATE())
--DATEPART(datepart,date) 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
/*
date 参数是合法的日期表达式。
datepart 参数可以是
年 yy, yyyy
季度 qq, q
月 mm, m
年中的日 dy, y
日 dd, d
周 wk, ww
星期 dw, w
小时 hh
分钟 mi, n
秒 ss, s
毫秒 ms
微妙 mcs
纳秒 ns
*/
SELECT N'日期的年'=DATEPART(YYYY,GETDATE())
SELECT N'日期的天'=DATEPART(DD,GETDATE())
--DATEADD(时间间隔,数值表达式,日期)
/*
为DATETIME值添加间隔。时间间隔项决定时间间隔的单位,可取Year、Day of year(一年的日数)、
Quarter、Month、Day、Week、Weekday(一周的日数)、Hour、Minute、Second、Millisecond。
数值表达式为加上或者减去的时间间隔
*/
SELECT N'10年后的日期'=DATEADD(YEAR,10,GETDATE()),
N'10天前的日期'=DATEADD(DAY,-10,GETDATE())
--DATEDIFF(时间间隔,日期1,日期2)
/*
计算两个DATETIME值之间指定的日期部分的差,返回数值型数据。
时间间隔项决定时间间隔的单位,取值与DATEADD中的时间间隔项相同
*/
SELECT N'日期相差的年份'=DATEDIFF(YEAR,'2018-09-10',GETDATE()),
N'日期相差的天数'=DATEDIFF(DAY,'2018-09-10',GETDATE())
6.4数据类型转换函数
--隐式转换
select str(123.456),str(123.456,5,2),STR(123.456,2)
--显式转换
select cast('123' as int)+10
select CONVERT(nvarchar(30),getdate(),102)+'转换成字符型'
CONVERT()将一种数据类型转变为另一种数据类型
CURRENT_USER()返回当前用户的名称
ISDATE()判断是否有效日期
ISNULL()指定一个值替换空值
ISNUMERIC()判断输入的是不是一个数值
6.5聚合函数
--avg:返回一组值的平均值。
--binary_checksum:返回对表中的行或者表达式列表计算的二进制校验位。
--checksum:返回在表中的行或者表达式列表计算的校验值,该函数用于生成哈希索引。
--checksum_agg:返回一组值的校验值。
--count:返回一组值中项目的数量。(返回值为int类型)。
--count_big:返回一组值中项目的数量。(返回值为bigint类型)。
--grouping:产生一个附加的列,当用cube或rollup运算符添加行时,附加的列输出为1,当添加的行不是由cube或rollup运算符产生时,附加的列输出为0。
--max:返回表达式或者项目中的最大值。
--min:返回表达式或者项目中的最小值。
--sum:返回表达式中所有项的和,或者只返回distinct值。sum只能用于数字列。
--stdev:返回表达式中所有值的统计标准偏差。
--stdevp:返回表达式中所有值的统计统计标准偏差。
--var:返回表达式中所有值的统计标准方差。
--varp:返回表达式中所有值的统计统计标准方差。
use 实例数据库
select avg(分数) as 平均成绩
from 选课表
go
use 实例数据库
select max(分数) as 最高成绩
from 选课表
go
use 实例数据库
select count(学号) as 总人数
from 选课表
go
6.6用户自定义函数
用户在编写程序的过程中,除了可以调用系统函数外,还可以根据自己的需要自定义函数。自定义函数包括表值函数和标量值函数两类,其中表值函数又包括内联表值函数和多语句表值函数。
内联表值函数:返回值为可更新表。如果用户自定义函数包含单个SELECT语句且该语句可以更新,则该函数返回的表也可以更新。
多语句表值函数:返回值为不可更新表。如果用户自定义函数包含多个SELECT语句,则该函数返回的表不可更新。
标量函数:返回值为标量值。
--1.标量函数
create function maxf (@para1 real,@para2 real)
returns real
as
begin
declare @max real
if @para1>@para2
set @max=@para1
else
set @max=@para2
return(@max)
end
--2.内嵌表值函数:只能通过select语句调用,在调用时可以省略函数的所有者
create function a(@no char(10)) returns table
as
return
(select student.学号,姓名,课程名,成绩
from student,sc,course
where student.学号=sc.学号
and sc.课程号=course.课程号
and student.学号=@no)
go
select * from a('2008056102')
--3.多语句表值函数:
create function b(@no char(10))
returns @score table
(sno char(10),
sname varchar(8),
cname varchar(30),
grade tinyint)
as
begin
insert @score
select student.学号,姓名,课程名,成绩
from student,sc,course
where student.学号=sc.学号
and sc.课程号=course.课程号
and student.学号=@no
return
end
go
select * from b('2008056103')
--4.自定义函数的调用调用标量函数,必顺提供至少由两部分组成的名称(所有者.函数名),可用print, select, exec语句调用
print dbo.maxf(12,38.6)
select N'最大数为:'+
convert(varchar(10),dbo.maxf(2.8,15676.9))
declare @m real
exec @m=dbo.maxf 12.8,789.6
select @m as '最大数为‘
declare @m real
exec @m=dbo.maxf @para1=789.6,@para2=12.8
select @m as '最大数为'
内嵌表值函数和多语句表值函数都返回表,二者不同之处在于:
内嵌表值函数没有函数体,返回的表是单个select语句的结果集。
多语句表值函数在begin….end 定义的函数主体包含T-SQL语句,这些语句可生成行并将行插入表中,最后返回表。
Microsoft SQL Server Transact-SQL的更多相关文章
- PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法
逆向工程中,有时会出现如下错误 ... [Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句 SQLSTATE = 37000 解决方案: 1. ...
- 开始使用 Docker (Linux 上运行 SQL Server) 上的 SQL Server 容器 - SQL Server | Microsoft Docs
原文:开始使用 Docker (Linux 上运行 SQL Server) 上的 SQL Server 容器 - SQL Server | Microsoft Docs 快速入门:使用 Docker ...
- SQL Server参数化SQL语句中的like和in查询的语法(C#)
sql语句进行 like和in 参数化,按照正常的方式是无法实现的 我们一般的思维是: Like参数化查询:string sqlstmt = "select * from users whe ...
- SQL Server经典sql语句大全(转)
一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...
- [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)
原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin update 某个sqlserver的表@dblink名字 .... ...
- (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)
本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...
- SQL Server 2008 /SQL Server 2008 R2 配置数据库邮件
原文:SQL Server 2008 /SQL Server 2008 R2 配置数据库邮件 从2005开始,就引入了"数据库邮件"功能.并且取代SQLMail.原有SQLMail ...
- SQL Server审计功能入门:SQL Server审核 (SQL Server Audit)
原文:SQL Server审计功能入门:SQL Server审核 (SQL Server Audit) 介绍 Audit是SQL Server 2008之后才有的功能,它能告诉你"谁什么时候 ...
- sql server 与 sql server compact 互相数据导入
从SQL Server 导出数据到 Sql Compact 使用 Sql Server Compact Tool box 从SQL Server Comapct 导出数据到 Sql Server 使 ...
- SQLSERVER 免费对比数据库结构和数据的工具支持:SQL Server 2012, SQL Server 2008 and SQL Server 2005
New xSQL Schema Compare - version 5 Compare the schemas of two SQL Server databases, review differen ...
随机推荐
- 量化分析师的Python日记【第1天:谁来给我讲讲Python?】
量化分析师的Python日记[第1天:谁来给我讲讲Python?]薛昆Kelvin优矿 001 号员工2015-01-28 15:48 58 144克隆 ###“谁来给我讲讲Python?” 作为无基 ...
- HTTPie: a CLI, cURL-like tool for humans
HTTPie github HTTPie 是用 Python 编写,用到了 Requests 和 Pygments 这些出色的库. 主要特性: 直观的语法 格式化和色彩化的终端输出 内置 JSON 支 ...
- Java后端发出post请求带参数并接收返回的json
核心代码: 参数格式: “key1=value1&key2=value2” /*** sendUrl (远程请求的URL)* param (远程请求参数)* JSONObject ...
- 【bzoj1260】[CQOI2007]涂色paint
题意:就是说一开始一个序列是空的,然后每次可以将连续的一段染成同一颜色,问多少次才能到目标状态. 一开始想的是二分,然后题解DP... f[i][j]表示区间[i,j]需要染色多少次 首先初始状态是f ...
- c#调用oracle存储过程返回数据集
c#调用oracle存储过程返回数据集 2008-12-20 10:59:57| 分类: net|字号 订阅 CREATE OR REPLACE PACKAGE pkg_tableTypeIS ...
- 【Dairy】2016.10.23 观火&中彩记
...................... 就第一条可以! 观火10分钟,长郡附近老房子起火...
- HTTPS数据包抓取的可行性分析
HTTPS数据包抓取的可行性分析 相信只要是从事软件开发, 多多少少都会涉及到数据包的抓取.常见的有网页数据抓取(即网页爬虫),应用程序数据包抓取等.网页数据抓取比较简单, 在chrome下可以非常方 ...
- 【POJ 1330】 Nearest Common Ancestors
[题目链接] 点击打开链接 [算法] 倍增法求最近公共祖先 [代码] #include <algorithm> #include <bitset> #include <c ...
- sqlserver新加一自增长的列,并且更新为行号
--查询行号 select row_number()over(order by CHECKTIME )as RowNum,*from CHECKINOUT --更新id列为行号 update CHEC ...
- bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路【dijskstra】
严格次短路模板,用两个数组分别维护最短路和次短路,用dijskstra,每次更新的时候先更新最短路再更新次短路 写了spfa版的不知道为啥不对-- #include<iostream> # ...