《SQL Server 2012 T-SQL基础》读书笔记 - 1.背景
几个缩写的全称:Data Definition Language (DDL), Data Manipulation Language (DML), and Data Control Language (DCL)。
以下三种范式我的理解就是规范,用来保证数据关系的正确性和减少冗余。
- 第一范式:表中的每一行必须是唯一的。
- 第二范式:首先必须满足第一范式。其次,想获得任何非键属性值,就必须提供“整个候选键”(候选键(candidate key)就是能唯一确定一行的一个或多个属性)。例如:表Orders主键为orderid和productid(由两个属性组成的候选键),但通过orderid(只是候选键的一部分)就可以确定某个customerid(非键属性值),所以必须拆成两个表:Orders和OrderDetails,如下图1-3所示。
- 第三范式:首先必须满足第二范式。其次,非键属性值之间必须互相独立,不能互相依赖。例如:表Orders中有customerid和companyname,这两个属性就是互相依赖的,所以必须再增加一个Customers表,其主键为customerid,非键属性为companyname,然后将Orders表中companyname删去。
下图为应用了第三范式后的数据模型:
一个SQL Server实例是指一个SQL Server数据库引擎/服务。一台电脑上可以安装很多个SQL Server实例,并且他们之间是完全互相独立的。
可以把数据库当成是各种对象的容器,这些对象包括表、视图、存储过程等等。
其实刚才说简单了,数据库包含多个构架(Schema),而Schema又包含各种对象(表,视图什么的),如下图所示:
控制权限在Schema这一层,比如可以设置某些用户对dbo这个Schema只能SELECT。Schema也起到命名空间的作用,所以一个schema-qualified object name长这样:Sales.Orders。你也可以省略schema name让SQL Server猜一下你是指哪个schema。如果你新创建一个数据库,会自动创建一个默认的叫dbo的schema,如果你不指定schema名,就当你是指dbo。
主键约束(Primary Key Constraints)。主键能唯一标示一行数据,可以任意选择一个列(或多个列的组合)作为主键(primary key)。每个表只能有一个主键。语法:
ALTER TABLE dbo.Employees
ADD CONSTRAINT PK_Employees
PRIMARY KEY(empid);
唯一约束(Unique Constraints)。唯一约束用来表示这个列中数据的唯一(最典型的就是用户id)。可以在一个表中定义多个唯一约束。主键约束和唯一约束都会使SQL Server在幕后创建索引,索引是一种物理机制,也可以加快查询速度。语法:
ALTER TABLE dbo.Employees
ADD CONSTRAINT UNQ_Employees_ssn
UNIQUE(ssn);
外键约束(Foreign Key Constraints)用来引用其他表中的候选键,只能取其他表的候选键中出现过的值。外键可以引用当前表他自己的其他的列。语法:
ALTER TABLE dbo.Orders
ADD CONSTRAINT FK_Orders_Employees
FOREIGN KEY(empid)
REFERENCES dbo.Employees(empid);
默认下,当试图删除或更新被引用的行时,如果在引用表中存在相关的行,则此操作不能执行。也可以在外键定义中将ON DELETE和ON UPDATE选项定义为:CASCADE(改变被引用表,则自动改变引用表),SET DEFAULT(改变被引用表,则将引用表中相关行设置为列的默认值),SET NULL(改变被引用表,则将引用表中相关行设置为NULL)。
检查约束(Check Constraints)。语法:
ALTER TABLE dbo.Employees
ADD CONSTRAINT CHK_Employees_salary
CHECK(salary > 0.00);
之后如果你试图插入负数的工资进去,会被拒绝。当添加检查约束和外键约束时,你也可以指定一个选项WITH NOCHECK,意思是不必对现有的数据进行检查。
默认约束(Default Constraints)。语法:
ALTER TABLE dbo.Orders
ADD CONSTRAINT DFT_Orders_orderts
DEFAULT(SYSDATETIME()) FOR orderts;
如果标识符里面有特殊字符(比如有空格),那么就需要用分隔符,比如[Order Details] 。标准的SQL是用双引号。另外,每句的结尾记得写分号。
《SQL Server 2012 T-SQL基础》读书笔记 - 1.背景的更多相关文章
- SQL Server Window Function 窗体函数读书笔记二 - A Detailed Look at Window Functions
这一章主要是介绍 窗体中的 Aggregate 函数, Rank 函数, Distribution 函数以及 Offset 函数. Window Aggregate 函数 Window Aggrega ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)
为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示 ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)
计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓 ...
- SQL Sever 各版本下载 SQL Server 2012下载SQL Server 2008下载SQL Server 2005
SQL Server 2012SQL Server 2012 开发版(DVD)(X64,X86)(中文简体)ed2k://|file|cn_sql_server_2012_developer_edit ...
- sql server 2012 导出sql文件
导出表数据和表结构sql文件 在工作中,经常需要导出某个数据库中,某些表数据:或者,需要对某个表的结构,数据进行修改的时候,就需要在数据库中导出表的sql结构,包括该表的建表语句和数据存储语句!在这个 ...
- SQL Server Window Function 窗体函数读书笔记一 - SQL Windowing
SQL Server 窗体函数主要用来处理由 OVER 子句定义的行集, 主要用来分析和处理 Running totals Moving averages Gaps and islands 先看一个简 ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第3部分)(完结)
一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法 ...
- SQL Server 2012 - 动态SQL查询
动态SQL的两种执行方式:EXEC @sql 和 EXEC sys.sp_executesql @sql DECLARE @c_ids VARCHAR(200) SET @c_ids ='1,2' - ...
- SQL Server 2012 - 数据库的基础操作
数据库基本操作 --新建数据库卡 use master go create database SchoolDB on ( Name=SchoolDB, FileName='D;\DB\SchoolDB ...
- Win7 安装SQL SERVER 2012需要SP1补丁
在操作系统Win7上安装SQL Server 2012时,报如下错误: 也就是说SQL Server 2012如要要安装在Windows 7 上,则至少需要安装SP1补丁.否则就会弹出上面提示信息.关 ...
随机推荐
- [转帖]Windows下cwRsyncServer双机连续同步部署
Windows下cwRsyncServer双机连续同步部署 https://www.cnblogs.com/nulige/p/7607503.html 找时间做一下测试 应该能更好的实现 自动部署的功 ...
- 洛谷 P1484 种树(优先队列,贪心,链表)
传送门 解题思路 第一眼的贪心策略:每次都选最大的. 但是——不正确! 因为选了第i个树,第i-1和i-1棵树就不能选了.所以,要有一个反悔操作. 选了第i个后,我们就把a[i]的值更新为a[l[i] ...
- 【Luogu P2201】【JZOJ 3922】数列编辑器
题面: Description 小Z是一个爱好数学的小学生.最近,他在研究一些关于整数数列的性质. 为了方便他的研究,小Z希望实现一个叫做"Open Continuous Lines Pro ...
- c语言中不允许在函数外部给全局变量赋值
今天,在写条件编译的时候,出现了在函数外部给全局变量赋值的情况,gcc报错,那么c语言为什么不允许在函数外部给变量赋值呢?为什么声明变量的时候可以对变量进行赋值? 出错代码: /* 2 * ===== ...
- Redis哨兵功能与集群搭建
6.redis哨兵功能 Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机, ...
- Python 多列数据存储
zip()函数 zip函数可以把多个列表相加成一个tuple(元组) a = [1,2,3,4] b = [11,22,33,44] c = [111,222,333,444] A = list(zi ...
- mybatis oracle 批量新增
假定场景:批量导入用户信息 一般批量新增使用 SELECT … INSERT INTO 和 INSERT INTO … SELECT 我们这次使用第二种 一.先建一张用户信息表模拟批量导入用户信息 c ...
- [CodePlus 2018 3 月赛] 博弈论与概率统计
link 题意简述 小 $A$ 与小 $B$ 在玩游戏,已知小 $A$ 赢 $n$ 局,小 $B$ 赢 $m$ 局,没有平局情况,且赢加一分,输减一分,而若只有 $0$ 分仍输不扣分. 已知小 $A$ ...
- C# 静态方法调用非静态方法
转载:http://blog.csdn.net/seattle1215/article/details/6657814 using System; using System.Collections.G ...
- 在Python中使用protobuf2.6.1 string format utf-8 and unicode error
版本信息: protobuf: v2.6.1 python: 2.7 关于在Python中使用protobuf时 string格式字段的编码问题 在python中编码格式多采用utf-8格式.而pro ...