第一部分: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)是指位于一个数据库服务器实例上的一个库,而DBMS则是指类似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, DATEADD(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语句。

解决方案 »

  1.   

    对于SQL Server来说,一个服务器实例(Instance)即是一个数据库服务器

    所谓的数据库服务器是指什么东西呢。对于Instance,我觉得还是参照ORACLE的解释,会更好一点:实例=内存+进程,而database则是操作系统文件或者磁盘。instance + database = database serverDatabase: A collection of physical operating system files or disks. When using 
    Oracle Automatic Storage Management (ASM) or RAW partitions, the database 
    may not appear as individual, separate files in the operating system, but the 
    definition remains the same. 
    Instance: A set of Oracle background processes or threads and a shared memory 
    area, which is memory that is shared across those threads or processes running on 
    a single computer. This is the place for volatile, nonpersistent stuff, some of which 
    gets flushed to disk. A database instance can exist without any disk storage 
    whatsoever. It might not be the most useful thing in the world, but thinking about 
    it that way definitely helps draw the line between the instance and the database. 并考虑对系统的元数据进行版本控制。为偶尔的意外准备好后悔药。系统的元数据 的版本控制,不知道有没有好的实践和经验分享。
      

  2.   


    数据库服务器的说法是相对于数据库的客户端来说的。
    至于instance和database的区别,你上面的说法很不错。版本控制,目前所知的方法是:写脚本每天把系统元数据导成脚本,再对脚本进行版本控制。
      

  3.   

    haoziliao
      

  4.   

    学习ing