天天看点

《Oracle PL/SQL必知必会》——第1章 了解SQL

本节书摘来自异步社区出版社《oracle pl/sql必知必会》一书中的第1章,第1.1节,作者:【美】ben forta(本 福达),更多章节内容可以访问云栖社区“异步社区”公众号查看。

oracle pl/sql必知必会

在本章中,你将学习数据库和sql的相关知识,它们是学习oracle和pl/sql的前提。

你正在阅读本书的事实表明你需要以某种方式与数据库交互。因此,在深入学习oracle及其sql语言的实现(pl/sql)之前,了解一些关于数据库和数据库技术的基本概念就很重要。

无论知道与否,你事实上一直都在使用数据库。每次从电子邮件或智能手机通讯录中选择一个名字时,就是在使用数据库。当在internet搜索站点上执行搜索时,也是在使用数据库。当在工作中登录到网络时,将对照数据库验证你的名字和密码。甚至在自动取款机上使用atm卡时,同样在使用数据库,以进行pin验证和余额检查。

但是,即使我们一直都在使用数据库,对于数据库到底是什么仍然认识不清。事实的确如此,因为不同的人使用“数据库”一词来指代不同的事物。因此,一个良好的学习起点是:利用一份列表解释最重要的数据库术语。

提示:复习基本概念

 

下面简要概述了一些基本的数据库概念。如果你已经具有一些数据库使用经验,下面的内容将唤醒你的记忆;如果你是新手,那么以下内容将给你提供绝对基础的知识。理解数据库是掌握oracle的一个重要部分,你可能想要寻找一个关于数据库基本原理的优秀图书,以在需要时复习一下相关的主题。

人们以多种不同的方式使用数据库(database)这个术语,但是在我们看来,数据库是指以某种有组织的方式存储的数据集合。理解它的最简单的方式是把数据库想象成一个档案柜。档案柜只是存储数据的物理位置,而不管数据是什么以及它们是怎样组织的。

数据库

用于存储有组织的数据的容器(通常是文件或文件集)。

警告:滥用导致混淆

人们经常使用数据库(database)这个术语来指代他们正在运行的数据库软件。这是不正确的,它是大量混淆之源。数据库软件实际上被称为数据库管理系统(database management system,dbms)。数据库是通过dbms创建和操作的容器。数据库可能是存储在硬盘驱动器上的文件,但也可能不是。一般而言,这甚至是不重要的,因为你从来不会以任何方式直接访问数据库;你总是使用dbms,它会为你访问数据库。

当在档案柜中存储信息时,不会把信息简单地扔进抽屉里。相反,将在档案柜里创建文件,然后把相关的数据归档在特定的文件中。

在数据库世界里,这个文件称为表(table)。表是结构化的文件,可以存储特定类型的数据。表可能包含顾客列表、产品目录,或者其他任何信息列表。

特定类型数据的结构化列表。

这里的关键是:存储在表中的数据是一种数据类型或者一份列表。你永远不会把顾客列表和订单列表存储在同一个数据库表中。如果这样做,将使往后的检索和访问难以进行。相反,你将创建两个表,每个表用于存储一份列表。

数据库中的每个表都具有一个用于标识它的名称,这个名称总是唯一的,意味着该数据库中没有其他的表可以具有相同的名称。

注意:表名称

使表名称成为唯一的实际上是几个内容的组合,包括数据库名称和表名称。这意味着尽管不能在相同的数据库中多次使用相同的表名称,但是肯定可以在不同的数据库中重用表名称。

表具有一些特征和属性,定义了怎样在其中存储数据。它们包括一些信息,比如可能存储什么数据,如何分解它以及如何命名信息等。这个描述表的信息集称为模式(schema),模式描述了数据库内的特定表和整个数据库以及数据库内的表之间的关系(如果有的话)。

模式

关于数据库以及表布局和属性的信息。

{注意:模式还是数据库?} 偶尔也把模式(schema或schemata)用作数据库(database)的同义词。遗憾的是,通常可以从上下文来清晰得知模式要表达的意思,在本书中,模式是指上述的定义。

表由列组成,列包含表中特定的信息。

表中的单个字段。所有的表都由一列或多列组成。

理解列的最佳方式是把数据库表想象成网格,它有点像电子数据表,网格中的每一列都包含特定的信息。例如,在顾客表中,一列包含顾客编号,另一列包含顾客名字,而地址、城市、州和邮政编码都存储在它们各自的列中。

提示:分解数据

正确地把数据分解到多个列中极其重要。例如,城市、州和邮政编码应该总是存储在单独的列中。通过分解它们,就有可能按特定的列排序或筛选数据(例如,查找特定州或特定城市的所有顾客)。如果把城市和州结合进一列中,按州进行排序或筛选将极其困难。

数据库中的每一列都具有一种关联的数据类型,它定义了列中可以包含什么类型的数据。例如,如果列将包含数字(也许是订单中的商品数量),那么数据类型将是一种数值数据类型。如果列将包含日期、文本、注释、货币金额等,将使用相应的数据类型来指定它们。

数据类型

允许的数据的类型。每个表列都具有一种与之关联的数据类型,用以限制(或允许)在该列中存储特定的数据。

数据类型限制了列可以存储的数据的类型(例如,防止把字母字符输入到数值字段中)。数据类型的使用还有助于正确地排序数据,并且在优化磁盘使用方面起着重要作用。因此,在创建表时要特别注意选择适当的数据类型。

表中的数据存储在行中;保存的每条记录都存储在它自己的行中。同样,把表想象成电子数据表样式的网格,网格中的垂直列就是表列,水平行就是表行。

例如,顾客表可能每行存储一位顾客的信息。表中的行数就是其中的记录数。

表中的记录。

注意:记录或行?

你可能听到用户在提及行(row)时把它们称为数据库记录(record)。一般而言,可以互换使用这两个术语,但是行是技术上正确的术语。

表中的每一行都应该有某一列(或列集合)唯一地标识它。包含顾客信息的表可能为此使用顾客编号列,而包含订单信息的表则可能使用订单id。雇员表可能使用雇员id或雇员社会安全号(social security number)列。

主键

其值唯一地标识表中的每一行的列(或列集合)。

唯一地标识表中的每一行的这个列(或列集合)称为主键(primary key)。可以使用主键指代特定的行。如果没有主键,更新或删除表中的特定行将变得极其困难,因为没有方法可以保证受影响的行的安全。

提示:总是要定义主键

尽管主键实际上不是必需的,但是大多数数据库设计者都会确保他们创建的每个表都具有一个主键,以使得将来的数据操作是可能的并且容易管理。

可以把表中的任意列设定为主键,只要它满足以下条件即可:

任意两行都不能具有相同的主键值;

每一行都必须具有一个主键值(主键列可能不允许null值)。

提示:主键规则

这里列出的规则是由oracle自身强制执行的。

通常在表中的单独一列上定义主键。但是,这不是必需的,可以把多个列一起用作主键。当使用多个列时,前面列出的规则必须适用于组织主键的所有列,并且所有列的值组合起来必须是唯一的(单独的列不需要具有唯一的值)。

提示:主键的最佳实践

除了oracle强制执行的规则外,还应该遵守多个被普遍接受的最佳实践,包括:

不要更新主键列中的值;

不要重用主键列中的值;

不要使用主键列中可能改变的值(例如,如果使用名字作为主键来标识供应商,当供应商兼并以及更改其名字时,将不得不更改主键)。

另一种重要的键类型是外键,但是将在后面的第15章“连接表”中介绍它。