图解SQL基础知识,小白也能看懂的SQL文章


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


在计算机龄域有许多伟大的设计理念和思想,例如:
  •  Unix 中,一切皆文件

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


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


01

关系模型

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

eaf717703c24790defd7b5eca416c2e0.jpeg

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


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

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

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

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


02

面向集合

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

接下来我们具体分析一下关系的各种操作语句;目的是为了让大家能够了解 SQL 是一种面向集合的编程语言,它的作对象是集合,操作的结果也是集合
在关系数据库中,关系、表、集合三者通常表示相同的概念。

03

SELECT

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

SELECT employee_id, first_name, last_name, hire_date
   FROM employees;
它的作用就是从 employees 表中查询员工信息。
显然,我们都知道 FROM 之后是一个表(关系、集合)。不仅如此,整个查询语句的结果也是一个表
所以,我们可以将上面的查询作为表使用:
SELECT *
   FROM ( SELECT employee_id, first_name, last_name, hire_date
           FROM employees) t;
括号内的查询语句被称为派生表,我们给它指定了一个别名叫做 t。同样,整个查询结果也是一个表;这就意味着我们可以继续嵌套,虽然这么做很无聊。
我们再看一个 PostgreSQL 中的示例:
-- PostgreSQL
SELECT *
   FROM  upper( 'sql');
| upper |
| -------|
| SQL |
upper() 是一个大写转换的函数。它出现再 FROM 子句中,意味着它的结果也是一个表,只不过是 1 行 1 列的特殊表
SELECT 子句用于指定需要查询的字段,可以包含表达式、函数值等。SELECT 在关系操作中被称为投影(Projection),看下面的示意图应该就比较好理解了。
aebba2160b34100e407fe2c4b11e6ade.jpeg
除了 SELECT 之外,还有一些常用的 SQL 子句。
WHERE 用于指定数据过滤的条件,在关系运算中被称为选择(Selection),示意图如下:
ba88defc733e0cef0b49852631552b01.jpeg
ORDER BY 用于对查询的结果进行排序示意图如下:
cd2f93e1ea673679aa3008302b43afc7.jpeg
总之,SQL 可以完成各种数据操作,例如过滤、分组、排序、限定数量等;所有这些操作的对象都是关系表,结果也是关系表
ad1e445b73314fd5a2eac2dea4f3d26c.jpeg
在这些关系操作中,有一个比较特殊,就是分组。

04

GROUP BY

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

05

UNION

SQL 面向集合特性最明显的体现就是:
  • UNION(并集运算)

  • INTERSECT(交集运算)

  • EXCEPT/MINUS(差集运算)


这些集合运算符的作用都是 将两个集合并成一个集合, 因此需要满足以下条件:
  • 两边的集合中字段的数量和顺序必须相同;

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


具体来说,UNION 和 UNION ALL 用于计算两个集合的并集,返回出现在第一个查询结果或者第二个查询结果中的数据。
它们的区别在于 UNION排除了结果中的重复数据,UNION ALL保留了重复数据。
下面是 UNION 操作的示意图:
595130c01d359056e97b41db04e03509.jpeg
INTERSECT 操作符用于返回两个集合中的共同部分,即同时出现在第一个查询结果和第二个查询结果中的数据,并且排除了结果中的重复数据
INTERSECT 运算的示意图如下:
c6fb36a9e7f02aa4f679b68183875ea3.jpeg
EXCEPT 或者 MINUS 操作符用于返回两个集合的差集,即出现在第一个查询结果中,但不在第二个查询结果中的记录,并且排除了结果中的重复数据
EXCEPT 运算符的示意图如下:
8ac8acea13ba2b5696c6b8ffe42730d0.jpeg
除此之外,DISTINCT 运算符用于消除重复数据,也就是排除集合中的重复元素。
SQL 中的关系概念来自数学中的集合理论,因此 UNION、INTERSECT 和 EXCEPT 分别来自集合论中的并集(∪\cup∪)、交集(∩\cap∩)和差集(∖\setminus∖)运算。
需要注意的是,集合理论中的集合不允许存在重复的数据,但是 SQL 允许。因此,SQL 中的集合也被称为多重集合(multiset);多重集合与集合理论中的集合都是无序的,但是 SQL 可以通过 ORDER BY 子句对查询结果进行排序。

06

JOIN

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

