技术分享

您当前所在的位置:首页>>技术分享

如何快速学习SQL命令

你知道吗?Oracle 11g(11g Release 2)的SQL语言参考(SQL Language Reference)一共有1522页,其中CREATE TABLE这个命令的语法图解就有20页之多,而整个命令的说明更是达到了76页!

到了Oracle 12c(12c Release 1),整个手册的页数则达到1824页,CREATE TABLE命令的语法图解是21页,整个命令的说明则达到87页!Oracle语法是如此繁杂,简直让人望而却步!

你可能会说,我知道啊!我看过这个手册,而且CREATE TABLE 这个命令其实还不是最复杂的,最复杂的命令是ALTER TABLE,12c中占据了103页的篇幅,其中语法图解就有34页!

对,如果你知道,那说明你蛮厉害,你对Oracle的SQL语法不陌生。

可是如果我告诉你,在Oracle 版本7中,CREATE TABLE和ALTER TABLE这两个命令的语法图解都不足一页!你会不会感到惊讶?

选择了Oracle,就得去面对它繁杂的语法文档。但是一个人的精力是有限的,要想又快又好地掌握Oracle语法,就得讲究方式方法了。

《Oracle SQL命令通解三步曲》将引领大家从Oracle基本概念入手,了解某个早期版本语法命令,而后逐步了解各版本新增命令,从而建立起一个SQL命令的完整视图。


第一步:了解Oracle基本概念

SQL语法与Oracle基本概念紧密相关,在为数众多的SQL命令中,大部分命令是围绕Oracle基本概念设计的。比如CREATE TABLE、ALTERTABLE、DROP TABLE这三个命令,围绕TABLE(表)这个概念来设计,用于定义TABLE的结构。类似的SQL命令还有很多很多。所以我们要掌握SQL命令,首先应理解Oracle的基本概念。

让我们从关系数据库最基本、同时也是最核心的概念开始,分析几个Oracle基本概念的由来及含义。

首先,为了在数据库中存放数据,Oracle定义了表。表是数据的集合,由行和列组成。

当一个表很大的时候(包含成千上万的行),为了提升数据检索的速度,Oracle引入了索引。索引是实现数据高效检索的基础,也是SQL调优的最基本手段。

表中包含行,不同的行代表不同的实体。行不允许相同,否则无法代表不同实体,这就是实体的完整性约束。为了实现完整性约束,Oracle引入了序列:序列用来在整个数据库范围内产生唯一的顺序编号。

关系数据库的基本目的是在不同的用户间共享数据。表级别的授权无法实现行粒度和列粒度的权限管理,为此Oracle引入了视图。视图对表的行和列进行帅选,实现了行粒度和列粒度的权限管理目的。

有时我们要频繁地从多个表检索数据。各个表的数据默认存放到不同的段中,这意味着要到不同的数据块获取数据。为了加快检索速度,Oracle把若干个表的行存放到相同的数据块,这就是簇。簇提高了多表关联的性能,Oracle内部的数据字典表设计就用到了簇。

有了表、索引、序列和视图之后,Oracle把这些对象聚合在一起,形成数据库。表和索引之类的东西最终会存放到磁盘,其存在形式就是数据库文件。

让我们思考一个问题:如果定义表时,直接把表关联到文件会有什么问题?答案很明显:如果数据文件位置发生变化,就得修改表的定义。为了解决此问题,Oracle引入了表空间。表空间是多个文件的集合,实现了数据库的逻辑表现与数据存储的分离,使之更易于管理。

大机构的数据很多,通常会分散到不同的数据库中。为了在不同数据库之间访问彼此的数据,Oracle引入了数据库链接。数据库链接是不同数据库间互相访问的通道。

如果应用程序访问了多个数据库,当某个库的部署发生变动时,如何避免对应用程序的代码做更改呢?和表空间类似,Oracle引入了同义词来解决该问题。同义词是模式对象的别名,提供了数据独立性和位置透明性的功能。

上述概念是Oracle早期版本就具有的。在后续各个版本中,Oracle不断补充新概念,功能不断增强,Oracle数据库管理系统就像一棵树一样茁壮成长,枝繁叶茂。

上面简单地引出了几个Oracle基本概念,对于概念本身的阐述只是点到为止,未做深入解释。为了准确理解这些概念,我们看看Oracle是如何定义这些概念的:

表(table):Basic unit of data storage in Oracle Database. Data in tables is storedin rows and columns.
索引(index):Optional schema object associated with a nonclustered table, tablepartition, or table cluster. In some cases indexes speed data access.
序列(sequence):A schema object that generates a serial list of unique numbers for tablecolumns.
视图(view):A custom-tailored presentation of the data in one or more tables. Theviews do not actually contain or store data, but derive it from the tables onwhich they are based.
簇(cluster):Optional structure for storing table data. Clusters are groups of one ormore tables physically stored together because they share common columns andare often used together. Because related rows are physically stored together,disk access time improves.
数据库(database):Organized collection of data treated as a unit. The purpose of adatabase is to store and retrieve related information. Every Oracle databaseinstance accesses only one database in its lifetime.
表空间(tablespace):A database storage unit that groups related logical structures together.The database data files are stored in tablespaces.
数据库链接(database link):A named schema object that describes a pathfrom one database to another. Database links are implicitly used when areference is made to a global object name in a distributed database.
同义词(synonym):An alias for a schema object. You can use synonyms to provide dataindependence and location transparency.
注:以上内容来自Oracle手册《DatabaseConcepts》。

