SQL学习

  • 格式:docx
  • 大小:28.47 KB
  • 文档页数:10

第一部分:SQL基础1. 为什么学习SQL自人类社会形成之日起,社会的运转就在不断地产生和使用各种信息(文献、档案、资料、数据等);在如今所谓的信息时代,由于计算机和互联网的作用,信息的产生和使用达到前所未有的广度和深度。

如何管好和用好信息,是(而且将一直是)IT行业一块重要的领域。

在过去几十年中,关系数据库一直在这一领域占主导地位,而建立在关系理论基础之上的SQL也成为数据库领域的既定标准。

目前的数据存储领域可称为三分天下:a. 少量数据的存储:自定义数据文件或通用数据文件(单机数据库),通过自定义接口或通用API访问数据。

如需要存储数据的单机软件或小型的动态网站。

b. 对一致性要求高的大量数据的存储:关系数据库管理系统(RDBMS)。

如各种传统的信息系统(ERP、CRM、HRMS、MIS等)。

c. 对并发性要求高的大量数据的存储:NoSQL数据库系统。

如Web2.0网站的后台数据系统。

以上,“狐假虎威”地借数据存储的重要性来阐述了一番学习SQL的伟大意义。

但重要的是,对SQL善于做什么和不善于做什么有个清楚的认识。

2. 学习SQL的参考资料不久前整理了数据库图书ABC一文,对数据库相关的参考资料作了粗略的分类。

对于初学者而言,可以结合着《数据库系统概念(第5版)》一书和某个DBMS平台的入门技术手册练习,自行寻找或构思一个小需求,建一个数据库,创建几个表和视图,练习写查询和修改语句。

基础理论和技术实践可以相互促进。

3. 几组基本概念3.1. 单机数据库与服务器级数据库单机数据库(如sqlite、Access等,Excel也勉强可以算是)是应用于单个计算机的数据库引擎,通常不具备网络连接功能,适用于小型应用;程序部署时,一般只需要附带数据文件即可。

有时也称作桌面数据库。

服务器级数据库(如Oracle、DB2、SQL Server、MySQL、PostgreSQL等)是具备网络连接功能、可作为单独数据库服务器的DBMS,适用于大型信息系统;程序部署时,需要专门安装相应的DBMS,甚至要单独进行数据库服务器的架构设计。

此类数据库是我们讨论的重点。

3.2. 服务器(Server)与客户端(Client)数据库服务器是运行在一台主机(Host)(或主机集群)上的服务程序,维护着一个或多个数据库,并通过网络连接响应数据库客户端提交的SQL语句。

数据库客户端是向数据库服务器发送查询请求的应用程序,可能是DBMS的GUI管理界面或命令行应用程序,也可能是前端的Web服务器。

数据库客户端和数据库服务器可能是在同一台主机上,但更多情况下则是位于不同的主机上,通过局域网访问。

例如对于SQL Server来说,一个服务器实例(Instance)即是一个数据库服务器,一台主机上可以安装多个服务器实例;而查询分析器或SSMS、sqlcmd、以及连接数据库服务器的IIS,都是数据库客户端。

比如你在SSMS中备份/还原/附加一个数据库,或是通过xp_cmdshell执行一个命令程序,所操作的都是你所连接的数据库服务器所在主机的文件,而不是你运行SSMS数据库客户端所在主机的文件。

一台主机有时候会被称作一台(操作系统)服务器,而数据库服务器和Web服务器都是运行在主机之上的应用服务器。

它们都被称作服务器,不要因此搞混了。

一个典型的基于SQL Server的网站系统的架构示例如下:用户浏览器(Web Client) <----> IIS(Web Server/DB Client) <----> SQL Server(DB Server)3.3. 数据库(DB)与数据库管理系统(DBMS)“数据库”这个词已经被滥用,可能用来指一个数据系统(如中国移动的号码数据库),可能用来指一种数据存储技术(如关系数据库和NoSQL数据库),还可能用来指DBMS(如人们常说SQL Server是数据库软件)。

这种混乱已然形成,恐怕难以改变(比如上文的描述即是如此)。

我们只能根据上下文来判断具体含义。

按最狭义的技术含义,数据库(Database)是指位于一个数据库服务器实例上的一个库,而D BMS则是指类似SQL Server、Oracle等等此类软件。

初学者要注意这些概念之间的差别。

论坛上常常见到这样的帖子:“连不上数据库”、“数据库打不开了”,又没有上下文,可见发问者概念混乱,搞得解答者也是一头雾水。

3.4. SQL与SQL方言(dialect)SQL是一个关系数据库查询语言的标准,而SQL方言则是各种DBMS在SQL标准上进行的扩展,如增加新的关键字、查询功能、特有的数据类型、支持过程化的控制流语句等。

例如SQL Server的T-SQL和Oracle的PL/SQL都是常见的SQL方言。

这就好比ANSI C标准与各种编译器实现的C语言的差别。

但不同SQL方言之间的差异远大于不同C编译器之间的差异。

SQL方言之间的差异,对于跨DBMS的学习和开发,都是必须注意的。

3.5. 语句、表达式和断言语句(statement)是SQL中一个可以单独执行的单元。

如SELECT * FROM table;即是一个语句,其中包含了SELECT子句(clause)和FROM子句。

SQL标准规定用分号作为语句的结束,但在目前的T-SQL中,语句结束的分号是可选的。

表达式(expression)是SQL中的一个值(可能是变量、常量、查询字段或计算结果),对应一种特定的数据类型。

SQL中的表达式分为标量表达式和表值表达式,其中表值表达式作为单独语句则是SELECT语句,作为语句的一部分则称为子查询。

