SQL:结构化查询语言
关系 = 二维表 基本表:独立存在的表。 视图:虚表。对视图进行操作,有限制,实际是对基本表的操作。
数据库的创建与使用 数据库的结构 1、数据文件: 一个数据库只唯一有一个主数据文件,后缀(.mdf) 多个次数据文件,后缀(.ndf) 2、事务日志文件 记录对数据库操作的文件,保存用于恢复数据库的日志信息,后缀(.ldf)
一:Windows 身份验证 直接连接
二:SQL Server 身份验证 需要输入密码 默认安装时有一个最高权限账号:sa 忘记sa的登入密码: 以第一种方式进入数据库->安全性->登录名->右键sa属性->在密码框中输入新密码
以第一种或第二种方式进入数据库->安全性->右键登录名->新建登录名->SQL Server 身份验证->输入密码
日志文件
后缀名是否唯一作用.lfd至少一个保存用于恢复数据库的日志信息用[]括起来的是可以省略的。 最简便的创建数据库语句
//格式:CREATE DATABASE DATABASE_NAME create database One图形化操作:右键数据库->删除数据库->关闭连接->完成删除 如果数据库没有连接就不需要关闭连接,但是如果发现数据库一直无法删除就关闭连接之后再删除
//DROP DATABASE 数据库名称 [,.....n] DROP DATABASE ONE /* 若要删除的数据库当前正在被使用,则: 先随便打开别的数据库后,再删除该数据库 */ USE master GO DROP DATABASE ONE查看数据库结构(查看每一列(字段)的类型)
Sp_helpdb DATABASE查看数据库中的数据库文件信息(数据库地址,大小等)
Sp_helpfile DATABASE右击数据库->任务->分离->选中删除连接和更新统计信息->确定 以上操作可以将数据库与客户端分离 找到该数据库存放的位置,将mdf文件复制出来完成数据库备份 如果不知道默认路径就点新建数据库那边可以看到默认路径
将自己的已有的数据库放在sql软件的data文件夹中 右击数据库->附加->添加->选中要附加的数据库的mdf文件就能够成功将数据库附加到sql客户端中
值得注意的是,表必须要创建字段名,不然是无法创建表格的,每个字段名以逗号结尾 插入数据的两种方式
1、表中有多少个字段名,插入的数据也要有多少个字段名,且数据顺序也必须一样 2、自己指定字段名,指定多少字段名,就按顺序写多少数据就行 3、每一个字段用的数据用逗号隔开
表中的所有数据
delete from 表名; 删除数据库/表 drop database One --删除数据库:One drop table student --删除表:student 删除一张表中的相同一行的数据 delete from 表名where 字段名 in (select 字段名 from 表名 group by 字段名 having count(字段名) > 1);--当数据达成条件,全部删除,一条不留用于唯一标识一个事务 单独添加一列没有任何实际意义的,只有编号的那一列作为主键 自然主键: 业务主键: 代理主键:
关键字:来自(这一字段的数据是来自另一个表的,那么这一字段的值必须要在另一个表中存在,否则会报错) 表示事务与事务之间的联系 多对一,外键一般写在多的地方
列 字段,属性
行 记录,元组
除法: c1
AB11122123c2
B12c1 ÷ c2
A1数值型: 精确数值型: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) )数据完整性机制包括:约束(Constraint),默认(Default),规则(Rule),触发器(Trigger) 约束的基本语法: [CO NSTRAINT <约束名>]<约束类型> 约束名可以不给,系统会自动分配
该列的值不能重复
//列约束:[CONSTRAINT <约束名>] UNIQUE CREAT TABLE S ( SN NVARCHAR(10) CONSTRAINT SN_UNIQ UNIQUE ) //表约束:[CONSTRAINT <约束名>] UNIQUE(<列名>[{<列名>}])唯一,不能为空
//列约束:CONSTRAINT <约束名> PRIMARY KEY //组合主键:CONSTRAINT<约束名>PRIMARY 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))使用函数求出的值没有列名,无重命名显示‘(无列名)’
//求学号为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 图书在分组之前可以有WHERE条件语句,当语句中有WHERE语句又有HAVING语句时 顺序:WHERE-GROUP BY-[HAVING]
DESC:降序 ASC:升序(缺省)
//查询选修C1学生的学号和成绩,并按照成绩降序排序 SELECT SNO,SCORE FROM SC WHERE CNO='C1' ORDER BY SOCRE DESC在分组之前可以有WHERE条件语句,当语句中有WHERE语句又有HAVING语句时还需要排序时 顺序:WHERE-GROUP BY-[HAVING]-ORDER BY
查询所有选课学生的学号、姓名、选课名称及成绩
SELECT S.SNO,SN,SCORE FROM S,C,SC //以上得到的结果为笛卡尔积 WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO查询教师表中比刘伟工资高的教师
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='刘伟'返回值只有一个时,可用比较运算符将父查询与子查询连接
SELECT TNO,TN FROM T WHERE PROF=( SELECT PROFT FROM T WHERE TN='刘伟' )返回值是一个集合 (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<>'计算机')执行顺序:选取父查询表中的第一行记录,内部的子查询利用此行中相关的属性值进行查询,然后父查询根据子查询返回的结果判断此行是否满足查询条件。 如果满足条件,将改行放入父查询的结果集合中,重复执行,直到处理完父查询中的每一行数据。
SELETC DISTINCT TN FROM T WHERE ('C5'<>ALL ( SELECT CNO FROM TC WHERE TNO=T.TNO))返回逻辑值“真”或“假”
SELECT SN FROM S WHERE(NOT EXISTS(SELECT * FROM C WHERE NOT EXISTS (SELECT * FROM SC WHERE SNO=S.SNO AND CNO=C.CNO)))同时查询两个同学的总分
//查询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区别: INTO Cal_Table:生成物理文件 INTO #Cal_Table:不生成物理文件,只在内存中,存在时间很短
必须先建表,再进行筛选插入
物理存储顺序与索引键的逻辑(索引)顺序相同
/* 创建主键时会自动创建聚集索引 CREATE CLUSTERED INDEX INDEX_NAME ON TABLE_OR_VIEW_NAME */ //为T表在TN上建立聚集索引 CREATE CLUSTERED INDEX TI ON T(TN)在SQL server 2008R2中,每个表至多创建249个非聚集索引
//CREATE NONCLUSTERED INDEX <索引名> ON 表名(列名[,列名...]) //为T表在TN上建立非聚集索引 CREATE NONCLUSTERED INDEX TI ON T(TN)1、数据冗余 2、插入异常 3、删除异常 4、更新异常
y=3x 可知:x决定y的取值,因此,依赖x 如下表 知道学号就可得知,该生的姓名,性别,年龄,系 就可以说姓名,性别,年龄,系依赖于学号,学号决定姓名,性别,年龄,系 (SN,SEX,AGE,DEPT)函数依赖于SNO SNO唯一决定函数(SN,SEX,AGE,DEPT)
SNO能够决定函数(DEPT),DEPT能够决定(MN(系主任)),可得SNO决定MN
一组属性函数决定它的所有子集 例如:(SNO)→SNO,(SNO,CNO)→CNO
当决定关系成立时,左右双方同时增上一个属性,决定关系依然成立 若X→Y在R上成立,且Z⊆U时,XZ→YZ SNO→AGE,(SNO,SN)→(AGE,SN)
X→Y和X→Z在R上成立,则X→YZ在R上也成立 证明: X→Z X→Y 增广律: X→XZ XZ→YZ
X→Y和YW→Z在R上成立,则XW→Z在R上也成立 已知:X→Y 增广律:XW→YW 传递律:XW→YW,YW→Z 得:XW→Z
若X→Y和Z⊆Y在R上成立,则X→Z在R上也成立 已知:Z⊆Y 自反律:Y→Z 传递律:X→Y,Y→Z 得:X→Z
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 只有当决定因素时组合属性时,讨论部分函数依赖才有意义 单元素只能是完全函数依赖,因为单元素除了空集外没有其它真子集
X→Y,Y不依赖X,Y→Z,称Z对X传递函数依赖 X↔Y,Y→Z,称为Z对X直接函数依赖
闭包:通过这些属性能够直接推出或间接推出的属性集的集合。 (P139)例:设属性集U为XYZW,函数依赖集为{X→Y,Y→Z,W→Y} x+=XYZ ∵x+中必定包含x 已知:X→Y,∴推出含有y 进而:Y→Z ∴含有Z 但是无法推出W
超码:每一个表至少有一个超码(所有属性的组合) 候选码:最小的超码,无多余属性
L类:必是候选键的成员 R类:必不是候选键的成员 N类:必是候选键的成员 LR类:有可能是候选键的成员 L和N类决定候选码,题目中若有L类或N类,候选键中必有L类和N类的属性 没有N类,从L类和LR类中找
函数依赖集的等价、覆盖:两个函数的依赖集不一样,单求出的闭包相同 最小函数依赖集:最少函数依赖集合 求法: 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 <表名>
判断函数依赖是否与之前的函数依赖一样。 例:
有关系模式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是无损分解
两个关系是的交集能决定两个关系的差 例: 设有关系R(X,Y,Z),函数依赖集:F={X→Y} ρ1={R1(X,Y),R2(X,Z)} 交集:R1∩R2=X 差集:R1-R2=Y 由函数依赖集:X→Y可得交集→差集 综上,ρ1是R上的无损分解
关系中的包含的元素是否能组成闭包。
衡量关系模式的好坏