《锋利的SQL(第2版)》——1.3 Transact-SQL语言的类型

简介:

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

1.3 Transact-SQL语言的类型

锋利的SQL(第2版)
在介绍了SQL的起源后,来看一下Transact-SQL包括哪些语言类型。首先,为了遵循ANSI SQL标准,Transact-SQL提供了数据定义语言(Data Definition Language,DDL)语句和数据操纵语言(Data Manipulation Language,DML)语句;其次,为了增强灵活性,Transact-SQL还提供了用于编程的流控制语句和其他语句。

对于语言类型,读者仅做大致了解就可以。在实际应用中,就像没必要区分哪些是SQL标准,哪些是SQL扩展一样,也没有必要区分DDL和DML,它们是一个协同工作的整体。

1.3.1 DDL语句

DDL语句用于创建数据库对象,如表、视图、索引等,表1-1中列出了一些常用的DDL语句。

image
image
image

1.3.2 DML语句
DML语句用来检索和修改数据库的内容,表1-2中列出了一些常用的DML语句。
image
image

1.3.3 编程和流控制语句

许多人在学习编程时,经常询问编程工具的好坏,哪种语言好学,或是在开发上更具备优势。实际上,编程工具可能还有优劣之分,但是编程语言之间差别并不大。尤其是像SQL这样的数据处理语言,只要具备了顺序语句、判断语句和循环语句,就可以处理所有业务逻辑问题。表1-3中列出了一些常用的编程和流控制语句。
image

image

下面将对一些常用的编程语句进行介绍。

1.IF...ELSE语句
当条件为“真”时,将执行IF关键字后面的语句,当条件为“假”时,将执行ELSE后面的语句。例如,下面示例的含义是:如果变量@i > 0,设置@MyVar1 = 100,否则设置@MyVar1 = 10,最后使用PRINT语句输出@MyVar1的值。其中的“--”是注释字符。

DECLARE @i AS int, @MyVar1 AS int; -- 声明变量,详细信息参考1.5节的介绍
SET @MyVar1 = 0; -- 设置变量值
SET @i = 1;
IF @i > 0
  SET @MyVar1 = 100;
ELSE
  SET @MyVar1 = 10;
PRINT CONVERT(char(12),@MyVar1); --输出@MyVar1变量的值

2.BEGIN...END
BEGIN...END提供了执行一组SQL语句的方法,此语句对编写IF...ELSE和WHILE循环非常有用。现在将上面示例中IF...ELSE语句改写为下列形式:

IF @i > 0
  SET @MyVar1 = 100;
ELSE
  BEGIN
   SET @MyVar1 = 10;
   PRINT CONVERT(char(12),@MyVar1); --输出@MyVar1变量的值
  END

此时IF...ELSE语句的含义是:如果@i > 0,设置@MyVar1 = 100,否则设置@MyVar1 = 10,并使用PRINT语句输出@MyVar1的值。也就是说,SET @MyVar1 = 10和PRINT语句此时都属于ELSE部分。

3.WHILE循环
在WHILE关键字后面,可以编写一个控制循环执行的条件。在WHILE语句循环体的每一次执行前,都要测试条件。如果条件为真,则执行循环体;否则,将执行循环体后面的语句。

例如,下面的示例中使用了循环和判断语句。首先声明3个变量,@MyVar1用于累加1~100之间的奇数值,@MyVar2用于累加1~100之间的偶数值。

DECLARE @i AS int, @MyVar1 AS int, @MyVar2 AS int; -- 声明变量
SET @MyVar1 = 0; -- 设置变量值
SET @MyVar2 = 0;
SET @i = 1;
WHILE @i < 100 -- 开始循环
BEGIN -- 指定包含在循环中的语句
  IF @i % 2 <> 0 -- 判断是否为奇数
    SET @MyVar1 = @MyVar1 + @i; -- 累加奇数
  ELSE
    SET @MyVar2 = @MyVar2 + @i; -- 累加偶数
  SET @i = @i + 1; -- 递增@i