比如0, col + 2, DATE ADD(second, 30, GETDATE())都是(标量)表达式。

需要特别说明的是,SQL中的CASE WHEN是标题表达式,而不是条件语句。

比如CASE WHEN中可以使用表达式,却不能使用语句;CASE WHEN的结果是一个特定数据类型的标量值;CASE WHEN可以用在SELECT、GROUP BY或ORDER BY子句中,但IF ELSE则不行。

断言(predicate)是SQL中进行比较的结果,即真值,可理解为布尔表达式,因为SQL中没有bool数据类型,所以将断言特别从表达式中区分出来。

比如1是一个标量表达式,而1 = 1则是一个断言,后者可以用在WHERE、ON、HAVING、CHECK等需要真值条件的地方,但前者则不可以。

由于NULL的存在,SQL中的断言是三值逻辑,即True/False/Unknown,详见下文“NULL与三值逻辑”。

下文中多次用到计算和比较两个词。

表达式和表达式进行计算,结果是新的表达式;表达式和表达式进行比较,结果是一个断言;断言和断言可以进行逻辑运行(AND/OR/NOT),结果是新的断言。

注意其中的区别。

4. SQL不同于一般编程语言的地方4.1. SQL操作的是数据SQL是数据库的查询语言,因而可以对系统数据产生持久化影响。

在常规编程中,一个错误通常只会造成程序的crash或bug,修改并重新调试往往就可以了;而在SQL中,一个不小心就可能造成系统数据的破坏和丢失。

常常有新手执行SQL时,不小心遗漏了DELETE 或UPDATE语句中的WHERE子句,这往往是很大的麻烦。

因此,学习和使用SQL,一开始应该养成两个习惯:1. 细心。

在执行SQL语句认真检查一下,要清楚自己在做什么。

2. 及时备份,并考虑对系统的元数据进行版本控制。

为偶尔的意外准备好后悔药。

常见的可能造成破坏性影响的SQL关键词:DELETE, UPDATE, DROP, TRUNCATE TABLE。

4.2. SQL是基于集合的说明式语言SQL擅长集合操作,而不是循环。

所谓说明式语言,你只需要告诉SQL需要做什么,而不是怎么做。

初学SQL的人,思维往往难免带有过程式语言的痕迹,解决问题时常常不由地考虑循环。

在学习SQL编程时,每当想要用循环时,先反问一下自己:这个问题是不是必须用循环来解决?事实上,多数情况下,这个问题的答案是否定的。

有本书中讲,SQL代码中出现一次IF便要减一些分(比如-1),出现一次WHILE便要减很多分(比如-10或-50,不夸张)。

可以尝试用这样的方法为自己的存储过程打分。

5. SQL的三个子集SQL从功能上可以划分为三个子集:1. DML(Data Manipulation Language):数据操纵语言,是对数据进行查询和修改(增、删、改)操作的语言。

包含语句:SELECT+INSERT/DELETE/UPDATE使用对象:DB User2. DDL(Data Definition Language):数据定义语言,是对域(数据类型)和关系(表)及其它数据库对象进行定义的语言。

包含语句:CREATE/DROP/ALTER使用对象:DB Designer/Developer3. DCL(Data Control Language):数据控制语言:是对数据的访问进行权限控制的语言。

包含语句:GRANT/DENY/REVOKE使用对象:DBA补充说明:- 严格地说,DML只包含对数据进行修改的语句(INSERT/DELETE/UPDATE),但SELECT 语句与DML关系紧密、形式类似,故通常放在一起。

既可以统称为DML,也可以并称为Query+DML。

- 以上三个子集不包含BACKUP/RESTORE语句。

第三部分:SQL数据类型与三值逻辑7. 数据类型在数据库理论中,关系模型和数据类型这两部分内容是正交的(参看《程序员修炼之道》第8节关于“正交性”的讨论),互不依赖。

换言之,关系模型并不关心每个表的字段的数据类型是什么,是整数、字符串等基本类型也好,是组合类型、类等自定义类型也好,关系模型只要求每个字段是原子的。

在数据库理论中,数据类型又被称为域,但域是更为严格的定义。

比如一个班级的学生个数和学生平均分可能都是int类型,但这是两个不同的域,“学生个数* 学生平均分= 学生总分”,但“学生个数+ 学生平均分”是没有意义的。

目前的主流DBMS似乎尚未对域有很好的支持,但未来的情况可能会有所改变,而且,设计自定义类型也需要对这一问题有充分的认识。

详见《深度探索关系数据库》第2章。

对于数据库和SQL的应用来说,除掌握关系模型的原理,还需要对DBMS支持的数据类型及其转换规则有所认识。

1. 基本数据类型一个DBMS通常都会支持以下几类基本数据类型(以SQL Server为例):- 精确数字:整数(bigint/int/smallint/tinyint/bit),定点小数(decimal),货币(money/smallmoney) - 近似数字:浮点数(float)- 日期和时间:datetime/smalldatetime; date, time, datetime2, datetimeoffset(后4种为SQL Server 2008的新增类型)- 字符串和Unicode字符串:varchar/nvarchar, char/nchar(text/ntext已不再建议使用,用varchar(max)/nvarchar(max)代替)- 二进制串(即字节流):varbinary, binary(image已不再建议使用,用varbinary(max)代替)- 其他数据类型:具有特殊功能的类型(sql_variant, timestamp, uniqueidentifier, xml),不能用于表的特殊类型(cursor, table)2. 关于数据类型需要注意的问题a. 两类特殊的数据类型- 日期和时间类型的数据存储方式和可用值范围、相关的计算、比较、显示(转换为指定格式的字符串)都比较复杂,还涉及一组日期时间函数。