【MySQL自学之路】第2天——关系代数计算【理论知识】

news2024/11/19 11:21:20

目录

前言

基础名词

关系

候选码

关系运算

传统的集合计算(二目运算)

样例表创建【SQL】

专门的关系运算

后记

销毁已经创建的表


前言

在上一节我们提到了关系型数据库和非关系型数据库之间的关系,我们主要以MySQL关系型数据库为主展开。关系模型是建立在集合代数的基础上的,我们从集合论的角度给出关系数据结构的形式化的定义。

注:博客内标蓝色背景的是教材原话,黄色背景的是博主自己理解的加注,绿色背景的为引用。


基础名词

关系

定义:

D1xD2xD3x...xDn的子集叫做在域D1、D2、...、Dn上的关系,表示为 R(D1,D2,...,Dn) 

这里R是关系的名字,n是关系的或者。 

n目关系必有n种属性。

这里的D不是属性,只是R中的元素,属性是D的再分。

例如:R(AB,B,BC),属性是A、B、C

候选码

某一属性组的值能够唯一地标识一个元组,而其子集不能,则称该属性组为候选码

上句话的意思是关系R里面的每一个属性或者元素都可以用候选码推出。

候选码的属性称为主属性。

不包含在候选码里面的属性称为非主属性。


关系运算

注:每一种关系运算均可以用SQL语句来实现。

传统的集合计算(二目运算)

(1)并

R ∪ S = {t | t ∈ R ∨ t ∈ S}

(2)差

R - S = {t | t ∈ R ∧ t  S} 

(3)交

R ∩ S = {t | t ∈ R ∧ t ∈ S}

R ∩ S = R -(R - S)

(4)笛卡儿积

R x S = {tr ts | tr ∈ R ∧ ts ∈ S}

例如:R(a,b)  S(c,d)

R x S = {(a, c),(a, d),(b, c),(b, d)}

其中(a,c)等也成为元组,该元组中a、c分别叫做该元组的分量。

样例表创建【SQL】

(1)创建数据库sqlstudy

(2)在数据库sqlstudy下面创建表students

(3)students表内有sno、sname、sage三个字段

(4)现保存两位同学的信息:('123456789','aaa',12),('111111111', 'bbb', 13)

create database sqlstudy;

use sqlstudy;

create table students(
sno char(9) primary key,
sname char(20),
sage int
);

insert
into students
values('123456789','aaa',12);

insert
into students
values('111111111', 'bbb', 13);

select * from students;

注:这里的SQL不用记,只是方便演示效果,SQL语句后面会逐一讲解。

专门的关系运算

(1)选择

选择又称为限制。它是在关系R中选择满足给定条件的诸元组。

δF(R) = {t | t ∈ R ∧ F(t)='真'}

其中F表示选择条件,它是一个逻辑表达式,取逻辑值“真”或“假”。

例如:查询所有年龄大于10岁的学生。

 δ sage > 10 (students)

SQL语句:

select *
from students
where sage > 10;

总结 :
选择是找出满足条件的所有学生的所有信息。 是行查询操作。

(2)投影

关系R上的投影是从R中选择出若干属性列组成新的关系。投影操作是从列的角度进行的运算。

ПA(R) = {t[A] | t ∈ R} 

例如:查询学生关系students中都有哪些人(姓名)。

 Пsname(students)

SQL语句:

select sname
from students;

 总结 :

投影操作是从列的角度进行的运算。

(3)连接

连接也称为θ连接。它是从两个关系的笛卡尔积中选取属性间满足一定条件的元组。

θ为“=”的连接运算称为等值连接。

自然连接:

两个关系中进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉。

自然连接是一种特殊的等值连接。

总结:

连接是建立在多张数据库表的基础上。通过连接可以将多张表的数据通过共同的字段进行拼接,且拼接后的表去掉了重复字段的称为自然连接。

SQL语句:

create table homes
(
sno char(9) primary key,
shome char(20)
);

insert
into homes
values('123456789','hahaha');

insert
into homes
values('111111111', 'xixixi');

select *
from homes, students
where homes.sno=students.sno;

  

以上情况是两个表的数据正好一一对应,如果此时我再向表中再加入一个数据:

insert
into homes
values('222222222', 'lalala');

select * 
from homes;

此时在做连接:

select *
from homes, students
where homes.sno=students.sno;

注:可以看到新加入的一行数据并没有在连接里面出现,因为students表里面并没有这个学生的信息。 我们把这个被舍弃的元组(一行数据)称为悬浮元组。

悬浮元组:

两个关系R和S在做自然连接时,选择两个关系再公共属性上值相等的元组构成新的关系。此时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了。这些被舍弃的元组称为悬浮元组。

外连接:

如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(NULL),那么这种连接就叫做外连接。 

左外连接:

