在软件架构设计师的考试中,数据库的管理是重点内容,本文主要介绍关系代数。本文内容来至互联网内容的编辑修改,方便读者学习。如有侵权,第一时间联系作者删除。
  关系代数:是一种抽象的查询语言,用对关系的运算来表达 查询。关系代数运算的是关系,运算结果亦是关系。关系代数的基本关系包括:并、交、差、笛卡尔积、选择、投影、连接、除法运算。

1.关系代数符号

  并(∪)交(∩)差(−)选择(σ)投影(π)笛卡尔积(×)连接(⊳⊲)

2.关系代数功能

2.1.并(∪)交(∩)差(−)

  并、差、交 3个操作需要关系R、S的属性相同才能进行(即R中的属性为A、B、C,S中的属性也为A、B、C才可以),并交差针对的关系模型的记录,并是两个关系模型记录的合并,交是两个关系模型相同记录的共同部分,形成新的关系模型。而R-S差操作,将R关系模型中,RS中相同的记录去除,剩下的关系模型记录,就是差操作。

2.2.笛卡尔(×)

  计算两个关系R和S的笛卡尔积,R的元数为r,S的元数为s,则R×S是一个(r+s)元的元组集合。个数是R记录个数乘以S记录个数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

select * from stu join class;#笛卡尔积
select * from stu,class;

2.3.选择(σ)

  选择满足某些条件的记录。(Select语句)

2.4.投影(π)

  选择哪些列(关系属性)。

2.5.连接(⊳⊲)

  自然连接:只返回两个表中联结字段相等的行。左连接:返回包括左表中的所有记录和右表中联结字段相等的记录,不相等则用null表示。右连接:返回包括右表中的所有记录和左表中联结字段相等的记录,不相等则用null表示。外连接:左连接+右连接(或者说并)。
  在mysql中构建两张表,并输入数据。

create table IF NOT EXISTS stu (
id bigint unsigned AUTO_INCREMENT comment '学号',
name varchar(50) not null comment '姓名',
age int unsigned not null comment '年龄',
class_id bigint unsigned  not null comment '班级号',
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '学生表';

create table IF NOT EXISTS class(
id bigint unsigned comment '班级号',
master varchar(50) not null comment '班主任',
number int unsigned not null comment '学生人数',
type varchar(20) not null comment '班级类型:文科、理科',
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '班级表';


INSERT into stu(id,name,age,class_id) VALUES(1,'李1',24,201302);
INSERT into stu(id,name,age,class_id) VALUES(2,'李2',25,201301);
INSERT into stu(id,name,age,class_id) VALUES(3,'李3',25,201304);
INSERT into stu(id,name,age,class_id) VALUES(4,'李4',25,201307);

INSERT into class(id,master,number,type) VALUES(201301,'王1',64,'理科');
INSERT into class(id,master,number,type) VALUES(201302,'王2',64,'理科');
INSERT into class(id,master,number,type) VALUES(201304,'王3',64,'文科');
INSERT into class(id,master,number,type) VALUES(201306,'王4',64,'理科');

a.内连接

select * from stu inner join class on stu.class_id=class.id;
select * from stu join class on stu.class_id=class.id;  -- MySQL的join默认为inner jion
/* 对应的where语句 */
select * from stu,class where stu.class_id=class.id;

在这里插入图片描述
b.左连接
  如果左表数据没有匹配到右表的任何一条数据,则将右表数据的所有字段置为NULL,仍记作匹配到一条数据。

select * from stu left join class on stu.class_id=class.id;

在这里插入图片描述
c.右连接
  如果右表数据没有匹配到左表的任何一条数据,则将左表数据的所有字段置为NULL,仍记作匹配到一条数据。

select * from stu right join class on stu.class_id=class.id;

在这里插入图片描述
d.全连接
  MySQL目前不支持全连接,但可以对左连接、右连接的结果进行union操作实现。

select * from stu left join class on stu.class_id=class.id
union
select * from stu right join class on stu.class_id=class.id;

在这里插入图片描述

2.6.除法(÷)

在这里插入图片描述
在这里插入图片描述

R÷S:列S中同属性Y(Y1,Y2...)-->列R中不同属性X,取消重复值(X1,X2...)-->R中不同属性(X1,X2...)各自对应的Y值(Y1,Y2...)-->R中某X包含S中全部Y的即为最终解

  R÷S其实就是判断关系R中X各个值的像集Y是否包含关系S中属性Y的所有值。对比即可发现:X1的像集只有Y1,不能包含关系S中属性Y的所有值,所以排除掉X1;而X2的像集包含了关系S中属性Y的所有值,所以R÷S的最终结果就是X2 。

  合理的脚本代码可以有效的提高工作效率,减少重复劳动。

3.作者答疑


  如有疑问,请留言。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