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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 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
相关文章
|
4月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础第一篇(SQL通用语法与分类)
MySQL数据库基础第一篇(SQL通用语法与分类)
|
4月前
|
SQL PHP
thinkphp之进阶sql语法,持续更新
thinkphp之进阶sql语法,持续更新
26 0
|
2月前
|
SQL 关系型数据库 MySQL
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
33 5
|
3月前
|
SQL 关系型数据库 数据库
sql语法
【7月更文挑战第30天】sql语法
40 12
|
2月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
164 0
|
3月前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
74 7
|
3月前
|
SQL 数据库 索引
SQL SELECT语句的语法与查询优化技巧
SQL SELECT语句的语法与查询优化技巧
|
3月前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之遇到SQL语法错误,该如何排查
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
5月前
|
SQL 关系型数据库 数据库
SQL Server语法基础:入门到精通
SQL Server语法基础:入门到精通
143 9
SQL Server语法基础:入门到精通
|
4月前
|
SQL 机器学习/深度学习 分布式计算
MaxCompute产品使用合集之sql代码中支持插入jinja语法语句吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。