SQL Server 2008技术内幕:T-SQL语言基础 笔记(转)

来源:互联网 发布:网络搞笑喜欢你的段子 编辑:程序博客网 时间:2024/05/21 19:47

 

1.1 SQL Server 2008实例

    SQL Server实例是指安装的一个SQL Server数据库引擎/服务。在同一台计算机上可以安装SQL Server的多个实例,从安全性,实例管理的数据以及其他方面来说,每个实例之间是彼此独立的。

    可以将计算机上安装的实例之一设置为默认实例,而其他实例则必须为命名实例

    在安装期间中可以决定是将一个实例安装为默认实例,还是命名实例,但安装好后就不能对此进行修改了!

    客户端应用程序连接默认实例:   计算机名(IP地址)

    客户端应用程序连接命名实例:   计算机名(IP地址) / 实例名称(安装期间提供)


1.2数据库

    可以认为数据库是各种对象的容器,这些对象可以是:表,视图,存储过程等等。每个SQL Server实例可以包含多个数据库。

    安装SQL Server时安装程序会创建几个系统数据库,用于保存系统数据和服务于内部目的。


1.2.1系统数据库

    master : 保存实例范围内的元数据信息,服务器配置,实例中所有数据库的信息,以及初始化信息。

    resource : 是SQL Server 2005新增的,用于保存所有系统对象。当查询数据库中的元数据信息时,这种信息表面上是位于数据库中的,但实际上是保存在resource数据库中的。

    model : 是新数据库的模板,每个新创建的数据库最初都是model的一个副本(Copy)。

    tempdb : 是保存临时数据的地方。每次重新启动SQL Server实例时,会删除这个数据库 的内容,并将其创建为model 的一个副本。 

    msdb : 是称为SQL Server Agent的一种服务保存其数据的地方。


1.2.2登陆验证

    从安全性方面,为了能连接到SQL Server实例,必须让DBA位用户创建一个登陆账号。登陆账号可以关联到Windows凭据(credentials),在这种情况下,它会调用Windows凭据进行身份验证。

    当使用SQL Server验证登陆来连接SQL Server实例时,就必须提供登陆的用户名密码


1.2.3物理布局

    数据库在物理上是由数据文件事务日志文件组成。

    每个数据库必须至少有一个数据文件和一个日志文件(SQL Server的默认情况),数据文件用于保存数据库对象数据,事务日志文件则保存SQL Server为了维护事务所需的信息

    .mdf 代表Master Data File(主要数据文件)。

    .ldf 代表Log Data File(日志数据文件)

    .ndf 代表Not Master Data File(辅助数据文件)

 

1.2.4 架构和对象

一个数据库包含多个架构,而每个架构则又包含多个对象(表,视图,存储过程等)。

架构一个命名空间,用作对象名称的前缀。例如,在架构Sales中有一个Order表,架构限定(schema-qualified)的对象名称是Sales.Order。如果在引用对象时忽略了架构名称,SQL Server将按照一定的策略分析出架构的名称是什么。

如果不显式的指定架构,那么在解析对象名称时就会付出一定的没有意义的额外代价。所以在代码中引用对象时,总是推荐使用这种架构限定的对象名称(两部分对象名称)。

 

1.3 创建表和定义数据完整性

示例1:创建数据库

IF DB_ID ( 'testdb' ) IS NULL

CREATE DATABASE testdb ;

(1)检查数据库是否存在?

DB_ID函数接受一个数据库名称作为输入参数,返回它的内部数据库ID。如果指定名称的数据库还不存在,则返回NULL

(2)架构?

这个例子使用的架构是dbo(默认架构),在每个数据库中都会自动创建这个架构。

 

1.3.1创建表

示例2:创建表

USE testdb ; 

IF  OBJECT_ID( 'dbo.Employees' ,'U' )  IS NULL

    DROP  TABLE  dbo.Employees ;

CREATE  TABLE  dbo.Employees

