随笔分类 -  T-SQL

1
摘要:1.在生产环境中不要出现Select * 这一点我想大家已经是比较熟知了,这样的错误相信会犯的人不会太多。但我这里还是要说一下。 不使用Select *的原因主要不是坊间所流传的将*解析成具体的列需要产生消耗,这点消耗在我看来完全可以忽略不计。更主要的原因来自以下两点: 扩展方面的问题 造成额外的书签查找或是由查找变为扫描 ... 阅读全文
posted @ 2012-10-11 11:06 CareySon 阅读(33551) 评论(110) 推荐(199) 编辑
摘要:假设一个业务规则规定某些情况不允许存在.并且不允许使用外键进行限制,此时Instead of 触发器可以作为备选答案,但是通常这类触发器在以后带来的麻烦会多于其带来的便利。还有一种解决方式是使用包含唯一索引的索引视图与只有一个两行的dummy table进行连接。 假设你有如下两个表,地区和办事处 Region表 RegionId RegionName IsActive EffectiveDate ExpirationDate 1 ... 阅读全文
posted @ 2012-08-21 09:18 CareySon 阅读(3435) 评论(8) 推荐(4) 编辑
摘要:简介 Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。”,通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的。 可以想象出,需要使用Merge的场景比如: 数据同步 数据转换 基于源表对目标表做Insert,Update,De... 阅读全文
posted @ 2012-03-07 16:03 CareySon 阅读(65494) 评论(45) 推荐(76) 编辑
摘要:写在前面:本篇文章需要你对索引和SQL中数据的存储方式有一定了解.标题中高级两个字仅仅是因为本篇文章需要我的T-SQL进阶系列文章的一些内容作为基础. 简介 在SQL Server中,存储数据的最小单位是页,每一页所能容纳的数据为8060字节.而页的组织方式是通过B树结构(表上没有聚集索引则为堆结构,不在本文讨论之列)如下图: 在聚集索引B树中,只有叶子节点实际存储数据,而其他根节点和中间节点仅仅用于存放查找叶子节点的数据. 每一个叶子节点为一页,每页是不可分割的. 而SQL Server向每个页内存储数据的最小单位是表的行(Row).... 阅读全文
posted @ 2012-01-06 08:46 CareySon 阅读(23894) 评论(59) 推荐(68) 编辑
摘要:简介 分区表是在SQL SERVER2005之后的版本引入的特性。这个特性允许把逻辑上的一个表在物理上分为很多部分。而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个表做union操作. 分区表在逻辑上是一个表,而物理上是多个表.这意味着从用户的角度来看,分区表和普通表是一样的。这个概念可以简单如下图所示: 而对于SQL SERVER2005之前的版本,是没有分区这个概念的,所谓的分区仅仅是分布式视图: 本篇文章所讲述的分区表指的是SQL SERVER2005之后引入的分区表特性. ... 阅读全文
posted @ 2011-12-30 17:19 CareySon 阅读(21506) 评论(31) 推荐(72) 编辑
摘要:写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完。这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章的内容需要索引的知识作为基础。 简介 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索引的表.但相比实际的表而言.非聚集索引中所存储的表的列数要窄很多,因为非聚集索引仅仅包含原表中非聚集索引的列和指向实际物理表的指针。 并且,对于非聚集索引表来说,其中所存放的列是按照聚集索引来进行存放的.所以查找速度要快了很多。但是对于性能的榨取来... 阅读全文
posted @ 2011-12-27 14:18 CareySon 阅读(18279) 评论(51) 推荐(100) 编辑
摘要:简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能。但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索引的概念,需要了解大量原理性的知识,包括B树,堆,数据库页,区,填充因子,碎片,文件组等等一系列相关知识,这些知识写一本小书也不为过。所以本文并不会深入讨论这些主题。 索引是什么 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 精简来说,索引是一种结构.在SQL Server中,索引和表(这... 阅读全文
posted @ 2011-12-22 12:18 CareySon 阅读(47887) 评论(112) 推荐(218) 编辑
摘要:最近遇到一个情况,需要在内网系统中出一个统计报表。需要根据不同条件使用多个group by语句.需要将所有聚合的数据进行UNION操作来完成不同维度的统计查看. 直到发现在SQL SERVER 2008之后引入了GROUPING SETS这个对于GROUP BY的增强后,上面的需求实现起来就简单多了,下面我用AdventureWork中的表作为DEMO来解释一下GROUPING SETS. 假设我现在需要两个维度查询我的销售订单,查询T-SQL如下: 而使用SQL SERVER 2008之后新增的GROUPING SETS语句,仅仅... 阅读全文
posted @ 2011-12-19 13:05 CareySon 阅读(11285) 评论(9) 推荐(16) 编辑
摘要:简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈了. 公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个特性.CTE可以看作是一个临时的结果集,可以在接下来的一个SELECT,INSERT,UPDATE,DELETE,MERGE语句中被多次引用。使用公用表达式可以让语句更加清晰... 阅读全文
posted @ 2011-12-12 13:50 CareySon 阅读(50465) 评论(38) 推荐(77) 编辑
摘要:简介 视图可以看作定义在SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口.常规视图本身并不存储实际的数据,而仅仅存储一个Select语句和所涉及表的metadata. 视图简单的理解如下: 通过视图,客户端不再需要知道底层table的表结构及其之间的关系。视图提供了一个统一访问数据的接口。 为什么要使用视图(View) 从而我们不难发现,使用视图将会得到如下好处: 视图隐藏了底层的表结构,简化了数据访问操作 因为隐藏了底层的表结构,所以大大加强了安全性,用户只... 阅读全文
posted @ 2011-12-07 16:32 CareySon 阅读(59598) 评论(24) 推荐(105) 编辑
摘要:概述        游标是邪恶的!        在关系数据库中,我们对于查询的思考是面向集合的。而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服。        正常面向集合的思维方式是:               而对于游标来说:              这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想用面向集合的查询... 阅读全文
posted @ 2011-11-01 14:12 CareySon 阅读(32490) 评论(33) 推荐(75) 编辑
摘要:概述 关系数据库的起源起源于数学中的集合概念.所以集合与集合之间,也同样继承了数学集合之间的运算.而对于在关系数据库中,常常用于两个数据集中并没有直接的关系数据库中的“关系”,比如外键.但两个数据集会有间接的关系,比如两届比赛,参加比赛人员集合之间会有间接关系. 数据集运算的种类 在T-SQL中,关系运算实际上可以分为四类,首先看我们举例子用的表: 这里的例子表分别为两个不同会议参加的人员记录,分别为Meeting1和Meeting2,如下: 关系运算的具体可以分为以下四类: 1.A∩B,既是所求数... 阅读全文
posted @ 2011-10-13 12:59 CareySon 阅读(9083) 评论(9) 推荐(32) 编辑
摘要:概述 变量对于一种语言是必不可少的一部分,当然,对于T-SQL来讲也是一样。在简单查询中,往往很少用到变量,但无论对于复杂的查询或存储过程中,变量都是必不可少的一部分. 变量的种类 在T-SQL中,变量按生存范围可以分为全局变量(Global Variable)和局部变量(Local Variable). 1.全局变量是由系统定义的,在整个SQL SERVER实例内都能访问到的变量.全局变量以@@作为第一个字符,用户只能访问,不能赋值。 2.局部变量由用户定义,生命周期只在一个批处理内有效。局部变量以@作为第一个字符,由用户自己定义和赋值... 阅读全文
posted @ 2011-10-11 15:03 CareySon 阅读(39918) 评论(21) 推荐(48) 编辑
摘要:概述 和其他高级语言一样,T-SQL中也有用于控制流程的语句。T-SQL中的流程控制语句进一步扩展了T-SQL的力量……使得大部分业务逻辑可以在数据库层面进行。但很多人对T-SQL中的流程控制语句并没有系统的了解,本篇文章会系统的对T-SQL语句中的流程控制语句进行系统讲解。 基本概念 在没有流程控制语句的情况下,T-SQL语句是按照从上到下的顺序逐个执行: 使用流程控制语句可以让开发人员可以基于某些逻辑进行选择性的跳转,实现了类似高级语言的跳转结构: 流程控制语句的使用范围和GO关键字 ... 阅读全文
posted @ 2011-08-23 13:06 CareySon 阅读(22086) 评论(19) 推荐(48) 编辑
摘要:引言 T-SQL不仅仅是一个用于查询数据库的语言,还是一个可以对数据进行操作的语言。基于列的CASE表达式就是其中一种,不像其他查询语句可以互相替代(比如用子查询实现的查询也可以使用Join实现),CASE表达式在控制基于列的逻辑大部分是无法替代的。下面文中会详细讲解CASE表达式。 简介 基于列的逻辑表达式,其实就是CASE表达式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后。由于这里讲的是T-SQL查询,所以只说到CASE表达式在SELECT子句和ORDER BY子句中的使用。 CASE表达式实现的功能类似于编 阅读全文
posted @ 2011-08-11 16:49 CareySon 阅读(9850) 评论(21) 推荐(49) 编辑
摘要:引言 SQL有着非常强大且灵活的查询方式,而多表连接操作往往也可以用子查询进行替代,本篇文章将会讲述子查询的方方面面。 简介 子查询本质上是嵌套进其他SELECT,UPDATE,INSERT,DELETE语句的一个被限制的SELECT语句,在子查询中,只有下面几个子句可以使用 SELECT子句(必须) FROM子句(必选) WHERE子句(可选) GROUP BY(可选) HAVING(可选) ORDER BY(只有在TOP关键字被使用时才可用) 子查询也可以嵌套在其他子查询中,这个嵌... 阅读全文
posted @ 2011-07-18 13:06 CareySon 阅读(84720) 评论(31) 推荐(94) 编辑
摘要:引言 在前两篇文章中,对于单表查询和多表查询的概念做出了详细的介绍,在本篇文章中会主要介绍聚合函数的使用和数据的分组. 简介 简单的说,聚合函数是按照一定的规则将多行(Row)数据汇总成一行的函数。对数据进行汇总前,还可以按照特定的列(column)将数据进行分组(Group by)再汇总,然后按照再次给定的条件进行筛选(Having). 聚合函数将多行数据进行汇总的概念可以简单用下图解释: 简单聚合函数 简单聚合函数是那些拥有很直观将多行(Row)汇总为一行(Row)计算规则的函数。这些... 阅读全文
posted @ 2011-05-18 11:21 CareySon 阅读(20528) 评论(13) 推荐(66) 编辑
摘要:引言     在前篇文章中(SQL查询入门(上篇),我对数据库查询的基本概念以及单表查询做了详细的解释,本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查询的不同思路。   多表连接简介      在关系数据库中,一个查询往往会涉及多个表,因为很少有数据库只... 阅读全文
posted @ 2010-04-13 14:22 CareySon 阅读(20431) 评论(18) 推荐(56) 编辑
摘要:引言         SQL语言是一门简单易学却又功能强大的语言,它能让你快速上手并写出比较复杂的查询语句。但对于大多数开发者来说,使用SQL查询数据库并没有一个抽象的过程和一个合理的步骤,这很可能会使在写一些特定的SQL查询语句来解决特定问题时被”卡”住,本系列文章主要讲述SQL查询时一些基本的理论,以及写查询语句的抽象思路。 &... 阅读全文
posted @ 2010-04-05 21:53 CareySon 阅读(88827) 评论(32) 推荐(102) 编辑
摘要:简介 数据库范式在数据库设计中的地位一直很暧昧,教科书中对于数据库范式倒是都给出了学术性的定义,但实际应用中范式的应用却不甚乐观,这篇文章会用简单的语言和一个简单的数据库DEMO将一个不符合范式的数据库一步步从第一范式实现到第四范式。 范式的目标 应用数据库范式可以带来许多好处,但是最重要的好处归结为三点: 1.减少数据冗余(这是最主要的好处,其他好处都是由此而附带的) 2.消除异常(插入异常,更新异常,删除异常) 3.让数据组织的更加和谐… 但剑是双刃的,应用数据库范式同样也会带来弊端... 阅读全文
posted @ 2010-02-16 21:28 CareySon 阅读(48982) 评论(48) 推荐(86) 编辑

1