首页 > 数据库 >图解SQL基础知识,小白也能看懂的SQL文章!

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

时间:2024-06-02 12:32:51浏览次数:32  
标签:关系 查询 能看懂 SQL 集合 图解 数据 连接

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

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

  • 在 Unix 中,一切皆文件。
  • 在面向对象的编程语言中,一切皆对象。

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

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

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

  • 关系模型中的数据结构就是关系表,包括基础表、派生表(查询结果)和虚拟表(视图)。
  • 常用的关系操作包括增加、删除、修改和查询(CRUD),使用的就是 SQL 语言。其中查询操作最为复杂,包括选择(Selection)、投影(Projection)、并集(Union)、交集(Intersection)、差集(Exception)以及笛卡儿积(Cartesian product)等。
  • 完整性约束用于维护数据的完整性或者满足业务约束的需求,包括实体完整性(主键约束)、参照完整性(外键约束)以及用户定义的完整性(非空约束、唯一约束、检查约束和默认值)。

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

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

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

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

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

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),看下面的示意图应该就比较好理解了。

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

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

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

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

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

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

SELECT department_id, count(*), first_name
  FROM employees
 GROUP BY department_id;

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

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

分组操作的示意图如下:

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

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

在 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)。

标签:关系,查询,能看懂,SQL,集合,图解,数据,连接
From: https://blog.csdn.net/2401_84572204/article/details/139293572

相关文章

  • SQL注入攻击
    一.什么是SQL注入分类:可回显的注入和不可回显的注入以及二次注入;(1)可回显的注入:可以联合查询的注入,报错注入;(2)不可回显的注入:Bool盲注,时间盲注;(3)二次注入;二.可以联合查询的SQL注入1.SQL语句中的$id变量该变量会将GET获取到的参数直接拼接到SQL语句中,如:?id=1'unionselect......
  • 【跟着例子学MySQL】学以致用 -- 综合练习
    文章目录前言回顾租赁系统数据库练习高级练习前言举例子,是最简单有效的学习方法。本系列文章以一个贯穿始终的场景,结合多个实例讲解MySQL的基本用法。❔为什么要写这个系列?模仿是最好的老师,实践是检验成果的方法。本系列以实操样例和应用场景为核心,将MySQL基本......
  • 使用Python连接到SQLite3数据库进行数据更新和删除
    SQLite3是一种轻量级的嵌入式关系型数据库管理系统,广泛应用于移动应用、嵌入式设备以及小型Web应用等场景。Python内置了对SQLite3数据库的支持,通过sqlite3模块,可以方便地连接、操作SQLite3数据库。在本文中,我们将学习如何使用Python连接到SQLite3数据库,并进行数据更新和删......
  • openeuler源码安装Postgresql 16
    准备条件OpenEuler(虚拟机):版本:22.03-LTS-SP3下载地址:https://www.openeuler.org/zh/download/PostgreSQL:版本:16.3源码包下载地址:https://www.postgresql.org/ftp/source/操作系统安装安装过程与centos基本一致,此处就省略了,安装的时候可以把需要的网络工具和开发工具包勾......
  • MySQL学习——从命令行调用MySQL 程序
    从命令行(即你的shell或命令提示符)调用MySQL程序时,你需要输入程序名,后跟任何选项或其他参数,以指示程序你想要它执行什么操作。以下是一些示例程序调用的命令。在这些示例中,$> 表示你的命令解释器的提示符;它并不是你需要输入的内容。你实际看到的提示符取决于你的命令解释......
  • Spark SQL的所有语句
     SparkSQL提供了一种基于结构化数据处理的高级API,它允许使用SQL或DataFrameAPI进行数据查询和分析。以下是SparkSQL中常用的语句:创建表格:使用CREATETABLE语句创建表格,可以基于现有数据源或手动定义模式。示例:CREATETABLEtableName(col1INT,col2STRING,......
  • 面试必问:MySQL死锁 是什么,如何解决?(史上最全)
    MySQL死锁接触少,但面试又经常被问到怎么办?最近有小伙伴在面试的时候,被问了MySQL死锁,如何解决?虽然也回答出来了,但是不够全面体系化,所以,小北给大家做一下系统化、体系化的梳理,帮助大家在面试过程中能够脱颖而出,拿到自己心仪的Offer插播一条:如果你近期准备面试跳槽,建议在http:......
  • 基础—SQL—DCL(数据控制语言)之用户管理
    一、引言分类全称描述DCLDataControlLanguage(数据控制语言)用来创建和管理数据库用户以及控制数据库的访问权限 1、图解右边的是我们的 MySQL 的数据库服务器,左边是假设的两个用户  1、DCL主要控制的就是有哪些用户可以来访问这台MySQL服务器。第二个就是当It......
  • Linux上安装MySQL
    1).准备工作在安装MySQL数据库之前,我们需要先检查一下当前Linux系统中,是否安装的有MySQL的相关服务(很多linux安装完毕之后,自带了低版本的mysql的依赖包),如果有,先需要卸载掉,然后再进行安装。A.通过rpm相关指令,来查询当前系统中是否存在已安装的mysql软件包,执行指令如下:rpm-qa......
  • Navicat, PDManer,PyMySQL模块,SQL注入问题,PyMySQL进阶之主动提交事务
    ⅠNavicat【一】Navicat介绍Navicat可以充当很多数据库软件的客户端提供了图形化界面能够让我们更加快速的操作数据库【1】介绍Navicat是一款功能强大且广泛使用的数据库管理工具,可用于连接和管理多种数据库系统,如MySQL、MariaDB、Oracle、PostgreSQL等。本文将详细......