T-SQL 之 语法元素
一、标识符
在T-SQL语言中,对SQLServer数据库及其数据对象(比如表、索引、视图、存储过程、触发器等)需要以名称来进行命名并加以区分,这些名称就称为标识符。
通常情况下,SQLServer数据库、Oracle数据库以及各种数据对象都应该有一个标识符,但对于某些对象来说,比如约束,标识符是可选的。推荐每个对象都使用标识符。
1、常规标识符的规则
[1] 首字符:标识符的第一个字符必须满足下列条件:
Unicode标准3.2定义的字母,通常就是字母a~z和A~Z。
下划线(_)、at字符(@)、或数字符号(#)。
[2] 后续字符:
Unicode标准3.2中所定义的字母。
基本拉丁字符或其他国家/地区字符中的十进制数字。
at符号(@)、美元符号($)、数字符号或下划线。
[3] 不能是保留字(默认关键字):
常规标识符不能使用SQL Server内部的保留字,比如char。
[4] 不允许嵌入空格:
2、带分隔符的标识符
当一定要使用保留字时,如table,这样的标识符是SQLServer内部的保留字,如果非得这样使用,就必须用这样的方式:"table"。
(1)分隔符
T-SQL规定下列符号为特定的分隔符。
[1] 双引号("):用于表示引用的标识符。
[2] 中括号([]):用于表示括号中的标识符。
(2)使用分隔符的情况
T-SQL常在下列情况下使用分隔符。
[1] 对象名称或对象名称的组成部分中包含保留字时。
[2] 使用其他特殊的字符时。
二、数据类型
T-SQL语言和SQLServer数据库中的数据通常需要定义一个数据类型,数据类型定义了对象可以容纳的数据的种类。
1、需要声明数据类型的对象
(1)表 和 视图的列:在定义表或视图时,其列需要定义数据类型。
(2)存储过程的参数:在定义存储过程的T-SQL代码中定义参数的数据类型。
(3)变量:如果在T-SQL中使用变量,需要定义数据类型。
(4)带返回值的函数:返回一个或多个特定类型数据值的T-SQL函数中的返回值需要定义数据类型。
(5)带返回代码的存储过程:具有返回代码的存储过程。
2、选择恰当的数据类型
(1)必须
首先根据需要判断数据的类别、需要存储的数据的最大长度和大小,对于数字数据类型还要考虑精度和小数位数,然后再T-SQL中挑选备用的数据类型。
(2)够用
接下来可以在备用的数据类型中挑选够用即可的类型作为最后的方案。比如要表述“身份证号码”这样的字段,nvarchar和nchar这样的数据类型都可以,最后我们可以使用nchar(18),因为身份证号码规定为统一的18位,所以选择定长的数据类型。
(3)权衡
权衡空间和效率,权衡数据的存储方式等。
通常情况下,数据类型的长度越小,存储大量数据所需要的存储空间就越小。因此一次I/O读取到内存中的数据记录就会越多,同样大小的内存空间存储的记录数量就会更多,这样T-SQL语句使用数据时从内存读取的几率就增大了,所以自然效率就高,尤其是联机事务频繁的系统,这样的设计优点就十分明显。"细节决定成败",数据类型的选择恰当与否往往会对数据库系统的性能产生非常大的影响。
3、基本数据类型
名称 | 说明 | 取值范围 |
Bit | 整数型 | 0、1或NULL,常用于代表Yes(No)、True(False)等 |
Int | 整数型 | -2147483648~2147483647 |
tinyint | 整数型 | 0~255 |
smallint | 整数型 | -32768~32768 |
Bigint | 整数型 | -9223372036854775808~9223372036854775807 |
binary | 二进制 | 1~8000字符的定长二进制数据,比如0x2A |
varbinary | 二进制 | 1~8000字符的变长二进制数据,varbinary(max)可以存储2^31个字节 |
image | 二进制 | 变长达20亿字符的二进制数据 |
char | 字符型 | 1~8000字符的定长、非Unicode字符数据 |
varchar | 字符型 | 1~8000字符的非定长的、Unicode字符数据varchar(max)可以存储2^31个字符 |
text | 字符型 | 变长达20亿字符的unicode字符数据 |
nchar | unicode字符型 | 1~4000定长的、unicode字符数据 |
nvarchar | unicode字符型 | 1~4000字符的非定长的、unicode字符数据,nvarchar(max)可以存储2^31-1个字符 |
ntext | unicode字符型 | 1~1073741823字符、非定长的、unicode字符数据 |
datetime | 日期时间型 | 1753年1月1日~9999年12月31日的日期和时间 |
smalldatetime | 日期时间型 | 1900年1月1日~2079年6月6日的日期和时间 |
decimal | 精确数值型 | -1038次方+1~1038-1的固定精度和范围的数值型数据 |
numeric | 精确数值型 | 同decimal |
float | 近似数值型 | -1.79E+308~1.79E+308之间的浮点数 |
real | 近似数值型 | -3.40E+38~3.40E+38之间的浮点数 |
money | 货币型 | -263~263-1的货币型数据,精确到万分之一 |
smallmoney | 货币型 | -214748.3648~214748.3647的货币型数据,精确到万分之一 |
timestamp | 特殊类型 | 时间戳,用于记录SQLServer在一行数据的活动次序 |
uniqueidentifier | 特殊类型 | 16位的16进制数据表示的全局唯一标识符(GUID) |
sql_variant | 特殊类型 | 存储除了text、ntext、image和sql_variant之外的SQLServer支持的各种数据类型值的数据类型 |
4、SQLServer2008新增数据类型
[1] 日期和时间类型
名称 | 取值范围 |
Time | 00:00:00.0000000到23:59:59.0000000,按照hh:mm:ss的格式精确表示时间 |
Date | 00001-01-01到99999-12-31,按照年-月-日的格式表示日期 |
DateTime2 | 0001-01-01 00:00:00.0000000到9999-12-31 23:59:59:9999999,表示日期和时间 |
DateTimeOffset | 00000-01-01 00:00:00.0000000到99999-12-31 23:59:59:9999999 |
[2] hierarchid
新增的数据类型,用于创建层次结构的表,或引用位于另一位置的数据层次结构。
三、常量
常量是指在T-SQL代码中其值始终不变的数据。常量的定义格式取决于其所属于的数据类型。
常量的使用不需要定义,直接在T-SQL中使用就可以,所以需要关注的是各种典型的常量的格式。
1、数值型常量
数值型常量的格式不需要任何其他的符号,只需要按照特定的数据类型进行赋值就可以
(1)、bit常量:0、1
(2)、int常量:89、22
(3)、decimal(numeric)常量:123.89、89.0
(4)、float(real)常量:100.5E5
(5)、money(smallmoney)常量:$12、$123.90
2、字符串型常量
字符串型常量的格式需要以单引号(')包含起来。
1、非unicode字符串常量:'Hello World'
2、unicode字符串常量:N'Hello World'
N 在这里表示Unicode,就是双字节字符。对于西文字符,用一个字节来存储过足够了,对于东方文字字符,就需要两个字节来存储。Unicode 为了统一、规范、方便、兼容,就规定西文字符也用两个字节来存储。也就是说加 N 就表示字符串用 Unicode 方式存储。但有时候加与不加都一样,这是由于自动转换造成的。
3、单引号作为字符串常量的处理:
如果单引号本身也属于字符串常量的内容,就需要使用单引号将其包含在内,比如'O'''Brien'实际上定义的就是字符串O'Brien。''你好'',定义的就是'你好'。
4、日期时间型常量的格式
日期时间型常量的格式需要以单引号('')包含起来,和字符串常量的格式一致。
如:'April 15,1998' '04/15/98' '14:30:24' '04:24 PM'
四、注释
在T-SQL代码中,添加注释信息是一个很好的习惯,便于程序的可读性。
1、添加单行注释
如果需要添加单行注释,可以使用两个连字符(--)。
如: select * from person --查询所有的人信息
2、添加多行注释信息
如果需要添加多行注释信息,可以使用正斜杠型号字符对(/**/)
五、变量
在T-SQL语言中,经常需要使用变量来临时赋值,变量常用于在T-SQL代码中作为存储执行的计数器,或作为临时数据存储场所。
1、变量的数据类型
SQLServer支持的数据类型。
2、变量的分类
(1)、全局变量
T-SQL中的全局变量是由SQLServer系统定义和使用的变量。DBA和用户可以使用全局变量的值,但不能自己定义全局变量。全局变量以两个@@为标记,如 @@Connections等。
(2)、局部变量
T-SQL中的局部变量是由用户定义和使用的变量,其作用范围仅仅局限在定义的T-SQL程序内。局部变量以一个@为标记,如@A。
3、局部变量的声明
在T-SQL程序中,定义局部变量的语法如下。
DECLARE
{{@local_variable data_type} |{@cursor_variable_name CURSOR} |{table_type_definition} }
[,...n]
主要参数说明如下:
[1] @local_variable:局部变量的名称,必须以at符号(@)开头,符合标识符规则。
[2] data_type:任何有系统提供的或用户定义的数据类型,但不能是text、ntext或image数据类型。
[3] @cursor_variable_name:游标变量的名称。
[4] CURSOR:指定变量是局部游标变量,为关键字。
[5]table_type_definition:定义表数据类型。
4、局部变量的赋值
T-SQL程序中给局部变量赋值有三种方法。
[1] SET语句赋值
在T-SQL程序中,用SET语句给局部变量赋值的语法如下:
SET @local_variable=expression
其中,@local_variable为局部变量的名称,expression为有效的表达式,表示将表达式的值赋予局部变量。
[2] select语句赋值
与上面的SET等效的赋值语句是将SET替换为SELECT。
SELECT @local_variable=expression
[3] 通过选择语句赋值
很多情况下,局部变量需要获取通过选择语句查询某个表后得到的字段值。
SELECT @empId = max(empId) --查出的值赋给局部变量
FROM tableTest
如果查询语句返回的值不止一行,而且变量引用一个非标量表达式,那么最后变量的值将是最后一行记录的特定字段的值。
5、局部变量的作用域
局部变量的作用域就是可以引用该变量的T-SQL语句的范围。局部变量的作用域从声明变量的地方到声明变量的批处理或存储过程的结尾。
六、SQLServer 数据库常用全局变量
select APP_NAME ( ) as w --当前会话的应用程序 select @@IDENTITY --返回最后插入的标识值
select USER_NAME() --返回用户数据库用户名 SELECT @@CONNECTIONS --返回自上次SQL启动以来连接或试图连接的次数。
SELECT GETDATE() --当前时间
SELECT @@CPU_BUSY/100 --返回自上次启动SQL 以来 CPU 的工作时间,单位为毫秒 USE tempdb SELECT @@DBTS as w --为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。
select @@IDENTITY as w --返回最后插入的标识值
SELECT @@IDLE as w --返回SQL自上次启动后闲置的时间,单位为毫秒
SELECT @@IO_BUSY AS w --返回SQL自上次启动后用于执行输入和输出操作的时间,单位为毫秒
SELECT @@LANGID AS w --返回当前所使用语言的本地语言标识符(ID)。
SELECT @@LANGUAGE AS w --返回当前使用的语言名
SELECT @@LOCK_TIMEOUT as w --当前会话的当前锁超时设置,单位为毫秒。
SELECT @@MAX_CONNECTIONS as w --返回SQL上允许的同时用户连接的最大数。返回的数不必为当前配置的数值
EXEC sp_configure --显示当前服务器的全局配置设置
SELECT @@MAX_PRECISION as w --返回 decimal 和 numeric 数据类型所用的精度级别,即该服务器中当前设置的精度。默认最大精度38。
select @@OPTIONS as w --返回当前 SET 选项的信息。
SELECT @@PACK_RECEIVED as w --返回SQL自启动后从网络上读取的输入数据包数目。
SELECT @@PACK_SENT as w --返回SQ自上次启动后写到网络上的输出数据包数目。
SELECT @@PACKET_ERRORS as w --返回自SQL启动后,在SQL连接上发生的网络数据包错误数。
SELECT @@SERVERNAME as w --返回运行SQL服务器名称。
SELECT @@SERVICENAME as w --返回SQL正在其下运行的注册表键名
SELECT @@TIMETICKS as w --返回SQL服务器一刻度的微秒数
SELECT @@TOTAL_ERRORS AS w --返回 SQL服务器自启动后,所遇到的磁盘读/写错误数。
SELECT @@TOTAL_READ as w --返回 SQL服务器自启动后读取磁盘的次数。
SELECT @@TOTAL_WRITE as w --返回SQL服务器自启动后写入磁盘的次数。
SELECT @@TRANCOUNT as w --返回当前连接的活动事务数。
SELECT @@VERSION as w --返回SQL服务器安装的日期、版本和处理器类型。
T-SQL 之 语法元素的更多相关文章
- SQL select 语法(转)
SQL 里面最常用的命令是 SELECT 语句,用于检索数据.语法是: SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expr ...
- sql基本语法
sql基本语法 sql server 查询 多表查询 直接多表查询 select * from st_profiles,st_score_report 上面的语句将会产生两个表的笛卡尔乘积,其中大部分 ...
- SQL基础语法(二)
SQL SELECT 语句 本章讲解 SELECT 和 SELECT * 语句. SQL SELECT 语句 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). SQL ...
- Sql常用语法以及名词解释
Sql常用语法以及名词解释 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) D ...
- SQL基础语法笔记教程整理
PS:本文适用SQL Server2008语法. 一.关系型数据库和SQL 实际上准确的讲,SQL是一门语言,而不是一个数据库. 什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的 ...
- Delphi XE5教程9:基本语法元素
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...
- sql 常用语法汇总
Sql常用语法 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控 ...
- MySQL基本语法(一):和SQL Server语法的差异小归纳
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- python学习笔记(2)--基本语法元素
来看一个非常简单的温度转换程序 #Tempconvert.py tempstr = input("输入:") if tempstr[-1] in ['F', 'f']: C = ( ...
- SQL基础语法提纲
一.SQL需知5点 1.SQL是Structured Query Language的缩写,是用来访问关系型数据库的,非过程化的,高级编程语言. 2.SQL具有语法高度综合统一,高度的非过程化,对集合进 ...
随机推荐
- 【BZOJ 1398】 1398: Vijos1382寻找主人 Necklace (最小表示法)
1398: Vijos1382寻找主人 Necklace Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 308 Solved: 129 Descrip ...
- codevs 1392 合并傻子
1392 合并傻子 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个园形操场的四周站着N个傻子,现要将傻子有 ...
- [BZOJ5109][LOJ #6252][P4061][CodePlus 2017 11月赛]大吉大利,今晚吃鸡!(最短路+拓扑排序+传递闭包+map+bitset(hash+压位))
5109: [CodePlus 2017]大吉大利,晚上吃鸡! Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 107 Solved: 57[Sub ...
- 20162325 金立清 S2 W6 C15
20162325 2017-2018-2 <程序设计与数据结构>第6周学习总结 教材学习内容概要 队列是先进先出(FIFO)的集合 队列是保存重复编码k值的一种有效结构 实现模拟时常用队列 ...
- [CodeForces-763C]Timofey and remoduling
题目大意: 告诉你一个长度为n的等差数列在模m意义下的乱序值(互不相等),问是否真的存在满足条件的等差数列,并尝试构造任意一个这样的数列. 思路: 首先我们可以有一个结论: 两个等差数列相等,当且仅当 ...
- Linux进程守护——Supervisor 使用记录
0.旁白 Supervisor是个父进程,你要守护的进程会以Supervisor的子进程形式存在,所以老子才可以管儿子 官网链接:http://supervisord.org/ [5.参数]那块不要看 ...
- 【原】Eclipse部署Maven web项目到tomcat服务器时,没有将lib下的jar复制过去的解决办法
我们在做web开发是,经常都要在eclipse中搭建web服务器,并将开发中的web项目部署到web服务器进行调试,在此,我选择的是tomcat服务器.之前部署web项目到tomcat进行启动调试都很 ...
- java计算代码执行时间
有时候为了排查性能问题,需要记录完成某个操作需要的时间,我们可以使用System类的currentTimeMillis()方法来返回当前的毫秒数,并保存到一个变量中,在方法执行完毕后再次调用 Syst ...
- Spring ListFactoryBean实例
ListFactoryBean”类为开发者提供了一种在Spring的bean配置文件中创建一个具体的列表集合类(ArrayList和LinkedList). 这里有一个 ListFactoryBean ...
- .NET 4.5 is an in-place replacement for .NET 4.0
With the betas for .NET 4.5 and Visual Studio 11 and Windows 8 shipping many people will be installi ...