《SQL 从入门到精通》专栏目录

  • 第 01 篇 和数据打交道的你,一定要学会 SQL
  • 第 02 篇 在 SQL 的世界里一切都是关系
  • 第 03 篇 使用 SELECT 语句初步探索数据库
  • 第 04 篇 通过查询条件实现数据过滤
  • 第 05 篇 如何使用 SQL 语句进行模糊查找?
  • 第 06 篇 利用 ORDER BY 对数据进行排序显示
  • 第 07 篇 如何实现排行榜和前端分页效果
  • 第 08 篇 什么是函数?如何利用函数提高数值计算的效率?
  • 第 09 篇 SQL 常见函数之文本数据处理
  • 第 10 篇 日期和时间的存储与格式转换
  • 第 11 篇 如何为 SQL 增加 IF-THEN-ELSE 逻辑,并且实现行列转换?
  • 第 12 篇 轻松完成数据报表中的汇总分析
  • 第 13 篇 按照部门或者职位进行分组统计
  • 第 14 篇 实战案例:世界银行全球 GDP 数据分析
  • 第 15 篇 小心 SQL 中的空值陷阱!
  • 第 16 篇 如何同时查询多个表中的相关数据?
  • 第 17 篇 子查询:多表查询的另一种方式
  • 第 18 篇 你知道表也能进行加减运算吗?
  • 第 19 篇 将表当作一个变量,实现递归调用和层次遍历
  • 第 20 篇 销售数据的多维度交叉分析
  • 第 21 篇 高级报表之移动分析和累计求和
  • 第 22 篇 高级报表之分类排名和环比/同比分析
  • 第 23 篇 分析股票 K 线图与检测可疑的银行转账
  • 第 24 篇 什么是 ER 图,如何进行数据库规范化设计?
  • 第 25 篇 SQL 支持哪些数据类型,使用时如何进行选择?
  • 第 26 篇 使用 DDL 管理数据库中的对象
  • 第 27 篇 使用 DML 执行数据的增删改合
  • 第 28 篇 为什么数据库事务如此重要?
  • 第 29 篇 索引一定能提高性能吗?
  • 第 30 篇 视图有哪些优缺点,什么时候使用视图?
  • 第 31 篇 该不该使用存储过程封装业务接口?
  • 第 32 篇 如何通过触发器记录和审核用户的操作?
  • 第 33 篇 什么是执行计划,如何查看执行计划?
  • 第 34 篇 了解常见 SQL 查询优化技巧
  • 第 35 篇 使用 SQL 处理 NoSQL 数据
  • 第 36 篇 在 Python 中运行 SQL 进行数据分析
  • 第 37 篇 在 Java 中使用 SQL 执行增删改查
  • 第 38 篇 动态 SQL 语句与防止 SQL 注入
  • 第 39 篇 结束语:SQL 编程的道与术

在上一篇中,我们回顾了数据库领域以及 SQL 的最新发展趋势。

本篇我们将会介绍 SQL 的基本特性以及最重要的一个编程思想:一切都是关系。让我们先来回顾一下关系数据库的几个基本概念。

关系数据库

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

数据结构

在关系模型中,用于存储数据的逻辑结构称为关系(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)用于向字段中插入默认的数据。

本专栏涉及的 4 种数据库对于这些完整性约束的支持情况如下:

数据库 非空约束 唯一约束 主键约束 外键约束 检查约束 默认值
Oracle 支持 支持 支持 支持 支持 支持
MySQL 支持 支持 支持 支持* 支持* 支持
SQL Server 支持 支持 支持 支持 支持 支持
PostgreSQL 支持 支持 支持 支持 支持 支持

* MySQL 中只有 InnoDB 存储引擎支持外键约束;MySQL 8.0.16 增加了对检查约束的支持。

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

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

SQL:一种面向集合的编程语言

本节会出现几个示例,我们还没有正式开始学习 SQL 语句,可以暂时不必理会细节。

语法特性

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

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

