作者:不剪发的Tony老师

链接:https://blog.csdn.net/horses/article/details/104553075

本文介绍关系数据库的设计思想:在 SQL 中,一切皆关系。

在计算机龄域有许多伟大的设计理念和思想,例如:

  •  Unix 中,一切皆文件

  • 面向对象的编程语言中,一切皆对象

关系数据库同样也有自己的设计思想: SQL 中,一切皆关系。

01

关系模型

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

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

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

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

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

我们今天的主题是关系操作语言,也就是 SQL。

02

面向集合

SQL(结构化查询语言)是操作关系数据库的标准语言。SQL 非常接近英语,使用起来非常简单。它在设计之初就考虑了非技术人员的使用需求,我们通常只需说明想要的结果(What),而将数据处理的过程(How)交给数据库管理系统。所以说,SQL 才是真正给人用的编程语言!

接下来我们具体分析一下关系的各种操作语句;目的是为了让大家能够了解 SQL 是一种面向集合的编程语言,它的作对象是集合,操作的结果也是集合

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

03

SELECT

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

SELECT employee_id, first_name, last_name, hire_dateFROM employees;

它的作用就是从 employees 表中查询员工信息。

显然,我们都知道 FROM 之后是一个表(关系、集合)。不仅如此,整个查询语句的结果也是一个表

所以,我们可以将上面的查询作为表使用:

SELECT *FROM (SELECT employee_id, first_name, last_name, hire_dateFROM employees) t;

括号内的查询语句被称为派生表,我们给它指定了一个别名叫做 t。同样,整个查询结果也是一个表;这就意味着我们可以继续嵌套,虽然这么做很无聊。

我们再看一个 PostgreSQL 中的示例:

-- PostgreSQL
SELECT *FROM upper('sql');
| upper |
|-------|
| SQL |

upper() 是一个大写转换的函数。它出现再 FROM 子句中,意味着它的结果也是一个表,只不过是 1 行 1 列的特殊表

SELECT 子句用于指定需要查询的字段,可以包含表达式、函数值等。SELECT 在关系操作中被称为投影(Projection),看下面的示意图应该就比较好理解了。

除了 SELECT 之外,还有一些常用的 SQL 子句。

WHERE 用于指定数据过滤的条件,在关系运算中被称为选择(Selection),示意图如下:

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

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

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

04

GROUP BY

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

SELECT department_id, count(*), first_nameFROM employeesGROUP BY department_id;

该语句的目的是按照部门统计员工的数量,但是存在一个语法错误,就是 first_name 不能出现在查询列表中。原因在于按照部门进行分组的话,每个部门包含多个员工;无法确定需要显示哪个员工的姓名,这是一个逻辑上的错误。

所以说,GROUP BY 改变了集合元素(数据行)的结构,创建了一个全新的关系。

分组操作的示意图如下:

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

05

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 子句对查询结果进行排序。

06

JOIN

在 SQL 中,不仅实体对象存储在关系表中,对象之间的联系也存储在关系表中。因此,当我们想要获取这些相关的数据时,需要使用到另一个操作:连接查询(JOIN)

常见的 SQL连接查类型包括内连接外连接交叉连接等。其中,外连接又可以分为左外连接、右外连接以及全外连接。

内连接(Inner Join)返回两个表中满足连接条件的数据,内连接的原理如下图所示:

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

左外连接的原理如下图所示:

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

t1 RIGHT JOIN t2
t2 LEFT JOIN t1

全外连接(Full Outer Join)等价于左外连接加上右外连接,同时返回左表和右表中所有的数据;对于两个表中不满足连接条件的数据返回空值。

全外连接的原理如下图所示:

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

交叉连接的原理如下图所示:

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

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

SELECT department_idFROM departmentsUNION
SELECT department_idFROM employees;

等价于:

SELECT COALESCE(d.department_id, e.department_id)FROM departments dFULL JOIN employees e ON (e.department_id = d.department_id);

我们已经介绍了许多查询的示例,接下来看看其他的数据操作。

07

DML

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

CREATE TABLE test(id int);-- MySQL、SQL Server 等
INSERT INTO test(id) VALUES (1),(2),(3);-- Oracle
INSERT INTO test(id)
(SELECT 1 AS id FROM DUAL
UNION ALL
SELECT 2 FROM DUAL
UNION ALL
SELECT 3 FROM DUAL);

我们通过一个 INSERT 语句插入了 3 条记录,或者说是插入了一个包含 3 条记录的关系表。因为,UNION ALL 返回的是一个关系表。VALUES 同样是指定了一个关系表,在 SQL Server 和 PostgreSQL 中支持以下语句:

SELECT *
FROM (VALUES(1),(2),(3)
) test(id);

前面我们已经说过,FROM 之后是一个关系表,所以这里的 VALUES 也是一样。由于我们经常插入单条记录,并没有意识到实际上是以表为单位进行操作。

