从编程语言的视角来看,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类:
- 定义数据库的元数据格式——DDL,Data Definition Language
- 操作数据库中的数据——DML, Data Manipulation Language
- 数据权限控制——DCL,Data Control Language
- 数据事务处理——TCL,Transaction Control Lanaguae
- 数据查询:DQL : Data Query Language
图片
根据数据对象实体的不同,常见的28个SQL 语句如下:
- 建库:create database db_name
- 用库:use db_name
- 建表:create table table_name{ 列字段描述}
- 插值入表:insert into table_name values (一行记录) ...
- 查表中记录:select fieldname1,fieldname2,* from table_name
- 表中增新列:alter table table_name add 列字段描述
- 更新字段:update table_name set 列字段名= 赋值 where 条件
- 删除表中一列:alter table table_name drop column 列字段名
- 删除表中行:delete from table_name where 条件
- 删除表:drop table table_name
- 更改某一列的数据类型:alter table table_name alter column 列字段描述
- 查看特殊行:select top 百分比 percent * from table_name
- 查看特殊列:select fieldname1, fieldname2 from tablename order by columnnumber desc
- 创建临时表:select distinct fieldname1,fieldname2 into temp from tablename order by fieldname1
- 字段的字符串匹配:select * from tablename where 列字段名 like 'r%'
- 字段匹配:select * from table_name where 列字段名 in (数据列表)
- 范围搜索:select * from table_name where 列字段名 > 目标
- 判断字段是否为空:select * from table_name where 列字段名 IS NOT NULL
- 区间搜索:select * from table_name where 列字段名 between 边界下限 and 边界上限
- 计数:select count(*) as 定义别名 from table_name where 条件
- 求和/平均值:select sum/average(列字段名) as 定义别名 from table_name where 条件
- 求极值:select max/min(列字段名) as 定义别名 from table_name where 条件
- 条件过滤:select * from table_name where 条件1 group by 列字段名 having 条件2 order by 条件3
- 日期转换:SELECT CAST('2023-10-20 00:00:00.000' AS date) ;SELECT CONVERT(date,'2023-11-22 00:00:00.000')
- 条件语句:select * when case1 then result1when case2 then result2else result3from table_name where 条件
- 字符串处理:TRIM,LTRIM,RTRIM,REPLACE,Substring,LOWER,UPPER
- 查询嵌套:在 select 、from、where 中使用 select 语句
- 存储过程创建与使用:CREATE PROCEDURE procname 目标语句;exec procname 条件
常见的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种典型用法:
- 结果并集,查看包括重复的记录:select field1,field2 from tablename1 union all select field1,field2 from tablename2
- 结果交集,去重并展示相同的数据:select field1,field2 from tablename1 intersect select field1,field2 from tablename2
- 结果补集,去除相同的数据:select field1,field2 from tablename1 expect select field1,field2 from tablename2
简单而言,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中使用事务的一般步骤:
- 开始事务:使用BEGIN TRANSACTION语句开始一个新的事务。这标记了事务的起点。例如:BEGIN TRANSACTION;
- 执行数据库操作:在事务中,执行需要的数据库操作语句,如INSERT、UPDATE、DELETE等。这些语句将对数据库进行更改。例如:INSERT INTO TableName (Column1, Column2) VALUES (Value1, Value2);UPDATE TableName SET Column1 = Value1 WHERE Condition;DELETE FROM TableName WHERE Condition;
- 判断操作是否成功:根据需要,可以使用条件语句(如IF)来判断数据库操作是否成功。如果操作失败,可以选择回滚事务,撤销之前的所有更改。例如:IF @@ERROR <> 0BEGINROLLBACK TRANSACTION;RETURN;END
- 提交事务:如果数据库操作成功,并且你希望将其永久保存,使用COMMIT TRANSACTION语句提交事务。这将使事务中的所有更改永久生效。例如:COMMIT TRANSACTION;
需要注意的是,事务的使用取决于数据库管理系统(DBMS)的支持和具体的SQL方言。上述步骤提供了一般的指导,但具体的语法和机制可能会因不同的DBMS而有所差异。
8.小结
SQL是处理数据的强大工具,可以创建有效的查询来检索所需的数据。可以说,SQL是数据工程的基础,熟悉SQL使工作更有效率,更易于维护,并提供在现代数据驱动的工作场所中所需的技能。
9. 画外音
SQL是处理关系型数据的有效方式, 但是,数据库系统的类型确实有很多,在什么场景使用怎样的数据库系统呢?下图给出了一个简要的指南。