总结sql用法及基础语法 第一章 三范式
第一范式(1NF)设置了一个有组织的数据库非常基本的规则:
定义所需要的数据项,因为它们成为在表中的列。放在一个表中的相关的数据项。
确保有数据没有重复的组。
确保有一个主键。 PRIMARY KEY (ID)
1NF的第一条规则:
必须定义的数据项。这要求我们数据要被存储,组织数据到列,限定数据的每一列包含什么类型,最后把相关列到自己的表中。
例如,把所有涉及会议地点列到地点表,那些有关会员在会员明细表,等等。
1NF的第二条规则:
下一步骤是确保有数据的无重复组。考虑到我们有如下表:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
ORDERS VARCHAR(155)
);
因此,如果我们填充这个表一个客户有多个订单,那么数据如下:
| ID | NAME | AGE | ADDRESS | ORDERS |
|---|---|---|---|---|
| 100 | Sachin | 36 | Lower West Side | Cannon XL-200 |
| 100 | Sachin | 36 | Lower West Side | Battery XL-200 |
| 100 | Sachin | 36 | Lower West Side | Tripod Large |
但按照1NF,我们需要确保数据没有重复的组。因此,让我们分解上面的表格分为两部分,并使用一个键加入行列如下:
CUSTOMERS 表:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
PRIMARY KEY (ID)
);
此表将有以下记录:
| ID | NAME | AGE | ADDRESS |
|---|---|---|---|
| 100 | Sachin | 36 | Lower West Side |
ORDERS 表 :
CREATE TABLE ORDERS(
ID INT NOT NULL,
CUSTOMER_ID INT NOT NULL,
ORDERS VARCHAR(155),
PRIMARY KEY (ID)
);
此表将具有以下记录:
| ID | CUSTOMER_ID | ORDERS |
|---|---|---|
| 10 | 100 | Cannon XL-200 |
| 11 | 100 | Battery XL-200 |
| 12 | 100 | Tripod Large |
1NF的第三个规则:
第一范式的最终规则,创建一个主键,我们已经在每个表中创建主键了。
第二范式指出,它应满足所有1NF的规则,必须有任意列不依赖主键关系:
考虑客户订单的关系,你想存储客户ID,客户名称,订单ID和订单的细节,以及购买日期:
CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
ORDER_ID INT NOT NULL,
ORDER_DETAIL VARCHAR (20) NOT NULL,
SALE_DATE DATETIME,
PRIMARY KEY (CUST_ID, ORDER_ID)
);
此表是第一范式,因为它遵循了第一范式的所有规则。在该表中,主键由CUST_ID和ORDERID组成。 它们是唯一的,假设同一客户将很难订购同样的东西。
然而,该表不是在第二范式,因为有主键和列的部分相关性。CUST_NAME依赖于CUST_ID,并有一个客户的名字和他所购买之间没有真正的联系。订单细节和购买日期也取决于ORDERID,但他们不依赖于CUST_ID,因为有一个CUST_ID和订单的详细信息或SALE_DATE之间没有联系。
为了使这个表符合第二范式,需要的列分在三个表。
首先,创建一个表来存储客户的详细信息如下:
CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
PRIMARY KEY (CUST_ID)
);
接下来,创建一个表来存储每个订单的详细信息:
CREATE TABLE ORDERS(
ORDER_ID INT NOT NULL,
ORDER_DETAIL VARCHAR (20) NOT NULL,
PRIMARY KEY (ORDER_ID)
);
最后,创建第三个表存储只是CUST_ID和ORDER_ID让所有的客户订单可以跟踪:
CREATE TABLE CUSTMERORDERS(
CUST_ID INT NOT NULL,
ORDER_ID INT NOT NULL,
SALE_DATE DATETIME,
PRIMARY KEY (CUST_ID, ORDER_ID)
);
表满足以下条件时就是第三范式:
满足第二范式
所有非主字段都是依赖于主键
非主字段的依赖是数据,例如,在下面的表中,街道名称,城市,国家是可绑定到邮政编码的。
CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
DOB DATE,
STREET VARCHAR(200),
CITY VARCHAR(100),
STATE VARCHAR(100),
ZIP VARCHAR(12),
EMAIL_ID VARCHAR(256),
PRIMARY KEY (CUST_ID)
);
邮政编码和地址之间的依赖关系称为传递依赖。为了符合第三范式,所有你需要做的是移动的街道,城市和国家领域纳入自己表中,您可以调用邮编表:
CREATE TABLE ADDRESS(
ZIP VARCHAR(12),
STREET VARCHAR(200),
CITY VARCHAR(100),
STATE VARCHAR(100),
PRIMARY KEY (ZIP)
);
接下来,改变CUSTOMERS表如下:
CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
DOB DATE,
ZIP VARCHAR(12),
EMAIL_ID VARCHAR(256),
PRIMARY KEY (CUST_ID)
);
去掉传递依赖的优势主要有二点。首先,数据的重复的量减少,因此,数据库变得更小。
第二个优点是数据的完整性。当重复数据的变化,还有只更新一些数据,尤其是如果它摊开在多个数据库中不同的地方的一大隐患。例如,如果地址和邮政编码数据存储在三个或四个不同的表,然后在邮政编码的任何变化都需要波及到那些三个或四个表中的每一个记录。
总结sql用法及基础语法 第一章 三范式的更多相关文章
- 村田噪声抑制基础教程-第一章 需要EMI静噪滤波器的原因
1-1. 简介 EMI静噪滤波器 (EMIFIL®) 是为电子设备提供电磁噪声抑制的电子元件,配合屏蔽罩和其他保护装置一起使用.这种滤波器仅从通过连线传导的电流中提取并移除引起电磁噪声的元件.第1章说 ...
- Java语言程序设计(基础篇)第一章
第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...
- go基础系列 第一章 go基础语法
0.前言 1. go定义变量的几种方式 2. go内建变量类型 3. 常量的定义 4. go枚举 5. go的if语句 零. go语言的换行 go语言对换行很有讲究, 如果想换行,必须有一个逗号, 否 ...
- C基础入门 - 第一章 - C语言绪言
第1章 C语言绪言 1.1 C语言概述 1.1.1 C语言世界 1.1.2 C语言学习, 能当饭吃吗 1.2 开发环境构建 1.2.1 visual studio安装使用 1.2.2 visual s ...
- sql系列(基础)-第二章 限制和排序数据
更好的看↑代码点击VIEW PLAN 第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息: 注意:使用 between 下边界 and 上边界时.条件包括 ...
- .NET技术基础总结 ----第一章
. 一..NET定义 很多人常说我是做.NET开发的,但是,NET到底是什么呢?是一个开发工具?还是一个平台?或者是一个软件环境? 其实,我觉得吧,他是一种概念.一种构想吧.微软的产品发布会上,主持人 ...
- DirectX9:基础篇 第一章 初始化Direct3D
一.简介 二.Direct3D类 1.创建D3D类 IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion); //Direct3D类的创建 IDirec ...
- python 机器学习基础教程——第一章,引言
https://www.cnblogs.com/HolyShine/p/10819831.html # from sklearn.datasets import load_iris import nu ...
- Python - 基础语法 - 第一天
编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 标识符 第一个字符必须是字母表中字母或下划线 _ . 标识符的其他的部分由字母.数字和下划线 ...
随机推荐
- Pig distinct用法举例
dst = distinct data: DISTINCT只能对整个记录(整行)去重,不能在字段级别去重. 触发reduce阶段 data = load 'data'; distinct ...
- RHEL7系统管理之内核管理
1. Kdump工具 Kdump的工作机制是在内核崩溃时, 通过kexec 工具由BIOS启动一个备用内核, 由备用内核执行一系列任务,保存内存中崩溃内核的状态, 供后续故障分析用. 本文默认AMD或 ...
- UIButton的resizableImageWithCapInsets使用解析
UIButton的resizableImageWithCapInsets使用解析 效果: 使用的源文件: 源码: // // ViewController.m // SpecialButton // ...
- NSOperation的使用细节 [2]
NSOperation的使用细节 [2] 这一节我们来写自定义nonconcurrent的operation,自定义nonconcurrent的operation很简单,重写main方法,之后处理好c ...
- 2018 徐州赛区网赛 G. Trace
题目链接在这里 题意是:按时间先后有许多左下角固定为(0,0),右上角为(xi,yi)的矩形浪潮,每次浪潮会留下痕迹,但是后来的浪潮又会冲刷掉自己区域的老痕,留下新痕迹,问最后留下的痕迹长度为多少? ...
- APP的案例分析
很多同学有误解,软件项目管理是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课?都不对,软件项目管理有理论,有实践,更重要的是分析,思辨,总结. ...
- 如何让邮件营销平台成为EDM神器?
任何一家做邮件营销的企业都希望自己的投入获得超乎想象的回报,出现打开率.点击率和伴随而来的成交量能够节节攀升的现象,这些数据我们当然可以通过监测各种平台的反馈而得到确切的报表.当然,作为邮件营销平台运 ...
- IKVM.NET入门(1)
IKVM.NET是一个针对Mono和微软.net框架的java实现,其设计目的是在.NET平台上运行java程序.本文将比较详细的介绍这个工具的原理.使用入门(如何java应用转换为.NET应用.如何 ...
- 整合Yolov3到游戏引擎
这篇其实是前文 CUDA版Grabcut的实现 的后续,和上文一样,先放视频. (博客园好像不支持视频,gif文件太大,视频链接) 在上文用CUDA实现opencv下的grabcut后,当时问题主要是 ...
- 【洛谷】【线段树】P1047 校门外的树
[题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...