SQL 数据库初学,还未完善

SQL的基本概念

SQL:结构化查询语言

关系 = 二维表
基本表:独立存在的表。
视图:虚表。对视图进行操作,有限制,实际是对基本表的操作。

数据库的创建与使用
数据库的结构
1、数据文件:
一个数据库只唯一有一个主数据文件,后缀(.mdf)
多个次数据文件,后缀(.ndf)
2、事务日志文件
记录对数据库操作的文件,保存用于恢复数据库的日志信息,后缀(.ldf)

登入数据库

一:Windows 身份验证
直接连接

二:SQL Server 身份验证
需要输入密码
默认安装时有一个最高权限账号:sa
忘记sa的登入密码:
以第一种方式进入数据库->安全性->登录名->右键sa属性->在密码框中输入新密码

创建新用户

以第一种或第二种方式进入数据库->安全性->右键登录名->新建登录名->SQL Server 身份验证->输入密码

权限设置

数据创建与使用

数据库结构 P74

类型后缀名是否必须以及唯一
主数据文件.mdf必须有
次数据文件.mdf可有可无,可多个

日志文件

后缀名是否唯一作用
.lfd至少一个保存用于恢复数据库的日志信息

创建数据库 P77

create database One
[NO
[FILEGROUP 文件组名称
(
	NAME=数据文件逻辑名称,
	FILENAME='路径+数据文件名',
	SIZE=数据文件初始大小,
	MAXSIZE=数据文件最大容量,
	FILEGROWTH=数据文件自动增长容量,
)]
[LOG ON
(
	NAME=日志文件逻辑名称,
	FILENAME='路径+日志文件',
	SIZE=日志文件初始大小,
	MAXSIZE=日志文件最大容量
)]
[COLLATE 数据库校验方式名称]
[FOR ATTACH]

用[]括起来的是可以省略的。
最简便的创建数据库语句

//格式:CREATE DATABASE DATABASE_NAME
create database One

修改数据库 P79

/*
ALTER DATA 数据库名称
ADD FILE(
		具体文件格式)
[,...n]
↑相数据库中添加数据库文件
[TO FILEGROUP 文件组名]
[ADD LOG FILE(
				具体文件格式)
[,...n]
↑向数据库中添加日志文件
| REMOVE FILE 文件逻辑名称
| MODIFY FILE( 
				具体文件格式)
↑移除并删除数据库中的逻辑文件并删除物理文件。若文件不为空,无法删除
| ADD FILEGROUP 文件组名
↑向数据库中添加文件组
| REMOVE FILEGROUP 文件组名
↑删除数据库中的文件组,文件组不空无法删除
| MODIFY FILEGROUP 文件组名
{
READ_ONLY|ONLY|READ_WRITE,
	| DEFAULT,
	| NAME = 新文件组名}
}
↑修改文件组名称,设置文件组的只读(READ_ONLY)或读写(READ_WRITE)属性,指定文件组为默认文件组(DEFAULT)
具体文件格式:
(
	NAME = 文件逻辑名称
	[ , NEWNAME = 新文件逻辑名称]
	[ , SIZE = 初始文件大小]
	[ , MAXSIZE = 文件最大容量]
	[ , FILEGROWTH = 文件自动增长容量])
*/

删除数据库 P80

图形化操作:右键数据库->删除数据库->关闭连接->完成删除
如果数据库没有连接就不需要关闭连接,但是如果发现数据库一直无法删除就关闭连接之后再删除

//DROP DATABASE 数据库名称 [,.....n]
DROP DATABASE ONE
/*
若要删除的数据库当前正在被使用,则:
先随便打开别的数据库后,再删除该数据库
*/
USE master
GO
DROP DATABASE ONE

查看数据库信息

查看数据库结构(查看每一列(字段)的类型)

Sp_helpdb DATABASE

查看数据库中的数据库文件信息(数据库地址,大小等)

Sp_helpfile DATABASE

层次化结构

go  --先执行go上的语句,再执行后面的语句

使用该数据库

use One

备份数据库

右击数据库->任务->分离->选中删除连接和更新统计信息->确定
以上操作可以将数据库与客户端分离
找到该数据库存放的位置,将mdf文件复制出来完成数据库备份
如果不知道默认路径就点新建数据库那边可以看到默认路径

附加数据库

将自己的已有的数据库放在sql软件的data文件夹中
右击数据库->附加->添加->选中要附加的数据库的mdf文件就能够成功将数据库附加到sql客户端中

新建表

create table student
(
     num char(10) not null,
     age int default 18,
     name char(10)
)

值得注意的是,表必须要创建字段名,不然是无法创建表格的,每个字段名以逗号结尾
插入数据的两种方式

插入 P109

//INSERT INTO <表名>[(<列名1>,[<列名2>]...)] VALUES (<值>)
insert into student values ('123456',19,'张三')
insert into student(num,name) values ('123456','李四')

1、表中有多少个字段名,插入的数据也要有多少个字段名,且数据顺序也必须一样
2、自己指定字段名,指定多少字段名,就按顺序写多少数据就行
3、每一个字段用的数据用逗号隔开

删除

  1. 删除表中的数据
delete from stuinfor where 字段名 = '要删除的属'--删除要删除的一行
delete top (3)  from 表名;--删除前三行

表中的所有数据

delete from 表名;
  1. 删除数据库/表
drop database One  --删除数据库:One
drop table student  --删除表:student
  1. 删除一张表中的相同一行的数据
delete from 表名where 字段名 
in (select 字段名 from 表名 group by 字段名  having count(字段名) > 1);--当数据达成条件,全部删除,一条不留

查询

--查询
select * from student    --查询全部数据
select name from student --查询全部name的数据
--条件查询
运算符:
and&&
or||
not 或 !
> , < , <= , >= , = , <>(不等于)
select *  from 表名 where 字段名 <> 18;
语法:between...end
--查询年龄大于等于50小于等于70的信息
select *  from 表名 where 字段名 between 50 and 70;
语法:in(集合)
--查询年龄为12,36,65岁的信息
select * from 表名 where 字段名 in (12,36,65);
占位符:
	 _:单个任意字符
     %:多个任意字符
--部分参照:https://blog.csdn.net/qq_36050720/article/details/100044740

select *  from 表名 where 字段名 like '要查询的数据%'

--第二个字为x的数据
select *  from 表名 where 字段名 like '_x%'

--有三个字的数据
select *  from 表名 where 字段名 like '___%'

--查询有包含x的数据
select *  from 表名 where 字段名 like '%x%'

--筛选出表中某个字段不重复的数据
select distinct 字段名from 表名

--查询有重复的的所有数据
select * from 表名where 字段名
in (select 字段名 from 表名 group by 字段名 having count(字段名) > 重复次数) ;--只有达成重复数字的这个条件才会执行该语句

--将表中有重复的数据新建到另一个表中
 select <原表的字段名,...,...> into 新表名 from 原表group by <原表的字段名,...,...>;

批量导入数据

insert into 数据目的表 select * from 数据来源表
--将数据来源表中的所有数据都导入进数据目的表中

主键

用于唯一标识一个事务
单独添加一列没有任何实际意义的,只有编号的那一列作为主键
自然主键:
业务主键:
代理主键:

外键

关键字:来自(这一字段的数据是来自另一个表的,那么这一字段的值必须要在另一个表中存在,否则会报错)
表示事务与事务之间的联系
多对一,外键一般写在多的地方


字段,属性


记录,元组

除法:
c1

AB
11
12
21
23

c2

B
1
2

c1 ÷ c2

A
1

数据类型p83-p84

数值型:
精确数值型:numeric(numeric(p,s)p表示数据长度,s表示小数)
decimal等效numeric

sorce numeric(4,1)

近似数值型:float。。。
字符型:char,nachar,varchar,nvarchar
n:万国字符编码(可使用中文,中文字符一个占用两个字符)
var:变长(变量长度可变,例如:同学姓名,有的3个字有的2个字,当输入的名字长度是2个字时,改变量长度占4个子节,当输入的名字长度是3个字时,改变量长度占6个子节)

二进制数据类型:binary(定长二进制数据型),varbinary(非定长),image
图片用文件路径存储时可采用字符型
特殊类型:table,timestamp(时间戳,一个数据库中只能用一个timestamp数据列)
创建数据表

#CREAT TABLE <表名> (<列定义>[{,<列定义>|<表约束>}])
CREAT TABLE S
(
	sNo VARCHAR(6),
	SN NVARCHAR(10),
	Sex NCHAR(1) DEFAULT '男',
	Age Int,
	Dept NVARCHAR(20)
)

3.4.3约束p87

数据完整性机制包括:约束(Constraint),默认(Default),规则(Rule),触发器(Trigger)
约束的基本语法:
[CO NSTRAINT <约束名>]<约束类型>
约束名可以不给,系统会自动分配

1、NULL/NO NULL约束

#[CO NSTRAINT <约束名>]<NULL|NOT NULL>
CREATE TABLE S
(	sNo CHAR(6) CONSTRAINT S_sNo NOT NULL,#学号设置为不可为空
	Address nvarchar(20)#家庭住址可为空)	
	#NULL:可为空(默认值)
	#NO NULL :不为空

2、UNIQUE约束(唯一约束)P88

该列的值不能重复

//列约束:[CONSTRAINT <约束名>] UNIQUE
CREAT TABLE S
(	SN NVARCHAR(10) CONSTRAINT SN_UNIQ UNIQUE
)
//表约束:[CONSTRAINT <约束名>] UNIQUE(<列名>[{<列名>}])

3、PRIMARY KEY约束(主键约束)P89

唯一,不能为空

//列约束:CONSTRAINT <约束名> PRIMARY KEY
//组合主键:CONSTRAINT<约束名>PRIMARY KEY(<列名>[{,<列名>}])

4、FOREIGN KEY约束(外键约束,两个表连接)

保证两表的参照完整性

//[CONSTRAINT<约束名>] FOREIGN KEY REFERENCES <主表名> (<列名>[{,<列名>}])
CREATE TABLE SC
(
	SNo VARCHAR(6) NOT NULL CONSTRAINT S_Fore FOREIGN S(SNo),
	CNo VARCHAR(6) NOT NULL CONSTRAINT S_Fore FOREIGN S(SNo),
	Score NUMERIC (4,1),
	CONSTRAINT S_C_Prim PRIMARY KEY (SNo,CNo))

5、CHECK约束(检查字段值所允许的范围)

//[CONSTRAINT <约束名>] CHECK (<条件>)
//0~100
Score NUMERIC(4,1) CONSTRAINT Score_Chk CHECK(Score>=0 AND Score<=100)
//or
Score NUMERIC(4,1) CONSTRAINT Score_Chk CHECK(Score BETWEEN 0 AND 100)

3.4.4修改数据表P91

(1)ADD方式(新增列和完整性约束)

//ALTER TABLE <> ADD <列定义> | <完整性约束定义>

//添加列定义
ALTER TABLE S
ADD
CLASS_NO VARCHAR(6)

//添加完整性约束定义
ALTER TABLE S
ADD
CONSTRAINT SCORE_CHK(SCORE BETWEEN 0 AND 100)

(2)ALTER方式(修改列属性/修改)

//ALTER TABLE <表名>
//ALTER COLUMN <列名> <数据类型> [NULL|NOT NULL]

ALTER TABLE S
ALTER COLUMN SN VARCHAR(12)

(3)DROP方式(删除约束)

//ALTER TABLE <表名>
//DROP CONSTRAINT <约束名>

ALTER TABLE S
DROP CONSTRAINT S_PRIM

3.4.5删除基本表

//DROP TABLE <表名>

DROP TABLE S

3.4.5查看数据表 P93

//SP_HELP [<表名>]
SP_HELP S

单关系(表)的数据查询 P94

无条件查询

显示出所有数据
//SELECT *
//FROM <表名>

SELECT *
FROM S
显示出个别列数据
SELECT <列名>[{,<列名>}]|<第几行>[{,<第几行>}]
FROM <表名>

SELECT SNO,SN,AGE
FROM S

SELECT 1,2,3
FROM S
去重查询(关键字:DISTINCT)P96
SELECT DISTINCT SNO
FROM SC
显示时为列取别名(关键字:AS)P96
SELECT SN NAME
FROM S
//OR
SELECT SN AS NAME
FROM S

3.5.3 条件查询 P97

运算符含义
>、<、<=、>=、=、<>、!=确定范围
AND、OR 、NOT多重条件
BETWEEN AND确定范围
IN确定集合
LIKE字符匹配
IS NULL空值
确定范围(关键字:BETWEEN AND=AND)
//要求:求出工资在1000~1500的教师姓名
SELECT TN
FROM T
WHERE SAL BETWEEN 1000 AND 1500
//注意:sql sever中,BETWEEN AND的条件包含等号
//OR
SELECT TN
FROM T
WHERE SAL>=1000 AND SAL<=1500

//要求:求出工资不在1000~1500的教师姓名
SELECT TN
FROM T
WHERE SAL NOT BETWEEN 1000 AND 1500
//只需要在条件前添加一个NOT
确定集合(关键字:IN=OR)
SELECT SNO
FROM SC
WHERE CNO IN('C1','C2')
//OR
SELECT SNO
FROM SC
WHERE CNO='C1' OR CNO='C2'
字符匹配(名字中包含/不包含什么什么的,模糊查询)
通配符功能实例
%代表0个或多个字符‘ab%’,’ ab’后可以接任意长的字符串
_(下划线)代表一个字符‘a_b’,‘a与b之间可有一个字符’
[]代表在某一范围的字符[0-9],在0~9之间的字符
[^]表示不在某一范围的字符[^0-9] ,不在0~9之间的字符
//查询所有姓张的人的姓名
SELECT TN
FROM T
WHERE TN LIKE '张%'
//查询所有姓张的且名字是一个字的人
SELECT TN
FROM T
WHERE TN LIKE '张_'
//查询成绩里面有其中任何一位数包含在0-3之间
SELECT SOCE
FROM SC
WHERE TN LIKE '[0-3]%'
//查询成绩里面没有其中任何一位数包含在0-3之间
SELECT SOCE
FROM SC
WHERE TN LIKE '[^0-3]%'

//查询人名中不姓王且不姓黄的人的姓名
SELECT SOCE
FROM SC
WHERE TN LIKE '[^王黄]%'
转义字符实例功能
/‘%/%’ ESCAPE’/’查询有%的数据
[]‘[%]’查询有%的数据
//查询含有%的数据
SELECT PRECENT
FROM REPORT
WHERE SN LIKE '%[%]'
//OR
WHERE SN LIKE '%/%' ESCAPE '/'

3.5.4 常用函数 p99

函数名称功能
AVG计算列平均值
SUM求列值的总和
MAX求一列中的最大值
MIN求一列中的最小值
COUNT统计多少列
ROUND四舍五入

使用函数求出的值没有列名,无重命名显示‘(无列名)’

//求学号为S1的学生的总分,平均分,最大值,最小值
SELECT SUM(SCORE) AS TOTALSOCORE, AVG(SCORE) AS AVGSCORE,MAX(SCORE) MAX,MIN(SCORE) MIN
FROM SC
WHERE (SNO='S1')

警告: 聚合或其他 SET 操作消除了 Null 值。
方法一:

SET ANSI_WARNINGS ON //默认开启
SET ANSI_WARNINGS OFF //设为关闭

方法二:

SUM(ISNUMM(<列名>,0))
/*
列名:要参与计算的那列的列名
例如:
*/
SUM(ISNUMM(<SCORE>,0))
//计算分数的总和

四舍五入

/*
SELECT ROUND(AVG(列名),小数点后几位) 别名
FROM 表名
*/
SELECT ROUND(AVG(售价),1) 平均售价
FROM 图书

3.5.5 分组查询(关键字:GROUP BY) P100

//查询每个教师的教师号及其任课的门数
SELECT TNO,COUNT(*) AS C_NUM
FROM TC
GROUP BY TNO
分组后再进行筛选(关键字:HAVING)
//查询选修两门以上(含两门)课程的学生的学号和选课门数
SELECT SNO,COUNT(*) AS SC_NUM
FROM SC
GROUP BY SNO
HAVING (COUNT(*)>=2)

在分组之前可以有WHERE条件语句,当语句中有WHERE语句又有HAVING语句时
顺序:WHERE-GROUP BY-[HAVING]

查询结果排序(关键字:ORDER BY)

DESC:降序
ASC:升序(缺省)

//查询选修C1学生的学号和成绩,并按照成绩降序排序
SELECT SNO,SCORE
FROM SC
WHERE CNO='C1'
ORDER BY SOCRE DESC

在分组之前可以有WHERE条件语句,当语句中有WHERE语句又有HAVING语句时还需要排序时
顺序:WHERE-GROUP BY-[HAVING]-ORDER BY

3.6 多关系(表)的连接查询

3.6.1 多关系(表)的连接查询(多个表连接在一起)

FROM
SELECT *
FROM <表名>,<表名>
//以上得出的结果为笛卡尔积
JOIN P102
关键字功能
INNER JOIN (默认值)显示符合条件的记录
LEFT JOIN显示符合条件的记录和左边不符合条件的数据,右边数据行以NULL显示
RIGHT JOIN显示符合条件的记录和右边不符合条件的数据,左边数据行以NULL显示
CROSS JOIN (笛卡尔积)将一个表的每一个记录和另一表的每个记录匹配成新的数据
/*
SELECT *
FROM <表1> INNER|LEFT|RIGHT|CROSS JOIN <表2>
ON 条件
使用join连接时,两个表必须要用一列相同的列
*/
SELECT *
FROM S INNER JOIN SC
ON S.SNO=SC.SNO

3.6.2 内连接 P102

查询所有选课学生的学号、姓名、选课名称及成绩

SELECT S.SNO,SN,SCORE
FROM S,C,SC
//以上得到的结果为笛卡尔积
WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO

3.6.5 自连接查询 (查询的内容均在同一张表中) P104

查询教师表中比刘伟工资高的教师

SELECT X.TN,X.SAL AS SAL_A,Y.SAL AS SAL_B
FROM T AS X,T AS Y
WHERE X.SAL>Y.SAL AND Y.TN='刘伟'

子查询 P105

普通子查询

返回一个值的普通子查询

返回值只有一个时,可用比较运算符将父查询与子查询连接

SELECT TNO,TN
FROM T
WHERE PROF=(
			SELECT PROFT
			FROM T
			WHERE TN='刘伟'
)
返回一组值的普子查询(关键字:IN/ANY,ALL)P106

返回值是一个集合
(1)ANY P106

SELECT TN FROM T
WHERE (TNO=ANY(
				SELECT TNO
				FROM TC
				WHERE CNO='C5'))

(2)IN P106

SELECT TN FROM T
WHERE (TNO IN (
				SELECT TNO
				FROM TC
				WHERE CNO='C5'))

(3)ALL P107

SELECT TN,SAL
FROM T
WHERE (SAL>ALL(
				SELECT SAL
				FROM T
				WHERE DEPT='计算机'))
		AND (DEPT<>'计算机')

相关子查询(关键字:IN/ANY,ALL) P107

执行顺序:选取父查询表中的第一行记录,内部的子查询利用此行中相关的属性值进行查询,然后父查询根据子查询返回的结果判断此行是否满足查询条件。
如果满足条件,将改行放入父查询的结果集合中,重复执行,直到处理完父查询中的每一行数据。

SELETC DISTINCT TN
FROM T
WHERE ('C5'<>ALL (
					SELECT CNO
					FROM TC
					WHERE TNO=T.TNO))
存在/不存在(EXISTS/NOT EXISTS) P108

返回逻辑值“真”或“假”

SELECT SN
FROM S
WHERE(NOT EXISTS(SELECT *	
				 FROM C
				 WHERE NOT EXISTS (SELECT *
				 				   FROM SC
				 				   WHERE SNO=S.SNO
				 				   AND	CNO=C.CNO)))

其它类查询

集合运算查询(关键字:UNION) P108

同时查询两个同学的总分

//查询S1和S5同学的总分
SELECT SNO 学号,SUM(SOURSE) 总分
FROM SC
WHERE (SNO = 'S1')
GROUP BY SNO
UNION
SELECT SNO 学号,SUM(SORCE) 总分
FROM SC
WHERE(SNO = 'S5')
GROUP BY SNO

把查询到的结果存储到新建的数据库表或临时表中(关键字:SELECT…INTO)P109

//将查询到的数据存放到新建的数据表中
SELECT SNO 学号,SUM(SCORE) 总分
INTO Cal_Table
FROM SC
GROUP BY SNO

//将查询到的数据存放到临时的数据表中?作用是啥?
INTO #Cal_Table
FROM SC
GROUP BY SNO

区别:
INTO Cal_Table:生成物理文件
INTO #Cal_Table:不生成物理文件,只在内存中,存在时间很短

数据操纵(DML)

添加新数据(关键字:INSTER INTO)P109

/*
语法格式:
INSTER INTO <表名>[(<列名>[,<列名2>...])] VALUES (<值>)
↑值要跟列名的顺序一致,未填充的部分系统自动填充UNLL,约束设置NTO NULL/
*/
INSERT INTO S VALUES ('S1','郑冬','女','计算机')

/*
INSTER INTO <表名> VALUES (<值>)
↑值要跟表中的列的顺序一致,且必须全有
*/
INSERT INTO S(SNO,SN,SEX,DEPT) VALUES ('S1','郑冬','女','计算机')

添加多行筛选出的数据(关键字:INSTER INTO)P110

/*
INSERT INTO <表名>
SELECT <列名>[,<列名>...N]
FROM
[WHERE]
[GROUP BY]
*/

必须先建表,再进行筛选插入

修改表中的数据

/*
UPDATA <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]...
[WHERE <条件>]
*/

删除数据

/*
DELETE
FROM <表名>
[WHERE <条件>]
*/

视图

创建视图 P113

/*
CREATR VIEW view_name (列名)
AS SELECT 列名
FROM 表名
[WHERE]
[GROUP BY]
*/
CREATE VIEW S_SC_C(SNO,SN,CN,SCORE)
AS SELECT S.SNO,SN,CN,SCORE
	FROM S,C,SC
	WHERE S.SNO = SC.SNO AND SC.CNO = C.CNO

修改视图 P114

/*
ALTER VIEW <视图名>[<视图列表>]
AS <子查询>
*/
ALTER VIEW S_SC_C(SN,CN,SCORE)
AS SELECT SN,CN,SCORE
	FROM S,C,SC
	WHERE S.SNO = SC.SNO AND SC.CNO = C.CNO

删除视图 P115

//DROP VIEW <视图名>
DROP VIEW SUB_T

查询视图 P115

/*
SELECT 列名
FROM <视图名>
WHERE <查询条件>
*/
SELECT TNO,TN
FROM SUB_T
WHERE PROF = '教授'

更新视图 P115

添加(INSERT) P 1166

/*
INSERT INTO <视图名>(列名)
VALUES (列值)
*/
//添加一条记录
INSERT INTO SUB_T(TNO,TN,PROF)
VALUES ('T6','李丹','副教授')

修改(UPDATE) P166

/*
UPDATE <视图名>
SET 列名='列值'
WHERE 列名=列值
*/
//将刘伟老师的职位改为副教授
UPDATE SUB_T
SET PROF = '副教授'
WHERE (TN = '刘伟')

删除(DELETE)

/*
DELETE <视图名>
WHERE 列名=列值
*/
//删除视图中刘伟老师的记录
DELETE SUB_T
WHERE TN ='刘伟'

索引 P116

聚集索引(一个表中只能有一个聚集索引)P117

物理存储顺序与索引键的逻辑(索引)顺序相同

/*
创建主键时会自动创建聚集索引
CREATE CLUSTERED INDEX INDEX_NAME ON TABLE_OR_VIEW_NAME
*/
//为T表在TN上建立聚集索引
CREATE CLUSTERED INDEX TI ON T(TN)

非聚集索引(可多个)P117

在SQL server 2008R2中,每个表至多创建249个非聚集索引

//CREATE NONCLUSTERED INDEX <索引名> ON 表名(列名[,列名...])
//为T表在TN上建立非聚集索引
CREATE NONCLUSTERED INDEX TI ON T(TN)

唯一索引()P117

视图索引()P118

全文索引()P118

创建索引()P118

修改索引 P119

//ALTER INDEX {INDEX_NAME|ALL} ON TABLE_OR_VIEW_NAME

删除索引 P120

/*
DROP INDEX <TABLE_OR_VIEW NAME>.<INDEX_NAME>
DROP INDEX <INDEX_NAME> ON <TABLE_OR_VIEW NAME>
*/

查看索引 P120

//Sp_helpindex row_name
[EXEC]Sp_helpindex Sc

SQL四个功能

SQL功能动词
数据定义(DDL)CREATE、DROP、ALTER
数据查询(DQL)SELECT
数据操纵(DML)INSERT、UPDATE、DELETE
数据控制(DCL)GRANT、REVOKE

数据库理论

不合理的关系模式存在的异常问题

1、数据冗余
2、插入异常
3、删除异常
4、更新异常

函数依赖 P135

y=3x
可知:x决定y的取值,因此,依赖x
如下表
在这里插入图片描述
知道学号就可得知,该生的姓名,性别,年龄,系
就可以说姓名,性别,年龄,系依赖于学号,学号决定姓名,性别,年龄,系
(SN,SEX,AGE,DEPT)函数依赖于SNO
SNO唯一决定函数(SN,SEX,AGE,DEPT)

函数依赖的逻辑蕴涵(潜在关系)

在这里插入图片描述
SNO能够决定函数(DEPT),DEPT能够决定(MN(系主任)),可得SNO决定MN

函数依赖的推理规则

自反律 P136

一组属性函数决定它的所有子集
例如:(SNO)→SNO,(SNO,CNO)→CNO

增广律 P136

当决定关系成立时,左右双方同时增上一个属性,决定关系依然成立
若X→Y在R上成立,且Z⊆U时,XZ→YZ
SNO→AGE,(SNO,SN)→(AGE,SN)

传递律(潜在关系) P136

合并律 P136

X→Y和X→Z在R上成立,则X→YZ在R上也成立
证明:
X→Z
X→Y
增广律:
X→XZ
XZ→YZ

伪传递律 P136

X→Y和YW→Z在R上成立,则XW→Z在R上也成立
已知:X→Y
增广律:XW→YW
传递律:XW→YW,YW→Z
得:XW→Z

分解律 P137

若X→Y和Z⊆Y在R上成立,则X→Z在R上也成立
已知:Z⊆Y
自反律:Y→Z
传递律:X→Y,Y→Z
得:X→Z

复合律 P137

X→Y和W→Z在R上成立,则XW→YZ在R上也成李
已知:X→Y
增广律:XW→YW
YW→ZY
传递律:XW→ZY

完全函数依赖与部分函数依赖

X,Y
完全函数依赖:除x可以决定Y外,x的任何真子集都不能决定Y
部分函数依赖:除x可以决定Y外,x的真子集中有任意一个能决定Y
只有当决定因素时组合属性时,讨论部分函数依赖才有意义
单元素只能是完全函数依赖,因为单元素除了空集外没有其它真子集

传递函数依赖 P138

X→Y,Y不依赖X,Y→Z,称Z对X传递函数依赖
X↔Y,Y→Z,称为Z对X直接函数依赖

属性集的闭包及其算法 P138

闭包:通过这些属性能够直接推出或间接推出的属性集的集合。
(P139)例:设属性集U为XYZW,函数依赖集为{X→Y,Y→Z,W→Y}
x+=XYZ
∵x+中必定包含x
已知:X→Y,∴推出含有y
进而:Y→Z ∴含有Z
但是无法推出W

候选码(根据其中的属性,可以推出全部)

超码:每一个表至少有一个超码(所有属性的组合)
候选码:最小的超码,无多余属性

求解候选码 P140

L类:必是候选键的成员
R类:必不是候选键的成员
N类:必是候选键的成员
LR类:有可能是候选键的成员
L和N类决定候选码,题目中若有L类或N类,候选键中必有L类和N类的属性
没有N类,从L类和LR类中找

函数依赖集的等价、覆盖和最小函数依赖集 P142

函数依赖集的等价、覆盖:两个函数的依赖集不一样,单求出的闭包相同
最小函数依赖集:最少函数依赖集合
求法:
1、使右边都为单一的属性
例:
F={X→ZY}
F={X→Z,X→Y}
2、去掉左边多余的属性
例:
F={XA→Z,A→Z}
F={A→Z}
因为A本身就可以决定Z,所以X是多余的属性,去掉
3、消除冗余的依赖,从第一个函数依赖开始在G中去掉它(假设该函数依赖为X→Y),然在剩下的函数依赖中求X+,若X+中包含Y,则去掉,若X+不包含Y,则留下

实践总结:

创建数据库 P77
CREATE DATABASE 数据库名称
修改数据库 P79
向数据库中添加数据文件.mdf
ALTER DATABASE 数据库名称
ADD FILE(
NAME=文件逻辑名称(文件名)
FILENAME=‘文件路径’)

文件路径:D:/a.ndf(盘符:/文件名.文件名后缀)

删除数据库 P80
DROP DATABASE 数据库名称 [,…n]

查看数据库信息(查询过程=方法) P81
用系统存储过程显示的,方法如下:
数据库结构:Sp_helpdb
文件信息:Sp_helpfile
文件组信息:Sp_helpfilegroup

迁移数据库 P81

数据库

创建表 P86
CREATE TAB <表名>(列名 属性[,…列定义|[{<列约束>}]])
表名最多128个字符

修改表 P90
关键:ALTER TABLE

ADD方式 (增加一列或者新约束)P91
ALTER TABLE <表名> ADD <列定义> | <完整约束定义>
注意:该方法无法新增NOT NULL约束

ALTER(修改列)P92
ALTER TABLE <表名>
ALTER COLUMN <表名> <数据类型> [NULL|NOT NULL]

DROP(删除完整性约束)P92
ALTER TABLE<表名>
DROP CONSTRAINT <约束名>

删除表 P92
DROP TABLE <表名>

理论:

无损测试算法 P146

判断函数依赖是否与之前的函数依赖一样。
例:

分解出多个

有关系模式R(A,B,C,D)
分解成:p=(AB,BC,CD)
在R上成立的函数依赖集:F(B→A,C→D)

ABCD
ABaa
BCaa
CDaa

列:关系模式有几个属性,就有几
行:分解成几个表,就写几行
在每一行中,有出现的属性,在那行的对准属性列写上a(例如在AB这以列中,有出现AB那就在这行对准AB两列上写a),没有写b(没有写b,这步可以选择不写)
再根据依赖集
B→A,由这个函数依赖集可知,知B可推A
找出B列上由a,在行上b列是空着的地方,填上a

ABCD
ABaa
BCaaa
CDaa

再根据依赖集
C→D,同上

ABCD
ABaa
BCaaaa
CDaa

找出全部为a的列
综上:p相对于函数依赖F是无损分解

分解出两个 P148

两个关系是的交集能决定两个关系的差
例:
设有关系R(X,Y,Z),函数依赖集:F={X→Y}
ρ1={R1(X,Y),R2(X,Z)}
交集:R1∩R2=X
差集:R1-R2=Y
由函数依赖集:X→Y可得交集→差集
综上,ρ1是R上的无损分解

保持函数依赖

关系中的包含的元素是否能组成闭包。

关系模式的范式

衡量关系模式的好坏

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值