0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

列表解释关系模型

数据分析与开发 来源:数据分析与开发 作者:数据分析与开发 2020-09-24 15:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

关系模型(Relational model)由 E.F.Codd 博士于 1970 年提出,以集合论中的关系概念为基础;无论是现实世界中的实体对象还是它们之间的联系都使用关系表示。我们在数据库系统中看到的关系就是二维表(Table),由行(Row)和列(Column)组成。因此,也可以说关系表是由数据行构成的集合。

关系模型由数据结构、关系操作、完整性约束三部分组成。

关系模型中的数据结构就是关系表,包括基础表、派生表(查询结果)和虚拟表(视图)。

常用的关系操作包括增加、删除、修改和查询(CRUD),使用的就是 SQL 语言。其中查询操作最为复杂,包括选择(Selection)、投影(Projection)、并集(Union)、交集(Intersection)、差集(Exception)以及笛卡儿积(Cartesian product)等。

完整性约束用于维护数据的完整性或者满足业务约束的需求,包括实体完整性(主键约束)、参照完整性(外键约束)以及用户定义的完整性(非空约束、唯一约束、检查约束和默认值)。

我们今天的主题是关系操作语言,也就是 SQL。本文使用的示例数据来源于https://blog.csdn.net/horses/article/details/86518676。

面向集合

SQL(结构化查询语言)是操作关系数据库的标准语言。SQL 非常接近英语,使用起来非常简单。它在设计之初就考虑了非技术人员的使用需求,我们通常只需说明想要的结果(What),而将数据处理的过程(How)交给数据库管理系统。所以说,SQL 才是真正给人用的编程语言! 接下来我们具体分析一下关系的各种操作语句;目的是为了让大家能够了解SQL 是一种面向集合的编程语言,它的操作对象是集合,操作的结果也是集合。

在关系数据库中,关系、表、集合三者通常表示相同的概念。

SELECT

下面是一个简单的查询语句:

SELECT employee_id, first_name, last_name, hire_dateFROMemployees; 它的作用就是从 employees 表中查询员工信息。显然,我们都知道 FROM 之后是一个表(关系、集合)。不仅如此,整个查询语句的结果也是一个表。所以,我们可以将上面的查询作为表使用:

SELECT * FROM (SELECT employee_id, first_name, last_name, hire_dateFROMemployees)t; 括号内的查询语句被称为派生表,我们给它指定了一个别名叫做 t。同样,整个查询结果也是一个表;这就意味着我们可以继续嵌套,虽然这么做很无聊。 我们再看一个 PostgreSQL 中的示例:

-- PostgreSQLSELECT * FROM upper('sql');| upper ||-------||SQL| upper() 是一个大写转换的函数。它出现再 FROM 子句中,意味着它的结果也是一个表,只不过是 1 行 1 列的特殊表。 SELECT 子句用于指定需要查询的字段,可以包含表达式、函数值等。SELECT 在关系操作中被称为投影(Projection),看下面的示意图应该就比较好理解了。

除了 SELECT 之外,还有一些常用的 SQL 子句。 WHERE 用于指定数据过滤的条件,在关系运算中被称为选择(Selection),示意图如下:

ORDER BY 用于对查询的结果进行排序,示意图如下:

总之,SQL 可以完成各种数据操作,例如过滤、分组、排序、限定数量等;所有这些操作的对象都是关系表,结果也是关系表。

在这些关系操作中,有一个比较特殊,就是分组。

GROUP BY

分组( GROUP BY)操作和其他的关系操作不同,因为它改变了关系的结构。来看下面的示例:

SELECT department_id, count(*), first_name FROM employeesGROUPBYdepartment_id; 该语句的目的是按照部门统计员工的数量,但是存在一个语法错误,就是 first_name 不能出现在查询列表中。原因在于按照部门进行分组的话,每个部门包含多个员工;无法确定需要显示哪个员工的姓名,这是一个逻辑上的错误。 所以说,GROUP BY 改变了集合元素(数据行)的结构,创建了一个全新的关系。分组操作的示意图如下:

尽管如此,GROUP BY 的结果仍然是一个集合。

UNION

SQL 面向集合特性最明显的体现就是 UNION(并集运算)、INTERSECT(交集运算)和 EXCEPT/MINUS(差集运算)。 这些集合运算符的作用都是将两个集合并成一个集合,因此需要满足以下条件:

两边的集合中字段的数量和顺序必须相同;

两边的集合中对应字段的类型必须匹配或兼容。

具体来说,UNION 和 UNION ALL 用于计算两个集合的并集,返回出现在第一个查询结果或者第二个查询结果中的数据。它们的区别在于 UNION 排除了结果中的重复数据,UNION ALL 保留了重复数据。下面是 UNION 操作的示意图:

INTERSECT 操作符用于返回两个集合中的共同部分,即同时出现在第一个查询结果和第二个查询结果中的数据,并且排除了结果中的重复数据。INTERSECT 运算的示意图如下:

EXCEPT 或者 MINUS 操作符用于返回两个集合的差集,即出现在第一个查询结果中,但不在第二个查询结果中的记录,并且排除了结果中的重复数据。EXCEPT 运算符的示意图如下:

除此之外,DISTINCT 运算符用于消除重复数据,也就是排除集合中的重复元素。

SQL 中的关系概念来自数学中的集合理论,因此 UNION、INTERSECT 和 EXCEPT 分别来自集合论中的并集(∪cup∪)、交集(∩cap∩)和差集(∖setminus∖)运算。需要注意的是,集合理论中的集合不允许存在重复的数据,但是 SQL 允许。因此,SQL 中的集合也被称为多重集合(multiset);多重集合与集合理论中的集合都是无序的,但是 SQL 可以通过 ORDER BY 子句对查询结果进行排序。

JOIN

在 SQL 中,不仅实体对象存储在关系表中,对象之间的联系也存储在关系表中。因此,当我们想要获取这些相关的数据时,需要使用到另一个操作:连接查询(JOIN)。 常见的 SQL连接查类型包括内连接、外连接、交叉连接等。其中,外连接又可以分为左外连接、右外连接以及全外连接。 内连接(Inner Join)返回两个表中满足连接条件的数据,内连接的原理如下图所示:

左外连接(Left Outer Join)返回左表中所有的数据;对于右表,返回满足连接条件的数据;如果没有就返回空值。左外连接的原理如下图所示:

右外连接(Right Outer Join)返回右表中所有的数据;对于左表,返回满足连接条件的数据,如果没有就返回空值。右外连接与左外连接可以互换,以下两者等价:

t1 RIGHT JOIN t2t2LEFTJOINt1 全外连接(Full Outer Join)等价于左外连接加上右外连接,同时返回左表和右表中所有的数据;对于两个表中不满足连接条件的数据返回空值。全外连接的原理如下图所示:

交叉连接也称为笛卡尔积(Cartesian Product)。两个表的交叉连接相当于一个表的所有行和另一个表的所有行两两组合,结果的数量为两个表的行数相乘。交叉连接的原理如下图所示:

其他类型的连接还有半连接(SEMI JOIN)、反连接(ANTI JOIN)。

集合操作将两个集合合并成一个更大或更小的集合;连接查询将两个集合转换成一个更大或更小的集合,同时获得了一个更大的元素(更多的列)。很多时候集合操作都可以通过连接查询来实现,例如:

SELECT department_id FROM departments UNIONSELECT department_idFROMemployees; 等价于:

SELECT COALESCE(d.department_id, e.department_id) FROM departments dFULLJOINemployeeseON(e.department_id=d.department_id); 我们已经介绍了许多查询的示例,接下来看看其他的数据操作。

DML

DML 表示数据操作语言,也就是插入、更新和删除。以下是一个插入语句示例:

CREATE TABLE test(id int); -- MySQL、SQL Server 等INSERT INTO test(id) VALUES (1),(2),(3); -- OracleINSERT INTO test(id)(SELECT 1 AS id FROM DUALUNION ALLSELECT 2 FROM DUALUNION ALLSELECT3FROMDUAL); 我们通过一个 INSERT 语句插入了 3 条记录,或者说是插入了一个包含 3 条记录的关系表。因为,UNION ALL 返回的是一个关系表。VALUES 同样是指定了一个关系表,在 SQL Server 和 PostgreSQL 中支持以下语句:

SELECT *FROM ( VALUES(1),(2),(3))test(id); 前面我们已经说过,FROM 之后是一个关系表,所以这里的 VALUES 也是一样。由于我们经常插入单条记录,并没有意识到实际上是以表为单位进行操作。 同样,UPDATE 和 DELETE 语句也都是以关系表为单位的操作;只不过我们习惯了说更新一行数据或者删除几条记录。

原文标题:图解 SQL,这也太形象了吧!

文章出处:【微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    789

    浏览量

    46369
  • 关系模型
    +关注

    关注

    0

    文章

    3

    浏览量

    5789

