关系数据库
关系数据模型
关系数据语言-关系代数
-SQL
数据库设计
数据库管理
关系代数运算
基本常识:笛卡尔积,v,∧
集合运算:并,交,差
投影和选择
连接:自然连接,等值连接
重命名
笛卡尔积-行(元组)《所有行相乘》
-列(属性)《所有属性相加》
v-逻辑运算符或,一个条件为真,则整个表达式全部为真,整个表达式的条件全部错误则表达式错误。
∧-逻辑运算符与,所有条件全部为真则表达式才为真,一个条件错误则整个表达式都是错误。
并集-所有的元组(去重复的)
交集-相同的元组
差-R中的元组减去S中相同的元组
投影-列,表R中选择出需要的列
选择-元组(行),表R中选择出需要的行(如果条件右边有字符串记得用单引号括起来)
连接-等于
A和B中间的符号就是比较运算符,公式首先R和S笛卡尔积然后选择出A和B属性组上值满足条件的元组
等值连接R.A这列与R.B这列值相同的元组
自然连接公共属性上的等值连接,两个关系必须有公共属性,去除相同属性就是自然连接
重命名-把关系S的名字改为R,S中的列名改为A1,。。。An
等价运算-
关系运算符的优先级:
1.单目运算符优先级最高--select,project
2.笛卡而积和连接运算符
3.交
4.并和差
括号的优先级最高
表达式树
两类结点
叶子结点-》关系
其余结点-》操作符(应用其余孩子结点)
SQL
DDL
DML
DCL
LNDEX
VIEW
嵌入式SQL
SQL(Structured Query Language):结构化查询语言(SEQUEL语言)
是关系数据库的标准语言,是数据库领域中一个主流语言
SQL-86
-第一个SQL标准
SQL-89
SQL-92(SQL2)
1999年,SQL3
-当前应用的
大部分商用DBMS的SQL实现类似,但是又与标准SQL不完全相同
SQL的特点
1.综合统一
-支持DDL,DML,DCL
2.高度非过程化
-用户只需要提出“做什么”,而不必指明“怎么做”
-存取路径的选择以及SQL语句的操作过程由系统自动完成
3.面向集合的操作方式
-操作对象,查找结果可以是元组的集合
-一次插入,删除,更新操作的对象可以是元组的集合
4.同一种语法提供俩种使用方式
-自含语言
-嵌入式语言
5.语言简捷,易学易用
-3大类,11个命令词
SQL 3大类,11个命令词
SQL支持数据库的三级模式结构
外模式-视图
关系模式-基本表
内模式-存储文件
SQL语言的基本概念:
用户用SQL语言对基本表,视图,索引等进行操作
DDL
1.创建表
关系名(表名)
属性名(列名)
属性数据类型
完整性约束
CREATE TABLE<表名>
(<列名><数据类型>[<列级完整性约束条件>])
[,<列名><数据类型>[<列级完整性约束条件>]]
[,<表级完整性约束条件>])[;]
CHAR(8)固定长度的字符串
VARCHAR(20)可变长度的字符串,最多20个字符串
常用完整性约束
-主码约束:PRIMARY KEY(不可以为空)
-参照完整性约束:FOREIGN KEY。。REFERENCES。。。(外键:跟另外一张表有同样的公共属性的键)
-唯一性约束:UNIQUE(可以为空)
-非空值约束:NOT NULL
-取值约束:CHECK(自定义约束)
2.修改基本表
ALTER TABLE<表名>
[ADD<新列名><数据类型>|完整性约束]
[DROP<列名>|<完整性约束名>]
[MODIFY<列名><数据类型>];
SQL Server:
增加一列:
alter table 表名 add 列名 数据类型;
删除一列:
alter table 表名 drop column 表名;
删除主键约束:
alter table 表名 drop 主键约束的名字;
修改列数据类型:
alter table 表名 alter column 列名 数据类型;
3.删除基本表:
drop table 表名;
-系统从数据字典中删去;
该基本表的描述
该基本表上的所有索引的描述
该基本表表中的数据
-表上的视图往往仍然保留,当无法引用
总结(SQL不区分大小写但是我习惯用小写,不好,标准的是命令词,关键字用大写,其他的小写):
创建create table
删除drop table
添加alter table
DML
select ,insert ,update ,delete
select A1,A2,。。。,An
From R1,R2,。。。,Rm
Where condition
Group By columns
Havint condition
Order by columns
select语句和关系代数不同:
1.select 是等值连接
在condition中要有等值连接条件
2.select 结构不是集合是包,有重复元组
数据查询
1.单表查询
2.连接查询
3.嵌套查询
4.集合查询
1.单表查询
查询仅涉及一个表,是一种最简单的查询操作
-(1)选择表中的若干列 ---select子句
-(2)选择表中的若干元组 --where子句
-(3)对查询结果排序 --order by子句
-(4)使用集函数 --5个集函数
-(5)对查询结果分组 -group by子句
-(6)对分组之后结果进行筛选 --having
1.选择表中的若干列
属投影运算
-不消除重复行
select子句查询指定属性列
-查询全部列
1.在select关键字后面列出所有属性列名
2.当列的显示顺序与其在基表的属性相同时,也可以简单的将属性列表指定为*
*代表全部列
-查询经过计算的值
在selsect子句中指定要查询的属性列
-各个列的先后属性可以与表中的逻辑顺序不一致
-用户可以根据应用的需要改变显示顺序
SQL Server函数(select只有查询功能不能改变表内信息,as在使用的时候起别名,但是不可以改变名字,as也可以省略):
year():返回指定日期“年”日期部分的整数
getdate():返回当前的系统日期和时间
在select子句中使用distinct短语,消除取值重复的行
distinct短语的作用范围是所有目标列
2.查询满足条件的元组
2.1选择运算
通过where condition子句实现
在where子句的condition中使用比较运算符
=,>,<,>=,<=,!=或<>,!>,!<,
逻辑运算符not+,含上述运算符的表达式
2.2确定范围
使用谓词
-between....and.....
-not between....and...
between后:范围的下限(即低值)
and后:范围的上限(即高值)
用多重条件查询实现
2.3确定集合
使用谓词 in<值表>
not in<值表>
-<值表>:用逗号分隔的一组取值
用多重条件查询实现
2.4字符串匹配
使用谓词like或not like
格式:
[not]like'<>'[ESCAPE'<换码字符>']
通配符:
%(百分号)代表任意长度(长度可以为0)的字符串
-(下横线)代表任意单个字符
2.5 escape短语
当用户要查询的字符串本身就含有%或_时,
要使用escape'<换码字符>'短语对通配符进行转义
使用换码字符将通配符转义为普通字符
2.6涉及空值的查询
使用谓词is null 或is not null
"is null"不能用“=null”代替
多重条件查询
用逻辑运算符and和or来联结多个查询条件
-and的优先级高于or
-可以用括号改变优先级
对查询结果排序
使用order by子句
-可以按一个或多个属性列排序
-升序:asc;降序:desc;缺省值为升序
当排序列含空值时
-asc:排序列为空值的元组最后显示
-desc:排序列为空值的元组最先显示
(4)使用集函数
5类主要集函数
-统计个数
count(<列名>)
count(*)统计行数
-计算列总和
sum(<列名>)
-计算列平均值
avg(<列名->)
求列最大值
max(<列名>)
求列最小值
min(<列名>)
注意:统计时不计null值
在列名前加distinct则统计时去重复行
对查询结果分组
用途:细化集函数的作用对象
使用group by子句分组
-分组方法:按指定的一列或多列值分组,值相等的为一组
-使用group by子句后,select子句的列名列表中只能出现组属性和集函数
-group by子句的作用对象是查询的中间结果表
对查询结果分组2
使用having短语筛选最终输出结果
-只有满足having短语指定条件的组才输出
having 短语与where子句的区别:作用对象不同
顺序:
select all|distinct
from
where
group by
having
order by
2.连接查询
同时涉及多个表的查询称为连接查询
用来连接两个表的条件称为连接条件或连接谓词
SQL中连接查询的主要类型
(1)交叉连接(广义笛卡尔积)
(2)等值连接
(3)自身连接
(4)复合条件连接
(5)内连接
(6)外连接
(1)交叉连接(广义笛卡尔积)
不带连接谓词的连接
很少使用
select 表1.*,表2.* from 表1,表2 和 select 表.1*,表2.* from 表1 cross join 表2结果都是一样的
(2)等值连接
-连接运算符为=的连接操作
表1.列名1=表2.列名2
(3)自身连接
一个表与其直接进行连接,称为表的自身连接
表示方法
需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀
3.嵌套查询
查询块
-一个select语句称为一个查询块
嵌套查询
-将一个查询块嵌套在另一个查询块的where子句
或having短语的条件中的查询称为嵌套查询
不相关子查询
由里向内逐层处理,即每个子查询在上一级查询处理之前求解,子查询结果用于建立其父查询的查找条件
相关子查询
首先去外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询若where子句返回值为真,则取此元组放入结果表;
然后再取为层表的下一个元组;
重复这一过程,直至外层表全部检查完为止。
子查询的限制
不能使用order by子句
层层嵌套方式反映SQL语言的结构化
有一些嵌套查询可以用连接运算替代
嵌套查询的谓词
(1)带有in谓词的子查询
(2)带有比较运算符的子查询
(3)带有any或all谓词的子查询
(4)带有exists谓词的子查询
(1)带有in谓词的子查询
父查询和子查询之间用in进行连接,子查询的结果是一个集合
(2)带有比较运算符的子查询
使用范围
-当能确切真的内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=,<,>,!>,!<).
-与any或all谓词配合使用
子查询一定要跟在比较符之后
(3)带有any或all谓词的子查询
谓词语义
-any:任意一个值
-all:所有值
(4)带有exists谓词的子查询
带有exists谓词的子查询不返回任何实际数据
它只产生逻辑真值“true”或是逻辑假值“false”
not exists不存在
exists存在
4.集合查询
标准SQL直接支持的集合操作种类
-并操作(union)
一般商用数据库支持的集合操作种类
-并操作(union)
-交操作(intersect)
-差操作(minus)
(1)并操作(union)
形式
<查询块>
union
<查询块>
-参加union操作的各结果表的列数必须相同:
-对应项的数据类型也必须相同
(2)交操作
标准SQL中没有提供集合交操作,但可用其他方法间接实现。
(3)差操作
标准SQL中没有提供集合差操作,但可用其他方式间接实现。
(4)对集合操作结果的排序
order by子句只能用于最终查询结果排序,不能对中间结果排序
任何情况下,order by子句只能出现在最后
对集合操作结果排序时,order by子句中可以用数字指定排序属性
查询语句格式
select all |distinct
<目标列表达式>[<别名>]
[,<目标列表达式>[别名]]
from <表名或视图名>[<别名>]
[,<表名或视图名>]<别名>]...
where<条件表达式>
group by<列名>[,<列名>]...
having<条件表达式>
order by <列名><列名>...[asc|desc]
修改数据
1.插入数据
两种插入数据方式
-插入单个元组
-插入子查询结果
insert
into<表名>(属性列1),[<属性列2>...]
values(<常量1>,<常量2>...)
-功能
将新元组插入指定表中
-into子句
指定要插入数据的表名及属性列
属性列的顺序可与表定义中的顺序不一致
没有指定属性列,表示要插入的是一条完整的元组,并且属性列属性与表定义中的顺序一致
指定部分属性列,插入的元组在其余属性列上去null
完整性校验
DBMS在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则
-实体完整性
-参照完整性
-用户定义的完整性
对于有not null约束的属性列是否提供了非空值
对于有unique约束的属性列是否提供了非重复值
对于有值域约束的属性列所提供的属性值是否在值域范围内
插入子查询结果
insert into<表名>
[(<属性1>,[,<属性列2>...)]]
子查询;
2.修改数据
update <表名>
set<列名>=<表达式>[,<列名>=<表达式>]...
[where<条件>];
-功能
修改指定表中满足where子句条件的元组
三种修改方式
-修改某一个元组的值
-修改多个元组的值
-带子查询的修改语句
3.删除数据
delete
from<表名>
[where<条件>];
-功能
删除指定表中满足where子句条件的元组
-where子句
指定要删除的元组
缺省表示要修改表中的所有表中的所有元组
完整性校验
DBMS在执行删除语句时会检查所删元组是否破坏表上已定义的完整性规则
-参照完整性
不允许删除
级联删除
三种删除方式
-删除某一个元组的值
-删除多个元组的值
-带子查询的删除语句
delect form(表)和truncate table(表)的区别
delect一行一行的删除
truncate整表删除,然后创建空表(drop table(表) create table(表))