即使没有学过 SQL 语句,但只要知道几个单词的意思,就能明白该语句的作用。它查询员工表(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)作为输入值,传递给了外面的查询;最终整个语句的结果仍然是一个表。在第 17 篇中,我们将会介绍这种嵌套在其他语句中的查询就是子查询(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 DUALUNION ALL
SELECT 2 FROM DUALUNION ALL
SELECT 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

我们使用 DBeaver 开发工具编写所有的 SQL 语句,该工具的安装和使用可以参考我的博客文章。当然,你也可以使用自己喜欢的开发工具。

小结

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

参考文献

  • [美] Abraham Silberschatz,Henry F.Korth,S.Sudarshan 著,杨冬青,李红燕,唐世渭 译 ,《数据库系统概念(原书第6版)》,机械工业出版社,2012

第 02 篇 在 SQL 的世界里一切都是关系相关推荐

  1. Java数据库篇3——SQL

    Java数据库篇3--SQL 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库 查询和程序设计语言,用于存取数据以及查询.更新和管 ...

  2. 在网上看到和篇关于sql server 2005的性能优化篇,觉得写得很好。

    在网上看到和篇关于sql server 2005的性能优化篇,觉得写得很好. SQL Server2005扩展函数已经不是一件什么新鲜的事了,但是我看网上的大部分都是说聚合函数,例子也比较浅,那么这里 ...

  3. MySql基础篇---003 SQL之DDL、DML、DCL使用篇:创建和管理表 ,数据处理之增删改,MySQL数据类型精讲 ,约束:联合主键

    第10章_创建和管理表 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步.只有正确地 ...

  4. 02 数据库语言SQL

    02 数据库语言SQL SQL语言概述 SQL语言是集DDL.DML和DCL于一体的数据库语言,SQL语言主要由以下9个单纯引导的操作语句来构成,但是每一种语句都能表达复杂的操作请求. DDL语句引导 ...

  5. 自学python需要下载什么软件-一篇告诉你为什么人人都应该学点Python?

    一篇告诉你为什么人人都应该学点Python? 2018-06-28 20:39:45 333点赞 3620收藏 203评论 小编注:想获得更多专属福利吗?金币加成.尊享众测.专属勋章.达人福利任务你想 ...

  6. 32位mysql安装包_《MySQL 入门教程》第 02 篇 MySQL 安装

    文章来源:<MySQL 入门教程>第 02 篇 MySQL 安装 原文作者:不剪发的Tony老师 来源平台:CSDN 上一篇我们了解了什么是MySQL数据库. 本文介绍如何在 Window ...

  7. pythonselenium教程模拟鼠标和键盘_【02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!...

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第二篇博 ...

  8. python能做什么软件-一篇告诉你为什么人人都应该学点Python?

    一篇告诉你为什么人人都应该学点Python? 2018-06-28 20:39:45 333点赞 3621收藏 203评论 小编注:想获得更多专属福利吗?金币加成.尊享众测.专属勋章.达人福利任务你想 ...

  9. Sql执行平时都很快但是偶尔就会很慢

    Sql执行平时都很快但是偶尔就会很慢 记录一下在翻看MySQL技术文章的资料,觉得很不错就自己记录一下.大部分来源于网络. SQL执行变慢的原因 一条Sql执行很慢,那是每次执行都慢还是偶尔慢,简单的 ...

最新文章

  1. 在使用stl中的ifstream出错时如何快速排错?
  2. css background-image 高度自适应_每天一个CSS小技巧 - 内容元素的自适应
  3. 开源代码的使用 二次开发
  4. matlab分支定界法linprog_序列比对(二十二)——中间字符串分支定界方法中更紧的界...
  5. php curl post 下载文件,Curl提交POST请求到一个网址 如何获取返回的文件名
  6. 今日头条ocpm计费规则_今日头条广告投放推广新产品选OCPM还是CPA好?是新的计费方式吗?...
  7. matlab fread每隔,matlab 中关于fread函数的用法
  8. Android流量监控以及流量防火墙的概述
  9. AD555计算机辅助设计,震旦Aurora AD555 驱动
  10. android gson解析json
  11. 单片机MCU OTA升级技术
  12. java jconsole 远程连接_jconsole连接远程tomcat
  13. Vue 腾讯防水墙验证
  14. VirtualBox虚拟机安装
  15. ASML光刻机PK 原子弹,难度?
  16. 高精度加法(蓝桥杯)
  17. 一个双向转换火星文的玩具
  18. SM2 SM3 SM4 国密版本,基于bouncycastle 实现
  19. php mysql好学吗_零基础小白PHP开发好学吗
  20. Git上传代码报错Push rejected: Push to origin/master was rejected

热门文章

  1. 御剑系列扫描工具(五款)下载
  2. PHP从入门到精通(六)
  3. CS+查看ROM和RAM用量
  4. Spring JDBC的详解
  5. thinksnsv4.6运行php,开源微博系统ThinkSNS电脑版
  6. Ubuntu20.04 LTS装Livesuit的方法
  7. 计算机毕业设计Java高校多媒体设备报修管理系统(源码+系统+mysql数据库+lw文档)
  8. 网络变压器 网络变压器基本线路及其设计目的和侧重点
  9. 基于VUE + Echarts 实现可视化数据大屏效果展示大数据
  10. Java自学基础 面向对象(下)