目录
1. 认识SQL
1.1 SQL的标准
SQL是数据库沟通的语言标准,有以下三个主要的标准: Sql是数据库沟通的语言标准,有以下三个主要的标准:
(1) ANSI (American National Standards Institute,美国国家标准机构)SQL,对 ANSI SQL修改后在1992年采纳的标准,称为SQL-92或SQL2。
(2)最近的SQL-99标准,SQL-99标准从sQL2扩充而来并增加了对象关系特征和许多其他新功能。
(3)其次,各大数据库厂商提供了不同版本的SQL,这些版本的SQL不但包括原始的ANSI标准,而且在很大程度上支持新推出的SQL-92标准。
注意:虽然SQL是一门ANSI标准的计算机语言,但是仍然存在着多种不同版本的SQL。然而,为了与ANSI标准相兼容,它们必须以相似的方式共同地来支持一些主要的命令(比如SELECT、UPDATE、DELETE、INSERT、WHERE等)。
1.2 SQL的种类
1.3 SQL的功能
2. 常量
2.1 数字常量
18,-2
注意:数字常量之间不要加 , 避免被识别为多个数字
小数常量常又没有用引号括起来并且包含小数点的数字字符串来表示
184.12,3.1415
浮点常量常用科学记数法来表示
104.5E5,2.1E-2
货币常量以前缀为可选的小数点和可选的货币符号的数字字符串来表示,货币常量不使用引号括起来
$15,¥5
在使用数字常量的过程中,若要指示一个数是正数还是负数,对数值常量应用“+”或“- ”一元运算
符,如果没有应用+或-一元运算符,数值常量将使用正数。
2.2 字符串常量
字符串常量括在单引号内,包含字母和数字字符(a~z、A~Z和0~9)以及特殊字符,如感叹号(!)、
at符号(@)和#号(#)。
如果单引号中的字符串包含一个嵌入的引号,可以使用两个单引号表示嵌入的单引号。如
'Time'
'L''Ning!'
'I Love SQL Server!'
2.3 日期和时间常量
在SQL中,日期和时间常量使用特定格式的字符日期值来表示,并用单引号括起来
'December 1,2019'
'1 December,2019'
!191105!
'11/5/19'
2.4 符号常量
在SQL中,除了为用户提供一些数字常量、字符串常量、日期与时间常量外,还提供了几个比较特殊的符号常量,这些常量代表不同的常用数据值,如CURRENT DATE表示当前系统日期、CURRENT TIME表示当前系统时间等,这些符号常量可以通过SQL Server的内嵌函数访问
3. 变量
变量可以保存查询之后的结果,可以在查询语句中使用变量,也可以将变量中的值插入到数据表中, 在 SQL 中变量的使用非常灵活方便,可以在任何SQL语句集合中声明使用,根据其生命周期,可以分为全局变量和局部变量。
3.1 局部变量
局部变量是用户可自定义的变量,它是一个能够拥有特定数据类型的对象,其作用范围仅限制在程序内部。局部变量被引用时要在其名称前加上标志“@”,而且必须先用 DECLARE 命令声明后才可以使用。
定义局部变量的语法格式 DECLARE {@local-variable data-type} [. · ·n]
主要参数含义介绍如下。
·@local-variable:用于指定局部变量的名称,变量名必须以符号“@”开头,且必须符合SQL Server
的命名规则。
· data-type:用于设置局部变量的数据类型及其大小。data-type可以是任何由系统提供的或用户定义
的数据类型。但是,局部变量不能是text、ntext或image数据类型。
3.2 全局变量
全局变量是SQL Server系统提供的内部使用的变量,不用用户参与定义,对用户而言,其作用范围并
不仅局限于某一程序,而是任何程序均可以随时调用。
全局变量通常存储一些SQL Server的配置设定值和统计数据,用户可以在程序中用全局变量来测试系
统的设定值或者是SQL命令执行后的状态值。
在使用全局变量时,由于全局变量不是由用户的程序定义的,它们是在服务器级定义的,用户只能使 用预先定义的全局变量,而不能修改全局变量。引用全局变量时,必须以标记符“@@”开头。另外,局 部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。SQL Server中常用
的全局变量及其含义如表3-2所示。
表3-2 SQL Server 中常用的全局变量
全局变量名称 | 含 义 |
@@CONNECTIONS | 返回SQL Server自上次启动以来尝试的连接数,无论连接是成功还是失败 |
@@CPU BUSY | 返回SQL Server自上次启动后的工作时间。其结果以CPU时间增量或“滴答数”表示, 此值为所有CPU时间的累积,因此可能会超出实际占用的时间。乘以@@TIMETICKS即 可转换为微秒 |
@@CURSOR ROWS | 返回连接上打开的上一个游标中的当前限定行的数目。为了提高性能,SQL Server可异步 填充大型键集和静态游标。可调用@@CURSOR ROWS以确定当其被调用时检索了游标 符合条件的行数 |
@@DATEFIRST | 针对会话返回SET DATEFIRST的当前值 |
@@DBTS | 返回当前数据库的当前timestamp数据类型的值。这一时间戳值在数据库中必须是唯一的 |
@@ERROR | 返回执行的上一个Transact SQL语句的错误号 |
@@FETCH STATUS | 返回针对连接当前打开的任何游标,发出的上一条游标FETCH语句的状态 |
@@IDENTITY | 返回插入到表的IDENTITY列的最后一个值 |
@@IDLE | 返回SQL Server自上次启动后的空闲时间。结果以CPU时间增量或“时钟周期”表示, 并且是所有CPU的累积,因此该值可能超过实际经过的时间。乘以@@TIMETICKS即 可转换为微秒 |
全局变量名称 | 含 义 |
@@IO BUSY | 返回自从SQL Server最近一次启动以来,SQL Server已经用于执行输入和输出操作的时 间。其结果是CPU时间增量(时钟周期),并且是所有CPU的累积值,所以,它可能超 过实际消逝的时间。乘以@@TIMETICKS即可转换为微秒 |
@@LANGID | 返回当前使用的语言的本地语言标识符(ID) |
@@LANGUAGE | 返回当前所用语言的名称 |
@@LOCK TIMEOUT | 返回当前会话的当前锁定超时设置(毫秒) |
@@MAX CONNECTIONS | 返回SQL Server实例允许同时进行的最大用户连接数。返回的数值不一定是当前配置的数值 |
@@MAX PRECISION | 按照服务器中的当前设置,返回decimal和numeric数据类型所用的精度级别。默认情况 下,最大精度返回38 |
@@NESTLEVEL | 返回对本地服务器上执行的当前存储过程的嵌套级别(初始值为0) |
@@OPTIONS | 返回有关当前SET选项的信息 |
@@PACK RECEIVED | 返回SQL Server自上次启动后从网络读取的输入数据包数 |
@@PACK SENT | 返回SQL Server自上次启动后写入网络的输出数据包数 |
@@PACKET ERRORS | 返回自上次启动SQL Server后,在SQLServer连接上发生的网络数据包错误数 |
@@ROWCOUNT | 返回上一次语句影响的数据行的行数 |
@@PROCID | 返回SQL当前模块的对象标识符(ID)。SQL模块可以是存储过程、用户定义函数或触 发器。不能在CLR模块或进程内数据访问接口中指定@@PROCID |
@@SERVERNAME | 返回运行SQL Server的本地服务器的名称 |
@@SERVICENAME | 返回SQL Server正在其下运行的注册表项的名称。若当前实例为默认实例,则 @@SERVICENAME返回MSSQLSERVER;若当前实例是命名实例,则该函数返回该实例名 |
@@SPID | 返回当前用户进程的会话ID |
@@TEXTSIZE | 返回SET语句的TEXTSIZE选项的当前值,它指定SELECT语句返回的text或image数 据类型的最大长度,其单位为字节 |
@@TIMETICKS | 返回每个时钟周期的微秒数 |
@@TOTAL ERRORS | 返回自上次启动SQL Server之后,SQL Server所遇到的磁盘写入错误数 |
@@TOTAL READ | 返回SQL Server自上次启动后,由SQLServer读取(非缓存读取)的磁盘的数目 |
@@TOTAL WRITE | 返回自上次启动SQL Server以来,SQL Server所执行的磁盘写入数 |
@@VERSION | 返回当前安装的日期、版本和处理器类型 |
@@TRANCOUNT | 返回当前连接的活动事务数 |
4. 运算符
运算符是一些符号,它们能够用于执行算术运算、字符串连接、赋值以及在字段、常量和变量之间进 行比较。在SQL Server中,运算符主要有以下6大类:算术运算符、赋值运算符、比较运算符、逻辑运算符、连接运算符以及按位运算符。
4.1 算术运算符
算术运算符可以在两个表达式上执行数学运算,这两个表达式可以是任何数值数据类型。SQL中的算术运算符如表4-1所示。
表 4-1 SQL中的算术运算符
运算符 | 作 用 |
+ | 加法运算 |
减法运算 | |
* | 乘法运算 |
1 | 除法运算,返回商 |
% | 求余运算,返回余数 |
加法和减法运算符也可以对日期和时间类型的数据执行算术运算,求余运算即返回一个除法运算的整数余数,例如,表达式14%3的结果等于2。
4.2 比较运算符
比较运算符用来比较两个表达式的大小,表达式可以是字符、数字或日期数据,其比较结果是布尔值。 比较运算符测试两个表达式是否相同。除了text、ntext或image数据类型的表达式外,比较运算符可以用于所有的表达式。表4-2列出了SQL中的比较运算符。
表4-2 SQL中的比较运算符
运算符 | 含 义 |
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于或等于 |
<= | 小于或等于 |
<=> | 不等于 |
!= | 不等于(非ISO标准) |
!< | 不小于(非ISO标准) |
!> | 不大于(非ISO标准) |
4.3 逻辑运算符
逻辑运算符可以把多个逻辑表达式连接起来测试,以获得其真实情况,返回带有TRUE、FALSE或
UNKNOWN值的Boolean数据类型。SQL中包含如表4-3所示的一些逻辑运算符。
表4-3 逻辑运算符。
运算符 | 含 义 |
ALL | 如果一组的比较都为TRUE,那么就为TRUE |
AND | 如果两个布尔表达式都为TRUE,那么就为TRUE |
ANY | 如果一组的比较中任何一个为TRUE,那么就为TRUE |
BETWEEN | 如果操作数在某个范围之内,那么就为TRUE |
EXISTS | 如果子查询包含一些行,那么就为TRUE |
IN | 如果操作数等于表达式列表中的一个,那么就为TRUE |
LIKE | 如果操作数与一种模式相匹配,那么就为TRUE |
NOT | 对任何其他布尔运算符的值取反 |
OR | 如果两个布尔表达式中的一个为TRUE,那么就为TRUE |
SOME | 如果在一组比较中有些为TRUE,那么就为TRUE |
4.4 按位运算符
按位运算符在两个表达式之间执行位操作,这两个表达式可以为整数数据类型类别中的任何数型。
SQL中的按位运算符如表4-5所示
4.5连接运算符
加号(+)是字符串串联运算符,可以将两个或两个以上字符串合并成一个字符串。其他所有字符串操作都使用字符串函数(如SUBSTRING)进行处理。
默认情况下,对于varchar数据类型的数据,在INSERT或赋值语句中,空的字符串将被解释为空字符 串。在串联varchar、char或text数据类型的数据时,空的字符串被解释为空字符串。例如,'abc+"+'def被存储为'abcdef。
4.5 运算符优先级
当一个表达式中的两个运算符有相同的运算符优先级别时,将按照它们在表达式中的位置对其从左到 右进行求值。当然,在无法确定优先级的情况下,可以使用圆括号()来改变优先级,并且这样会使计算过程更加清晰。
5. 通配符和注释符
5.1 通配符
查询时,有时无法指定一个清楚的查询条件,此时可以使用SQL通配符,通配符用来代替一个或多个字符,在使用通配符时,要与LIKE运算符一起使用。SQL中常用的通配符如表5-1所表示
表5-1 SQL的通配符
通 配 符 | 说 明 |
% | 匹配任意长度的字符,甚至包括零字符 |
_ | 匹配任意单个字符 |
[字符集合] | 匹配字符集合中的任何一个字符 |
[^]或[!] | 匹配不在括号中的任何字符 |
5.2 注释符
注释语句不是可执行语句,不参与程序的编译,通常是一些说明性的文字,对代码的功能或者代码的
实现方式给出简要的解释和提示。SQL中的注释分为以下两种。
1. 单行注释
单行注释以两个连字符“--”开始,作用范围是从注释符号开始到一行的结束。例如:
--15
--SECLECT * FROM
2. 多行注释
多行注释作用于某一代码块,该种注释使用斜杠星型(/**/),使用这种注释时,编译器将忽略从“/*”
开始后面的所有内容,直到遇到“*/”为止。例如:
/*
abic
nik
*/
--如果没有找到匹配的*/ 后面的代码将会被全部注释掉