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

news2024/12/28 1:59:53

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

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

  • Unix 中,一切皆文件

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

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

01 关系模型

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

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

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

  • 常用的关系操作包括增加删****除修改查询(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),看下面的示意图应该就比较好理解了。

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

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

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

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

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

04 GROUP BY

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

SELECT department_id, count(*), first_name
  FROM employees
 GROUP 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_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 语句也都是以关系表为单位的操作;只不过我们习惯了说更新一行数据或者删除几条记录。

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

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

点击免费领取《CSDN大礼包》:Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取

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

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

相关文章

mybatis_使用注解开发

第一步&#xff1a;使用注解写一个接口 Select("select * from user")List<User> getUsers(); 第二步&#xff1a;绑定接口 第三步&#xff1a;测试 官方提示&#xff1a; 使用注解来映射简单语句会使代码显得更加简洁&#xff0c;但对于稍微复杂一点的语句&…

Spring AOP (面向切面编程)原理与代理模式—实例演示

一、AOP介绍和应用场景 Spring 中文文档 (springdoc.cn) Spring | Home 官网 1、AOP介绍&#xff08;为什么会出现AOP &#xff1f;&#xff09; Java是一个面向对象&#xff08;OOP&#xff09;的语言&#xff0c;但它有一些弊端。虽然使用OOP可以通过组合或继承的方…

使用网络 IP 扫描程序的原因

随着网络不断扩展以满足业务需求&#xff0c;高级 IP 扫描已成为网络管理员确保网络可用性和性能的关键任务。在大型网络中扫描 IP 地址可能具有挑战性&#xff0c;这些网络通常包括具有动态 IP、多个 DNS、DHCP 配置和复杂子网的有线和无线设备。使用可提供全面 IP 地址管理 &…

哈尔滨的全年平均气温和降水特点

哈尔滨全年平均气温和降水特点 哈尔滨是我国最靠北的省会城市&#xff0c;冬季那边特别冷&#xff0c;但夏季比较凉爽&#xff0c;下面根据中国气象台的1981-2010年的统计数据[1]&#xff0c;分析哈尔滨全年平均气温和降水的特点有以下几点&#xff1a; 1.全年最高气温在7月&…

ubuntu18.04安装autoware1.15

目录 前言一、准备工作1.安装autoware1.152.安装依赖3.把src/autoware/common/autoware_build_flags/cmake文件夹下的CUDA版本改为11.4&#xff08;或者你电脑上的版本&#xff09; 二、解决报错错误类型1错误类型2错误类型3错误类型4错误类型5错误类型6 前言 本文参考链接&am…

如何降低TCP在局域网环境下的数据传输延迟

以Ping为例。本案例是一个测试题目&#xff0c;只有现象展示&#xff0c;不含解决方案。 ROS_Kinetic_26 使用rosserial_windows实现windows与ROS master发送与接收消息_windows 接收ros1 消息 什么是ping&#xff1f; AI&#xff1a; ping是互联网控制消息协议&#xff08;…

数学建模-预测模型 神经网络

设置测试集&#xff0c;算sse&#xff0c;进行过拟合检验

无涯教程-jQuery - jQuery.get( url, data, callback, type )方法函数

