《锋利的SQL(第2版)》——1.4 Transact-SQL语法

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

本节书摘来自异步社区出版社《锋利的SQL(第2版)》一书中的第1章,第1.4节,作者:张洪举 王晓文,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.4 Transact-SQL语法

锋利的SQL(第2版)
Transact-SQL具有一些大多数语句都使用或受之影响的元素,包括标识符、数据类型、函数、表达式、运算符和保留关键字等。

1.4.1 标识符

数据库对象的名称即为其标识符,如服务器、数据库和数据库对象(例如表、视图、列、索引、触发器、过程、约束及规则等)都可以有标识符。对象标识符是在定义对象时创建的,创建完成后便可以使用标识符引用该对象。例如,下列语句创建一个名为TableX的表,其中包含KeyCol 和 Description列,则TableX、KeyCol 和 Description都是标识符。

CREATE TABLE TableX (KeyCol INT PRIMARY KEY, Description nvarchar(80));

无论是TableX、还是KeyCol 和 Description,这些中间无空格的字符,都称为常规标识符。常规标识符格式规则取决于数据库兼容级别(可以使用sp_dbcmptlevel存储过程设置该级别)。当兼容级别为90(SQL Server 2005)、100(SQL Server 2008)或110(SQL Server 2012)时,常规标示符使用下列规则。

第一个字符必须是下列字符之一。

