摘要: SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点建立表:CREATE TABLE [TestTable] ([ID] [int] IDENTITY (1, 1) NOT NULL ,[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[N 阅读全文
posted @ 2012-09-18 18:02 左正 阅读(624) 评论(0) 推荐(0)
摘要: 简介数据库范式在数据库设计中的地位一直很暧昧,教科书中对于数据库范式倒是都给出了学术性的定义,但实际应用中范式的应用却不甚乐观,这篇文章会用简单的语言和一个简单的数据库DEMO将一个不符合范式的数据库一步步从第一范式实现到第四范式。范式的目标应用数据库范式可以带来许多好处,但是最重要的好处归结为三点:1.减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)2.消除异常(插入异常,更新异常,删除异常)3.让数据组织的更加和谐…但剑是双刃的,应用数据库范式同样也会带来弊端,这会在文章后面说到。什么是范式简单的说,范式是为了消除重复数据减少冗余数据,从而让数据库内的数据更好的组织,让磁盘空间得 阅读全文
posted @ 2012-09-18 16:48 左正 阅读(127) 评论(0) 推荐(0)
摘要: 引言在前两篇文章中,对于单表查询和多表查询的概念做出了详细的介绍,在本篇文章中会主要介绍聚合函数的使用和数据的分组.简介简单的说,聚合函数是按照一定的规则将多行(Row)数据汇总成一行的函数。对数据进行汇总前,还可以按照特定的列(column)将数据进行分组(Group by)再汇总,然后按照再次给定的条件进行筛选(Having).聚合函数将多行数据进行汇总的概念可以简单用下图解释:简单聚合函数简单聚合函数是那些拥有很直观将多行(Row)汇总为一行(Row)计算规则的函数。这些函数往往从函数名本身就可以猜测出函数的作用,而这些函数的参数都是数字类型的。简单聚合函数包括:Avg,Sum,Max, 阅读全文
posted @ 2012-09-18 16:42 左正 阅读(180) 评论(0) 推荐(0)
摘要: 引言在前篇文章中(SQL查询入门(上篇),我对数据库查询的基本概念以及单表查询做了详细的解释,本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路。多表连接简介在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只有一个表,而如果大多查询只涉及到一个表的,那么那个表也往往低于第三范式,存在大量冗余和异常。因此,连接(Join)就是一种把多个表连接成一个表的重要手段.比如简单两个表连接学生表(Student)和班级(Class)表,如图:进行连接后如图:笛卡尔积笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join)。 阅读全文
posted @ 2012-09-18 16:40 左正 阅读(261) 评论(0) 推荐(0)
摘要: 引言SQL语言是一门简单易学却又功能强大的语言,它能让你快速上手并写出比较复杂的查询语句。但对于大多数开发者来说,使用SQL查询数据库并没有一个抽象的过程和一个合理的步骤,这很可能会使在写一些特定的SQL查询语句来解决特定问题时被”卡”住,本系列文章主要讲述SQL查询时一些基本的理论,以及写查询语句的抽象思路。SQL查询简介SQL语言起源于1970年E.J.Codd发表的关系数据库理论,所以SQL是为关系数据库服务的。而对于SQL查询,是指从数据库中取得数据的子集,这句话貌似听着有些晦涩是吧,下面通过几张图片简单说明一下:假如一个数据库中只有一个表,再假如所有数据如下图(取自Adventure 阅读全文
posted @ 2012-09-18 16:38 左正 阅读(292) 评论(0) 推荐(0)
摘要: 引言SQL有着非常强大且灵活的查询方式,而多表连接操作往往也可以用子查询进行替代,本篇文章将会讲述子查询的方方面面。简介子查询本质上是嵌套进其他SELECT,UPDATE,INSERT,DELETE语句的一个被限制的SELECT语句,在子查询中,只有下面几个子句可以使用SELECT子句(必须)FROM子句(必选)WHERE子句(可选)GROUP BY(可选)HAVING(可选)ORDER BY(只有在TOP关键字被使用时才可用)子查询也可以嵌套在其他子查询中,这个嵌套最多可达32层。子查询也叫内部查询(Inner query)或者内部选择(Inner Select),而包含子查询的查询语句也叫 阅读全文
posted @ 2012-09-18 16:34 左正 阅读(143) 评论(0) 推荐(0)
摘要: 引言T-SQL不仅仅是一个用于查询数据库的语言,还是一个可以对数据进行操作的语言。基于列的CASE表达式就是其中一种,不像其他查询语句可以互相替代(比如用子查询实现的查询也可以使用Join实现),CASE表达式在控制基于列的逻辑大部分是无法替代的。下面文中会详细讲解CASE表达式。简介基于列的逻辑表达式,其实就是CASE表达式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后。由于这里讲的是T-SQL查询,所以只说到CASE表达式在SELECT子句和ORDER BY子句中的使用。CASE表达式实现的功能类似于编程语言中的IF… 阅读全文
posted @ 2012-09-18 16:24 左正 阅读(305) 评论(0) 推荐(0)
摘要: 概述和其他高级语言一样,T-SQL中也有用于控制流程的语句。T-SQL中的流程控制语句进一步扩展了T-SQL的力量……使得大部分业务逻辑可以在数据库层面进行。但很多人对T-SQL中的流程控制语句并没有系统的了解,本篇文章会系统的对T-SQL语句中的流程控制语句进行系统讲解。基本概念在没有流程控制语句的情况下,T-SQL语句是按照从上到下的顺序逐个执行:使用流程控制语句可以让开发人员可以基于某些逻辑进行选择性的跳转,实现了类似高级语言的跳转结构:流程控制语句的使用范围和GO关键字流程控制语句只能在单个批处理段(Batch),用户自定义函数和存储过程中使用。不能跨多个批处理段或者用户自定义函数和存 阅读全文
posted @ 2012-09-18 16:16 左正 阅读(220) 评论(0) 推荐(0)
摘要: 概述变量对于一种语言是必不可少的一部分,当然,对于T-SQL来讲也是一样。在简单查询中,往往很少用到变量,但无论对于复杂的查询或存储过程中,变量都是必不可少的一部分.变量的种类在T-SQL中,变量按生存范围可以分为全局变量(Global Variable)和局部变量(Local Variable).1.全局变量是由系统定义的,在整个SQL SERVER实例内都能访问到的变量.全局变量以@@作为第一个字符,用户只能访问,不能赋值。2.局部变量由用户定义,生命周期只在一个批处理内有效。局部变量以@作为第一个字符,由用户自己定义和赋值。一个简单的例子如下因为全局变量仅仅是用于读取系统的一些参数,具体 阅读全文
posted @ 2012-09-18 16:10 左正 阅读(223) 评论(0) 推荐(0)
摘要: 概述关系数据库的起源起源于数学中的集合概念.所以集合与集合之间,也同样继承了数学集合之间的运算.而对于在关系数据库中,常常用于两个数据集中并没有直接的关系数据库中的“关系”,比如外键.但两个数据集会有间接的关系,比如两届比赛,参加比赛人员集合之间会有间接关系.数据集运算的种类在T-SQL中,关系运算实际上可以分为四类,首先看我们举例子用的表:这里的例子表分别为两个不同会议参加的人员记录,分别为Meeting1和Meeting2,如下: 关系运算的具体可以分为以下四类:1.A∩B,既是所求数据集既在A中,又在B中在实例表中,实际的例子为既参加第一个会议,又参加第二个会议人的集合,如下图:2.A∪ 阅读全文
posted @ 2012-09-18 16:02 左正 阅读(407) 评论(0) 推荐(0)
摘要: 概述游标是邪恶的!在关系数据库中,我们对于查询的思考是面向集合的。而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服。正常面向集合的思维方式是:而对于游标来说:这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能.同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量……从游标对数据库的读取方式来说,不难看出游标为什么占用更多的资源,打个比方:当你从ATM取钱的时候,是一次取1000效率更高呢,还是取10次100?既然游标这么“邪恶”,为什么还要学习游标我个人认为存在 阅读全文
posted @ 2012-09-18 15:58 左正 阅读(1207) 评论(0) 推荐(0)
摘要: 简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈了. 公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个特性.CTE可以看作是一个临时的结果集,可以在接下来的一个SELECT,INSERT,UPDATE,DELETE,MERGE语句中被多次引用。使用公用表达式可以让语句更加清晰简练. 除此之外,根据微软对CT 阅读全文
posted @ 2012-09-18 15:11 左正 阅读(332) 评论(0) 推荐(0)
摘要: 最近遇到一个情况,需要在内网系统中出一个统计报表。需要根据不同条件使用多个group by语句.需要将所有聚合的数据进行UNION操作来完成不同维度的统计查看. 直到发现在SQL SERVER 2008之后引入了GROUPING SETS这个对于GROUP BY的增强后,上面的需求实现起来就简单多了,下面我用AdventureWork中的表作为DEMO来解释一下GROUPING SETS. 假设我现在需要两个维度查询我的销售订单,查询T-SQL如下: 而使用SQL SERVER 2008之后新增的GROUPING SETS语句,仅仅需要这样写: 值得注意的是,虽然上面使用GROUPING .. 阅读全文
posted @ 2012-09-18 14:57 左正 阅读(244) 评论(0) 推荐(0)
摘要: 简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能。但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索引的概念,需要了解大量原理性的知识,包括B树,堆,数据库页,区,填充因子,碎片,文件组等等一系列相关知识,这些知识写一本小书也不为过。所以本文并不会深入讨论这些主题。索引是什么 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 精简来说,索引是一种结构.在SQL Server中,索引和表(这里指的是加了聚集索引的表)的存储结构是一样的,都是B树,B树是一 阅读全文
posted @ 2012-09-18 14:41 左正 阅读(307) 评论(0) 推荐(0)
摘要: 写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完。这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章的内容需要索引的知识作为基础。简介 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索引的表.但相比实际的表而言.非聚集索引中所存储的表的列数要窄很多,因为非聚集索引仅仅包含原表中非聚集索引的列和指向实际物理表的指针。 并且,对于非聚集索引表来说,其中所存放的列是按照聚集索引来进行存放的.所以查找速度要快了很多。但是对于性能的榨取来说,SQL SERVER总是竭尽所能,假如仅仅是通过索. 阅读全文
posted @ 2012-09-18 14:22 左正 阅读(282) 评论(0) 推荐(0)
摘要: 简介 分区表是在SQL SERVER2005之后的版本引入的特性。这个特性允许把逻辑上的一个表在物理上分为很多部分。而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个表做union操作. 分区表在逻辑上是一个表,而物理上是多个表.这意味着从用户的角度来看,分区表和普通表是一样的。这个概念可以简单如下图所示: 而对于SQL SERVER2005之前的版本,是没有分区这个概念的,所谓的分区仅仅是分布式视图: 本篇文章所讲述的分区表指的是SQL SERVER2005之后引入的分区表特性.为什么要对表进行分区 在回答标题的问题之前,需要说明的是,表分区这个特性只有.. 阅读全文
posted @ 2012-09-18 14:11 左正 阅读(253) 评论(0) 推荐(0)
摘要: 简介 Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。”,通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的。 可以想象出,需要使用Merge的场景比如: 数据同步 数据转换 基于源表对目标表做Insert,Update,Delete操作使用Merge关键字的好处 首先是更加短小精悍的语句,在 阅读全文
posted @ 2012-09-18 13:46 左正 阅读(172) 评论(0) 推荐(0)
摘要: 在我的上一篇关于SQL SERVER索引的博文,有圆友问道关于逻辑读,预读和物理读的概念.我觉的还是写一篇博文能把这个问题解释清楚。SQL SERVER数据存储的形式 在谈到几种不同的读取方式之前,首先要理解SQL SERVER数据存储的方式.SQL SERVER存储的最小单位为页(Page).每一页大小为8k,SQL SERVER对于页的读取是原子性,要么读完一页,要么完全不读,不会有中间状态。而页之间的数据组织结构为B树(请参考我之前的博文).所以SQL SERVER对于逻辑读,预读,和物理读的单位是页. SQL SERVER一页的总大小为:8K 但是这一页存储的数据会是:8K=8192. 阅读全文
posted @ 2012-09-18 11:40 左正 阅读(228) 评论(0) 推荐(0)
摘要: 简介 当查询优化器(Query Optimizer)将T-SQL语句解析后并从执行计划中选择最低消耗的执行计划后,具体的执行就会交由执行引擎(Execution Engine)来进行执行。本文旨在分类讲述执行计划中每一种操作的相关信息。数据访问操作 首先最基本的操作就是访问数据。这既可以通过直接访问表,也可以通过访问索引来进行。表内数据的组织方式分为堆(Heap)和B树,其中表中没有建立聚集索引时数据是通过堆进行组织的,这个是无序的,表中建立聚集索引后和非聚集索引的数据都是以B树方式进行组织,这种方式数据是有序存储的。通常来说,非聚集索引仅仅包含整个表的部分列,对于过滤索引,还仅仅包含部分行。 阅读全文
posted @ 2012-09-18 11:30 左正 阅读(201) 评论(0) 推荐(0)
摘要: 简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理。二级存储(secondary storage) 对于计算机来说,存储体系是分层级的。离CPU越近的地方速度愉快,但容量越小(如图1所示)。比如:传统的计算机存储体系结构离CPU由近到远依次是:CPU内的寄存器,一级缓存,二级缓存,内存,硬盘。但同时离CPU越远的存储系统都会比之前的存储系统大一个数量级。比如硬盘通常要比同时代的内存大一个数量级。 图1.计算机存储体系 因此对于SQL Server来说,正常的生产系统所配置的内存通常不能装载所有. 阅读全文
posted @ 2012-09-18 11:02 左正 阅读(137) 评论(0) 推荐(0)