百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

在SQL中:一切皆关系_所有的sql语句

moboyou 2025-03-02 23:37 64 浏览

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

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

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

关系模型

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

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

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

数据结构

在关系模型中,用于存储数据的逻辑结构称为关系(Relation);对于使用者而言,关系就是二维表(Table)。

以下是一个员工信息表,它和 Excel 表格非常类似,由行(Row)和列(Column)组成。

在不同的场景下,大家可能会听到关于同一个概念的不同说法。在此,我们列出了关系数据库中的一些常见概念:

  • 关系,也称为表,用于表示现实世界中的实体(Entity)或者实体之间的联系(Relationship)。举例来说,一个公司的员工、部门和职位都是实体,分别对应员工信息表、部门信息表和职位信息表;销售的产品和订单都是实体,同时它们之间存在联系,对应订单明细表。
  • 行,也称为记录(Record),代表了关系中的单个实体。上图中工号为 4 的数据行存储了“诸葛亮”的相关信息。关系(表)可以看作是由行组成的集合。
  • 列,也称为字段(Field),表示实体的某个属性。上图中的第二列包含了员工的姓名。表中的每个列都有一个对应的数据类型,常见的数据类型包括字符类型、数字类型、日期时间类型等。

有了关系结构之后,就需要定义基于关系的数据操作。

操作集合

常见的数据操作包括增加(Create)、查询(Retrieve)、更新(Update)以及删除(Delete),或者统称为增删改查(CRUD)。

其中,使用最多、也最复杂的操作就是查询,具体来说包括选择(Selection)、投影(Projection)、并集(Union)、交集(Intersection)、差集(exception)以及笛卡儿积(Cartesian product)等。我们将会介绍如何使用 SQL 语句完成以上各种数据操作。

为了维护数据的完整性或者满足业务需求,关系模型还定义了完整性约束。

完整性约束

关系模型中定义了三种完整性约束:实体完整性、参照完整性以及用户定义完整性。

  • 实体完整性是指表的主键字段不能为空。现实中的每个实体都具有唯一性,比如每个人都有唯一的身份证号;在关系数据库中,这种唯一标识每一行数据的字段称为主键(Primary Key),主键字段不能为空。每个表可以有且只能有一个主键。
  • 参照完整性是指外键参照的完整性。外键(Foreign Key)代表了两个表之间的关联关系,比如员工属于某个部门;因此员工表中存在部门编号字段,引用了部门表中的部门编号字段。对于外键引用,被引用的数据必须存在,员工不可能属于一个不存在的部门;删除某个部门之前,也需要对部门中的员工进行相应的处理。
  • 用户定义完整性是指基于业务需要自定义的约束。非空约束(NOT NULL)确保了相应的字段不会出现空值,例如员工一定要有姓名;唯一约束(UNIQUE)用于确保字段中的值不会重复,每个员工的电子邮箱必须唯一;检查约束(CHECK)可以定义更多的业务规则。例如,薪水必须大于 0 ,字符必须大写等;默认值(DEFAULT)用于向字段中插入默认的数据。

存储引擎(Storage Engine)是 MySQL 中用于管理、访问和修改物理数据的组件,不同的存储引擎提供了不同的功能和特性。从 MySQL 5.5 开始默认使用 InnoDB 存储引擎,支持事务处理(ACID)、行级锁定、故障恢复、多版本并发控制(MVCC)以及外键约束等。

关系数据库使用 SQL 作为访问和操作数据的标准语言。现在,让我们来直观感受一下 SQL 语句的特点。

语法特性

SQL 是一种声明性的编程语言,语法接近于自然语言(英语)。通过几个简单的英文单词,例如 SELECT、INSERT、UPDATE、CREATE、DROP 等,完成大部分的数据库操作。以下是一个简单的查询示例:

SELECT emp_id, emp_name, salaryFROM employeeWHERE salary > 10000ORDER BY emp_id;

它查询员工表(employee)中月薪(salary)大于 10000 的员工,返回工号、姓名以及月薪,并且按照工号进行排序。可以看出,SQL 语句非常简单直观。

以上查询中的 SELECT、FROM 等称为关键字(也称为子句),一般大写;表名、列名等内容一般小写;分号(;)表示语句的结束。SQL 语句不区分大小写,但是遵循一定的规则可以让代码更容易阅读。

SQL 是一种声明式的语言,声明式语言的主要思想是告诉计算机想要什么结果(what),但不指定具体怎么做。这类语言还包括 HTML、正则表达式以及函数式编程等。

面向集合

