4.1 SQL的本质
对于早期的关系数据库,整个行业做了很多努力,试图统一不同的专用查询语言。IBM曾建立了一个早期的标准,被称为Structured English Query Language,这个名字缩写为SEQUEL。另外一种语言称为"选择查询语言(Select Query Language,SQL)",它包含了一些只能为制作报表和查找记录而读取数据的命令。当该语言成为流行的、与产品无关的标准时,数据库人士仍在坚持使用Sequel这个首字母缩写词。最终通过增加了一些命令,该数据库可以实现添加、删除、修改记录的操作。但这时出现了一个进退两难的局面:他们这么费劲地创建了一种标准语言,但这个可爱的名字却不合适了。最后Select被Structured所替代,于是,整个行业的争论趋向缓和。当然,正统人士坚持把SQL读作ESS CUE EL而不是SEQUEL。那么,究竟应怎么读这个词呢?怎么读都可以,不过我还是选择省略一个音节,读作SEQUEL(尽管你可能会不太同意这种读法)。为了让SQL语言不依赖于特定的产品或公司,SQL标准由独立的标准化组织发表并持有。SQL标准最初是由美国国家标准协会注册的,正式名称是ANSI SQL标准,发表于1986年。这个标准修订了多次,以下是这些修订版:
ANSI SQL-86
ANSI SQL-89
ANSI SQL-92
ANSI SQL:1999
ANSI SQL:2003
ANSI SQL:2006
虽然这个概念看起来简单,但还存在一些故事。实际上,此时的ANSI SQL标准不再由美国国家标准协会独家拥有了-美国土生土长的标准被全世界采纳的现象屡见不鲜。1987年,SQL成为国际标准,注册者是国际标准化组织(ISO),不过仍旧使用以往的版权名称,即ANSI SQL。这就意味着1992年修订版的SQL标准实际上被称为ISO ANSI SQL-92。尽管在1999年、2003年和2006年分别对此标准进行了修订,大多数基于SQL的数据库产品仍建立在ANSI SQL-92标准上,并没有被修改为完全符合ANSI SQL-99、2003或2006规范。如同其大多数竞争对手一样,T-SQL并不完全符合最近的ANSI标准,但是它实现了其中一些功能。
最后,ANSI SQL标准实际上定义了三个级别的兼容性:入门级、中级与完整级。大多数产品(包括SQL Server)完全符合入门级标准,部分符合更高的标准。
4.1 SQL的本质
许多使用T-SQL的人都有其他语言的使用经验。如果用户从来没接触过编程,请别把书合上就此放弃。有编程经验并不是编写SQL的先决条件,只不过对用过计算机系统其他语言的人来说,这种经验可作为参考。
把T-SQL与过程化或面向对象的编程语言(比如Java、C、C++、C#或者Visual Basic)相比较,就如比较苹果和石榴一样,两者没有更好或者更坏之分,即使在语法上或者某些语句的结构上的确存在相似性,但SQL和真正的编程语言相比还是有很大差异性的。对于不同的操作类型,T-SQL可能比这些语言先进得多,也可能差得多,因为它们所实现的目标不同。很难概括不同语言的功能,因为它们一直在演化,一个版本接着一个版本,添加越来越多的功能。而行业标准的问题就是,每个人都在保护并增强自己的产品。随着时间的推移,每项技术(这里是指编程语言)的功能开始重叠,提供了一大堆不同的选项来完成相同的任务。
那么是否可以不使用SQL,而使用过程化编程语言来完成数据访问或者数据操纵(在数据库中插入、修改或删除值)呢?回答是可以,但是这比较笨拙,通常也很低效。那么能否在T-SQL中实现复杂的数学运算、循环、字符串解析、多维数组管理呢?可以,不过这会耗费很多的时间和精力。第1章提到,SQL Server 2005允许程序员完全使用面向对象的程序代码(而不是SQL)编写存储过程与用户定义的函数,这不会让作为SQL Server本地语言的T-SQL在性能上有任何缺失,而只是给程序员提供了另一个选择。
T-SQL主要用于关系数据的操作,这没什么可惊奇的。T-SQL也有许多有用的功能来实现标量(单值)数据操作、逻辑运算、数学计算、决策结构、文本字符串解析以及循环机制。然而,和大多数编程语言相比,SQL不如真正的编程语言那样强大。如果需要超出SQL范围的高级功能,就要仔细考虑一下使用另一种方法,比如定制的扩展存储过程、应用程序编程接口(API)、.NET程序集或者其他编程解决方案。所以SQL Server的集成服务既可以使用编程代码也可以使用T-SQL。在解决了这个问题之后,现在您应该知道T-SQL可以做什么了吧?真是非常多。那么又应使用T-SQL执行什么操作?这是一个更好的问题。希望读者在看完了本章后能找出答案。
T-SQL是与SQL Server交流的语言,而查询表达式主要用来告诉服务器该做什么。一定要知道可以要求SQL Server做什么和SQL Server能做什么。查询操作可分为三类,下面简要描述它们,然后讲解几个例子。和技术世界里的所有事物一样,这些类别用三字母缩写词(Three-letter abbreviations,TLA)表示,按顺序介绍如下:
数据定义语言(Data Definition Language,DDL):用于创建、管理数据库中的对象。DLL语句可以创建、修改、删除数据库、表、索引、视图、存储过程和其他对象。例如CREATE/ALTER和DROP。
数据控制语言(Data Control Language,DCL):DCL语句用于控制用户和数据库对象的安全权限。一些对象有不同的权限集。可以给特定的用户或者用户组授予或者拒绝这些权限。这些用户或者用户组属于一个数据库角色或者Windows用户组(如GRANT、REVOKE和DENY)。
数据操纵语言(Data Manipulation Language,DML):DML语句用于处理数据,包括数据检索、在表中插入行、修改值、删除行等。例如SELECT、INSERT、UPDATE和DELETE。
4.1 SQL的本质的更多相关文章
- atitit.查看预编译sql问号 本质and原理and查看原生sql语句
atitit.查看预编译sql问号 本质and原理and查看原生sql语句 1. 预编译原理. 1 2. preparedStatement 有三大优点: 1 3. How to look gene ...
- 其实SQL优化调优,就跟吃饭喝水一样简单,教你抓住SQL的本质!
前言 SOL 优化并不简单,做好 SOL 优化需要掌握数据库体系结构.表和索引设计.高效 SOL法.高级 SOL 语法.多种优化工具等知识,甚至还得分析业务特点,以及了解优化器的缺点.只有建立 SOL ...
- LINQ之路(2):LINQ to SQL本质
LINQ之路(2):LINQ to SQL本质 在前面一篇文章中回顾了LINQ基本语法规则,在本文将介绍LINQ to SQL的本质.LINQ to SQL是microsoft针对SQL Server ...
- 谈一谈SQL Server中的执行计划缓存(上)
简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...
- 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编 ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- Mybatis动态SQL简单了解 Mybatis简介(四)
动态SQL概况 MyBatis 的强大特性之一便是它的动态 SQL 在Java开发中经常遇到条件判断,比如: if(x>0){ //执行一些逻辑........ } Mybatis应用中,S ...
- 浅析SQL Server中的执行计划缓存(上)
简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...
- Web安全XSS、CSRF和SQL注入
SQL注入 SQL注入是以用户的输入作为sql语句的一部分,如后端接收到用户的请求数据后,不经过数据转义,就把数据拼接到SQL中执行,容易导致SQL的语义被篡改,即受到攻击了. 解决办法是对接收的数据 ...
随机推荐
- JWT+Log4net配置与使用
Log4net的优点 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.程序运行过 ...
- Extjs文件上传问题总结
本来文件上传是一个简单而常用的功能,但是,由于刚刚接触extjs,对extjs中的控件及其使用方法并不熟悉,导致本来一个很快就可以搞定的文件上传问题,弄了将近两天的时间.现将问题及解决办法发出来,供有 ...
- sql 中如何查询某一列的数据在另一个表中有没有?
假设表table1,列a,表table2,列bselect a from table1where a not in(select b from table2)
- WPF 获取表格里面的内容
DataRowView dataRow = DataGridCase.SelectedItem as DataRowView; 代码转为数组分别获取.
- jzoj3363
JYY 来到了一个新的城市,为了和大家保持联系,第一件事就是办理新的手机号.JYY 对号码的要求很高,希望大家都能够顺畅地阅读手机号,因此 JYY 特别研究了地球人的电话号码阅读习惯,有如下重大发现 ...
- 八,mysql优化——读写分离
读写分离目的是给大型网站缓解查询压力.
- 一,memcached的基本概念
1,memcached的基本概念 memcached是一个高效的分布式内存对象缓存系统,它可以支持把各种php的数据(array,对象,基本数据类型)放入到它管理的内存中.简单的说,memcached ...
- 如何优雅的调戏XSS
作者:i春秋作家——万年死宅 前言 这篇paper,我们将学习如何优雅的调戏XSS.我们会教大家一些不常用的,但很实用的XSS姿势.我们在正式进入主题之前,先来说一下,该篇paper将涉及的内容: 正 ...
- 使用browserSync自动刷新
本篇主要是以 http://www.imooc.com/article/14759 为参考来写的: 已经整理到github上:https://github.com/Macaulish/gulp-Bro ...
- Storm系列二: Storm拓扑设计
Storm系列二: Storm拓扑设计 在本篇中,我们就来根据一个案例,看看如何去设计一个拓扑, 如何分解问题以适应Storm架构,同时对Storm拓扑内部的并行机制会有一个基本的了解. 本章代码都在 ...