常见的 SQL连接查类型包括内连接外连接交叉连接等。其中,外连接又可以分为左外连接、右外连接以及全外连接。
内连接(Inner Join)返回两个表中满足连接条件的数据,内连接的原理如下图所示:
ca48f39a17a245ffa5a64379140a0895.jpeg
左外连接(Left Outer Join)返回左表中所有的数据;对于右表,返回满足连接条件的数据;如果没有就返回空值。
左外连接的原理如下图所示:
fa0f92f09ffb5464d16fd7371c05a27e.jpeg
右外连接(Right Outer Join)返回右表中所有的数据;对于左表,返回满足连接条件的数据,如果没有就返回空值。右外连接与左外连接可以互换以下两者等价:
t1  RIGHT JOIN t2
t2  LEFT JOIN t1
全外连接(Full Outer Join)等价于左外连接加上右外连接,同时返回左表和右表中所有的数据;对于两个表中不满足连接条件的数据返回空值。
全外连接的原理如下图所示:
02340e6e90473468c29ffb74bfafd54c.jpeg
交叉连接也称为笛卡尔积(Cartesian Product)。两个表的交叉连接相当于一个表的所有行和另一个表的所有行两两组合,结果的数量为两个表的行数相乘
交叉连接的原理如下图所示:
c9a44fe77a188027f498d4b55d8b0928.jpeg
其他类型的连接还有半连接(SEMI JOIN)、反连接(ANTI JOIN)。


集合操作将两个集合合并成一个更大或更小的集合;连接查询将两个集合转换成一个更大或更小的集合,同时获得了一个更大的元素(更多的列)。很多时候集合操作都可以通过连接查询来实现,例如:
SELECT department_id
   FROM departments
  UNION
SELECT department_id
   FROM employees;
等价于:
SELECT  COALESCE(d.department_id, e.department_id)
   FROM departments d
   FULL  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 语句也都是以关系表为单位的操作;只不过我们习惯了说更新一行数据或者删除几条记录。

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

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

相关文章

Element-plus中tooltip 提示框修改宽度——解决方案

tooltip 提示框修改宽度方法&#xff1a; 在element中&#xff0c;想要设置表格的内容&#xff0c;超出部分隐藏&#xff0c;鼠标悬浮提示 可以在el-table 上添加show-overflow-tooltip属性 同时可以通过tooltip-options配置提示信息 如下图代码 <el-tableshow-overflo…

【git技巧】什么是 .gitkeep

.gitkeep 文件的作用 就是——使 Git 保留一个空文件夹&#xff01; Git 是一个文件追踪系统&#xff0c;这也导致了 Git 的设计初衷是对文件进行追踪&#xff0c;所以&#xff0c;Git 不会追踪一个空目录。 但是&#xff0c;在某些情况下&#xff0c;我们确实是需要保留一些…

Grafana集成prometheus(2.Grafana安装)

查找镜像 docker search grafana下载指定版本 docker pull grafana/grafana:10.0.1启动容器脚本 docker run -d -p 3000:3000 --namegrafana grafana/grafana:10.0.1查看是否启动 docker ps防火墙开启 检查防火墙3000端口是否开启 默认用户及密码 admin/admin 登录 ht…

无涯教程-Perl - last 语句函数

当在循环内遇到 last 语句时&#xff0c;循环立即终止&#xff0c;程序控制在循环后的下一条语句处恢复。您可以为LABEL提供最后一个语句&#xff0c;其中LABEL是循环的标签。 last 语句可以在嵌套循环内使用&#xff0c;如果未指定LABEL&#xff0c;则该语句将适用于最近的循环…

SpringBoot实现数据库读写分离

SpringBoot实现数据库读写分离 参考博客https://blog.csdn.net/qq_31708899/article/details/121577253 实现原理&#xff1a;翻看AbstractRoutingDataSource源码我们可以看到其中的targetDataSource可以维护一组目标数据源(采用map数据结构)&#xff0c;并且做了路由key与目标…

HCIP---OSPF的优化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.汇总&#xff1a; 目的&#xff1a;减少骨干区域的LSA的更新量 作用&#xff1a;OSPF的…

CI/CD—Docker初入门学习

1 docker 了解 1 Docker 简介 Docker 是基于 Go 语言的开源应用容器虚拟化技术。Docker的主要目标是build、ship and run any app&#xff0c;anywhere&#xff0c;即通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;达到应用组件级别的一次封装、到处运…

阿里云安全组设置

简介​ 云主机安全组必须打开如下端口&#xff1a; ssh&#xff1a;22http&#xff1a;80https&#xff1a;443ftp&#xff1a;21、20000&#xff5e;30000 阿里云安全组端口开放教程​ 腾讯云安全组端口开放教程​ 华为云安全组端口开放教程​

一些网络知识总结(自用)

