在下面部分的许多语句都不是SQL标准语句,而是一个叫做Transact-SQL(T-SQL)的SQL扩展的一部分。T-SQL通过在别的事物上添加一些诸如变量、条件和循环之类的传统编程元素来扩充SQL。

你可能注意到这个问题的唯一原因是你计划使用一种和Microsoft SQL Server不同的数据库服务器。在下面部分介绍的语句和技术并不是所有都是可替换的。然而,如果你想全面的利用Microsoft SQL Server的性能,你必须使用T-SQL。

在批处理中执行多个语句

为了一次能够执行多个SQL语句,你可以把它们一起放入一个批处理中。批处理,如同它的名字所隐含的意识一样,是简单的一个或多个SQL语句组成的语句组。比如,假如你在ISQL/w中输入下面的两个语句,它们就会做为一个批处理而一起执行:

SELECT pub_name FROM publishers

SELECT pub_name FROM publishers

当你执行上面那个简单的批处理时,在表中同样的数据被读取了两次—一个SELECT 语句读取一次。现在假设你输错了第二个SELECT语句中表的名称,并尝试执行下面的语句:

SELECT pub_name FROM publishers

SELECT ub_name FROM publishers

你可能期望第一个语句能够成功执行,而在执行第二个语句时会发生错误。而实际上并不是这样,在大多数情况下,如果在批处理中有任何一个语句不能成功执行。在其中没有一个语句会执行(特殊情况请看下面的注意)。SQL Server 把在批处理中的语句当成组来看待。

注意

在一些情况下,一个语句在发生错误时,其他语句仍然能够执行。假如服务器在传递和编译一个批处理时检测到错误,则在批处理中的所有语句都不能执行。假如批处理通过了编译但仍然存在错误,则在其中的某些语句就可能会执行。

你可以把一组语句分成隔离的批处理。在ISQL/w中,你可以使用命令GO来实现该功能。考察下面的语句:

SELECT pub_name FROM publishers

GO

SELECT ub_name FROM publishers

假如你在ISQL/w中执行上面的语句。即使在第二个SELECT语句中存在错误。第一个语句仍然能够成功地返回答案集。GO命令强迫SQL Server 将此二个语句看成两个批处理。

给变量赋值

SQL Server 具有两种类型的变量:全局变量和局部变量。全局变量是只读的,你不能改变它们的值。然而你可以在多个批处理中接收全局变量的值。局部变量则相反,仅局限于专门的某一个批处理。局部变量的优势在于你可以修改和读取它们的值,在本部分中,你将学习如何使用这两种类型的变量。

全局变量

全局变量的个数是有限的,你不能自己创建全局变量。两个非常重要的全局变量是@@IDENTITY和@@ROWCOUNT。@@IDENTITY变量保留最近一次插入到IDENTITY列的值,如下面的例子:

INSERT Authors(author_name) VALUES(‘James Joyce’)

INSERT Books(book_id,book_title) VALUES(@@IDENTITY,’Portrait of Artist as a Yong Man’)

假定表Authors具有两列,第一列是author_id,它是个IDENTITY列。它用于给每个Authors表中的作者一个唯一的标志,第二列 author_name用于保留作者的姓名。假定表Books同样也具有两列。第一列book_id是一个INT列,第二列book_title是一个具有VARCHAR属性的列。

在该批处理执行时,Authors表中标志列的值就会插入到Books表的整数列中。这就允许你进行两个表的联合查询。比如,假定你想从两个表中得到作者的姓名和他们的书时,你就可以执行下面的SELECT语句:

SELECT author_name,book_title FROM Authors,Books

WHERE author_id=book_id

对于@@IDENTITY变量来说,一个很重要的特征是如果有一个记录插入了一个没有标志列的表之后,该变量的值就会变成NULL。例如下面的批处理:

INSERT Authors(author_name) VALUES(‘James Joyce’)

SELECT @@IDENTITY

SELECT @@IDENTITY

INSERT Books(book_id,book_title)

VALUES(@@IDENTITY,’Portrait of the Artist as a Young Man’)

SELECT @@IDENTITY

SELECT @@IDENTITY

在该批处理执行时,第一个和第二个SELECT语句返回Authors表中标志列的值。而第三个和第四个SELECT语句则返回空值,因为在他们之前执行了另一个INSERT 语句。

注意