END  -- 结束循环
SELECT @MyVar1, @MyVar2, @i; -- 显示变量值

4.GOTO语句和标签
GOTO语句用于将执行流更改到标签处,虽然Transact-SQL和PL/SQL都提供了该语句,但是作为编程而言,我们不推荐使用此编程技术。要编写一个标签,应当在标识符后面加一个冒号。例如,下面的示例使用GOTO语句代替WHILE循环,与上面的WHILE循环示例功能相同。

DECLARE @i AS int, @MyVar1 AS int, @MyVar2 AS int; -- 声明变量
SET @MyVar1 = 0; -- 设置变量值
SET @MyVar2 = 0;
SET @i = 1;
table_loop:  -- 指定标签
  IF @i % 2 <> 0 -- 判断是否为奇数
    SET @MyVar1 = @MyVar1 + @i; -- 累加奇数
  ELSE
    SET @MyVar2 = @MyVar2 + @i; -- 累加偶数
  SET @i = @i + 1; -- 递增@i
IF (@i < 100) GOTO table_loop --跳转到标签处
SELECT @MyVar1, @MyVar2, @i; -- 显示变量值

5.使用WAITFOR语句
WAITFOR语句用于延迟后面语句的执行,可以指定延迟的时间长度或是具体的时间。参考下面的语句:

WAITFOR DELAY '00:1:15';
PRINT N'到时间了';
-- 另一种形式
WAITFOR TIME '10:02:10';
PRINT N'到时间了';

第一个WAITFOR语句使用DELAY关键字指定在1分15秒后执行后面的PRINT语句,最长延迟时间为24小时。第二个WAITFOR语句使用了TIME关键字,指定在10点2分10秒的时候执行后面的PRINT语句。

此语句通常用于并发测试,实际应用中并不多见。例如,可以指定在同一个时间执行多个相同的SQL语句。

1.3.4 SQL语句的批处理

应用程序可以将多个SQL语句作为一个批发送到服务器,然后服务器将该批中的语句编译成一个执行计划。在SQL Server的Management Studio工具,可以使用GO作为批发送的分隔符号。例如,在图1-4所示的语句中共包含3个批,选中后单击“执行”按钮一起执行。但是由于包含3个GO,所以会被分批发送,其中第1和第2个批都能正常执行,第3个批中由于最后一行INSERT语句的VALUSE关键字错了(正确的应当为VALUES),这个批在将这3个INSERT语句编译成一个执行计划时,将发生错误。因此,这3条INSERT语句都不会被执行,而不是仅仅发生错误的INSERT语句。从这个示例可以看出,理解批处理Transact-SQL语句的执行方式很重要。
image

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

相关文章
|
24天前
|
SQL 存储 BI
【软件设计师备考 专题 】数据库语言(SQL)
【软件设计师备考 专题 】数据库语言(SQL)
89 0
|
2月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据查询
【数据库SQL server】关系数据库标准语言SQL之数据查询
95 0
|
2月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之视图
【数据库SQL server】关系数据库标准语言SQL之视图
76 0
|
3月前
|
SQL Java 分布式数据库
Flink CDC HBase字段类型与Flink SQL类型之间的转换
【1月更文挑战第4天】【1月更文挑战第19篇】Flink CDC HBase字段类型与Flink SQL类型之间的转换
61 1
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
49 0
|
7天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
64 6
|
4天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
1月前
|
SQL 关系型数据库 MySQL
Flink 提供了一种名为 Flink SQL 的查询语言,它支持多种数据库之间的 DDL 语句转换
【2月更文挑战第18天】Flink 提供了一种名为 Flink SQL 的查询语言,它支持多种数据库之间的 DDL 语句转换
171 2
|
1月前
|
SQL 数据库 数据库管理
|
1月前
|
SQL 存储 关系型数据库
【MySQL】——关系数据库标准语言SQL(大纲)
【MySQL】——关系数据库标准语言SQL(大纲)
55 0
【MySQL】——关系数据库标准语言SQL(大纲)