第十三章:Sqlserver2019数据库之Transact-SQL 语法基础及常用 SQL 函数总结
Posted Amo Xiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十三章:Sqlserver2019数据库之Transact-SQL 语法基础及常用 SQL 函数总结相关的知识,希望对你有一定的参考价值。
学前必备知识
- 第一章:SQL Server 数据库环境搭建与使用
- 第二章:SQL Server2019 数据库的基本使用之图形化界面操作
- 第三章:SQL Server2019 数据库 之 开启 SQL 语言之旅
- 第四章:SQL Server2019 数据库 之 综合案例练习、 使用SQL语句插入数据、更新和删除数据
- 第五章:SQL Server2019 数据库 之 综合案例练习、开启 SELECT 语句之旅
- 第六章:SQL Server2019 数据库 之 SELECT 语句的深入使用
- 第七章:SQL Server2019 数据库 之 单表查询综合练习 及SELECT 语句的进阶使用
- 第八章:SQL Server2019 数据库 之分组统计(GROUP BY)
- 第九章:SQL Server2019 数据库 之简单子查询
- 第十章:SQL Server2019 数据库 之多行子查询
- 第十一章:SQL Server2019 数据库 之多表连接
- 第十二章:使用C语言(Python语言)操作Sqlserver2019数据库
一、Transact-SQL 语法基础
1.1 常量
数据在内存中存储始终不变的量叫做常量。常量,也称为文字值或标量值,是表示一个特定数据值的符号。常量的格式取决于它所表示的值的数据类型。
1、数字常量。 数字常量包括整数常量、小数常量以及浮点常量。例如:
13
-56
1314.520
--浮点常量使用符号e来指定,例如:
select 3.4e3
select -3.14e1
select 2.5e7 -- e后面数字是几表示"乘10的几次幂"
0xB0C5
2、字符串常量。 字符串常量定义在单引号内。字符串常量包含字母、数字字符(a~z、A~Z和0~9)及特殊字符(如数字号#、感叹号!、at符@)。例如,以下为字符串常量:
'Amo'
'Life is short, i need Python。'
--'相当于转义的功能,将中间的'变成了普通的'原样进行了输出
select 'Oh''MyGod'
3、日期和时间常量。 SQL 规定日期、时间和时间间隔的常量值被指定为日期和时间常量,例如:
'2021-06-23'
'06/21/2021'
4、符号常量。 除了用户提供的常量外,SQL 包含几个特有的符号常量,这些常量代表不同的常用数据值。例如:
select CURRENT_TIMESTAMP; --2021-06-23 10:55:11.030
select CURRENT_USER; --dbo
1.2 变量
数据在内存中存储可以变化的量叫变量。为了在内存存储信息,用户必须指定存储信息的单元,并为该存储单元命名,以方便获取信息,这就是变量的功能。Transact-SQL 可以使用两种变量,一种是局部变量;另外一种是全局变量,局部变量和全局变量的主要区别在于存储的数据作用范围不一样。
1、局部变量。 局部变量是用户可自定义的变量,它的作用范围仅在程序内部。局部变量的名称是用户自定义的,命名的局部变量名要符合 SQL Server 标识符命名规则,局部变量名必须以@开头。
DECLARE
{
@varaible_name datatype [ ,… n ]
}
/*
1.@varaible_name:局部变量的变量名必须以@开头,另外变量名的形式必须符合SQL Server标识符的命名方式。
补充:SQL Server标识符的命名方式。
一、首字母以字母、下划线_、@符号(表示局部变量或参数)、#符号(表示临时表或过程)开头 ## 开始的标识符表示全局临时变量!
二、标识符后续组成可以是字母、数字、@、$、#、_
三、标识符不允许是 T-SQL 的关键字。
四、不允许嵌入空格或其他特殊字符。
2.局部变量使用的数据类型可以是除text , ntext或者image类型外所有的系统数据类型和用户自定义数据类型。
*/
例如:声明局部变量 @name,SQL 语句如下:
DECLARE @name VARCHAR(10);
为变量赋值的方式一般有两种,一种是使用 SELECT 语句,一种是使用 SET 语句。使用 SET 语句为变量赋值的语法如下:
{SET @varible_name = ecpression}[ ,… n]
下面是一个简单的赋值语句:
DECLARE @name VARCHAR(10);
SET @name = 'Amo';
还可以为多个变量值一起赋值,相应的 SQL 语句如下:
DECLARE @name VARCHAR(10),@age INT, @sex CHAR(2);
SELECT @name='Amo', @age=18, @sex='男';
使用 SELECT 语句为变量赋值的语法如下:
SELECT @varible_name = expression
[FROM table_name [ ,… n ]
WHERE clause]
/*上面的SELECT语句的作用是为了给变量赋值,而不是为了从表中查询出数据。
而且在使用SELECT语句进行赋值的过程中,并不一定非要使用FROM关键字和WHERE子句。*/
例子:
USE student;
DECLARE @courseName NVARCHAR(20);
SELECT @courseName=课程代号 FROM course WHERE 课程代号='K06';
PRINT @courseName;
DECLARE @a INT;
SELECT @a=1;
PRINT @a;
2、全局变量
全局变量是 SQL Server 系统内部事先定义好的变量,不需要用户参与定义,对用户而言,其作用范围并不局限于某一程序,而是任何程序均可随时调用。全局变量通常用于存储一些 SQL Server 的配置设定值和效能统计数据。SQL Server 一共提供了 30 多个全局变量,本节只对一些常用变量的功能和使用方法进行介绍。全局变量的名称都是以 @@ 开头的。
全局变量 | 作用 |
---|---|
@@CONNECTIONS | 记录自最后一次服务器启动以来,所有针对这台服务器进行的连接数目,包括没有连接成功的尝试。 使用@@CONNECTIONS可以让系统管理员很容易地得到今天所有试图连接本服务器的连接数目。 |
@@CUP_BUSY | 记录自上次启动以来尝试的连接数,无论连接成功还是失败,都以ms为单位的CPU工作时间。 |
@@CURSOR_ROWS | 返回在本次服务器连接中,打开游标取出数据行的数目。 |
@@DBTS | 返回当前数据库中timestamp数据类型的当前值。 |
@@ERROR | 返回执行上一条Transact-SQL语句所返回的错误代码。 |
@@FETCH_STATUS | 返回上一次使用游标FETCH操作所返回的状态值,且返回值为整型。0:FETCH 语句成功 −1:FETCH 语句失败或此行不在结果集中。−2:被提取的行不存在 |
@@IDENTITY | 返回最近一次插入的identity列的数值,返回值是numeric。 |
@@IDLE | 返回以ms为单位计算SQL Server服务器自最近一次启动以来处于停顿状态的时间。 |
@@IO_BUSY | 返回以ms为单位计算的SQL Server服务器自最近一次启动以来花在输入和输出上的时间。 |
@@LOCK_TIMEOUT | 返回当前对数据锁定的超时设置。 |
@@PACK_RECEIVED | 返回SQL Server服务器自最近一次启动以来一共从网络上接收数据分组的数目。 |
@@PACK_SENT | 返回SQL Server服务器自最近一次启动以来一共向网络上发送数据分组的数目。 |
@@PACK_SENT | 返回SQL Server服务器自最近一次启动以来一共向网络上发送数据分组的数目。 |
@@PROCID | 返回当前存储过程的ID标识。 |
@@REMSERVER | 返回在登录记录中记载远程SQL Server服务器的名字。 |
@@ROWCOUNT | 返回上一条SQL语句所影响到数据行的数目。对所有不影响数据库数据的SQL语句,这个全局变量返回的结果是0。在进行数据库编程时,经常要检测@@ROWCOUNT的返回值,以便明确所执行的操作是否达到了目标。 |
@@SPID | 返回当前服务器进程的ID标识。 |
@@TOTAL_ERRORS | 返回自SQL Server服务器启动来,所遇到读写错误的总数。 |
@@TOTAL_READ | 返回自SQL Server服务器启动来,读磁盘的次数。 |
@@TOTAL_WRITE | 返回自SQL Server服务器启动来,写磁盘的次数。 |
@@TRANCOUNT | 返回当前连接中,处于活动状态事务的数目。 |
@@VERSION | 返回当前SQL Server服务器安装日期、版本,以及处理器的类型。 |
1.3 注释符、运算符与通配符
1、注释符。 注释语句不是可执行语句,不参与程序的编译,通常是一些说明性的文字,对代码的功能或者代码的实现方式给出简要的解释和提示。
--DECLARE @a INT; 单行注释
PRINT @@ERROR;
/*DECLARE @a INT;
PRINT @@ERROR;*/ 多行注释
注释快捷键:Ctrl + K 然后按住Ctrl键不放,按C
取消注释快捷键:Ctrl + K 然后按住Ctrl键不放,按U
2、运算符。
1.算术运算符包括:+(加)、-(减)、*(乘)、/(除)、%(取余)。
2.赋值运算符,即等号 (=)
3.比较运算符:>(大于)、<(小于)、=(等于)、>=(大于等于)、<=(小于等于)、!=(不等于_、!>(不大于)、!<(不小于)
和其他SQL Server 数据类型不同,不能将布尔数据类型指定为表列或变量的数据类型,也不能在结果集中返回布尔数据类型。
4.逻辑运算符:
ALL:如果一个比较集中全部都是TRUE,则值为TRUE
AND:如果两个布尔表达式均为TRUE,则值为TRUE
ANY:如果一个比较集中任何一个为TRUE,则值为TRUE
BETWEEN:如果操作数是在某个范围内,则值为TRUE
EXISTS:如果子查询包含任何行,则值为TRUE
IN:如果操作数与一个表达式列表中的某个相等的话,则值为TRUE
LIKE:如果操作数匹配某个模式的话,则值为TRUE
NOT:对任何其他布尔运算符的值取反
OR:如果任何一个布尔表达式是TRUE,则值为TRUE
SOME:如果一个比较集中的某些为TRUE的话,则值为TRUE
5.位运算符。
&:按位AND
|:按位OR
^:按位互斥OR
~:按位NOT
运算符优先级如下:
- +(正) −(负) ~(位反)
- *(乘) /(除) %(取余)
- +(加) +(字符串串联运算符) -(减)
- =、>、<、>=、<=、<>、!=、!>、!<(比较运算符)
- ^(按位异或)&(按位与)| (按位或)
- NOT
- AND
- ALL ANY BETWEEN IN LIKE OR SOME(逻辑运算符)
- =(赋值)
若表达式中含有相同优先级的运算符,则从左向右依次处理。还可以使用括号来提高运算的优先级,在括号中的表达式优先级最高。如果表达式有嵌套的括号,那么首先对嵌套最内层的表达式求值。
3、通配符。 在 SQL 中通常用 LIKE 关键字与通配符结合起来实现模式查询。其中 SQL 支持的通配符如下表所示:
通 配 符 | 描 述 | 示 例 |
---|---|---|
% | 包含零个或更多字符的任意字符 | "Amo%"可以表示:“Amo”、“Amo Cool”、“Amo?” |
_ | 任何单个字符 | "Amo_"可以表示:“AmoS”。后面只能再接一个字符 |
[ ] | 指定范围([a-f])或集合([abcdef])中的任何单个字符 | [1-9]2 表示以1-9之间任意一个字符开头,以’2’结尾的字符串 |
[^] | 不属于指定范围([a-f])或集合([abcdef])的任何单个字符 | [^0-5]123 表示不以0~5之间任意一个字符开头,却以’123’结尾的字符 |
1.4 流程控制
流程控制语句是用来控制程序执行流程的语句。使用流程控制语句可以提高编程语言的处理能力。Transact-SQL 语言提供的流程控制语句如下所示:
BEGIN...END
WHILE :
IF...ELSE
BREAK
CONTINUE
RETURN
GOTO
WAITFOR
1、BEGIN…END。用于将多个 Transact-SQL 语句组合为一个逻辑块。当流程控制语句必须执行一个包含两条或两条以上的 T-SQL 语句的语句块时,使用 BEGIN…END 语句。语法格式如下:
BEGIN
{sql_statement...}
END
【练习1】在BEGIN…END语句块中完成把两个变量的值交换。运行结果如下图所示:
此例子不用 BEGIN…END 语句结果也完全一样,但 BEGIN…END 和一些流程控制语句结合起来就有作用了。在 BEGIN…END 中可嵌套另外的 BEGIN…END 来定义另一程序块。
2、IF。IF结构的语法如下:
IF<条件表达式>
{命令行|程序块}
IF<条件表达式>
{命令行1|程序块1}
[ELSE
{命令行2|程序块2}]
【示例1】判断一个数是否是正数。SQL 语句如下:
declare @x int
set @x=3
if @x>0
print '@x是正数'
print'end'
【练习2】判断一个数的奇偶性。运行结果如下图所示:
【示例2】判断两个数的大小。
declare @x int,@y int
set @x=8
set @y=3
if @x>@y
print '@x大于@y'
else
print'@x小于等于@y'
运行结果如下图所示:
【练习3】 输入一个坐标值,然后判断它在哪一个象限。
3、CASE。CASE 结构的语法如下:
CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression]
END
CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression]
END
【练习4】 在student数据库中的grade表,查询每个同学的成绩。如果成绩大于等于90,显示成绩优秀;如果成绩小于90大于等于80,显示成绩良好。如果成绩小于80大于等于70,显示成绩及格。否则将显示不及格。运行结果如下图所示:
稍微复杂的 SQL 语句:
USE pubs
SELECT kind =
CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(30)) AS 'Shortened Title',
price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
--CASE的第二种形式:
USE pubs
SELECT 'Price Kind' =
CASE
WHEN price IS NULL THEN 'Not yet priced'
WHEN price < 20 THEN 'Very Reasonable Title'
WHEN price >= 20 and price < 20 THEN 'Coffee Table Title'
ELSE 'Expensive book!'
END,
CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
4、WHILE。WHILE 子句是 T-SQL 语句支持的循环结构。在条件为真的情况下,WHILE 子句可以循环地执行其后的一条T-SQL 命令。如果想循环执行一组命令,则需要使用 BEGIN…END 子句:
WHILE<条件表达式>
BEGIN
<命令行|程序块>
END
【练习5】 求1~10的整数的和。运行结果如下图所示:
5、WHILE…CONTINUE…BREAK。循环结构 WHILE 子句还可以用 CONTINUE 和 BREAK 命令控制 WHILE 循环中语句的执行。语法格式如下:
WHILE<条件表达式>
BEGIN
<命令行|程序块>
[BREAK]
[CONTINUE]
[命令行|程序块]
END
【练习6】求1~10之间的偶数的和,并用CONTINUE控制语句的输出。
6、RETURN。RETURN 语句用于从查询过程中无条件退出。RETURN 语句可在任何时候用于从过程、批处理或语句块中退出。位于 RETURN 之后的语句不会被执行。语法格式如下:
RETURN[整数值]
在括号内可指定一个返回值。如果没有指定返回值,SQL Server系统会根据程序执行的结果返回一个内定值,内定值如下表所示:
返 回 值 | 含 义 |
---|---|
0 | 程序执行成功 |
−1 | 找不到对象 |
−2 | 数据类型错误 |
−3 | 死锁 |
−4 | 违反权限原则 |
−5 | 语法错误 |
−6 | 用户造成的一般错误 |
−7 | 资源错误,如磁盘空间不足 |
−8 | 非致命的内部错误 |
−9 | 已达到系统的极限 |
−10或−11 | 致命的内部不一致性错误 |
−12 | 表或指针破坏 |
−13 | 数据库破坏 |
−14 | 硬件错误 |
示例 SQL 语句如下:
declare @x int
set @x=3
if @x>0
print'遇到return之前'
return
print'遇到return之后'
7、GOTO。用来改变程序执行的流程,使程序跳到标识符指定的程序行再继续往下执行。语法格式如下:
--语法格式:GOTO 标识符
--示例:
declare @X int
select @X=1
loving:
print @X
select @X=@X+1
WHILE @X<=3 goto loving
8、WAITFOR。指定触发器、存储过程或事务执行的时间、时间间隔或事件;还可以用来暂时停止程序的执行,直到所设定的等待时间已过才继续往下执行。语法格式如下:
-- 语法格式:WAITFOR{DELAY<’时间’>|TIME<’时间’>
-- 1.DELAY:用来设定等待的时间,最多可达24小时。
-- 2.TIME:用来设定等待结束的时间点。
WAITFOR DELAY'00:00:03'
PRINT'葱葱睡觉了!'
WAITFOR TIME'15:00:00'
PRINT'喜爱的歌曲:舞'
二、SQL 函数
(1) SUM(求和) 函数:返回表达式中所有值的和或非重复值的和。
(2) AVG(平均值) 函数:返回组中各值的平均值,忽略空值。
(3) MIN(最小值) 函数:用于返回表达式中的最小值。
(4) MAX(最大值) 函数:用于返回表达式中的最大值。
(5) COUNT(统计) 函数:用于返回组中的项数。
(6) DISTINCT(取不重复) 函数:对指定的集求值,删除该集中的重复元组,然后返回结果集。
(7) ABS(绝对值) 函数:用于返回数值表达式的绝对值。
SELECT ABS(1.5),ABS(-2.5);
(8) PI(圆周率) 函数:用于返回 PI 的常量值。
SELECT PI();
(9) POWER(乘方) 函数:用于返回对数值表达式进行幂运算的结果。
SELECT POWER(2,2),POWER(3,3),POWER(4,4);
(10) RAND(随机浮点数) 函数:用于返回 0~1 的随机 float 值。
DECLARE @counter smallint;
SET @counter = 1;
WHILE @counter < 4
begin
--SELECT RAND(10) Random_Number
SELECT RAND() Random_Number
SET @counter = @counter + 1
end;
(11) ROUND(四舍五入) 函数:用于返回一个数值,舍入到指定的长度或精度。
SELECT ROUND(123.9994,3),ROUND(123.9995,3);
(12) SQUARE(平方) 函数和 SQRT(平方根) 函数。
SELECT SQUARE(4) --16
declare @mysqrt float
set @mysqrt = 1.00
while @mysqrt < 10.00
begin
select SQRT(@mysqrt)
select @mysqrt = @mysqrt + 1
end
(13) 字符串函数如下:
函数名称 | 用途 |
---|---|
ASCII | 返回字符表达式最左端字符的ASCII代码值 |
REVERSE | 返回字符表达式的反转 |
CHARINDEX | 返回字符串中指定表达式的起始位置 |
RIGHT | 从右边开始,取得字符串右边指定个数的字符 |
LEFT | 从左边开始,取得字符串左边指定个数的字符 |
STR | 返回由数字数据转换来的字符数据 |
LEN | 返回指定字符串的字符(而不是字节)个数 |
SUBSTRING | 返回指定个数的字符 |
REPLACE | 将指定的字符串替换为另一指定的字符串 |
【练习7】使用ASCII函数返回AMOXiang的ASCII代码值。
【练习8】使用RIGHT函数查询student数据库中grade表学号的后2位。
(14) 日期和时间函数如下:
函数名称 | 用途 |
---|---|
DATEADD | 在向指定日期加上一段时间的基础上,返回新的datetime值 |
DATEDIFF | 返回跨两个指定日期的日期和时间边界数 |
GETDATE | 返回当前系统日期和时间 |
DAY | 返回指定日期中的天的整数 |
MONTH | 返回指定日期中的月份的整数 |
YEAR | 返回指定日期中的年份的整数 |
(15) CAST 函数和 CONVERT 函数如下:
函数名称 | 用途 |
---|---|
CAST | 用于将某种数据类型的表达式显示转换为另一种数据类型。 |
CONVERT | 与CAST函数功能相似,该函数不是一个ANSI标准SQL函数,按照指定的格式将数据转换为另一种数据类型。 |
以上是关于第十三章:Sqlserver2019数据库之Transact-SQL 语法基础及常用 SQL 函数总结的主要内容,如果未能解决你的问题,请参考以下文章