数据库系统-学习记录5

ch5.代数与逻辑查询语句

包(Bag)的关系运算

  包与集合的区别:包允许重复,比较高效(省掉了去重的过程)

并集、交集与差集

  与集合的运算基本一致。值得注意的是,进行差集计算的时候,对于重复元组,包R和S有相同的有n个时,R-S运算时,就从R中减去n个,剩余的保留下来

投影

  与集合的投影的不同点在于:包的投影不消去重复元组

选择

  与集合的操作一致,最后同样保留重复元组

笛卡尔积、自然连接

  与集合的操作一致

扩展的关系代数运算

去除重复元组

  符号表示: δ ( R ) \delta(R) δ(R)
  使得包R内不存在两个相同的元组

聚集

  SUM:求和
  AVG:求平均
  MIN/MAX:求最小/最大值
  COUNT:求总数

分组运算

  在有些时候,会有分别求各类元素的聚集函数的需求(例如求出编号为x的学生的考试平均成绩)。因此,在此处,就引出了分组的概念:

  符号表示: γ a t t r i b u t e s   o r   A g g r e g a t i o n O p ( a t t r i b u t e ) ( R ) \gamma_{attributes\ or\ AggregationOp(attribute)}(R) γattributes or AggregationOp(attribute)(R)

  两种参数分别为:
  1、分组属性
  2、聚集函数操作

  此运算能够先对指定的属性进行分组,将相同的属性分为一组,随后再对各个组单独进行聚集函数运算

  去除重复元组的操作是分组运算的特例:
δ ( R ) = γ A 1 ,   A 2 ,   …   ,   A n ( R ) \delta (R)=\gamma_{A_1,\ A_2,\ \dots\ ,\ A_n}(R) δ(R)=γA1, A2,  , An(R)
  其中,关系R: R ( A 1 ,   A 2 ,   …   ,   A n ) R(A_1,\ A_2,\ \dots\ ,\ A_n) R(A1, A2,  , An)

扩展投影

  类似于集合上的扩展投影运算。
  使用 → \rightarrow 表示重命名,例如: π x → y ( R ) \pi_{x\rightarrow y}(R) πxy(R)表示将包R中的x属性重命名为y

排序

  符号表示: τ L ( R ) \tau_L(R) τL(R)
  按列表L中的顺序,逐属性进行排序

外连接

  符号表示: ⋈ ∘ \mathop\Join\limits^\circ
  类似于集合的外连接,连接后的空值用 ⊥ \perp 表示
  左外连接: ⋈ ∘   L \mathop\Join\limits^\circ\ _L  L
  右外连接: ⋈ ∘   R \mathop\Join\limits^\circ\ _R  R
   θ \theta θ外连接: ⋈ ∘   C o n d i t i o n \mathop\Join\limits^\circ\ _{Condition}  Condition

查询树

  类似于编译原理中的语法树,数据库系统中的关系操作,也可以用树的形式表示。例如: σ C ( ( S ⋈ S C ) ⋈ C ) \sigma_C((S\Join SC)\Join C) σC((SSC)C)这样的操作,可以表示为如图1所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qiS2Dl0-1601886277128)(C:\Users\蔡三圈\AppData\Roaming\Typora\typora-user-images\image-20201005143341120.png)]

图1

关系的逻辑

谓词和原子(关系原子)

  定义:关系在Datatog中由谓词(predicate)表示。每个谓词拥有固定数目的参数,一个谓词和它的参数一起被称为原子(atom)。谓词是一个返回布尔值的函数名

  如果R是一个包含n个固定顺序的属性的关系,那么也可以用作为对应这个关系的谓词名。如果 ( a 1 ,   a 2 ,   …   , a n ) (a_1,\ a_2,\ \dots\ ,a_n) (a1, a2,  ,an)是满足R的元组,那么原子 R ( a 1 ,   a 2 ,   …   , a n ) R(a_1,\ a_2,\ \dots\ ,a_n) R(a1, a2,  ,an)的值为TRUE,否则原子的值为FALSE
  例如:关系R(A, B)​含有两个元组(1, 2)、(3, 4),则R(1, 2)和R(3, 4)的值为TRUE,其他的R(x, y)值为FALSE

算术原子

  对两个算术表达式作比较

Datalog规则与查询

定义:
  与经典关系代数类似的操作在Datalog中称作规则(rule),它包括:
  1、一个称为头部(head)的关系原子
  2、符号 ← \leftarrow ,经常读作“if”
  3、主体(body)部分,由一个或多个称为子目标(subgoal)的原子组成。原子可以是关系原子或算术原子。子目标之间由AND连接,任何子目标之前都可随意添加逻辑算子NOT

  例如:LongMovie(t, y) ← \leftarrow Movies(t, y, l, g, s, p) AND l ≥ \ge 100
  这个规则的头部是LongMovie(t, y),主体包括Movies(t, y, l, g, s, p)和l ≥ \ge 100这两个原子。该规则表示,对于给出的元组(t, y),如果这个元组属于Movies的前两个分量,并且其对应的l大于或等于100,则LongMovie(t, y)的值为TRUE

扩展谓词和内涵谓词

  扩展谓词:这种谓词的关系存放在数据库中
  内涵谓词:这种谓词的关系由一个或多个Datalog规则计算而来

关系代数与Datalog

