网站更新内容:请访问: https://bigdata.ministep.cn/

《数据库基础语法》1. 在SQL的世界里一切都是关系

楔子

SQL 是每个开发人员都应该掌握的,很多人可能觉得 SQL 没啥大不了的,但是说真的,SQL要是写好了,是很厉害的。下面我们来从零开始学习SQL。

基本概念

正如 Linux 中一切皆文件,Python中一切皆对象,SQL(Structured Query Language,结构化查询语言)中可以把一切都看成是关系。我们来看看一些概念:

 
关系型数据库:

关系型数据库(Relational database)是指基于关系模型的数据库。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。

 
数据结构:

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

以下是一张员工信息表,知道 Excel 的人肯定会很熟悉,因为它和 Excel 的结构非常类似,由 行(Row)和 列(Column)组成。

关系型数据库中还有一些常见的概念:

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

 
操作集合:

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

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

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

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

 
完整性约束:

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

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

另外我们说的 SQL 其实是一个工业标准,或者说它指的是操作数据库中的二维表时所使用的语言,而不同种类的关系型数据库的 SQL 也是不同的,但是它们大致都是一样的。常见的数据库一般有 MySQL、Oracle、PostgreSQL、SQL Server,我们后续介绍的 SQL,这四种数据库都支持,如果不支持,我们单独指出来。

SQL 的语法特性

SQL 是一种声明性的编程语言,语法接近于自然语言(英语)。通过几个简单的英文单词,例如 SELECT、INSERT、UPDATE、CREATE、DROP 等,来完成大部分的数据库操作。以下是一个简单的查询示例,这里只是提前感受一下 SQL,具体的语法细节我们后面会说:

SELECT emp_id, emp_name, salary
FROM employee
WHERE salary > 10000
ORDER BY emp_id;

即使没有学过 SQL 语句,但只要知道几个单词的意思,就能明白该语句的作用。它查询员工表(employee)中月薪(salary)大于 10000 的员工,返回工号、姓名以及月薪,并且按照工号进行排序。可以看出,SQL 语句非常简单直观。

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

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

SELECT emp_id, emp_name, salary
FROM employee;

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

SELECT emp_id, emp_name, salary
FROM (
         SELECT emp_id, emp_name, salary
         FROM employee
     ) as t;

我们将括号中的查询结果(取名为 t)作为输入值,传递给了外面的查询,最终整个语句的结果仍然是一个表。这种嵌套在其他语句中的查询就是子查询(Subquery),后续我们会详细介绍。

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

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

CREATE TABLE t(id INTEGER);

-- 适用于 MySQL、SQL Server 以及 PostgreSQL
INSERT INTO t(id)
VALUES (1), (2), (3);

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

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

-- 适用于 Oracle
INSERT INTO t(id)
SELECT 1 FROM DUAL
UNION ALL 
SELECT 2 FROM DUAL
UNION ALL
SELECT 3 FROM DUAL;

UNION ALL 是 SQL 中的并集运算,用于将两个集合组成一个更大的集合。此外,SQL 还支持交集运算(INTERSECT)、差集运算(EXCEPT)以及笛卡儿积(Cartesian product)。我们后面会慢慢介绍。

posted @ 2023-03-07 23:25  ministep88  阅读(102)  评论(0编辑  收藏  举报
网站更新内容:请访问:https://bigdata.ministep.cn/