SQL 数据库初学,还未完善

    科技2022-08-14  86

    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、每一个字段用的数据用逗号隔开

    删除

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

    表中的所有数据

    delete from 表名; 删除数据库/表 drop database One --删除数据库:One drop table student --删除表:student 删除一张表中的相同一行的数据 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

    AB11122123

    c2

    B12

    c1 ÷ c2

    A1

    数据类型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)

    ABCDABaaBCaaCDaa

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

    ABCDABaaBCaaaCDaa

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

    ABCDABaaBCaaaaCDaa

    找出全部为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上的无损分解

    保持函数依赖

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

    关系模式的范式

    衡量关系模式的好坏

    Processed: 0.010, SQL: 9