天天看点

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

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

锋利的sql(第2版)

在介绍了sql的起源后,来看一下transact-sql包括哪些语言类型。首先,为了遵循ansi sql标准,transact-sql提供了数据定义语言(data definition language,ddl)语句和数据操纵语言(data manipulation language,dml)语句;其次,为了增强灵活性,transact-sql还提供了用于编程的流控制语句和其他语句。

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

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

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

1.3.2 dml语句

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

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

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

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

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

1.if...else语句

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

2.begin...end

begin...end提供了执行一组sql语句的方法,此语句对编写if...else和while循环非常有用。现在将上面示例中if...else语句改写为下列形式:

此时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之间的偶数值。

4.goto语句和标签

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

5.使用waitfor语句

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

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

此语句通常用于并发测试,实际应用中并不多见。例如,可以指定在同一个时间执行多个相同的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语句的执行方式很重要。

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

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

继续阅读