一些网络知识总结&#xff08;自用&#xff09; 1. 进制的转换 所有进制转换成十进制就是把字面值*权数 比如16进制 5AEF 转成10机制话就是 1* 151614321064 * 5 2. ip地址网段的概念&#xff0c;可用ip&#xff0c;广播地址 比如一个ip为10.1.1.1/24那么他的网络号就是前…

vue2 el-carousel轮播图和文字一起改变

vue项目的话 安装一下element依赖 npm i element-ui -S在main入口文件引入element包 我在app文件里边去写的 <template><div class"w"><el-carousel height"460px"><el-carousel-item v-for"item in items" :key"i…

优化|当机器学习上运筹学:PyEPO与端对端预测后优化

分享者&#xff1a;唐博 编者按&#xff1a;​ 这篇文章我想要写已经很久了&#xff0c;毕竟“端对端预测后优化”&#xff08;End-to-End Predict-then-Optimize&#xff09;正是我读博期间的主要研究方向&#xff0c;但我又一直迟迟没能下笔。想说自己杂事缠身&#xff08;实…

PCL点云处理之最小二乘空间直线拟合(3D) (二百零二)

PCL点云处理之最小二乘空间直线拟合(3D) (二百零二) 一、算法简介二、实现代码三、效果展示一、算法简介 对于空间中的这样一组点:大致呈直线分布,散乱分布在直线左右, 我们可采用最小二乘方法拟合直线,更进一步地,可以通过点到直线的投影,最终得到一组严格呈直线分布…

npm install报错 -> npm ERR! Unexpected token ‘.‘ 报错解决办法

问题原因&#xff1a; 用nvm1.1.7的版本安装了16.x以上的node, 然后再下载依赖的时候就报错了&#xff1b;总结一下就是nvm版本太低了&#xff0c;他的里面没有集成高版本node导致的。 解决办法&#xff1a; 把nvm切换到新版本就行了。 1. 卸载掉当前所有的node nvm unins…

[每日习题]第一个只出现一次的字符 小易的升级之路——牛客习题

hello,大家好&#xff0c;这里是bang___bang_&#xff0c;本篇记录2道牛客习题&#xff0c;第一个只出现一次的字符&#xff08;简单&#xff09;&#xff0c;小易的升级之路&#xff08;简单&#xff09;&#xff0c;如有需要&#xff0c;希望能有所帮助&#xff01; 目录 1️…

COMSOL SMS结构模拟简要步骤

做光纤传感方向的朋友们在日常的工作与学习中都想对你自己的结构进行一个仿真与模拟&#xff0c;以用于验证自己的思路与想法&#xff0c;又或者是在平时的文章中加入模拟以丰富自己的工作使得文章显得更加饱满&#xff0c;但又苦于在光纤传感方向的comsol案例、资料比较少&…

Appium+Python3环境搭建,其实超简单!

appium可以说是做app最火的一个自动化框架&#xff0c;它的主要优势是支持android和ios&#xff0c;另外脚本语言也是支持java和Python。略懂Python&#xff0c;所以接下来的教程是appiumpython&#xff0c;自己搭建环境的时候&#xff0c;按照某些博客安装遇到各种奇葩问题&am…

UE4 Cesium for unreal 离线加载应用全流程

参考配置&#xff1a;Win10、请保证是在局域网环境下配置 配置IP 右键选择&#xff1a;打开“网络和Internet” 设置 选择更改适配器选项 请保证以太网是处于启用状态并连接线缆&#xff0c;点击右键选择属性 双击选择Internet协议版本4&#xff08;TCP/IPv4&#xff09; 将IP地…

【雕爷学编程】MicroPython动手做(31)——物联网之Easy IoT

1、物联网的诞生 美国计算机巨头微软(Microsoft)创办人、世界首富比尔盖茨&#xff0c;在1995年出版的《未来之路》一书中&#xff0c;提及“物物互联”。1998年麻省理工学院提出&#xff0c;当时被称作EPC系统的物联网构想。2005年11月&#xff0c;国际电信联盟发布《ITU互联网…

常用消息中间件对比

Kafka 1.基于Pull的模式来处理消息消费 2.追求高吞吐量 3.一开始的目的就是日志收集和传输 4.0.8版本开始支持复制&#xff0c;不支持事务&#xff0c;对消息的重复、丢失、错误没有严格要求、适合产生大量数据的互联网服务的数据收集业务. RabbitMQ RabbitMQ是使用Erlang语…

Grafana集成prometheus(1.Prometheus安装)

下载docker镜像 docker pull prom/prometheus docker pull prom/node-exporter启动 node-exporter 该程序用以采集机器内存等数据 启动脚本 docker run -d -p 9100:9100 prom/node-exporter ss -anptl | grep 9100启动截图 prometheus 启动脚本 # 3b907f5313b7 为镜像i…