从编程语言的视角来看,SQL是一种强大而灵活的语言,具有嵌套特性,允许用户以高效且简洁的方式与数据库进行交互。通过SQL,用户可以轻松地对数据库中的数据进行CRUD等操作,从而满足各种数据处理需求。
1. SQL 的基本原理
作为一种高级的非过程化编程语言,SQL允许用户在高层数据结构上工作,无需用户指定对数据的存放方法或了解具体的数据存放方式。无论底层数据库系统的结构如何不同,都可以使用相同的SQL作为数据输入与管理的接口,与多种数据库程序协同工作,如MS Access、DB2、MS SQL Server、Oracle、MySQL、PG等数据库系统。
SQL的基本原理主要包括如下特点:
- 数据结构:SQL基于关系模型,数据被组织成表格的形式,每个表格由行和列组成。每行代表一个记录,每列代表一个属性。这种表格结构使得数据的存储、查询和处理变得方便和高效。
- 查询语言:SQL提供了一种丰富的查询语言,用户可以通过编写SQL语句来对数据库进行操作。SQL语句可以根据用户的需要进行组合和嵌套,以实现复杂的查询和操作。
- 声明式编程:采用声明式编程范式,用户只需指定所需的结果,而无需指定如何获得这些结果。这意味着用户只需关注查询的逻辑,而不必关心具体的实现细节。数据库系统会根据用户的查询语句,自动选择最优的执行计划来获取数据。
- 数据独立性:支持数据的物理独立性和逻辑独立性。物理独立性是指数据的存储结构与应用程序相互独立,逻辑独立性是指数据的逻辑结构与应用程序相互独立。这种独立性使得数据库的设计和维护更加灵活和方便。
2. SQL 的基本语句
一般地, 我们可以将SQL 语句/命令分成5类:
图片
根据数据对象实体的不同,常见的28个SQL 语句如下:
常见的SQL 语句汇总后如下图所示(来自 Brij Kishore Pandey):
图片
3. 关于JOIN
JOIN用于根据两个或多个表之间的列之间的关系,从这些表中查询数据。它允许用户将不同表中的相关数据连接起来,从而形成一个更完整和有意义的数据集。
图片
JOIN基于表之间的关联键进行连接操作。这些关联键将不同的表联系在一起,使得相关的数据能够被准确地组合在一起。在涉及两个或多个表时,用户可以同时查询多个表中的数据,从而获得更广泛和深入的结果。JOIN提供了多种连接类型,如INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN等。这些连接类型允许用户根据不同的需求和数据关系选择适当的连接方式。
在使用JOIN时,用户可以指定需要选择的列,并应用筛选条件,以进一步细化查询结果。这样可以确保只返回感兴趣的数据,并提高查询效率。其操作可能会涉及大量的数据,因此在使用时需要考虑性能因素。合理的索引设计、查询优化和数据库设计可以提高JOIN操作的性能。
图片
简而言之,JOIN是用于关联和查询多个表中数据的重要工具,提供了灵活的连接方式和查询选项,能够满足多种数据处理和分析的需求。
5. 关于UNION
在SQL中,JOIN和UNION是两种不同的操作,尽管都用于合并和处理数据,但在使用方式和结果上存在一些重要的区别。
- 操作方式:JOIN操作是将两个或多个表基于它们之间的关系连接起来,它依赖于表之间的关联键。而UNION操作则是将两个或多个查询结果集组合成一个结果集。
- 结果展示:JOIN操作的结果是生成一个新的表,该表包含连接表的所有匹配行。相比之下,UNION操作的结果是将各个查询结果集合并成一个结果集,不会生成新的表。
- 列数和数据类型:JOIN操作连接表的列数和数据类型必须匹配,因为它是在表的列之间进行连接。然而,UNION操作要求所有查询结果集的列数和数据类型必须相同,因为UNION是在查询结果集之间合并数据。
- 重复值处理:UNION操作中,默认会删除重复的结果行,只保留唯一的行。如果需要包含重复的行,可以使用UNION ALL操作。而JOIN操作不会自动删除重复的行,可能会返回重复的结果,除非使用DISTINCT关键字。
使用UNION 的3种典型用法:
简单而言,JOIN是用于连接表,而UNION是用于合并查询结果集。
6. 视图与临时表
视图是一种虚拟表,它提供了一种简化和安全的数据访问方式。而临时表是真实存在的表,它们用于暂存数据,通常在复杂的数据库操作中使用。
视图可以简化复杂的SQL查询,提供清晰且易于使用的接口。视图是虚拟的,它不存储实际的数据,只是对底层表的查询结果的引用。视图提供了一种安全机制,因为用户只能通过视图访问特定的数据,而不能直接访问底层表。另外,视图可以嵌套,即一个视图可以引用另一个视图,这使得数据结构更清晰和模块化。可以通过“create view view_name 查询语句”创建视图,然后就可以通过与表查询类似的方式查询数据了。
临时表是用于在数据库操作中暂存数据的表,例如用在多步骤的数据转换过程中。临时表是真实存在的表,它们存储实际的数据。临时表具有临时性,它们会在会话结束或连接关闭后自动删除,因此它们不适合存储需要长期保存的数据。可以通过“CREATE TEMPORARY TABLE temptablename”创建临时表,然后就可以通过与表查询类似的方式操作数据了。因此,通常用于存储中间结果或临时数据,这样可以提高复杂查询的性能和效率。
7. 常见技巧
建立并使用索引
在WHERE子句中使用的列和JOIN子句中的使用列上创建索引,这样可以加快数据检索,索引是为了允许快速检索数据页而组织的。
CREATE INDEX 索引名 ON 表名 (列名);
使用查询计划
通过在实际执行查询之前运行EXPLAIN命令,我们可以检查数据库引擎如何执行查询,并确定任何潜在的性能瓶颈。查询执行计划提供了对数据库检索请求数据所需步骤的深入了解,包括使用哪些索引,如何过滤、排序和连接数据。
EXPLAIN SELECT 语句
使用查询缓存
如果同一查询多次运行,则可以使用缓存将结果保存在内存中,以加快查询的执行时间。Enable query caching SET SESSION querycachetype = ON;SET SESSION querycachesize = 缓存大小; SELECT /*+ SQL_CACHE */ column1, column2, ... FROM tablename WHERE 条件;
使用事务
事务是作为单个工作单元执行的一系列操作。事务用于确保对数据库的一组相关更改同时执行或根本不执行。例如,如果在两个银行账户之间转账,需要确保从一个账户提款和向另一个账户存款作为一笔交易一起执行。如果其中一个操作失败,则需要回滚整个事务,以确保数据保持一致状态。
事务确保了数据库的一致性和完整性,提供了并发控制和恢复机制。以下是SQL中使用事务的一般步骤:
需要注意的是,事务的使用取决于数据库管理系统(DBMS)的支持和具体的SQL方言。上述步骤提供了一般的指导,但具体的语法和机制可能会因不同的DBMS而有所差异。
8.小结
SQL是处理数据的强大工具,可以创建有效的查询来检索所需的数据。可以说,SQL是数据工程的基础,熟悉SQL使工作更有效率,更易于维护,并提供在现代数据驱动的工作场所中所需的技能。
9. 画外音
SQL是处理关系型数据的有效方式, 但是,数据库系统的类型确实有很多,在什么场景使用怎样的数据库系统呢?下图给出了一个简要的指南。