当你要在Active Server Pages中接收全局变量的值时,你必须为该变量提供一个列名。比如,为了在ASP脚本中接收全局变量@@IDENTITY的值,使用如下的语句:

SELECT @@IDENTITY ‘myidentity’

第二个重要的全局变量是@@ROWCOUNT,@@ROWCOUNT变量记录最近一个语句执行时所影响到的行的数目。为了能够更清晰地了解该变量的工作原理,请看下面的批处理:

UPDATE Authors SET author_name=’Samel Clemens’

Where author_name=’Mark Twain’

SELECT @@ROWCOUNT

SELECT * FROM Authors Where 1=2

SELECT @@ROWCOUNT

在UPDATE 语句执行之后,变量@@ROWCOUNT的值等于在数据库中名字为’Samel Clement’的作者的数目。当最后一个SELECT语句执行后,它返回0个记录,因此变量@@ROWCOUNT的值被置为0(短句where 1=2保证没有记录会返回,因为没有一个记录会满足该条件)

你不能创建自己的全局变量同时你也不能给已存在的全局变量赋值。这意味着你不能使用变量在多个批处理之间传递信息。

假如你需要存储一些能被多个批处理使用的信息,你必须把信息保存在表中。你并不需要构建所用的数据库非常之大,你只需要创建一些只具有很少几列的小表。在这些表中的每一列都和在传统编程语言中的全局变量的作用非常相似。

注意

你也可以使用临时表格来模拟传统的全局变量。临时表格是一个特殊的表格,它不永久地存在于数据库中,关于更多的信息,请参看SQL Server自带的文档。

局部变量

在SQL中的局部变量和在传统编程语言中的变量非常相似。你可以定义自己的局部变量,并且给他们赋值。对于局部变量而言,最大的局限是他只能存活在定义它的批处理中。下面是使用局部变量的一个批处理例子:

DECLARE @myvariable INT

SELECT @myvariable=2+2

SELECT @myvariable

所用的局部变量都以单个@字符开头。在上面的例子中,局部变量@myvariable首先定义成INT类型。然后,使用SELECT语句为该变量赋值为2+2。最后一个SELECT语句返回该变量的值。

在批处理中使用变量之前,你必须首先定义它。你在定义变量时为该变量提供了该变量的名称和他所具有的数据类型。你可以在一个定义语句中定义多个变量。如下所示:

DECLARE @firstname VARCHAR(20),@secondname VARCHAR(20)

SELECT @firstname=”MARK TWAIN”

SELECT @secondname=”samnel clement”

SELECT @firstname=@secondname

在该批处理中,创建了两个变量:@firstname和@secondname。两个变量都定义成VARCHAR数据类型。下一步,使用SELECT语句为变量赋予不同的值。最后一个SELECT语句把第一个变量的值赋予另外一个。

你也可以把查询结果赋予局部变量,这是一种非常有用的做法。考察下面的批处理:

DECLARE @queryresults VARCHAR(20)

SELECT @queryresults=author_name FROM Authors WHERE author_id=1

SELECT @queryresults

在该例子中,变量@queryresults赋予一个从Authors表中查询所得到的结果。比如:如果author_id等于1的作者名为James Joyce。则变量@queryresults的值就是James Joyce。

在Authors表中使用的标志列用以确保最多只有一个值赋予变量。这就产生了另外两个问题。当你赋予变量一个没有返回值的查询结果时,会发生何种情况?当你赋予变量一个返回多个值的查询结果时,又会发生什么情况?

假如一个查询没有返回值,该变量保留它原先的值。当变量第一次定义时,该变量的值为NULL。因此,在前面的例子中,如果没有一个作者的author_id为1,则该变量将会保留值NULL。考虑下面的例子:

DECLARE @queryresults INT

SELECT @queryresults=12

SELECT @queryresults=author_id FROM Authors WHERE 1=2

SELECT @queryresults

在该例子中,查询确保没有返回结果因为1不等于2。因为没有返回结果,所以变量@queryresults保留它原先的值12。

假如你把一个返回多于一个值的查询结果赋予变量,变量将被赋予最后一个返回的值。比如:假定表Authors包含5个作者信息。如果在标志列中没有间断,在下面的批处理的最后,变量@queryresults的值将是5:

DECLARE @queryresults INT

SELECT @queryresults=author_id FROM Authors

SELECT @queryresults

当你的批处理文件编的越来越大时,你就会发现你会经常的使用局部变量。局部变量在当你需要对多个表格中的数据进行比较时非常的有用。你可以把存储在一个表中的数据存到一个局部变量中,然后和在另外一个表中的数据进行比较。下面就是一个简单的例子:

