SZU 数据设计与分析第3章 关系代数
@
- 关系代数
- 1.并/联合(Union U)
- 2.差运算(difference)
- 3.交(intersection)
- 4.笛卡尔积(X)
- 5.选择\(\partial\)
- 6. 投影\(\pi\)
- 7.join \(\infty\)
- 8.除法
- 9. SQL语句
- 9.1 create database + 数据库名字
- 9.2 drop database + 数据库名字
- 9.3 ALTER TABLE Persons (ADD DateOfBirth date / MODIFY DateOfBirth year / DROP COLUMN DateOfBirth)
- 9.4 创建表(主键+外键)
- 9.5 视图
- 9.6 Oracle view
- 9.7 添加约束
- 9.9 HAVING
- 9.10 DISTINCT
- 9.11 INNER JOIN
- 9.12 LEFT /RIGHT JOIN
- 9.13 JOIN 总结
- 9.14 ANY/ALL/IN
- 9.15 UNOIN / intersect / minus
- 9.16 子查询
- 9.17 Exist And No Exist
- 9.18 UPDATE
- 9.19 DELETE
关系代数
1.并/联合(Union U)
1.1 定义:
联合 (\(\cup\))
这个操作的结果,即 R S,是一个包含所有在 R 或 S 或两者中的元组的关系。 重复的元组不会出现在输出中。
形式上: \(R\) \(\cup\) \(S\) \(=\) \(\{\) \(t | t\) \(\in\) R 或 t \(\in\) S \(\}\)
联合兼容性:设 R 和 S 是两个分别具有属性 \((A1, A2, ..., An)\) 和 \((B1, B2, ....., Bn)\) 的关系。 如果要合并 R 和 S,则应满足以下两条规则:
规则1:关系 \(R\) 和 \(S\) 必须具有相同的度数(属性)。
规则2:\(R\)的第\(i\)个属性的定义域和S的第\(i\)个属性的定义域必须相同。
\(dom(A_i) = dom(B_i)\),其中,1 \(\leq\) i \(\leq\) n。
1.2 例图

2.差运算(difference)
2.1 定义
与联合一样,关系差分运算符也要求其操作数为相同类型。
格式:R - S
形式上:R - S = { t | t \(\in\) R 和 t \(\notin\) S}
语义:给定两个相同类型的关系 R 和 S,这两个关系之间的差异 R-S 是包含 R 中所有未出现在 S 中的元组的关系。
2.2 例图

3.交(intersection)
3.1 定义
表达式 R ∩ S 返回出现在关系 R 和 S 中的所有元组。
与并集和差集一样,关系交集运算符要求其操作数为相同类型。
形式上:R \(\cap\) S = { t | t \(\in\) R 和 t \(\in\) S}
从现有运算符派生:
R \(\cap\) S = R - (R - S) = S - (S - R)
3.2 例图

4.笛卡尔积(X)
4.1 定义
笛卡尔积或叉积是一种二元运算,用于组合两个关系。 假设 R 和 S 分别与 n 和 m 属性的关系,笛卡尔积,R × S 可以写成,
R (A1, A2, …, An) × S (B1, B2, …, Bm)
上面设置操作的结果是,
Q (A1, A2, …, An, B1, B2, …, Bm)
在哪里,
度数 (Q) = n + m
count(Q) = R 中的元组数 * S 中的元组数。
4.2 例图

5.选择\(\partial\)
\(\partial_{age=19}(student)=\partial_{selection-condition}(Relation)\)
多重选择

6. 投影\(\pi\)
投影操作用于仅从关系中选择几列。
\(\pi_{attributes}(Relation)\)
7.join \(\infty\)

7.1 Theta Join(\(\Theta\)) || NoEqui Join



7.2 Equi join

7.3 自然连接
当我们在连接两个关系时省略条件,则称为自然连接(*):
让关系 R1 分别有属性(x1,x2,x3,M),
R2 分别有属性(y1,y2,y3,y4,y5,M)。
也就是说,M 属性是两个关系共有的。
那么 R1 和 R2 的自然连接是一个与 Heading(x1,x2,x3,M, y1,y2,y3,y4,y5) 和 body 的关系,该 body 由所有元组组成,重复属性 M 被删除。
7.4 LEFT JOIN AND OUT JOIN RIGHT OUTER JOIN


8.除法
把同时A中具有和B\(共同的\)所有属性的如果B中包含了A没有的可以直接忽略掉

9. SQL语句
9.1 create database + 数据库名字
9.2 drop database + 数据库名字
9.3 ALTER TABLE Persons (ADD DateOfBirth date / MODIFY DateOfBirth year / DROP COLUMN DateOfBirth)
9.4 创建表(主键+外键)
CREATE TABLE rent_Info(
Order_ID int PRIMARY KEY AUTO_INCREMENT,
Date_Rented DATE NOT NULL,
Date_Returned DATE NOT NULL,
Optional_Insurance TINYINT DEFAULT 0,
Customer_ID VARCHAR(10),
Bag_ID int,
reverted TINYINT DEFAULT 0,
CONSTRAINT + (约束名字) + FOREIGN key(Customer_ID) REFERENCES customers(Customer_ID),
CONSTRAINT FOREIGN key(Bag_ID) REFERENCES bags(Bag_ID)
);
9.5 视图
create view table_name as + 语句
mysql> ALTER VIEW view_students_info
-> AS SELECT id,name,age
-> FROM tb_students_info;
mysql> DESC view_students_info;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | 0 | |
| name | varchar(45) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
drop view view_name
9.6 Oracle view

9.7 添加约束
1.主键约束
添加:alter table table_name add primary key (字段)
删除:alter table table_name drop primary key
2.非空约束
添加:alter table table_name modify 列名 数据类型 not null
删除:alter table table_name modify 列名 数据类型 null
3.唯一约束
添加:alter table table_name add unique 约束名(字段)
删除:alter table table_name drop key 约束名
4.自动增长
添加:alter table table_name modify 列名 int auto_increment
删除:alter table table_name modify 列名 int
5.外键约束
添加:alter table table_name add constraint 约束名 foreign key(外键列)
references 主键表(主键列)
删除:
第一步:删除外键
alter table table_name drop foreign key 约束名
第二步:删除索引
alter table table_name drop index 索引名
[^1]:
约束名和索引名一样
6.默认值
添加:alter table table_name alter 列名 set default '值'
删除:alter table table_name alter 列名 drop default

9.9 HAVING
where 和having之后都是筛选条件,但是有区别的:
1.where在group by前, having在group by 之后
2.聚合函数(avg、sum、max、min、count),不能作为条件放在where之后,但可以放在having之后
SELECT Websites.name, SUM(access_log.count) AS nums FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
WHERE Websites.alexa < 200
GROUP BY Websites.name
HAVING SUM(access_log.count) > 200;
9.10 DISTINCT
mysql> select DISTINCT(name) from info;
+------+
| name |
+------+
| addd |
| adsd |
| dcj |
+------+
3 rows in set (0.00 sec)
9.11 INNER JOIN
在使用 join 时,on 和 where 条件的区别如下:
1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
9.12 LEFT /RIGHT JOIN
左表全部列出来

9.13 JOIN 总结

9.14 ANY/ALL/IN

9.15 UNOIN / intersect / minus
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table1
UNION ALL(没有ALL) 默认去重/ instersect/ minus
SELECT column_name(s) FROM table2;
9.16 子查询
9.17 Exist And No Exist


一层一层的去分析就好了,你添加not exists之后考虑一下里面要展示什么信息

9.18 UPDATE

9.19 DELETE
delete from info where age < 0;

浙公网安备 33010602011771号