SQL学习Word格式文档下载.docx
- 文档编号:18432238
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:10
- 大小:24.49KB
SQL学习Word格式文档下载.docx
《SQL学习Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《SQL学习Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
数据库服务器是运行在一台主机(Host)(或主机集群)上的服务程序,维护着一个或多个数据库,并通过网络连接响应数据库客户端提交的SQL语句。
数据库客户端是向数据库服务器发送查询请求的应用程序,可能是DBMS的GUI管理界面或命令行应用程序,也可能是前端的Web服务器。
数据库客户端和数据库服务器可能是在同一台主机上,但更多情况下则是位于不同的主机上,通过局域网访问。
例如对于SQLServer来说,一个服务器实例(Instance)即是一个数据库服务器,一台主机上可以安装多个服务器实例;
而查询分析器或SSMS、sqlcmd、以及连接数据库服务器的IIS,都是数据库客户端。
比如你在SSMS中备份/还原/附加一个数据库,或是通过xp_cmdshell执行一个命令程序,所操作的都是你所连接的数据库服务器所在主机的文件,而不是你运行SSMS数据库客户端所在主机的文件。
一台主机有时候会被称作一台(操作系统)服务器,而数据库服务器和Web服务器都是运行在主机之上的应用服务器。
它们都被称作服务器,不要因此搞混了。
一个典型的基于SQLServer的网站系统的架构示例如下:
用户浏览器(WebClient)<
---->
IIS(WebServer/DBClient)<
SQLServer(DBServer)
3.3.数据库(DB)与数据库管理系统(DBMS)
“数据库”这个词已经被滥用,可能用来指一个数据系统(如中国移动的号码数据库),可能用来指一种数据存储技术(如关系数据库和NoSQL数据库),还可能用来指DBMS(如人们常说SQLServer是数据库软件)。
这种混乱已然形成,恐怕难以改变(比如上文的描述即是如此)。
我们只能根据上下文来判断具体含义。
按最狭义的技术含义,数据库(Database)是指位于一个数据库服务器实例上的一个库,而DBMS则是指类似SQLServer、Oracle等等此类软件。
初学者要注意这些概念之间的差别。
论坛上常常见到这样的帖子:
“连不上数据库”、“数据库打不开了”,又没有上下文,可见发问者概念混乱,搞得解答者也是一头雾水。
3.4.SQL与SQL方言(dialect)
SQL是一个关系数据库查询语言的标准,而SQL方言则是各种DBMS在SQL标准上进行的扩展,如增加新的关键字、查询功能、特有的数据类型、支持过程化的控制流语句等。
例如SQLServer的T-SQL和Oracle的PL/SQL都是常见的SQL方言。
这就好比ANSIC标准与各种编译器实现的C语言的差别。
但不同SQL方言之间的差异远大于不同C编译器之间的差异。
SQL方言之间的差异,对于跨DBMS的学习和开发,都是必须注意的。
3.5.语句、表达式和断言
语句(statement)是SQL中一个可以单独执行的单元。
如SELECT*FROMtable;
即是一个语句,其中包含了SELECT子句(clause)和FROM子句。
SQL标准规定用分号作为语句的结束,但在目前的T-SQL中,语句结束的分号是可选的。
表达式(expression)是SQL中的一个值(可能是变量、常量、查询字段或计算结果),对应一种特定的数据类型。
SQL中的表达式分为标量表达式和表值表达式,其中表值表达式作为单独语句则是SELECT语句,作为语句的一部分则称为子查询。
比如0,col+2,DATEADD(second,30,GETDATE())都是(标量)表达式。
需要特别说明的是,SQL中的CASEWHEN是标题表达式,而不是条件语句。
比如CASEWHEN中可以使用表达式,却不能使用语句;
CASEWHEN的结果是一个特定数据类型的标量值;
CASEWHEN可以用在SELECT、GROUPBY或ORDERBY子句中,但IFELSE则不行。
断言(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,TRUNCATETABLE。
4.2.SQL是基于集合的说明式语言
SQL擅长集合操作,而不是循环。
所谓说明式语言,你只需要告诉SQL需要做什么,而不是怎么做。
初学SQL的人,思维往往难免带有过程式语言的痕迹,解决问题时常常不由地考虑循环。
在学习SQL编程时,每当想要用循环时,先反问一下自己:
这个问题是不是必须用循环来解决?
事实上,多数情况下,这个问题的答案是否定的。
有本书中讲,SQL代码中出现一次IF便要减一些分(比如-1),出现一次WHILE便要减很多分(比如-10或-50,不夸张)。
可以尝试用这样的方法为自己的存储过程打分。
5.SQL的三个子集
SQL从功能上可以划分为三个子集:
1.DML(DataManipulationLanguage):
数据操纵语言,是对数据进行查询和修改(增、删、改)操作的语言。
包含语句:
SELECT+INSERT/DELETE/UPDATE
使用对象:
DBUser
2.DDL(DataDefinitionLanguage):
数据定义语言,是对域(数据类型)和关系(表)及其它数据库对象进行定义的语言。
CREATE/DROP/ALTER
DBDesigner/Developer
3.DCL(DataControlLanguage):
数据控制语言:
是对数据的访问进行权限控制的语言。
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通常都会支持以下几类基本数据类型(以SQLServer为例):
-精确数字:
整数(bigint/int/smallint/tinyint/bit),定点小数(decimal),货币(money/smallmoney)
-近似数字:
浮点数(float)
-日期和时间:
datetime/smalldatetime;
date,time,datetime2,datetimeoffset(后4种为SQLServer2008的新增类型)
-字符串和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.两类特殊的数据类型
-日期和时间类型的数据存储方式和可用值范围、相关的计算、比较、显示(转换为指定格式的字符串)都比较复杂,还涉及一组日期时间函数。
参看datetime类型分析一帖。
-字符串类型涉及到字符编码和排序规则,比较操作还包含LIKE匹配(未来还可能会支持正则表达式匹配),非常需要注意。
参看理解字符编码和SQLServer中文处理二帖。
b.如果对不同排序规则的两个字符串进行计算或比较,将会根据排序规则优先顺序来决定计算结果的排序规则或比较的方法。
c.如果对不同类型的两个值进行计算或比较,将会根据数据类型优先级进行隐式转换。
数据类型优先级基本规则如下:
-大>
小(>
指优先级高于,下同):
如bigint>
int>
smallint>
tinyint>
bit,varchar(20)>
varchar(10),datetime>
smalldatetime,等等。
-可变>
固定:
如float>
decimal,varchar>
char,nvarchar>
nchar,varbinary>
binary。
-各类型大类的优先级:
datetime>
float>
decimal>
integer>
unicodestring>
ansistring>
-特殊数据类型的优先级和转换规则需要特殊考虑,详见联机丛书。
d.如果对不同大小的两个值进行计算,将会根据精度、小数位数和长度的规则来产生新的类型大小。
e.常量的数据类型(可以通过SELECTcol=常量值INTOtestdt然后查看testdt表col字段的数据类型来观察)
-如果不显式指定和隐式转换,NULL会按int类型处理。
-'
'
N'
1,0x01,1.0,1E0,$1分别对应varchar,nvarchar,int,varbinary,decimal,float,money类型,并且长度是存储相应值所需要的最小长度。
f.在软件开发领域众所周知:
“隐式转换是bug的源泉”。
因此,有两个建议:
-使用常量时,最好使用对应类型的常量。
比如,如果table.col是varchar类型,那么WHEREtable.col=10的查询将不能使用索引,而且当遇到col中存放有不能转换为数字的值时将出错。
-除非相应值的隐式转换非常直观,否则宁可用CAST()/CONVERT()指定明确的显式转换。
以上内容中,加下划线的粗体是联机丛书的标题。
详细分析参看《MicrosoftSQLServer2005技术内幕:
T-SQL程序设计》第1章。
8.NULL与三值逻辑
三值逻辑(3VL,Three-valuedLogic)绝对是SQL修炼中的一个紧要关卡,值得特别注意,闭关静修。
待冲破这一关卡之后,SQL中的NULL与NOTNULL将别无二致。
关于SQL是否应该允许NULL,在数据库领域已经近乎一个信仰式的争论。
E.F.Codd认为NULL有存在的必要,但他的好友C.J.Date认为NULL完全可以取消。
最终结果是,SQL标准支持NULL。
理论上的争论且不管。
但在实践中,一定要知道NULL的三值逻辑会带来很多困扰的问题。
a.不使用NULL的理由:
-NULL会引入复杂的三值逻辑。
-NULL在查询条件、外键和CHECK约束、唯一约束、GROUPBY、ORDERBY中的行为都是不一致的。
b.使用NULL的理由:
-当需要表示一个未知的、不确定的值时,用NULL更自然。
比如一个现在职员工的离职时间、顶级员工(BOSS)的上级员工,等等。
-外联接通常会引入NULL,即使所有表的字段都定义为NOTNULL。
首先,如果可能,尽量让所有字段都声明为NOTNULL。
除非是更适合使用NULL的场合(从业务出发)。
其次,在使用NULL时,一定要搞清楚三值逻辑和数据库引擎对NULL的处理:
(SQLServer有一个选项SETANSI_DEFAULTS,默认为ON,即与SQL标准一致。
设为OFF的效果详见联机丛书。
)
1.NULL与别的值进行+-*/等计算操作(包括在大多数函数中使用NULL)后,结果是NULL(标量表达式)。
NULL与别的值进行=、>
、<
等比较操作后,结果是Unknown(断言)。
Unknown相关的逻辑运算:
[code=sql]
NOTUnknown-->
Unknown
UnknownAND/ORUnknown-->
UnknownORTRUE-->
TRUE
UnknownANDTRUE-->
UnknownORFALSE-->
UnknownANDFALSE-->
FALSE
[/code]
具体可查三值逻辑的真值表。
2.在where/on/having和if/casewhen中,只有True才使条件成立(即Unknown当作False来处理)。
比如:
wherecolumn=value:
表中column为NULL的行永远不会返回,即使value是NULL;
casevaluewhenNULLthenXXXwhen...end:
XXX永远不会执行,即使value是NULL;
if<
Unknown>
XXXelseYYYend或casewhen<
thenXXXelseYYYend:
这两种情况下,YYY会执行。
3.包含外键约束和Check约束的字段允许NULL(即约束只当条件为False时出错,Unknown是不管的)。
4.包含唯一约束(uniqueindex)的字段只允许一个NULL的行,再插入或更新该字段为NULL的行会报字段重复的错误。
5.GROUPBY时,所有NULL被视为一组。
6.ORDERBY时,所有NULL排在一起,但NULL排在非空值的前面(如SQLServer)还是后面(如Oracle),SQL标准未规定。
7.聚集函数(SUM/AVG/MAX/MIN/COUNT)忽略NULL的行。
8.declare的变量,在未赋值之前为NULL。
9.与NULL处理相关的运算符和函数:
-ISNULL/ISNOTNULL:
用这两个运算符来判断一个值是否为NULL,而不是=或<
>
。
-ISNULL/COALESCE:
取第一个非空值(注意两个函数的数据类型转换规则不同)。
-NULLIF(a,b):
等价于CASEWHENa=bTHENNULLELSEaEND。
第四部分:
DBMS扩展功能与SQL高级话题
9.DBMS提供的扩展功能
掌握了基本的关系模型原理和DBMS的数据类型,还需要对DBMS提供的扩展功能有所了解,才能充分运用DBMS进行数据库开发。
9.1.控制流
SQL是说明式语言,但DBMS面对实际开发的需求,通常在SQL方言中都提供了过程式的扩展,包括(以T-SQL为例):
1.变量定义和赋值
DECLARE@var<
datetype>
--变量定义语句
SET@var=<
value>
--通过SET语句赋值
SELECT@var=MAX(column_value)FROM[table]
--通过SELECT语句赋值
2.代码块
BEGIN...END定义一个代码块。
对于下面的IF/ELSE和WHILE,如果忽略了BEGIN...END代码块,条件和循环将只对其后的第一个语句生效。
3.条件分支语句
IF...ELSE...
注意IF语句与CASEWHEN表达式的区别。
4.循环控制语句
WHILE可以进行循环。
BREAK/CONTINUE可以跳出或进行下一次循环。
5.异常处理语句
SQLServer2005支持TRY-CATCH语句进行异常处理,但只能处理一部分异常。
详见联机丛书。
9.2.动态语句
SQL动态语句的功能很强大,但是难以调试和维护(字符串拼接、无语法高亮)、效率低(难以重用执行计划)、安全性差(SQL注入)。
除非功能上必须,否则尽量避免使用动态SQL。
假如真的需要使用动态SQL,使用sp_executesql的方式优于EXEC()的方式。
因为前者有些时候可以重用执行计划而改善性能,而且允许传参,数据类型上更安全。
9.3.DBMS支持的数据库对象
SQLServer还支持临时表、视图、存储过程、自定义函数(标量和表值)、触发器、游标等数据库对象,这是利用SQLServer进行开发必须掌握的知识。
参看《MicrosoftSQLServer2005技术内幕:
T-SQL程序设计》相关章节。
9.4.DBMS提供的系统函数、系统视图和系统存储过程
-SystemFunctions:
提供特定的表达式运算功能,如日期时间函数、字符串函数、数学函数、聚合函数等,是T-SQL编程必需的。
-SystemViews:
包含了数据库元数据、系统内部运行数据等,如目录视图(用来代替SQLServer2000中的系统表)、信息架构视图、动态管理视图等。
-SystemProcedures:
查看系统信息、修改系统配置等,如目录存储过程、数据库引擎存储过程等。
9.5.DBMS提供的工具
-数据库服务器配置工具:
配置管理器、外围应用配置器等
-数据库客户端应用工具:
SSMS、sqlcmd、bcp等
-数据库性能工具:
SQLServerProfiler等
10.高级话题
以下是数据库相关的高级话题,每一块都值得单独讨论,本帖不再详述。
1.高级技术专题
-数据库设计
-服务器架构
-索引和性能优化
-事务、锁定与并发
-备份与还原
相关书目:
-《SQLServer2005数据库服务器架构设计》
-《MicrosoftSQLServer2005技术内幕:
存储引擎》
查询、调整和优化》
-《SQLServer2005性能调校》
2.开发和维护相关的管理专题
-数据库权限管理
-数据库对象的版本控制
-数据库开发的命名规范
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 学习
![提示](https://static.bdocx.com/images/bang_tan.gif)