同样,UPDATE 和 DELETE 语句也都是以关系表为单位的操作;只不过我们习惯了说更新一行数据或者删除几条记录。

万水千山总是情,点个 ???? 行不行

推荐阅读:入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径量化: 定投基金到底能赚多少钱?  | 我用Python对去年800只基金的数据分析  干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|年度爆款文案1).卧槽!Pdf转Word用Python轻松搞定!2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密 4).80行代码!用Python做一个哆来A梦分身 5).你必须掌握的20个python代码,短小精悍,用处无穷 6).30个Python奇淫技巧集 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货 8).再见Python!我要学Go了!2500字深度分析!9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片点阅读原文,领AI全套资料!

太赞了!图解SQL基础知识,菜鸟也能看懂的SQL文章!相关推荐

  1. python基础一入门必备知识-python基础教程#菜鸟也能看懂的超简单入门必备知识...

    python基础语法教程 python一直是一门非常火爆的编程语言,从简洁的语法,全面的功能,也是得到许多编程萌新的重视,在刚刚接触编程不久的人来说,python就像是代码编程的入门语言,但其实想成为 ...

  2. python编程入门必备知识-python基础教程#菜鸟也能看懂的超简单入门必备知识

    python基础语法教程 python一直是一门非常火爆的编程语言,从简洁的语法,全面的功能,也是得到许多编程萌新的重视,在刚刚接触编程不久的人来说,python就像是代码编程的入门语言,但其实想成为 ...

  3. 华硕h81m一k跳线图_股票入门基础知识:你真的看懂了K线图了?【建议收藏】1...

    导言--就技术分析而言,我们应该牢记这样得一个原则:事物的后续发展常常和他们之前的表象不一致.我们自以为了解很多事实并不是事实,一些看起来显而易见的事情,有时并不是如此. 最近很多人,说,好像股市最近 ...

  4. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

  5. 数据库基础与SQL基础知识看这篇就够了!

    一.数据库简介 1. DBMS(DataBaseManagement System,数据库管理系统)和数据库数据库Schema有两种含义,一种是概念上的Schema,指的是一组DDL语句集,该语句集完 ...

  6. mysql 算子 谓词_[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

    SQL 基础知识梳理(六)-  函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为"参数",输出值称 ...

  7. oracle基础之sql基础知识

    1. sql(Structured Query Language)是关系型数据库的基本操作语言. 包括数据库查询(Data Query),数据操纵(Data Manipulation),数据定义(Da ...

  8. 原创《SQL基础知识第2版》PDF高清版,限时下载!

    内容简介 <SQL基础知识第2版>是一本为新手同学特地准备的入门文档,由公众号[SQL数据库开发]原创出品. 内容涵盖了SQL基础语法的所有内容,不仅有SQL各个语法的解释,而且还附有大量 ...

  9. Oracle PL/SQL基础知识

    Oracle PL/SQL基础知识 过程(存储过程) 过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out).通过在过程中使用输入参数,可以将数据传递到执行部分 ...

最新文章

  1. javascript操作select下拉列表框的一点小经验
  2. 图解观察托管程序线程
  3. Spring IO Platform简介及示例
  4. flink写入hive的时区问题
  5. 20172324 2018-2019-1《程序设计与数据结构》实验1报告
  6. vue 后端返回图片乱码处理方法
  7. 基于遗传算法自动化集装箱码头多载AGV调度(一)—模型搭建
  8. 4.从Paxos到Zookeeper分布式一致性原理与实践--- Zookeeper 与 Paxos
  9. 图的深度优先遍历和广度优先遍历(附例题)
  10. jeecgboot框架简介
  11. MMDetection2.XX-Backbone之ResNet源码最全解析
  12. 【DeeCamp 优秀项目详解】从零开始到 AI 技术落地,只用三周
  13. 关于网线水晶头的接法详解
  14. 关系数据库的完整性约束:实体完整性、参照完整性、用户自定义完整性
  15. pygame中display模块方法详解
  16. 【云计算】实验3:Keystone 组件
  17. [Android 性能优化系列]内存之终极篇--降低你的内存消耗
  18. SGM58031的IIC接口调试过程
  19. 计算机平面设计中职,成都中职计算机平面设计专业介绍
  20. css多重效果,css奇技淫巧—box-shadow与outline绘制多重边框效果

热门文章

  1. Multisim14.0仿真:三相半波可控整流电路
  2. java joda datetime_Joda Time项目和java8时间api
  3. webservice wsdl 转java对象
  4. MFC——EDIT空间显示内容大小限制在32K,如何解除?
  5. 腾讯自研HIDS「洋葱」后台上云架构演进实践
  6. 猎豹移动推出直播产品Live.me风靡美国
  7. 为Windows 7的winsxs文件夹瘦身,慎重。
  8. fatal error C1189: #error : Building MFC application with /MD[d]
  9. 阿童木实验校区-----少儿编程鼓励跨学科融合发展!
  10. (译)Xposed模块开发教程