SQL和T-SQL:它们如何比较?
如果您是SQL的新手,标准SQL和其他SQL语言变体(如T-SQL)之间的差异可能会让您感到困惑。很少有私有SQL语言严格遵循SQL标准。在本文中,我将观察SQL和T-SQL(也写成T-SQL)之间的区别。
什么是SQL和T-SQL?
SQL,结构化查询语言,最早创建于20世纪70年代。20世纪80年代,多家公司开始了自己的SQL程序。这些版本在不同方面与原版不同。
在20世纪80年代中期,两个组织,ISO和ANSI,发布了他们的SQL标准。这意味着其他人可以用它作为他们版本的起点。在本文中,我将ISO/ANSI版本称为“标准SQL”。
最后更新:2021年5月
从表和SELECT查询到高级SQL。SQL Server 2012, 2014, 2016, 2017, 2019,考试70-461和70-761 |由菲利普·伯顿
探索课程SQL的一些主要现代方言是:
- Oracle SQL。
- PL SQL,是Oracle SQL的扩展。
- Microsoft SQL Server的版本,TSQL或T-SQL,是Transact SQL的缩写。
这些方言都没有完全实现ISO或ANSI SQL语言。原因有以下几点:
- 不同的供应商对他们想要的东西有不同的想法
- 他们可能需要标准SQL的所有特性
- 他们希望结合自己对SQL应该做什么的想法
因此,尽管一些供应商已经非常接近标准SQL,但还没有实现完整的标准SQL。标准SQL更多的是一个概念,而不是一种实际实现的语言。同样,在现实世界中也没有“英语”这种东西。相反,有方言,如英国英语和美国英语。有些机构可能试图规范他们的英语方言。然而,方言随着实际使用情况的变化而发展。标准SQL也是如此,它每隔几年就会发展一次。
标准SQL并不完全复制它的创建者Cobb提出的标准。例如,set理论使用记录和字段,而Standard SQL使用行和列。因此,即使是SQL标准也不是原始SQL理论的完美实现。
那么标准SQL和MS SQL Server的SQL扩展之间有什么区别呢?
引用名称中有空格的对象
有时表和其他对象的名称包含一个空间。在写SELECT语句时,你应该考虑这一点:
SELECT * FROM My Table
在上面的示例中,SQL解释器无法理解表名的开始和结束位置。相反,它将抛出一个错误。
标准SQL使用双引号作为分隔符:
SELECT * FROM“My Table”
在T-SQL中,通常使用方括号。
SELECT * FROM [My Table]
减少查询中返回的行数
SELECT查询的结果可能有数十万或数百万行。您可能希望将其限制在第5或10行。
在标准SQL中,您可以使用:
SELECT * FROM“My Table”只取前10行
在T-SQL中,它有一个变体,最初是在SQL Server 2012中引入的。
SELECT * FROM [My Table] ORDER BY SomeField OFFSET 0 ROWS ONLY FETCH FIRST 10 ROWS
但是,在T-SQL中限制行数的通常方法是使用TOP。这是在2005年SQL Server首次引入的:
SELECT TOP 100 * FROM My Table
你可以使用括号或不使用括号:
SELECT TOP (100) * FROM My Table
上面的内容在T-SQL中非常好。其他SQL变体使用不同的方法来限制行数,例如:
SELECT * FROM [My Table] LIMIT 100;
你需要使用FROM子句吗?
在标准SQL中,您必须在SELECT语句中至少使用SELECT和FROM子句。这意味着您不能轻松地检索任何不需要表的计算结果,例如2+2。
Oracle SQL使用一个特殊的内置表“dual”来解决这个问题,它有一行和一列。所以
SELECT 2+2 FROM dual;
答案:4。
在Microsoft的SQL中,不使用“dual”表。您可以使用:
选择2 + 2
过程式编程
标准SQL使用基于集的逻辑查询数据。例如,可以在一个SELECT语句中查询一个表或视图的全部,检索数百万行。您不必指定SQL如何检索这些数据。这样,标准SQL就是一种声明性编程语言。这是因为您不描述控制流,而是描述您想要的结果。
T-SQL包括允许您使用不同查询方式的扩展。例如:
- 您可以使用游标,它一次查询一行数据。
- 您可以使用WHILE循环移到下一行。
- 您可以使用条件逻辑(如IF/ELSE)对检索到的数据作出反应。
- 您还可以使用TRY/CATCH构造来拦截错误并对它们作出反应。
开始尝试——我在这里犯了一个错误。END TRY BEGIN CATCH——我在这里处理错误。最终赶上
这些扩展使T-SQL不仅成为一种过程式编程语言,而且成为一种命令式编程语言。命令式编程允许用户指定要执行的命令。T-SQL是一种过程语言,因为您可以在过程或函数中编写代码。
功能
T-SQL函数可以不同于标准SQL函数。例如,标准SQL中的SUBSTRING函数采用如下形式:
SUBSTRING(name_of_string FROM first_character FOR number_of_characters)。
在T-SQL中,可以使用逗号分隔的参数,而不是SQL语句:
SUBSTRING (name_of_string first_character number_of_characters)
此外,在T-SQL中,您可以添加其他函数。Standard SQL CAST函数将一列或字段从一种数据类型转换为另一种数据类型。但是,如果不能转换它,就会导致错误。在SQL Server 2012之后,微软引入了TRY_CAST函数,如果出现错误,该函数将返回NULL。这使得编程更加容易。
扩展DDL和DML语句
DDL,即数据定义语言,允许您创建、ALTER和DROP对象,如表和视图。DML是数据操作命令。在标准SQL和T-SQL中都使用,它们是INSERT、UPDATE和DELETE。
T-SQL允许扩展DDL和DML语句。在T-SQL中,可以在DML命令中使用join,允许在使用这些DML命令时将表连接在一起。标准SQL要求您使用子查询来实现此功能。
数据类型
SQL是一种强类型语言。这意味着列中的数据必须是指定的类型,例如字符串、文本或基于日期的类型。
标准SQL包括广泛的数据类型选择。T-SQL扩展了这个选择。
例如:
- T-SQL smalldatetime数据类型将日期和时间值存储到1900-2079年的最近秒。它每行只使用4个字节来存储这个数据。
- 标准SQL datetime数据类型将日期/时间存储为300th从1753年到9999年的一秒。但是,它需要两倍的存储空间。
如果smalldatetime数据类型提供了您需要的所有数据,那么您可以通过使用它节省一半的存储空间。
结论
你能得出什么结论?首先,SQL方言并不相同。例如,如果您使用Oracle SQL,您的SELECT语句将必须以分号结束。在T-SQL中,它通常是可选的。这意味着SQL语句可能需要修改才能从一种方言转换到另一种方言。
然而,由于不同的方言来源于相同的标准SQL,超过90%的代码无需修改就可以工作。如果您修改了许多SELECT语句,您会发现调整变得重复。一个更改将为更改数百个SELECT语句提供基础。
其次,您可以学习任何SQL方言,因为您学到的大多数语法都可以移植到其他版本中。例如,如果您接受过Oracle SQL的培训,并且想要使用T-SQL,则需要进行一些修改,但基本理论和大多数语法保持不变。
如何学习T-SQL
我希望你喜欢这篇文章。如果你想学习T-SQL,为什么不加入我的课程"查询Microsoft SQL Server在本课程中,我们将详细介绍T-SQL,这样您就可以将数据库SELECT语句提升到一个全新的水平。
或者,如果你想学习Oracle SQL,请加入我我的Oracle SQL课程.