(

empid   INT   NOT NULL,

firstname  VARCHAR(30)   NOT NULL,

lastname  VARCHAR(30)   NOT NULL,

hiredate   DATE   NOT NULL,

mgrid   INT   NOT NULL,

ssn      VARCHAR(2)   NOT NULL,

salary   MONEY    NOT NULL

) ;

【示例分析】

(1)USE 语句将当前的数据库上下文切换为dbo.testdb。以确保在正确的数据库中创建对象。

(2)OBJECT_ID函数接受一个对象名称和类型作为输入,这里,类型 ' U '代表用户表。如果匹配给定输入名称和类型的对象存在,这个函数则返回内部的对象ID,否则返回NULL。

(3)CREATE  TABLE 先指定要创建的表的名称(架构限定名),然后再在圆括号中定义它的各个属性(列)。

【ANSI标准】

如果不显式指定一个列是否允许NULL值,则假设应该是NULL值(允许NULL值)。

【最佳实践】

将列定义为为NOT NULL

采用分号结束所有语句

 

1.3.2定义完整性约束

(1)Primary Key Constraints

     主键约束实施行的唯一约束,同时不允许受约束的属性(列)取NULL值。

 每个表只能定义一个主键.

 ALTER TABLE dbo.Employees

ADD  CONSTRAINT PK_Employees

PRIMARY KEY(empid);

     定义好主键约束后,就可以保证所有的empid的值是唯一而确定的。

(2)Unique Constraints

 唯一约束用来保证数据行的一个列(一组列)数据的唯一。

 在同一个表中可以定义多个唯一约束。

ALTER TABLE dbo.Employees

ADD  CONSTRAINT UNQ_Employees_ssn

UNIQUE(ssn);

(3)Foreign Key Constraints

     外键约束用于实施引用完整性。这种约束在引用表(referencing table)的一组属性上进行定义,并指向被引用表(referenced table)中的一组候选键(主键或唯一约束)。注意,引用表和被引用表可能是同一个表!

     外键的目的是将外键列允许的值域限制为被引用列中现有的那些值。

示例3:创建表Order,其主键定义在orderid上

IF OBJECT_ID('dbo.Orders','U') is NOT NULL

DROP TABLE dbo.Orders;

 

CREATE TABLE dbo.Orders

(

orderid INT NOT NULL,

empid INT NOT NULL,

custid VARCHAR(20) NOT NULL,

orderts DATETIME NOT NULL,

qty INT NOT NULL,

CONSTRAINT PK_Orders

PRIMARY KEY(orderid)

);

如果现在要想实施一个完整性规则,将Orders表的empid列支持的值域限制为现有的Employees表中empid列的取值。为此,要在Orders表的empid上定义一个外键约束,让他指向Employees表的empid列。

ALTER TABLE dbo.Orders

ADD CONSTRAINT FK_Orders_Employees

FOREIGN KEY(empid) REFERENCES dbo.Employees(empid);

 

类似的,想要限制Employees表中mgrid列支持的值域为同一个表中已经存在的那些empid的值。

ALTER TABLE dbo.Employees

ADD CONSTRAINT FK_Employees_Employees

FOREIGN KEY(mgrid) 

REFERENCES dbo.Employees(empid);

 

注意,既是被引用的候选键列不存在NULL值,在外键列中也允许NULL列。

【禁止操作】

当试图删除被引用表中的行,或更新被引用的候选键时,如果在引用表中存在相关的行,则操作不能执行!

【级联操作】

    可以在外键定义中将ON DELETE和ON UPDATE选项定义为:

CASCADE : 操作(更新和删除)将被级联到引用表中相关的行。

SET DEFAULT : 补偿操作将会把相关行的外键属性设置为列的默认值。

SET NULL : 补偿操作将会把相关行的外键属性设置为NULL值。

 

转自博客园张念http://www.cnblogs.com/zhangnian88123/archive/2010/01/25/1655863.html

 

原创粉丝点击