对于 SQL 语句而言,它所操作的对象是一个集合(表),操作的结果也是一个集合(表)。例如以下查询:

SELECT emp_id, emp_name, salaryFROM employee;

其中 employee 是一个表,它是该语句查询的对象;同时,查询的结果也是一个表。所以,我们可以继续扩展该查询:

SELECT emp_id, emp_name, salaryFROM (SELECT emp_id, emp_name, salaryFROM employee) dt;

我们将括号中的查询结果(取名为 dt)作为输入值,传递给了外面的查询;最终整个语句的结果仍然是一个表。

SQL 中的查询可以完成各种数据操作,例如过滤转换、分组汇总、排序显示等;但是它们本质上都是针对表的操作,结果也是表。

不仅仅是查询语句,SQL 中的插入、更新和删除都以集合为操作对象。我们再看一个插入数据的示例:

CREATE TABLE t(id INTEGER);-- 适用于 MySQL、SQL Server 以及 PostgreSQLINSERT INTO t(id)VALUES (1), (2), (3);

我们首先使用 CREATE TABLE 语句创建了一个表,然后使用 INSERT INTO 语句插入数据。在执行插入操作之前,会在内存中创建一个包含 3 条数据的临时集合(表),然后将该集合插入目标表中。由于我们通常一次插入一条数据,以为是按照数据行进行插入;实际上,一条数据也是一个集合,只不过它只有一个元素而已。

Oracle 不支持以上插入多行数据的语法,可以使用下面的插入语句:

-- 适用于 OracleINSERT INTO t(id)SELECT 1 FROM DUALUNION ALLSELECT 2 FROM DUALUNION ALLSELECT 3 FROM DUAL;

UNION ALL 是 SQL 中的并集运算,用于将两个集合组成一个更大的集合。此外,SQL 还支持交集运算(INTERSECT)、差集运算(EXCEPT)以及笛卡儿积(Cartesian product)。我们会在第 18 篇中介绍这些内容,它们也都是以集合为对象的操作。

我们已经介绍了 SQL 语言的声明性和面向集合的编程思想。在正式学习编写 SQL 语句之前,还需要进行一些准备工作,主要就是安装示例数据库。

示例数据库

在学习过程中,我们主要使用一个虚构的公司数据模型。该示例数据库包含 3 个表:员工表(employee)、部门表(department)和职位表(job)。以下是它们的结构图,也称为实体-关系图(Entity-Relational Diagram):

  • 部门表(department),包含部门编号(deptid)和部门名称(deptname)字段,主键为部门编号。该表共计 6 条数据。
  • 职位表(job),包含职位编号(jobid)和职位名称(jobtitle)字段,主键为职位编号。该表共计 10 条数据。
  • 员工表(employee),包含员工编号(empid)和员工姓名(empname)等字段,主键为员工编号,部门编号(deptid)字段是引用部门表的外键,职位编号(jobid)字段是引用职位表的外键,经理编号(manager)字段是引用员工表自身的外键。该表共计 25 条数据。

我们在 GitHub 上为大家提供了示例表和初始数据的创建脚本和安装说明,支持 Oracle、MySQL、SQL Server 以及 PostgreSQL。点击链接进行下载。

运行这些脚本之前,需要先安装数据库软件。网络上有很多这类安装教程可以参考;如果无法安装数据库,也可以使用这个免费的在线 SQL 开发环境:http://sqlfiddle.com,它提供了各种常见的关系数据库服务。下图是使用 MySQL 运行示例脚本的结果:

选择数据库之后,将创建表和插入数据的脚本复制到左边窗口,点击“Build Schema”进行初始化;点击“Browser”可以查看表结构;在右侧窗口输入 SQL 语句,点击“Run SQL”运行并查看结果。该工具提供的数据库不是最新版本,但是可以运行大部分的示例。

文章中所有的示例都在以下数据库版本中进行了验证:

  • Oracle database 18c
  • MySQL 8.0
  • SQL Server 2017
  • PostgreSQL 12

小结

关系模型中定义了一个简单的数据结构,即关系(表),用于存储数据。SQL 是关系数据库的通用标准语言,它使用接近于自然语言(英语)的语法,通过声明的方式执行数据定义、数据操作、访问控制等。对于 SQL 而言,一切都是关系(表)。

相关推荐

高效有趣学Excel:从入门到精通的全面教程分享

在当今这个数据驱动的时代,掌握Excel不仅是提升工作效率的利器,更是职场竞争中的一项重要技能。今天,我非常高兴地与大家分享一套全面的Excel学习教程——《高效有趣学Excel:轻松入门到精通》,这...