Unicode标准3.2所定义的字母。Unicode中定义的字母包括拉丁字符a~z和A~Z,以及来自其他语言的字母字符。
下划线(_)、at符号(@)或者数字符号(#)。
在SQL Server中,某些位于标识符开头位置的符号具有特殊意义。以at符号开头的标识符表示局部变量或参数。以一个数字符号开头的标识符表示临时表或过程。以两个数字符号(##)开头的标识符表示全局临时对象。

某些Transact-SQL函数的名称以两个at符号(@@)开头。为了避免与这些函数混淆,不应使用以“@@”开头的名称。

后续字符可以包括以下几类。

如Unicode标准3.2中所定义的字母。

基本拉丁字符或其他国家/地区字符中的十进制数字。

at符号、美元符号($)、数字符号或下划线。
此外,常规标识符不能是Transact-SQL保留字,不允许嵌入空格或其他特殊字符,不允许使用Unicode标准之外的增补字符。

如果标示符中必须使用空格(如My Table)或其他不符合常规标示符规则的字符,则必须包含在双引号(")或者方括号([ ])内,否则SQL Server无法正确识别它们。双引号和方括号被称为分隔标示符。例如,下面语句中的My Table和order必须包含在分隔标识符内,因为My Table中间有空格,order是SQL Server用于ORDER BY子句的保留字。

SELECT * FROM [My Table] WHERE [order] = 10;

常规标识符和分隔标识符包含的字符数必须在1~128。对于本地临时表,标识符最多可以有116个字符。

在使用双引号作为分隔符时,SQL Server遵从的规则受SET QUOTED_IDENTIFIER设置影响。设置为ON(默认值)时,双引号只能分隔标识符,文字必须由单引号分隔;设置为OFF时,标识符不能加引号,且必须符合所有常规标识符规则。

如果字符串中已经包含有单引号,则应在该单引号前再添加一个单引号。例如,下面的语句用于从My Table表中查找 Last Name为O’Brien的行。

SELECT * FROM "My Table"
WHERE "Last Name" = 'O''Brien';

1.4.2 数据类型

大多数SQL语句并不显式引用数据类型,但是,由于语句中所引用对象的数据类型间的交互作用,语句的返回结果会受到影响。下列对象具有数据类型。

表和视图中的列。
存储过程中的参数。
变量。
返回一个或多个特定数据类型数据值的Transact-SQL函数。
具有返回代码(始终为integer数据类型)的存储过程。
为对象分配数据类型时可以为对象定义以下4个属性。

对象包含的数据种类。
所存储值的长度或大小。
数值的精度(仅适用于数字数据类型)。
数值的小数位数(仅适用于数字数据类型)。
1.基本类型
SQL Server所支持的数据类型大体可分为精确数字、近似数字、日期和时间、字符串、Unicode字符串、二进制字符串和其他数据类型7种类别,详细信息如表1-4所示。

表1-4 SQL Server的数据类型
image
image
image
image
image

2.用户自定义数据类型
除了上面介绍的数据类型,还可以在SQL Server中创建三种用户自定义数据类型。

一种是从基本数据类型创建的别名数据类型,这样做的目的是为了更清楚地说明对象中值的类型。例如,下面的语句创建了一个基于datetime的birthday数据类型,用于在employee的emp_birthday列中存储生日数据。

-- 创建一个允许null的birthday数据类型
CREATE TYPE birthday
FROM datetime NULL;
GO
-- 创建一个使用新数据类型的表
CREATE TABLE employee
 (emp_id char(5), emp_first_name char(30), emp_last_name char(40), emp_birthday birthday);

另一种是CLR 用户定义数据类型,它是在Microsoft .NET Framework公共语言运行时(CLR)使用编程方法创建的,这是从SQL Server 2005开始提供的一种新功能。此外,包括触发器、存储过程、函数、聚合函数,都可以利用CLR提供的丰富的编程模型来扩展SQL Server的功能。

最后一种是用户定义表数据类型,也就是说用户可以定义一个表示表结构的数据类型。这是从SQL Server 2008开始提供的一种新功能。下面的语句首先创建一个名为LocationTableType的表数据类型,然后创建一个基于该类型的变量,并向其中插入数据和查询数据。

-- 创建一个表数据类型LocationTableType
CREATE TYPE LocationTableType AS TABLE 
(
 FirstName VARCHAR(50),
 LastName VARCHAR(50)
);
GO
-- 创建一个基于LocationTableType的变量
DECLARE @MyTable AS LocationTableType;
-- 向变量中插入数据行
INSERT INTO @MyTable VALUES('Ken','Levy');
INSERT INTO @MyTable VALUES('Sara','Ford');
-- 查询数据
SELECT * FROM @MyTable;
GO

3.数据类型的隐式转换
当两个不同数据类型的表达式用运算符组合后,数据类型优先级规则指定将优先级较低的数据类型转换为优先级较高的数据类型。如果此转换不是所支持的隐式转换,则返回错误。当两个操作数表达式具有相同的数据类型时,运算的结果便为该数据类型。优先级顺序是:用户定义数据类型(最高)、sql_variant、xml、datetime、smalldatetime、float、real、decimal、money、smallmoney、bigint、int、smallint、tinyint、bit、ntext、text、image、timestamp、uniqueidentifier、nvarchar、nchar、varchar、char、varbinary、binary(最低)。

1.4.3 函数

与其他程序设计语言中的函数相似,SQL Server的函数可以有零个、一个或多个参数,并返回一个标量值或表格形式的值的集合。

1.4.4 表达式

表达式是标识符、值和运算符的组合,SQL Server可以对其求值以获取结果。访问或更改数据时,可在多个不同的位置使用数据。例如,可以将表达式用作要在查询中检索的数据的一部分,也可以用作查找满足一组条件的数据时的搜索条件。

表达式可以是下列任何一种形式:

常量
函数
列名
变量
子查询
CASE、NULLIF或COALESCE

1.4.5 运算符

运算符是表达式的组成部分之一,可以使用运算符执行算术、比较、串联或赋值操作。例如,表达式PriceColumn 1.1中的乘号()使价格提高百分之十。

1.4.6 注释

注释是程序代码中不执行的文本字符串,也称为备注。注释可用于对代码进行说明或暂时禁用正在进行诊断的部分、SQL语句和批。使用注释对代码进行说明,便于将来对程序代码进行维护。

SQL Server支持两种类型的注释字符。

--(双连字符)。该注释字符可与要执行的代码处在同一行,也可另起一行。从双连字符开始到行尾的内容均为注释。对于多行注释,必须在每个注释行的前面使用双连字符。
/ ... /(正斜杠-星号字符对)。这些注释字符可与要执行的代码处在同一行,也可另起一行,甚至可以在可执行代码内部。开始注释对(/)与结束注释对(/)之间的所有内容均视为注释。对于多行注释,必须使用开始注释字符对(/)来开始注释,并使用结束注释字符对(/)来结束注释。批中的注释没有最大长度限制。
下面是一些有效注释的示例。

USE AdventureWorks2014;
GO
-- 这是我的单行注释
SELECT EmployeeID, Title
FROM HumanResources.Employee;
GO
/* 这是多行注释的第1行,
  这是多行注释的第2行。*/
SELECT Name, ProductNumber, Color
FROM Production.Product;
GO
-- 在一个SQL语句中添加注释
SELECT ContactID, /* FirstName, */ LastName
FROM Person.Contact;
-- 在代码行后使用注释
USE AdventureWorks2014;
GO
UPDATE Production.Product
SET ListPrice = ListPrice * .9; -- 我在代码行使用注释
GO

1.4.7 保留关键字

SQL Server保留某些关键字供自己专用。例如,在osql或SQL Server代码编辑器会话中使用DUMP关键字或BACKUP关键字,即表示让SQL Server备份全部或部分数据库或者备份日志。

除SQL Server定义的位置以外,在其他任何位置上,如果在SQL语句中使用保留关键字,均为非法。数据库中对象的名称不能与保留关键字相同。如果有这样的名称,则必须始终使用带分隔符的标识符来引用这个对象。尽管这个方法允许存在名称为保留关键字的对象,还是建议不要用与保留关键字相同的名称命名任何数据库对象。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
30天前
|
SQL 关系型数据库 MySQL
TiDB支持的SQL语法概述
【2月更文挑战第28天】本章将对TiDB所支持的SQL语法进行概述,涵盖其主要的语法特性和功能。我们将从基本的SQL语句到更复杂的查询和操作,逐步介绍TiDB的SQL语法,帮助读者更好地理解和使用TiDB进行数据库操作。
|
2月前
|
SQL 存储 数据管理
阿里云视觉智能开放平台的逻辑数仓基于统一的SQL语法
【2月更文挑战第9天】阿里云视觉智能开放平台的逻辑数仓基于统一的SQL语法
52 2
|
4月前
|
SQL Oracle 关系型数据库
SQL 中的运算符与别名:使用示例和语法详解
IN运算符允许您在WHERE子句中指定多个值,它是多个OR条件的简写
210 0
|
4月前
|
SQL Oracle 关系型数据库
|
4月前
|
SQL 存储 大数据
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
74 0
|
29天前
|
SQL 数据库
sql server中创建数据库和表的语法
sql server中创建数据库和表的语法
18 1
|
6月前
|
SQL 存储 大数据
黑马程序员-大数据入门到实战-分布式SQL计算 Hive 语法与概念
黑马程序员-大数据入门到实战-分布式SQL计算 Hive 语法与概念
74 0
|
1月前
|
SQL 存储 关系型数据库
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
|
30天前
|
SQL 监控 测试技术
SQL语法优化与最佳实践
【2月更文挑战第28天】本章将深入探讨SQL语法优化的重要性以及具体的优化策略和最佳实践。通过掌握和理解这些优化技巧,读者将能够编写出更高效、更稳定的SQL查询,提升数据库性能,降低系统资源消耗。
|
30天前
|
SQL 关系型数据库 MySQL
TiDB特有的SQL语法和特性
【2月更文挑战第28天】本章将深入探讨TiDB特有的SQL语法和特性,这些功能和优化是TiDB相较于传统关系型数据库所独有的。通过了解这些特性,读者将能更充分地利用TiDB的优势,优化数据库性能,提升业务处理效率。