SQL Server2012 T-SQL基础教程(一)

T-SQL是标准SQL在SQL Server数据库中的实现。数据库

范式

范式是在表设计时的标准,一般一个表须要遵循如下三个范式;
第一范式:数据库中的表的列,必须是原子的,不能够在进行拆分。
例如:一个列中存储多个值,一个学生的姓名和年龄被存储在同一个列内。
第二范式:继承第一范式的约束,在其基础上增长了必须存在主键进行惟一标识,并且表中的其余列须要依赖主键(当存在多个主键的时,不能只依赖主键的一部分,也就是只依赖于其中一个)。
第三范式:继承第二范式的约束,在其基础上增长了除了主键的列,其余列不能相互依赖。安全

数据库的组成结构

1.数据库由数据文件和事务日志文件,数据文件主要存储对象的数据,事务日志文件存储SQL Server须要维护事务的信息。
2.数据文件可并行写入,可是事务日志文件只能以连续的方式一次写入一个。因此多个事务日志文件并不能带来性能上的提高。
3.数据文件被组织存储到一个叫作“文件组”的逻辑组中,一个数据库至少存在一个PRIMARY的文件组,这个文件组主要存储主数据库文件(mdf文件)和数据库目录.
4.系统内数据库的用途:
master:主要存储实例范围的元数据,服务器配置,实例中全部数据库信息和初始化信息
tampdb:主要存储一些临时数据的地方,例如临时表。
modeldb:这个数据库用做建立新数据库的模版,建立的每一个新数据库是由Model的副本初始化建立的。
msdb:主要存储一个叫作“SQL Server代理”服务的数据。
resource:主要存储全部系统对象的定义。
5.架构:个人理解就是命名空间,方便管理,防止冲突,而且能够对架构进行权限控制,保证了安全性。建议在写T-SQL的时候为对象加上架构的前缀,这样能够省去系统查找对象所在架构上耗费掉的性能。服务器

单表查询

1.在关系模型中全部的列必须有名称,可是在T-SQL中容许SELECT查询中出现没有列名的列。
2.对列起别名的三种方式:
1)列名 AS 别名(建议)
2)别名 = 列名
3)列名 别名(不建议,:不直观并且若是在查询中多个列存在的时候,若是忘记写逗号,很容易把紧挨着的列当成别名处理,查询不会失败,从而致使BUG)
3.SQL Server可以在查询中对相同的表达式只计算一次。
4.在使用SELECT进行查询的时候最好把要查询的列都显示的列出来,即便须要的是表中的全部的列,也不要使用使用SELECT *进行查询,虽然性能上却是没有多大的影响, SELECT * 按照建立表定义时指定的列顺序保存列序号位置,这样作的弊端是,之后修改了表结构时,程序中对应序号位置的列可能已经不在是你指望的那个列,这样就会致使一些难以捕捉的BUG。
5.若是在SELECT查询中对列起的别名是当前表中已经存在的列,那么对该别名的全部操做都是对起别名的字段进行操做。架构

--例如:表A中存在列:firstName,lastName,CreateTime 
  SELECT firstname AS lastname FROM A ORDER BY lastname
--如上查询,会按照firstname进行排序

6.若是在SELECT中指定了DISTINCT,那么在后来使用的ORDER BY 子句中只能是 SELECT 中出现的列,不能是其余列。不然ORDER BY没有意义。性能

SELECT DISTINCT country FROM A ORDER BY emplId
--在上面的查询中,由于结果是去重的,因此对应于同一个国家可能有多个emplId,这样在按照emplId进行排序是没有意义的。

7.在基本的查询语句中,其逻辑处理顺序以下:设计

1) FROM 
2) WHERE 
3) GROUP BY 
4) HAVING 
5) SELECT
   5.1) 表达式 
   5.2) DISTINCT
6) ORDER BY
   6.1) TOP/OFFSET-FETCH

8.T-SQL中使用三值逻辑:TRUE / FALSE / UNKNOWN,对于查询筛选而言 “接收TRUE”,也就是 FALSE 和 UNKNOWN 是不知足条件的。可是对于CHECK约束而言 “拒接FALSE” 也就是 TRUE 和 UNKNOWN 知足条件,两个NULL进行比较为UNKNOWN,而且两个NULL被认为是不相等的。在对存在NULL值的列进行排序的时候,T-SQL会优先对NULL进行排序。
9.在T-SQL中若是两个操做数的类型不一样,具备较低优先级的操做数会先转化为较高优先级的操做数类型。5/2.0 第一操做数是 5 INT 类型,第二个操做数 2.0 NUMERIC 类型,在进行计算的时候 5 先转化为 5.0 以后在进行计算,结果为 2.5。
数据类型的优先级请查看:数据类型的优先级
10.T-SQL中运算符的优先级(从高到低)代理

1) ()
2) * / % 
3) + - 
4) > < >= <= <> != !> !<
4) NOT
5) AND
6) OR BETWEEN IN LIKE 
7) =(赋值)

11.在SELECT/WHERE/UPDATE的列表中表达式是在同一时间进行计算的。日志

SELECT RealAge AS age,age+1 FROM A 
--这里的age没法使用。因为同时操做,age在age+1时并不存在。

12.含Var元素的数据类型具备可变的存储长度,这样占用的存储空间更少,读取操做更快。可是对于更新操做可能会致使行扩展,数据移动在当前页面以外,因此更新效率低于固定长度。
MAX默认是8000字节,超出8000字节会被做为大型对象存储在行的外部。code

相关文章
相关标签/搜索