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
A | B |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
2 | 3 |
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)
A | B | C | D | |
---|---|---|---|---|
AB | a | a | ||
BC | a | a | ||
CD | a | a |
列:关系模式有几个属性,就有几
行:分解成几个表,就写几行
在每一行中,有出现的属性,在那行的对准属性列写上a(例如在AB这以列中,有出现AB那就在这行对准AB两列上写a),没有写b(没有写b,这步可以选择不写)
再根据依赖集
B→A,由这个函数依赖集可知,知B可推A
找出B列上由a,在行上b列是空着的地方,填上a
A | B | C | D | |
---|---|---|---|---|
AB | a | a | ||
BC | a | a | a | |
CD | a | a |
再根据依赖集
C→D,同上
A | B | C | D | |
---|---|---|---|---|
AB | a | a | ||
BC | a | a | a | a |
CD | a | a |
找出全部为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上的无损分解
保持函数依赖
关系中的包含的元素是否能组成闭包。
关系模式的范式
衡量关系模式的好坏