只保留左边关系R的悬浮元组,其他地方写空值。

右外连接:

只保留右边关系S的悬浮元组,其他地方写空值。

注:SQL可以通过outer join on等关键字实现外连接来保留悬浮元组,详细内容会在之后的章节在说明。这里只做大概的说明。

(4)除运算

设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性以及值,且T的元组与S的元组的所有组合都在R中。

R ÷ S = {tr[X] | tr ∈ R ∧ Пy(S) Yx} 

其中Yx为x在R中的象集

注:

(1)除是同时从行和列角度进行运算的。 

(2)交、连接、除均可以用并、差、笛卡尔积、选择和投影这五种基本运算来表达,通常我们在计算除法的时候都会将其转换为基本运算式。

从集合论上进行举例:

R
ABC
a1b1c2
a2b3c7
a3b4c6
a1b2c3
a4b6c6
a2b2c3
a1b2c1
S
BCD
b1c2d1
b2c1d1
b2c3d2
R ÷ S
A
a1

计算步骤:

(1)找到公共属性列(B、C)

(2)计算关系R里面不是公共属性列(A)的所有取值(a1,a2,a3,a4)。

(3)分别计算步骤(2)得到结果的象集 :

        a1象集:{(b1,  c2),(b2, c3),(b2, c1)}

        a2象集:{(b3, c7),(b2, c3)}

        a3象集:{(b4, c6)}

        a4象集:{(b6, c6)}

(4)计算S在(B,C)上的投影:{(b1, c2),(b2, c1),(b2, c3)}

(5)因为a1的象集  S在(B,C)上的投影,故结果为a1。

从SQL语句上进行举例:(通过SQL语句实现除法运算会涉及部分新的知识点在后面,可以先看后面的章节,再回来学习SQL的除法运算)

R(X,Y)

S(Y,Z)

select distinct R.X from R R1
where not exists
( 
    select S.Y from S
    where not exists
    ( 
        select * from R R2
        where R2.X=R1.X and R2.Y=S.Y 
    ) 
);

后记

销毁已经创建的表

drop table homes;

drop table students;

注:这里销毁已经创建的表是为了之后的章节可以独立于之前的章节,避免小伙伴们找不到例题中的表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11月更新 | Visual Studio Code Python

我们很高兴地宣布,2022年11月发布的适用于 Visual Studio Code Python 和 Jupyter 扩展现已推出! 此版本包括以下改进: 迁移 isort 扩展 Pylance 默认关闭自动导入 Pylint 和 flake8 扩展 用于笔记本单元调试的“Just My Code” 如果您有…

STL常用排序算法、替换算法、拷贝算法(20221207)

STL的常用算法 概述&#xff1a; 算法主要是由头文件<algorithm> <functional> <numeric> 组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;涉及比较、交换、查找、遍历等等&#xff1b; <functional>定义了一些模板类&#xff0…

《Linux运维实战:Centos7.6一键离线部署mongodb4.2.23副本集群》

一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&#xff0c;而作为基础组件中的mongodb针对不同的客户环境需要多次部署&#xff0c;作为一个运维工程师&#xff0c;提升工作效率也是工作中的重要一环。所以我觉得有必要针对mongodb4…

window+deepin双系统安装

说明 参考教程&#xff1a;https://baijiahao.baidu.com/s?id1662960328855347503 特别注意&#xff0c;最好用最新的PE工具&#xff0c;我用的 微PE。因为我弄过一次全盘安装&#xff0c;导致整个硬盘在PE工具中的diskgenius无法识别&#xff0c;最终为U盘安装最新版PE工具后…

中国唯一代表!阿里第三次当选Java全球管理组织最高管理席位

12月7日消息&#xff0c;近日&#xff0c;Java全球管理组织JCP披露了最高执行委员会&#xff08;JCP-EC&#xff09;新成员名单&#xff0c;作为唯一中国代表&#xff0c;阿里巴巴再次连任&#xff0c;任期两年。这是阿里连续三次入选JCP最高管理席位&#xff0c;代表着中国技术…

SpringBoot全局异常@ExceptionHandler无法精确匹配问题分析

这个是我的全局异常处理类&#xff0c;以new ThirdException&#xff08;JSON.toJSONString(obj)&#xff09;形式抛出了这个自定义异常&#xff0c;不管从最底层的方法抛出上层不抛&#xff0c;还是从controller的入口开始都抛出&#xff0c;均无法精确匹配。下面分别是自定义…

云原生底座之上,企业如何借力领跑数字化转型?

导语 | 随着数字化转型的加速&#xff0c;越来越多企业选择“乘云而上”&#xff0c;把云战略提升到了全新的高度&#xff0c;并逐步朝着多云架构加速演进。云原生架构的持续迭代&#xff0c;使得云原生技术的应用层出不穷&#xff0c;无论是互联网公司&#xff0c;还是银行、政…

