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字节会被作为大型对象存储在行的外部。


bitsman
257 声望7 粉丝

区块链爱好者