要注意的是,应结合实际例子来理解这些概念,而不能只停留在文字上。Oracle在不同版本中对某个概念的定义可能不同,若想透彻理解其本质,应仔细阅读《Database Concepts》相关内容。很多DBA反复阅读该文档,就是为了把握概念的本质。


第二步:了解Oracle版本6的SQL命令

事物的发展是循序渐进的,因此认识事物也应如此。
为了全面了解SQL命令,我们从Oracle版本6开始,构建一个最初的SQL命令清单,然后不断扩充其内容。

Oracle将SQL命令按功能分为六大类:
(1)数据定义语言命令(Data Definition Language commands,简称DDL命令)
(2)数据操纵语言命令(Data Manipulation Language commands,简称DML命令)
(3)事务控制命令(Transaction Control commands)
(4)会话控制命令(Session Control commands)
(5)系统控制命令(System Control commands)
(6)嵌入式SQL命令(EmbeddedSQL commands)
其中,DDL命令又分为如下细类:
• 对象的创建、修改与删除相关命令(create, alter, and drop objects)
• 授权、权限回收以及角色管理相关命令(grant and revoke privileges and roles)
• 表、索引及簇统计信息分析命令(analyze information on a table, index, orcluster)
• 数据库安全审计相关命令(establish auditing options)
• 数据库对象备注相关命令(add comments to the data dictionary)

首先看DDL命令。
还记得我们前面介绍的那些Oracle基本概念吗?这些概念对应了如下27个DDL命令:


上述命令的含义无须过多解释,大家一看自明。
值得关注的是,为什么没有DROP DATABASE、ALTER DATABASE LINK、ALTERSYNONYM、CREATE USER和DROP USER这些命令呢?
我猜测,Oracle一开始不提供DROP DATABASE命令的原因,是觉得这个命令过于危险;不提供ALTER DATABASE LINK和ALTER SYNONYM这两个命令,是因为数据库链接和同义词本身结构简单,没有修改的必要;而不提供CREATE USER和DROP USER命令的原因,是早期的Oracle采用系统用户登录的方式(和DB2类似)。(注意:Oracle在后续版本中陆续补充了CREATE USER,DROP USER, DROP DATABASE和ALTER DATABASE LINK这些命令。)
与授权及权限回收相关的DDL命令有2个:GRANT和REVOKE。前者用于授权,后者用于收回权限。
与数据库安全审计相关的DDL命令也有2个:AUDIT (Traditional Auditing)和NOAUDIT(Traditional Auditing),前者用于开启审计,后者用于取消审计。
COMMENT命令用于给数据库对象添加备注,RENAME命令用于重命名数据库对象,二者亦为DDL命令。

再看DML命令:
版本6中提供了如下6个DML命令:
• INSERT、UPDATE、DELETE三个命令用于插入、修改及删除表中的行;
• SELECT命令用于从表中检索行;
• LOCKTABLE命令以显式的方式给表和视图加锁;
• EXPLAINPLAN命令用于查看Oracle优化器预期的执行计划。
剩下5个命令是事务控制和会话控制命令:
(1)COMMIT、ROLLBACK、SAVEPOINT和SETTRANSACTION这4个命令用来控制事务
(2)ALTER SESSION命令用于控制会话。
(注意,Oracle版本6中还没有系统控制命令,该命令在Oracle版本7中首次出现)

至此,我们构建了一个Oracle版本6的命令清单:


第三步:了解Oracle各版本新增SQL命令

Oracle从版本6到目前最新的版本12c,期间经历了:版本7,版本8,版本8i,版本9i,版本10g,版本11g,每一次版本发布都出现了或多或少的新命令,下面逐一介绍。

Oracle 版本7新增SQL命令
版本7引入了众多新概念及相关SQL命令,包括过程化SQL、触发器、安全管理、对象管理、系统控制等一共30个新命令。

Oracle版本8新增SQL命令
版本8引入了目录、库、物化视图、类型等概念及18个相关命令。


Oracle8i新增SQL命令
8i版本引入了上下文、维度、Java、统计信息等概念以及18个相关命令。


Oracle 9i新增SQL命令
9i版本引入了服务器参数文件的概念,新增了3个命令。

Oracle 10g新增SQL命令
10g版本引入了ASM磁盘组以及闪回数据库的概念及9个相关新命令。

Oracle 11g新增SQL命令
11g版本引入了闪回数据归档及模式对象多版本的概念,以及相关的7个命令。


Oracle 12c新增SQL命令
12c版本为了支撑软件即服务的应用模式,提供了多租户架构的数据库支撑,引入可插拔式数据库的概念以及相关的安全审计策略,包含了10个新增命令。


至此,我们简单介绍了Oracle各个版本引入的关键概念,并通过这些概念来把握相关的SQL命令,从而对整个SQL命令体系有了大致了解。


上一篇:实验—BGP的十三条选路

下一篇:调整Exchange接收连接器延迟参数解决SMTP代发送邮件问题