阿里高工熬夜18天码出Java150K字面试宝典,却遭Github全面封杀

大家都知道&#xff0c;现在的Java面试是越来越难了&#xff01;主要原因无非是两个&#xff1a; 随着Java这个行业的兴起&#xff0c;不管是在家待业的、对自己现在工作不满意的、大学选错专业的、缺钱的、想自己学的等等这些人绝大部分都是选择了去学习Java&#xff01;大量人…

(附源码)SSM驾校考试车预约管理系统 毕业设计

SSM驾校考试车预约管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中…

数据库主从复制,读写分离,分库分表理解 (数据库架构演变)

主从复制 主从复制, 主要是针对MySQL数据库的高可用性, 容灾性上面. 是叫做高可用性? 高可用性可以简单的理解为容灾性, 稳定性, 针对故障&#xff0c;风险情况下的处理, 备案, 策略. 指系统无中断地执行其功能的能力&#xff0c;代表系统的可用性程度 高可用性通常…

FFmpeg手撕视频(Android端)

前言 FFmpeg是非常强大的音视频处理工具&#xff0c;我们可以使用它来处理视频合成、剪辑、加特效等等操作。 官方文档至上 FFmpeg的官方文档 FFmpeg的官方文档命令真的是太多太多&#xff0c;而且都是英文&#xff0c;感觉精通完这些命令&#xff0c;都够学一门新语言了&#…

SpringSecurity实现登录和自定义权限认证

介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean&#xff0c;充分利用了Spring IoC&#xff0c;DI和AOP&#xff08;面向切面编程&#xff09;功能&#xff0c;为应用系…

怎么看l2接口十档行情?

怎么看l2接口十档行情&#xff1f;打开任意个股&#xff0c;在盘口即可查看买一至买十&#xff0c;卖一至卖十。Level行情1只能看五档报价&#xff0c;但是五档报价看起来很平静&#xff0c;但是主力很可能会在五档报价之外悄悄布局。使用Level2接口&#xff0c;你可以看到10档…

python制作刮刮乐惊喜揭秘呀~【趣味代码】

前言 大家早好、午好、晚好吖 ❤ ~ 在今天&#xff0c;在我百般无聊的时候&#xff0c;突然发现一存货 于是&#xff0c;我把从犄角旮旯里翻出来的代码一运行 嘿&#xff0c;真不错~那在这里就分享给大家 素材 首先我们准备一些图片以及一首下载好的音乐&#xff08;游戏音…

C++ 数学与算法系列之认识格雷码

1. 前言 程序中所涉及到的任何数据&#xff0c;计算机底层均需转换成二进制数值后方可存储&#xff0c;这个过程也称为编码。反之&#xff0c;把底层二进制数据转换成应用数据称为解码&#xff0c; 不同的数据类型需要不同的编&#xff08;解&#xff09;码方案&#xff0c;如…

论文投稿指南——中国(中文EI)期刊推荐(第2期)

&#x1f680; EI是国际知名三大检索系统之一&#xff0c;在学术界的知名度和认可度仅次于SCI&#xff01;&#x1f384;&#x1f388; 【前言】 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊。其中&#xf…

基于jsp+ssm闲置图书分享平台系统-计算机毕业设计

项目介绍 本闲置图书管理系统主要包括系统图书交换模块、图书分享管理模块、图书借阅管理模块、新闻公告管理模块、图书类别管理、图书信息管理、登录模块、和退出模块等多个模块,采用目前最流行的B/S结构和java中流行的MVC三层设计模式和eclipse编辑器、MySQL 数据库设计并实…

代码提速100倍,怎么实现的?

众所周知&#xff0c;Python的简单和易读性是靠牺牲性能为代价的 尤其是在计算密集的情况下&#xff0c;比如多重for循环。不过现在&#xff0c;大佬胡渊鸣说了&#xff1a; 只需import 一个叫做“Taichi”的库&#xff0c;就可以把代码速度提升100倍&#xff01; 不信&…

VTK - vtkPolyData数据的Remesh

欢迎加入我的VTK社区 雪易VTK社区-CSDN社区云 前言&#xff1a;在研究3-matic软件中smooth Edge和Local Smoothing功能时&#xff0c;先对数据的网格进行了重新的划分&#xff0c;即3-matic软件中的Remesh功能。本博文主要针对Remesh进行展开。 目录 网格质量 vtkMeshQuali…

【JavaScript】ESLint 深入浅出

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 初体验安装lint配置.eslintrc.js忽略文件package.json中添加eslint脚本2️⃣ vscode中使用插件安装作用3️⃣ 规避报错问题行添加注释问题文件开头添加注释修改配置文件.eslintrc.js4️⃣ 常见错误汇总Cannot read property nam…