布尔操作

  包含并、交、差,可以简单地用Datalog表达

  并: A n s w e r ( a 1 ,   a 2 ,   …   ,   a n ) Answer(a_1,\ a_2,\ \dots\ ,\ a_n) Answer(a1, a2,  , an)
  交: A n s w e r ( a 1 ,   a 2 ,   …   ,   a n ) ← R ( a 1 ,   a 2 ,   …   ,   a n )   A N D   S ( a 1 ,   a 2 ,   …   ,   a n ) Answer(a_1,\ a_2,\ \dots\ ,\ a_n)\leftarrow R(a_1,\ a_2,\ \dots\ ,\ a_n)\ \mathrm{AND}\ S(a_1,\ a_2,\ \dots\ ,\ a_n) Answer(a1, a2,  , an)R(a1, a2,  , an) AND S(a1, a2,  , an)
  差: A n s w e r ( a 1 ,   a 2 ,   …   ,   a n ) ← R ( a 1 ,   a 2 ,   …   ,   a n )   A N D   N O T   S ( a 1 ,   a 2 ,   …   ,   a n ) Answer(a_1,\ a_2,\ \dots\ ,\ a_n)\leftarrow R(a_1,\ a_2,\ \dots\ ,\ a_n)\ \mathrm{AND}\ \mathrm{NOT}\ S(a_1,\ a_2,\ \dots\ ,\ a_n) Answer(a1, a2,  , an)R(a1, a2,  , an) AND NOT S(a1, a2,  , an)

投影

  只使用单个子目标,例如:P(t, y, l) ← \leftarrow Movies(t, y, l, g, s, p)

选择

  当选择条件是对一个或多个算术比较来作AND操作时,是一个比较简单的情况。对于更为复杂的选择条件,可以由逻辑算子AND、OR和NOT按照任意顺序组成

  R × \times ×S:P(a, b, c, x, y, z) ← \leftarrow R(a, b, c) AND S(x, y, z)

连接

  R ⋈ \Join S:J(a, b, c, d) ← \leftarrow R(a, b) AND S(b, c, d)

ch6.数据库语言SQL

  SQL:结构化查询语言
  限定了对数据库的几个基本操作

  SQL的优势:具有理论基础,查询效率高,规范化

  直接使用关系代数表示非常麻烦,因此高级语言是非常需要的

SQL的简单查询(单表查询)

  单表查询:只在一个关系中查询

  在结构查询中,有几个基本动词:

select #查询
update #修改
insert #插入
delete #删除
create table #创建表
create database #创建数据库
create schema #创建模式
drop table #删除表
alter table #修改表
create index #创建索引
drop index #删除索引
grant #授权
revoke #回收权限

  核心语句为数据操作和权限控制:

select
from
where
group by
order by

  在SQL语句中,不区分大小写。字符串使用单引号

投影

  通过在select后指定属性,可以将结果投影到这些被指定的属性上,例如:

select title, length
from Movies;

  而如果不希望使用投影,在select后输入*即可

选择

  在SQL语言中,使用where子句来表示关系代数中的选择操作,形如:

select L
from R
where C;

  表示的是关系代数中的 π L ( σ C ( R ) ) \pi_L(\sigma_C(R)) πL(σC(R))。其中,C是一个条件,可以是含有算术运算的比较。比较运算符常用的有六个:=(等于),<>(不等于),<,>,<=和>=
  关于此形式的语句的举例:

select title
from Movies
where (year_ > 1970 or length < 90) and studioName = 'MGM';

字符串的比较

  字符串的大小,是按照字典顺序/字母表顺序来比较的
  例如’fodder’ < ‘foo’,‘bar’ < ‘bargin’

  比较不同类型的字符串时,只比较实际的字符串

模式匹配

  字符串比较表达式的另一种方式:

s like p

  其中s是字符串,p是模式
  模式是可能使用了%和_的字符串。其中,%可以匹配s中(属性s中的各值)任意长度的字符串,而_可以匹配任何一个字符

  模式匹配举例:

select title
from Movies
where title like 'Star ____';

  此例表示从各元组的title属性值中,筛选出以’Star '开头,后面还有四个字符的名称,提取出它们所在的元组,投影到title上

  与正则表达式有所区别

  若需要定义转义字符,则可以使用保留字escape,例如要以x为转义字符:

s like 'x%%x%' escape 'x'

  值得注意的是,转义字符只能对靠着自己右边的一个特殊符号进行转义。在上例中,中间的%未被转义

日期和时间

  在SQL标准中,日期一般形如DATE ’ 1948-05-14’,时间一般形如:TIME ’ 15:00:02.5’
  组合日期和时间时,需要用到TIMESTAMP类型,例如:TIMESTAMP ’ 1948-05-14 12:00:00’

空值

  SQL使用NULL表示空值

  空值的运算:
  1、对NULL和任何值进行算术运算,结果仍然是空值
  2、对NULL和其他任意值(包括NULL)进行比较时,结果都为UNKNOWN值

SQL中的三值逻辑真值表

xyx AND yx OR yNOT x
TRUETRUETRUETRUEFALSE
TRUEUNKNOWNUNKNOWNTRUEFALSE
TRUEFALSEFALSETRUEFALSE
UNKNOWNTRUEUNKNOWNTRUEUNKNOWN
UNKNOWNUNKNOWNUNKNOWNUNKNOWNUNKNOWN
UNKNOWNFALSEFALSEUNKNOWNUNKNOWN
FALSETRUEFALSETRUETRUE
FALSEUNKNOWNFALSEUNKNOWNTRUE
FALSEFALSEFALSEFALSETRUE

排序输出

  使用保留字order by <list of attributes>,例如:

select *
from Movies
where studioName = 'Disney' and year_ = 1990
order by length, title;

  表示对length和title进行类似于基数排序的排序,即length从小到大排列,而length相同时,则按title从小到大进行排列

  默认的排序是升序排列,的上述的order相当于:

order by length, title ASC;

  如果需要降序排列,可以替换为DESC:

order by length, title DESC;

分组

  举例:在SC(sno, cno, grade)表中查询每位学生的平均成绩:

select sno, avg(grade) from SC group by sno;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值