一、概述
SQL有两个重要的标准,分别是SQL92和SQL99,它们分别代表了92年和99年颁布的SQL标准。
E-R(实体-关系)图
它是我们用来描述现实世界的概念模型,在这个模型中有3个要素:实体、属性、关系。
实体就是我们要管理的对象,属性是标识每个实体的属性,关系则是对象之间的关系。
SQL的4个部分:
- DDL,英文叫做Data Definition Language,也就是数据定义语言,它用来定义我们的数据库对象,包括数据库、数据表和列。通过使用DDL,我们可以创建,删除和修改数据库和表结构。
- DML,英文叫做Data Manipulation Language,数据操作语言,我们用它操作和数据库相关的记录,比如增加、删除、修改数据表中的记录。
- DQL,英文叫做Data Query Language,数据查询语言,我们用它查询想要的记录,它是SQL语言的重中之重。在实际的业务中,我们绝大多数情况下都是在和查询打交道,因此学会编写正确且高效的查询语句,是学习的重点。
- DCL,英文叫做Data Control Language,数据控制语言,我们用它来定义访问权限和安全级别。
DB、DBS和DBMS
DBMS的英文全称是DataBase Management System,数据库管理系统,实际上它可以对多个数据库进行管理
DB的英文是DataBase,也就是数据库。
DBS的英文是DataBase System,数据库系统。它是更大的概念,包括了数据库、数据库管理系统以及数据库管理人员DBA。
DBA是数据库管理人员
SQL和NoSQL的区别
-
SQL就是关系型数据库的查询语言
-
NoSQL泛指非关系型数据库
-
键值型数据库。通过Key-Value键值的方式来存储数据,其中Key和Value可以是简单的对象,也可以是复杂的对象。
Key作为唯一的标识符,优点是查找速度快,在这方面明显优于关系型数据库,同时缺点也很明显,它无法像关系型数据库一样自由使用条件过滤(比如WHERE),如果你不知道去哪里找数据,就要遍历所有的键,这就会消耗大量的计算。键值型数据库典型的使用场景是作为内容缓存。Redis是最流行的键值型数据库。
-
文档型数据库。用来管理文档,在数据库中文档作为处理信息的基本单位,一个文档就相当于一条记录,MongoDB是最流行的文档型数据库。
-
搜索引擎。虽然关系型数据库采用了索引提升检索效率,但是针对全文索引效率却较低。搜索引擎的优势在于采用了全文搜索的技术,核心原理是“倒排索引”。常见的全文搜索引擎有Elasticsearch、Splunk和Solr。
-
列式数据库。Oracle、MySQL、SQL Server等数据库都是采用的行式存储(Row-based),而列式数据库是将数据按照列存储到数据库中,这样做的好处是可以大量降低系统的I/O,适合于分布式文件系统,不足在于功能相对有限。
-
图形数据库,利用了图这种数据结构存储了实体(对象)之间的关系。最典型的例子就是社交网络中人与人的关系,数据模型主要是以节点和边(关系)来实现,特点在于能高效地解决复杂的关系问题。
-
SQL如何执行?
首先MySQL是典型的C/S架构,即Client/Server架构,服务器端程序使用的mysqld。
MySQL由三层组成:
- 连接层:客户端和服务器端建立连接,客户端发送SQL至服务器端;
- SQL层:对SQL语句进行查询处理;
- 存储引擎层:与数据库文件打交道,负责数据的存储和读取。
其中,SQL层负责SQL的执行。SQL语句在MySQL中的流程是:SQL语句→缓存查询→解析器→优化器→执行器。
- 查询缓存:Server如果在查询缓存中发现了这条SQL语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。因为查询缓存往往效率不高(一旦数据表有更新,缓存都将清空,因此只有数据表是静态的时候,或者数据表很少发生变化时,使用缓存查询才有价值,否则如果数据表经常更新,反而增加了SQL的查询时间),所以在MySQL8.0之后就抛弃了这个功能。
- 解析器:在解析器中对SQL语句进行语法分析、语义分析。
- 优化器:在优化器中会确定SQL语句的执行路径,比如是根据全表检索,还是根据索引来检索等。
- 执行器:在执行之前需要判断该用户是否具备权限,如果具备权限就执行SQL查询并返回结果。在MySQL8.0以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。
开启在SQL执行时所使用的时间情况
select @@profiling;
set profiling=1;
SQL语句
show profile;
MySQL的存储引擎
- InnoDB存储引擎:它是MySQL 5.5版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等。
- MyISAM存储引擎:在MySQL 5.5版本之前是默认的存储引擎,不支持事务,也不支持外键,最大的特点是速度快,占用资源少。
- Memory存储引擎:使用系统内存作为存储介质,以便得到更快的响应速度。不过如果mysqld进程崩溃,则会导致所有的数据丢失,因此我们只有当数据是临时的情况下才使用Memory存储引擎。
- NDB存储引擎:也叫做NDB Cluster存储引擎,主要用于MySQL Cluster分布式集群环境,类似于Oracle的RAC集群。
- Archive存储引擎:它有很好的压缩机制,用于文件归档,在请求写入时会进行压缩,所以也经常用来做仓库。