原文标题:图解 SQL,这也太形象了吧!

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    微店商品列表API,轻松采集商品列表数据

    微店商品列表API是微店开放平台提供的核心接口,主要用于获取指定店铺的商品列表数据。该接口支持分页查询、条件筛选和排序功能,适用于电商管理系统、竞品分析和多平台展示等场景。 一、接口概述 1.
    的头像 发表于 12-01 14:32 152次阅读

    调用拼多多开放平台 API 获取店铺列表

    ​  在电商平台生态开发中,获取店铺信息是常见的需求。本文将介绍如何通过拼多多开放平台的 API 接口获取店铺列表,包括接口概述、调用流程以及注意事项。 1. 接口概述 拼多多开放平台提供了
    的头像 发表于 11-10 15:30 196次阅读
    调用拼多多开放平台 API 获取店铺<b class='flag-5'>列表</b>

    产品列表获取API接口详解

    ​ 在现代软件开发中,API(应用程序编程接口)是获取产品列表的核心工具,它允许开发者从远程服务器高效地检索数据。本文将逐步介绍如何设计和使用产品列表获取API接口,包括核心概念、实现步骤、代码示例
    的头像 发表于 07-24 14:29 467次阅读
    产品<b class='flag-5'>列表</b>获取API接口详解

    《仿盒马》app开发技术分享-- 分类右侧商品列表(18)

    的切换,对应的列表都能够正常的刷新,同时也要注意数据之间的对应关系,及时的修改对应的id来帮助我们实现数据的查询。 代码实现 首先我们来实现右侧列表的展示 因为我们是用左侧列表的rig
    发表于 06-30 12:00

    FA模型和Stage模型API切换概述

    在FA模型下使用。因此在切换到Stage模型时,需要将应用中用到的FAModelOnly接口替换成Stage模型下对应的接口。下面是startAbility的接口切换示例,全量接口列表
    发表于 06-06 06:29

    从FA模型切换到Stage模型时:module的切换说明

    module的切换 从FA模型切换到Stage模型时,开发者需要将config.json文件module标签下的配置迁移到module.json5配置文件module标签下,具体差异见下列表
    发表于 06-05 08:16

    KaihongOS操作系统FA模型与Stage模型介绍

    FA模型与Stage模型介绍 KaihongOS操作系统中,FA模型(Feature Ability)和Stage模型是两种不同的应用模型
    发表于 04-24 07:27

    如何实现MC33774IC在Simulink环境中使用基于模型的设计?

    我想熟悉如何实现MC33774IC 在 Simulink 环境中使用基于模型的设计。 尽管 MATLAB 提供了一些示例文件,但它们似乎是最终版本。要更深入地了解如何配置MC33774,我正在寻找一个教程,该教程解释了如何从头开始在 Simulink 中设置和添加必要的模
    发表于 04-10 08:05

    【第二章 模型与设备连接】手把手教你玩转新版正点原子云

    首先打开原子云,将之前的透传策略删掉,因为不删掉透传策略的话是无法更换运行模式的。 2. 设备管理-&gt;模型列表-&gt;创建模型 3. 根据自己需求
    发表于 03-12 09:27

    模型领域常用名词解释(近100个)

    本文总结了大模型领域常用的近100个名词解释,并按照模型架构与基础概念,训练方法与技术,模型优化与压缩,推理与应用,计算与性能优化,数据与标签,模型
    的头像 发表于 02-19 11:49 1282次阅读
    大<b class='flag-5'>模型</b>领域常用名词<b class='flag-5'>解释</b>(近100个)

    AI大模型在汽车应用中的推理、降本与可解释性研究

    佐思汽研发布《2024-2025年AI大模型及其在汽车领域的应用研究报告》。 推理能力成为大模型性能提升的驱动引擎 2024下半年以来,国内外大模型公司纷纷推出推理模型,通过以CoT为
    的头像 发表于 02-18 15:02 1829次阅读
    AI大<b class='flag-5'>模型</b>在汽车应用中的推理、降本与可<b class='flag-5'>解释</b>性研究

    小白学解释性AI:从机器学习到大模型

    科学AI需要可解释性人工智能的崛起,尤其是深度学习的发展,在众多领域带来了令人瞩目的进步。然而,伴随这些进步而来的是一个关键问题——“黑箱”问题。许多人工智能模型,特别是复杂的模型,如神经网
    的头像 发表于 02-10 12:12 1150次阅读
    小白学<b class='flag-5'>解释</b>性AI:从机器学习到大<b class='flag-5'>模型</b>

    ADS1100的实际电压计算与输出码有什么关系

    ADS1100的实际电压计算与输出码的关系?? 求解释!可否直接用输出码套用公式? 求解释!可否直接用输出码套用公式?
    发表于 01-20 06:08

    关系型数据库和非关系型区别

    关系型数据库和非关系型数据库在多个方面存在显著差异,主机推荐小编为您整理发布关系型数据库和非关系型区别,以下是它们的主要区别。
    的头像 发表于 01-10 09:58 1436次阅读

    【「大模型启示录」阅读体验】对大模型更深入的认知

    的平衡,解释得清清楚楚,让我这个非专业人士也能明白大模型在实际应用中面临的挑战和限制,也对这些模型的复杂性和挑战有了更深的理解。 而且,书中还提到了OpenAI的成功案例和CUDA技术壁垒的形成,这些
    发表于 12-20 15:46