文章目录
1.简介
SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系型数据库的标准化查询语言。它是一种特定域语言(DSL),用于定义数据库结构、插入、更新、删除数据以及查询数据等操作,并不局限于数据查询。
SQL 最初由 IBM 的 Donald D. Chamberlin 和 Raymond F. Boyce 在 1970 年代初开发,作为关系数据库管理系统(RDBMS)的查询语言。随后,SQL 在 1986 年成为了 ANSI(美国国家标准学会)和 ISO(国际标准化组织)的标准,并在数据库管理领域得到广泛应用。
SQL 被标准化后,仍在不断的发展和完善,至今经历了一系列修订,加入了大量新特性。虽然有这一标准的存在,但很多数据库的实现并没有完全遵循它,大多数 SQL 代码在移植到不同的数据库系统之前需要进行一些更改。
2.组成
关系数据库管理系统使用 SQL 来存储和管理数据,系统存储多个相互关联的数据库表,如常用的 Oracle、MySQL、MS SQL Server 等。 以下是此类系统的组成成分。
- SQL 表
SQL 表是关系数据库的基本元素。 SQL 数据库表由行和列组成。 数据库工程师在多个数据库表之间创建关系以优化数据存储空间。
例如,数据库工程师为商店中的产品创建一个 SQL 表:
Product ID Product Name Color ID
0001 Mattress Color 1
0002 Pillow Color 2
然后数据库工程师将产品表链接到带有颜色 ID 的颜色表:
Color ID Color Name
Color 1 Blue
Color 2 Red
- SQL 语句
SQL 语句或 SQL 查询是关系数据库管理系统可以理解的有效指令。 软件开发人员使用不同的 SQL 语言元素构建 SQL 语句。 SQL语言元素是构成正确SQL语句的标识符、变量和搜索条件等组件。
例如,以下 SQL 语句使用 SQL INSERT 命令将价格为 499 美元的床垫品牌 A 存储到名为 mattress_table 的表中,其中列名称为brand_name 和 cost:
sql
INSERT INTO mattress_table (brand_name, cost)
VALUES('A','499');
- 存储过程
存储过程是存储在关系数据库中的一个或多个 SQL 语句的集合。 软件开发人员使用存储过程来提高效率和性能。 例如,他们可以创建一个存储过程来更新销售表,而不是在不同的应用程序中编写相同的 SQL 语句。
3.工作原理
结构化查询语言 (SQL) 的志聪过程需要经过几个软件组件,包括以下组件。
- 解析器
解析器首先将 SQL 语句中的一些单词单词化,或用特殊符号替换。然后,解析器会检查语句是否存在以下情况:
- 正确性
解析器会验证 SQL 语句是否符合 SQL 语义或规则,以确保查询语句正确性。例如,解析器会检查 SQL 命令是否以分号结尾。如果缺少分号,解析器将返回错误。
- 授权
解析器还会验证运行查询的用户是否具有操作相应数据的必要授权。例如,只有管理员用户才有权删除数据。
- 关系引擎
关系引擎或查询处理器会创建一个计划,以最有效的方式检索、写入或更新相应数据。例如,关系引擎会检查类似的查询,重用以前的数据操作方法,或创建新的方法。关系引擎以 SQL 语句的中间级表示形式(称为字节码)编写计划。关系数据库使用字节码高效地执行数据库搜索和修改。
- 存储引擎
存储引擎或数据库引擎是指处理字节码并运行预期 SQL 语句的软件组件。存储引擎会读取并存储物理磁盘存储上的数据库文件中的数据。完成后,存储引擎会将结果返回给请求应用程序。
4.五种子语言
SQL 由多种类型的语句组成,这些语句可以被非正式地归类为子语言,主要分为 5 类。
- DCL(Data Control Language)
DCL 数据控制语言,用于对数据库,数据表的访问角色和权限的控制等。
GRANT - 授权
REVOKE - 撤销授权
DENY - 拒绝授权
- DDL(Data Definition Language)
DDL 数据定义语言用于定义数据库结构,用于定义数据库的结构和模式。DDL 包括创建、修改和删除数据库对象的命令,例如表、索引、视图等。
CREATE - 创建
ALTER - 修改
DROP - 删除
TRUNCATE - 截断
RENAME - 重命名
COMMENT - 注释
- DML(Data Manipulation Language)
DML 数据操纵语言供用户对数据库中数据的操作,包括数据的增加、删除、更新,载入等操作。
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据
REPLACE INTO - 向数据库表中插入数据,如果存在先删除
LOAD - 从文件中导入数据到数据库表
- DQL(Data Query Language)
DQL 数据查询语言用以从表中获得数据,确定数据怎样在应用程序给出。 SELECT 是 DQL(也是所有 SQL)用得最多的动词。常用的关键字有:
SELECT-从数据库表中获取数据
SELECT 语句中常用关键字有:
FROM - 指定从哪个数据表或子查询中查询
WHERE - 指定查询条件
GROUP BY - 结合合计函数,根据一个或多个列对结果集进行分组
HAVING - 对分组后的结果集进行筛选
ORDER BY - 对结果集进行排序
LIMIT - 对结果集进行top限制输出
UNION - 结果集纵向联合
JOIN - 结果集横向拼接
- TCL(Transaction Control Language)
TCL 事务控制语言用于控制事务的执行。
SQL事务是数据库管理系统中的一个重要概念,它是一系列数据库操作(如插入、更新、删除等)的逻辑单元,要么全部执行成功并永久保存,要么全部失败并回滚到操作前的状态,保证数据库的数据一致性和可靠性。
TCL 命令只能与 DML 命令一起使用,例如 INSERT、DELETE 和 UPDATE 等。
BEGIN TRANSACTION 或 START- 开始事务
SAVEPOINT - 在事务中设置保存点,可以回滚到此处
ROLLBACK - 回滚
COMMIT - 提交
SET TRANSACTION -- 改变事务选项
SET CONSTRAINT - 启用或禁用外键约束
5.注释方式
SQL 注释是用来在 SQL 语句中添加对代码的解释说明。SQL 支持两种类型的注释符号。
单行注释:使用两个连续的减号(--)表示。减号后面的内容将被视为注释,直到该行结束。
sql
SELECT column1, column2
FROM table
-- This is a single-line comment
WHERE condition;
注意,MySQL 也支持使用 # 符号进行单行注释。不过 # 并不是 SQL 标准规定的注释方式,并不是所有数据库都支持。
多行注释:使用/* 注释内容*/
的格式表示。注释内容位于 /* 和 */ 之间,可以跨越多行。
sql
SELECT column1, column2
FROM table
/* This is a
multi-line comment */
WHERE condition;
6.字符串表示方式
在 SQL 标准中,字符串使用单引号(')来表示,而不是双引号(")。
但对于主流的数据库,都支持双引号表示字符串。比如 Oracle、MySQL 和 SQL Server 等。
如果字符串中包含单引号该如何表示呢?
在 SQL 中,如果要表示一个带有单引号的字符串有多种方式。
可以使用反斜杠(\)进行转移,也可以使用单引号进行转义,即使用两个单引号来表示一个单引号。
sql
SELECT 'It\'s a beautiful day';
SELECT 'It''s a beautiful day';
因为 MySQL 支持使用双引号表示字符串,所以还可以使用双引号表示一个包含单引号的字符串。
sql
SELECT "It's a beautiful day"
反之亦然,如果字符串中包含双引号,也可以使用上面三种方式来表示带有双引号的字符串。
至于使用单引号还是双引号表示字符串,我们应该首选单引号,因为这符合 SQL 标准,且是主流的做法。
参考文献
SQL - Wikipedia
What Is SQL (Structured Query Language)? - Amazon AWS