Excel新函数重磅来袭!告别复杂公式,效率提升200%!

“透视表终于不用点来点去了?”昨晚刷到这条留言,顺手把新表扔进365,一行=GROUPBY(部门,产品,销售额,SUM)回车,三秒出汇总,刷新按钮直接失业。那一刻,办公室空调声都显得多余。有人还在录宏...

Excel 效率神器:LET 函数入门教程,让复杂公式变简单

您是否曾经编写过又长又复杂的Excel公式,然后没过几天自己都看不懂了?或者,同一个计算在公式里重复写了无数次,不仅容易出错,修改起来更是噩梦?Excel推出的LET函数就是来解决这些痛点...

Excel多对多查询函数新手教程:从案例到实操

一、为啥要学多对多查询?举个例子你就懂!假设你是公司HR,手里有张员工技能表(如下),现在需要快速找出:"张三"会哪些技能?"Excel"技能有哪些人掌握?员工姓名...

14、VBA代码+excel内置函数,实现高效数据处理(零基础入门)

1、学习VBA的主要目的是数据处理,VBA在数据处理上展现出强大的计算实力。它不仅完美继承EXCEl内置函数的功能,还能通过编程语法实现更灵活的应用。无论是基础的加减乘除,还是复杂的统计分析、逻辑判断...

word和excel零基础学习免费视频教程,赶紧收藏,作者将转付费课

亲爱的朋友们:大家好!本人是全国计算机等级考试二级MSoffice高级应用课程的在校授课老师。本人近段时间打算将wore/excel免费分享给所有有需要的朋友。知识本身无深浅,本人知识也有限,如果讲...

excel函数从入门到精通,5组13个函数,易学易懂易用

对于职场中经常使用Excel的小伙伴们,最希望掌握一些函数公式,毕竟给数据处理带来很多方便,可以提高我们的工作效率。今天分享几组函数公式,适合于初学者,也是职场中经常用到的,下次碰到可以直接套用了。0...

Excel效率神器:LET函数入门教程,让复杂公式变简单

写公式写到想砸电脑?教你用LET把Excel公式从“迷宫”变成“小剧本”,几步看懂又好改很多人都经历过这样的窘境:花了半小时写出一条看似厉害的Excel公式,几天后再看自己都懵了,或者同样...

完全免费的Excel教程大全,适合日常excel办公和技能提升

说明微软官方的excel文档,由于网站在国外,有时打开慢,而且应用层面介绍不够详细;这里介绍一个集齐了excel各种使用方法和说明的网站;网站名称:懒人Excel网站介绍可以看到有基础教程、快捷键、函...

Excel 新函数 LAMBDA 入门级教程_excel365新增函数

LAMBDA函数的出现是Excel历史上的一次革命性飞跃。它允许用户自定义函数,而无需学习VBA等编程语言。这意味着你可以将复杂的、重复的计算逻辑封装成一个简单的、可复用的自定义函数,极大地...

Excel新函数LAMBDA入门级教程_excel新建函数

把复杂公式“变成函数”后,我在Excel上的重复工作少了一半——你也能做到我一直有一个习惯:遇到每天要重复写的复杂公式,就想把它封装起来,像调用内置函数那样去用。说实话,过去没有LAMBDA,这个想法...

Excel DROP 函数全方位教程:从基础入门到高级动态应用

上一篇我们学习了ExcelTAKE函数,今天我们来学习一下和TAKE函数相对应的DROP函数,它是Microsoft365和Excel2021中引入的一个动态数组函数。它的核心功能是从一...

学习Excel公式函数还有官方提供的教程,还是免费的!赶紧试试

首先声明,这不是广告,纯干货分享!除了学习Excel的基本操作之外,很多人都是冲着公式和函数才去找教程买教材的,这个结论应该不会有什么毛病。因为,Excel的公式函数真的很强大!现在的Excel教程可...

什么是保险员常说的“IRR”?让我们一次说明白!

买保险的时候,你是不是常听到销售抛出一些术语,比如“IRR很高哦,收益不错!”?听着挺专业,但“IRR”到底啥意思?想问又不好意思问,别急,它其实是个很简单的概念,咱们今天一次把它说明白。1,IRR...

理财型保险如何选择缴费期?_理财型保险计算方式

选择理财型保险(通常指年金险、增额终身寿险等)的缴费期,并非简单地看哪个年限短或长,而是需要结合自己的财务状况、理财目标和产品特性来综合决定。下面我将为大家详细解析不同缴费期的特点、适用人群和选择策略...