几个缩写的全称: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.背景的更多相关文章

  1. SQL Server Window Function 窗体函数读书笔记二 - A Detailed Look at Window Functions

    这一章主要是介绍 窗体中的 Aggregate 函数, Rank 函数, Distribution 函数以及 Offset 函数. Window Aggregate 函数 Window Aggrega ...

  2. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)

    为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示 ...

  3. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)

    计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓 ...

  4. 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 ...

  5. sql server 2012 导出sql文件

    导出表数据和表结构sql文件 在工作中,经常需要导出某个数据库中,某些表数据:或者,需要对某个表的结构,数据进行修改的时候,就需要在数据库中导出表的sql结构,包括该表的建表语句和数据存储语句!在这个 ...

  6. SQL Server Window Function 窗体函数读书笔记一 - SQL Windowing

    SQL Server 窗体函数主要用来处理由 OVER 子句定义的行集, 主要用来分析和处理 Running totals Moving averages Gaps and islands 先看一个简 ...

  7. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第3部分)(完结)

    一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法 ...

  8. SQL Server 2012 - 动态SQL查询

    动态SQL的两种执行方式:EXEC @sql 和 EXEC sys.sp_executesql @sql DECLARE @c_ids VARCHAR(200) SET @c_ids ='1,2' - ...

  9. SQL Server 2012 - 数据库的基础操作

    数据库基本操作 --新建数据库卡 use master go create database SchoolDB on ( Name=SchoolDB, FileName='D;\DB\SchoolDB ...

  10. Win7 安装SQL SERVER 2012需要SP1补丁

    在操作系统Win7上安装SQL Server 2012时,报如下错误: 也就是说SQL Server 2012如要要安装在Windows 7 上,则至少需要安装SP1补丁.否则就会弹出上面提示信息.关 ...

随机推荐

  1. 开篇——从程序员到IT经理

    2002年~2005年我在广州的广东水力电力职业技术学院求学,主修网络工程.求学期间,我从事最多的就是玩游戏,当时就是玩MU和CS,所以有一门编程课叫C语言的“肥佬”(广东话)了,要补考,没办法,于是 ...

  2. 函数 FUNCTION

    函数 FUNCTION 定义: 带名字的代码块,用于执行具体任务. 注意: 应给函数指定描述性名称,只是用小写字母和下划线. 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何 ...

  3. LINUX之启动流程

    (上图片转自一位高手所做) 启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关 ...

  4. P1969积木大赛

    这是2018与2013提高组的真题,可怕,,原题出了两年,是个纯模拟. 读完题后就想写一个朴素的模拟,先遍历层数,再把达到层数的宽度#存起来,再判断是否连续,如果不连续ans++,然后每一次循环都要初 ...

  5. 能够打开国内网络,比如百度微信,但是打不开外国网站,该怎么解决(主要是DNS的问题)

    (1)公司设置局域网外网打不开解决方法一: 如果是代理服务器上网,是因为服务上没有映射好外网访问网页的!解决方法是在服务器上开一个端口映射软件! 如果是路由器上网,就是路由器上没有映射外网访问的端口, ...

  6. spring boot 枚举使用的坑3

    上一篇说到spring boot 使用jackson在枚举enum序列化和反序列化的问题, 再来说说在JPA中实体entity使用枚举的问题. 还是这个枚举: @Getter @AllArgsCons ...

  7. PyMySQL和MySQLdb的区别

      网上很多关于Scrapy存入MySQL的教程,都会发现又这么一个包的引入: import MySQLdb import MySQLdb.cursors 聪明的你或许已经算到,需要安装MySQLdb ...

  8. 第三次作业—Wordcount

    一.地址 Github项目地址:https://github.com/1320068008/WordCount-1 同伴蒋鑫作业地址:https://www.cnblogs.com/JxsBK/p/1 ...

  9. Makefile中$$的使用

    在linux的Makefile中,经常会见到$var和$$var的形式.下面就这两种表示方法的区别进行简单的概述. 在Makefile中的规则命令行中: $var:将Makefile中的变量var的值 ...

  10. Thymeleaf 整理

    1.标准变量表达式: thymeleaf中的变量表达式使用${变量名}的方式获取其中的数据 th:text="" 是thymeleaf的一个属性,用于文本的显示 如:<spa ...