jQuery.get(url&#xff0c;[data]&#xff0c;[callback]&#xff0c;[type])方法使用GET HTTP请求从服务器加载数据。 该方法返回XMLHttpRequest对象。 jQuery.get( url, [data], [callback], [type] ) - 语法 $.get( url, [data], [callback], [type] ) 这是此方法使用的…

电动汽车市场的减速,正在让小鹏汽车付出代价

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;由于价格压力上升、竞争加剧和需求减弱&#xff0c;小鹏汽车的交付量出现了明显下滑&#xff0c;6月份的交付量已经同比下降了43%。 &#xff08;2&#xff09;小鹏汽车对2023年…

ancos注册中心、网关和静态化freemarker、对象存储服务MinIO

1、docker安装ancos ①&#xff1a;docker拉取镜像 docker pull nacos/nacos-server:1.2.0②&#xff1a;创建容器 docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8848 nacos/nacos-server:1.2.0③&#xff1a;访问地址&#xff1a;http://192…

【论文阅读】The Deep Learning Compiler: A Comprehensive Survey

论文来源&#xff1a;Li M , Liu Y , Liu X ,et al.The Deep Learning Compiler: A Comprehensive Survey[J]. 2020.DOI:10.1109/TPDS.2020.3030548. 这是一篇关于深度学习编译器的综述类文章。 什么是深度学习编译器 深度学习&#xff08;Deep Learning&#xff09;编译器将…

getInputStream has already been called for this request 问题记录

问题背景 HttpServletRequest.getReader() HttpServletRequest.getInputStream() 不能在过滤器中读取一次二进制流&#xff08;字符流&#xff09;&#xff0c;又在另外一个Servlet中读取一次&#xff0c;即一个InputSteam(BufferedReader)对象在被读取完成后&#xff0c;将无…

FPGA XDMA 中断模式实现 PCIE3.0 AD7606采集 提供2套工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案AD7606数据采集和缓存XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程1--BRAM缓存6、vivado工程2--DDR4缓存7、上板调试验证8、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&am…

全方位支持图文和音视频、100+增强功能,Facebook开源数据增强库AugLy

Facebook 近日开源了数据增强库 AugLy&#xff0c;包含四个子库&#xff0c;每个子库对应不同的模态&#xff0c;每个库遵循相同的接口。支持四种模态&#xff1a;文本、图像、音频和视频。 最近&#xff0c;Facebook 开源了一个新的 Python 库——AugLy&#xff0c;该库旨在帮…

Error: unknown flag: --export 【k8s,kubernets报错】

报错情况如下&#xff1a; [rootk8smaster ~]# kubectl get deploy nginx -oyaml --export > my2.yaml Error: unknown flag: --export See kubectl get --help for usage.原因&#xff1a; --export在所使用的版本中已被移除 解决&#xff1a;去除--export即可&#xff0c…

基于Javaweb实现ATM机系统开发实战(十五)退卡和转账跳转实现

首先创建一个servlet接受和处理请求&#xff1a; package com.atm.servlet;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException;//用户退出 WebServlet("/logout") public class ExitServlet ex…

14、php面向对象3(final、显示调用父类构造方法、static静态变量与方法)

1、如果父类中的方法被声明为 final&#xff0c;则子类无法覆盖该方法。如果一个类被声明为 final&#xff0c;则不能被继承。 <?php class BaseClass{public function test(){echo "BaseClass::test() called".PHP_EOL;}final public function moreTesting(){e…

使用CRM进行数据分析的四大好处

使用CRM数据分析系统够帮助企业更好地了解客户需求和行为习惯&#xff0c;提供个性化的服务&#xff0c;从而提高客户满意度和忠诚度。使用CRM数据分析系统可以为企业带来一些好处&#xff0c;包括提高客户洞察力、加强营销策略、提高运营效率等。 1.提高客户洞察力&#xff1a…

【C++ 重要知识点总结】进制与编码

1 进位计数 数制 2进制----字面量0b8进制----字面量010进制—无16进制0x-字面量0x 数制转化 r进制数转化成十进制 I a n − 1 r n − 1 ⋯ a 0 r 0 I a_{n-1}\times r^{n-1} \cdots a_0 \times r^0 Ian−1​rn−1⋯a0​r0十进制整数转化r进制数——除r取余法 I r…

日志系统:一条SQL更新语句是如何执行的

知识粗粮 为什么mysql 8 把缓存给取消了&#xff1f;&#xff08;在这里我不咋说&#xff0c;很简单&#xff0c;自己去百度&#xff09; mysql 可以回复到半个月内的任意一秒的状态 sql的执行链路&#xff08;8把查询缓存彻底给搞掉了呜呜呜&#xff09; 进入正题 下面我们从…