DECLARE @queryresults INT

SELECT @queryresults=author_id FROM Authors

WHERE author_name=”James Joyce”

SELECT book_title FROM Books WHERE author_id=@queryresults

在该例子中,第一个SELECT语句用于接收James

Transact SQL教程(一)相关推荐

  1. Transact SQL 常用语句以及函数

    Transact SQL  语 句 功 能  ======================================================================== --数据 ...

  2. sql 教程_SQL

    sql 教程 SQL stands for Structured Query Language. SQL is a domain specific language used to manage da ...

  3. transact sql

    结构化查询语言是美国国家标准协会和国际标准化组织定义的标准,而transact sql是microsoft公司对此标准的一个实现 它可以创建,维护,保护数据对象,并且可以操作对象中的数据,所以tran ...

  4. 视频教程-19全新mysql教程零基础入门实战精讲mysql视频DBA数据库视频教程SQL教程-MySQL

    19全新mysql教程零基础入门实战精讲mysql视频DBA数据库视频教程SQL教程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/ja ...

  5. sql教程学习(一)

    根据https://www.runoob.com/sql/sql-tutorial.html学的sql教程. 我只挑我觉得对我来说的重点学习,我不扣书,哈哈哈. sql教程 SQL 是用于访问和处理数 ...

  6. 交互式SQL(Transact SQL,TSQL)

    交互式SQL(Transact SQL,TSQL) 它是SQL Server的查询语言.提供以下命令: · 创建和数据库对象. · 访问和修改数据. · 数据聚合(aggregation,又称聚集). ...

  7. 易语言 Sql 教程

    使用易语言对SQL数据库操作的教程:精易入门培训2017 [教程]易语言入门教学培训2017(精易论坛)_哔哩哔哩_bilibili 23集-29集 SQL的教程可以看看: SQL 教程 SQL教程 ...

  8. 一、个人总结的菜鸟教程|sql教程的知识点(SQL教程)

    一.SQL教程 1.SQL语法 DML select查询数据 update更新数据 delete删除数据 insert into插入数据 DDL create database创建数据库表 alter ...

  9. SQL 教程【菜鸟】

    SQL 教程[菜鸟] 转载于:https://my.oschina.net/u/3706644/blog/2395829

最新文章

  1. 【解析】在高级语言源程序中, 常需要用户定义的标识符为程序中的对象命名,常见的命名对象有()
  2. MySQL存储过程相互调用
  3. 车牌号随机函数 php,模拟生成车牌号的程序.程序运行.生成十个随机的车牌子.......
  4. 验证gpu版pytorch是否可用
  5. 软件工程复习提纲——第二章
  6. u8转完看不到菜单_填制凭证界面上的菜单看不见
  7. Java Web应用实现GZIP压缩传输
  8. python 新建一列_创建一个空数据框并在python中填充创建的列
  9. 一、理解网络编程和套接字
  10. mysql outfile 权限_MYSQL解决select ... into outfile '..' mysql写文件权限问题 Can't create/write to file...
  11. 类模板和模板类的关系
  12. 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较
  13. 如何免费获取国外硕博学位论文全文资源
  14. 笔记本无法启用免费wifi
  15. MapReduce:Combiner与Shuffle阶段之Reducer输入
  16. python中的方法是什么_Python方法
  17. KT6368A蓝牙芯片调试中遇到的常见问题,以及解决的方法
  18. python文件打开模式的合法组合,python文件操作
  19. idea提示java: -source 1.5 中不支持修改
  20. Linux安装Redis并且修改端口号,redis-6.2.2

热门文章

  1. 中科大郭光灿院士团队开发出量子门测试新方法
  2. VXLAN 主机VTEP(EVPN)
  3. Android KTX与Kotlin Android Extensions
  4. 《天河传说》详细攻略1
  5. Office 365系列之十七:配置Outlook IMAP方式连接ExchangeOnline
  6. 北大信工计算机应用技术怎样,2018计算机九推——北大信工
  7. 五一出行一票难求,用Python实现12306火车票自动抢票,省心省力!
  8. FPGA图像处理学习——基于肤色的人脸识别
  9. Band in a Box 2019+RealTracks+RealDrums 智能编曲软件免安装版含音色库
  10. 泡妞的五重境界——经典喷血推荐