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

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

时间:2023-03-07 23:36:40浏览次数:46  
标签:语句 关系 数据库 查询 语法 完整性 SQL id

楔子

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)。我们后面会慢慢介绍。

标签:语句,关系,数据库,查询,语法,完整性,SQL,id
From: https://www.cnblogs.com/ministep/p/17190172.html

相关文章

  • 《数据库基础语法》6. 日期和时间的存储与格式转换
    楔子上次我们介绍了SQL中常见的字符函数,学习了如何对文本数据进行连接、大小写转换、子串的查找和替换等处理。下面我们继续讨论常见的日期和时间函数,以及不同数据类型......
  • 《数据库基础语法》5. 什么是函数?如何利用函数提高效率
    楔子SQL语句主要的功能就是对数据进行处理和分析。为了避免重复造轮子,提高数据处理的效率,SQL为我们提供了许多标准的功能模块:函数(Function)。SQL函数是一种具有某种功......
  • MySQL timestamp类型
    MySQLTIMESTAMP简介MySQLTIMESTAMP是一种保存日期和时间组合的时间数据类型。TIMESTAMP列的格式为YYYY-MM-DDHH:MM:SS,固定为19个字符。TIMESTAMP值的范围从'1970-01-......
  • MySQL
    MySQL所有的sql语句都需要用分号结尾基本命令showdatabases;--查看所有的数据库use数据库名;--切换数据库use数据库名showtables;--查看数据库中所有的表......
  • Mysql 知识总结
    1mysql数据类型1.整数类型tinyint:1个字节(2^8)smallint:2个字节mediumint:3个字节int:4个字节bigint:8个字节2.浮点数类型float:(4个字节)1个符号位,8个指数位,23......
  • Starrocks出现Lost connection to MySQL server during query
    背景:在调度中出现这个报错,但是在后台执行的时候是成功的,每次在调度上执行6分钟即360S的时候出现了这个报错,排查后发现使用的nginx代理中设置的timeout设置的是360s,所以......
  • SQL优化
    insert优化1.批量插入2.手动提交事务3.主键顺序插入4.大批量插入数据(load)客户端连接时加入参数--local-infilemysql--local-infile-uroot-p开启全局参数......
  • 《SQL基础》16. 锁
    目录锁全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁临键锁锁锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争......
  • 连上mysql数据库了,先小发表一下
    首先我的mysql是8.0版本的,用的8版本的驱动包就连接失败找不到类,后来换成5版本的就好了。一开始我按照网上的教程,告诉我需要在子线程才能执行jdbc的连接,代码如下所示:r......
  • 关系型数据库特点
    1)数据集中控制。在文件管理方法中,文件是分散的,每个用户或每种处理都有各自的文件,这些文件之间一般是没有联系的,因此,不能按照统一的方法来控制、维护和管理。而数据库则很好......