SQL简介及SQL*Plus操作

2018-05-09作者:(美) 普赖斯 (Price,J.) , 著编辑:Solomon

SQL 简介

SQL 是用于访问关系数据库的标准语言。SQL 应该按字母 S-Q-L 来发音。注意:根据美国国家标准化组织(American National Standards Institute,ANSI)的规定,SQL 的正确发音是 S-Q-L,但是也常常发音为单一的单词“sequel”。SQL是在E.F. Codd博士突破性工作的基础上发展起来的,其第一个实现由IBM在20世纪70年代中期开发完成。当时IBM开展了一个称System R的研究项目,SQL就是从这个项目中诞生的。后来到 1979 年,一家当时名为RelationalSoftware Inc.的公司(也就是现在的Oracle 公司)发布了第一个商业版本的 SQL。1986 年,SQL 成为美国国家标准化组织(ANSI)的一项标准,但每个软件公司的 SQL 实现之间存在一些差异。SQL 使用一种很简单的语法,非常易于学习和使用。本章通过几个简单的例子来介绍 SQL的用法。SQL 语句可分为 5 类,简要概括如下:

● 查询语句 用于检索数据库表中存储的行。可以使用 SQL 的 SELECT 语句编写查询语句。 

● 数据操纵语言(Data Manipulation Language,DML)语句用于修改表的内容。

DML 语句有3种:

● INSERT 向表中添加行。 

● UPDATE 修改行的内容。 

● DELETE 删除行。

● 数据定义语言(Data Definition Language,DDL)语句 用于定义构成数据库的数据结构, 例如表。DDL 语句有 5 种基本类型:

● CREATE 创建数据库结构。例如,CREATE TABLE 语句用于创建表;另外一个例子是 CREATE USER,用于创建数据库用户。

● ALTER 修改数据库结构。例如,ALTER TABLE 语句用于修改表。 ● DROP 删除数据库结构。例如,DROP TABLE 语句用于删除表。

● RENAME 更改表名。

● TRUNCATE 删除表的全部内容。

● 事务控制(Transaction Control,TC)语句 用于将对行所做的修改永久性地保存,或者取消这些修改操作。TC 语句有 3 种:

● COMMIT 永久性地保存对行所做的修改。

● ROLLBACK 取消对行所做的修改。

● SAVEPOINT 设置“保存点”,可以将对行所做的修改回滚到此处。

● 数据控制语言(Data Control Language,DCL)语句用于修改数据库结构的操作权限。 DCL 语句有两种:

● GRANT 授予某个用户对指定的数据库结构的访问权限。

● REVOKE 阻止某个用户访问指定的数据库结构。

Oracle 有一个名为 SQL*Plus 的程序,使用这个程序可以输入 SQL 语句,并获取从数据库返回的结果。SQL*Plus 也可以运行包含 SQL 语句和 SQL*Plus 命令的脚本。 还有其他方法可以运行 SQL 语句,并从数据库中获取返回结果。例如,使用 Oracle Forms 和 Oracle Reports 都可以运行 SQL 语句。SQL 语句也可以嵌入在使用诸如 Java 和 C#之类的语言编写的程序中。如何在 Java 程序中添加 SQL 语句的细节请参考作者的 Oracle 9i JDBC Programming (2002年,Oracle出版社)一书。如何在C#程序中添加SQL语句的细节请参考作者的 Mastering C#Database Programming (Sybex, 2003)一书。


启动 SQL*Plus

如果使用的是Windows 7,请单击Start菜单,并选择All Programs | Oracle | Application Development | SQL Plus 来启动 SQL*Plus。如果使用的是 UNIX 或 Linux,可以在命令行提示符下运行 sqlplus 来启动 SQL*Plus。显示了在 Windows 7 上运行的 SQL*Plus。


scott 用户连接到了数据库,scott 用户是许多 Oracle 数据库安装时都包含的 一个用户,在本人的数据库中,scott 的密码是 oracle。@字符后面的主机字符串告诉 SQL*Plus 连接到哪个数据库。如果是在自己的本地计算机 上运行数据库,一般可以忽略主机字符串。例如,可以输入scott/oracle 并忽略@字符和 orcl 字符串。如果忽略主机字符串,SQL*Plus 就会尝试连接到正运行 SQL*Plus 的本地计算机上的数据库。如果数据库不是在本地计算机上运行的,那么应该咨询一下数据库管理员(DBA),以 获得主机字符串。如果在你的数据库中 scott 用户不存在或被锁定,请向 DBA 申请另一用户和密码(对于本 章第一部分的示例,可以使用任何用户来连接到数据库)。


从命令行启动 SQL*Plus

要从命令行启动 SQL*Plus,可以使用 sqlplus 命令。sqlplus 命令的完整语法如下:

sqlplus [user_name[/password[@ host_string]]]

其中:

● user_name 指定数据库用户的名称。 

● password 指定数据库用户的密码。 

● host_string 指定要连接的数据库。

     下面是执行 sqlplus 命令的几个例子: 

    sqlplus scott/oracle

    sqlplus scott/oracle@orcl

如果你在 Windows 操作系统上使用的是 SQL*Plus,那么 Oracle 安装程序会自动将 SQL*Plus 的目录添加到路径中。如果使用的是 UNIX 或 Linux,那么运行 SQL*Plus 有以下两 种选择:

● 使用 cd 命令转到 sqlplus 可执行文件所在的目录,并在此目录路径中运行 sqlplus。

● 将 sqlplus 所在的目录添加到路径中,然后运行 sqlplus。如果需要有关设置目录路径的帮助,请咨询系统管理员。为安全起见,在连接到数据库时可以隐藏密码。例如,可以输入下面的命令:

    sqlplus scott@orcl

SQL*Plus 会提示用户输入密码。输入密码时,密码会隐藏起来。 也可以只输入如下命令:

sqlplus

SQL*Plus 会提示输入用户名和密码。通过将主机字符串添加到用户名可以指定主机字符串(例如 scott@orcl)。


使用 SQL*Plus 执行 SELECT 语句

使用 SQL*Plus 登录到数据库之后,输入下面的 SELECT 语句,这条语句会返回当前日期:

    SELECT SYSDATE FROM dual;

注意:

如果你想跟着例子练习,本书中用粗体显示的 SQL 语句是应当输入并运行的。非粗体显 示的语句不需要输入。SYSDATE 是一个内置的数据库函数,它返回当前日期;dual 表只包含单个dummy 行。下 一章将讲述有关 dual 表的更多信息。

注意:

可以使用分号(;)字符终止 SQL 语句。通过输入 EDIT 命令,可以编辑 SQL*Plus 中 的最后一条 SQL 语句。在输错 SQL 语句或想修改 SQL 语句时,这项功能非常有用。在 Windows 系 统中输入 EDIT 命令后,会启动记事本应用程序。 在退出记事本并保存 SQL 语句时,一条新的 SQL 语句就会被传递到 SQL*Plus 中。可以通过输入一个斜杠(/)重新执行该 SQL 语句。在 Linux 或 UNIX 系统中,默认的编辑器一般是 ed。要保存修改的语句并退出 ed,请输入 wq。


解决尝试编辑报表时出现的错误

尝试在 Windows 中编辑语句时,如果遇到错误 SP2-0110,可以管理员身份运行 SQL*Plus。 在 Windows 7 中,做到这一点的方法是右击 SQL*Plus 的快捷方式,并选择“Run as administrator” 选项。在 Windows 7 中,通过右击 SQL*Plus 的快捷方式,在 Compatibility 选项卡中选择“Run as administrator”选项,可以永久保存这个设置。


还可以通过右击SQL*Plus的快捷方式并在Shortcut选项卡中修改“Start in”目录来设置 SQL*Plus 的启动目录。SQL*Plus 在保存和检索文件时将使用该默认目录。例如,可以将目录 设置为C:My_SQL_files,并且 SQL * Plus 会默认在该目录中存储和检索文件。在 Windows 版本的 SQL* Plus 中,可以通过按键盘上的向上和向下箭头键来滚动过去曾经运行的命令。


使用SQLDeveloper

也可以使用 SQL Developer 来输入 SQL 语句。SQL Developer 有图形用户界面,在其中可 以输入 SQL 语句、检查数据库表、运行脚本、编辑并调试 PL/SQL 代码,还能完成更多的任务。 SQL Developer 可以连接到 9.2.0.1 和更高版本的 Oracle 数据库,可以在许多操作系统中运行。 运行中的 SQL Developer。必须下载包含 Java 软件开发包(Software Development Kit,SDK)的 SQL Developer 版本,或者必须预先已经将正确版本的 Java 安装在计算机上。根据不同的SQL Developer 版本,需要的 Java 版本也不同,应当访问 www.oracle.com 上的SQLDeveloper 网页来了解详细情况。


asdas.jpg

成功启动 SQL Developer 后,需要通过右击 Connections 并选择 New Connection 来创建数 据库连接,SQL Developer将显示一个对话框,可以在其中指定数据库连接的详情。创建连接和测试之后,就可以使用 SQL Developer 检查数据库表和运行查询。展示了名为 customers 的数据库表中的各列,这是本书中用到的一个表。也可以通过选择 Data 选项卡查看表中存储的数据。


创建store模式

这个假想的商店销售书籍、录像、DVD、CD 之类的商品。此商店的数据库将存放客户、 员工、产品和销售的有关信息。创建数据库的 SQL*Plus 脚本命名为 store_schema.sql,它位于解压本书的压缩文件后的 SQL 目录中。store_schema.sql 脚本包含了用来创建 store 模式的 DDL 和 DML 语句。

检查脚本

在编辑器中打开 store_schema.sql 脚本,并检查脚本中的语句。本节介绍脚本中的语句, 并引导你完成可能需要对脚本做的任何修改。在本章后面,你将了解更多有关这些脚本语句的信息。


1. 删除和创建用户

store_schema.sql 脚本中的第一条可执行语句如下:

    DROP USER store CASCADE;

这里的 DROP USER 语句是为了在本书后面重新创建该模式时不必手动删除 store 用户。接下来的语句创建 store 用户,密码是 store_password:

   CREATE USER store IDENTIFIED BY store_password;

   接下来的语句允许 store 用户连接到数据库并允许创建数据库条目: 

GRANT connect, resource TO store;

2. 分配表空间存储

下面的语句为 store 用户在 users 表空间分配 10MB 的空间:

    ALTER USER store QUOTA 10M ON users;

表空间是数据库用来存储表和其他数据库对象的地方。你将在第 10 章了解更多关于表空 间的信息。大多数数据库都有 users 表空间来存储用户数据。要验证这一点,首先以特权用户(例 如,system 用户)的身份连接到数据库,然后执行下面的语句:

    SELECT property_value

    FROM database_properties

    WHERE property_name = 'DEFAULT_PERMANENT_TABLESPACE';

    PROPERTY_VALUE

    --------------

    USERS

    此查询返回在ALTER USER语句中使用的表空间的名称。在本人的数据库中,此表空间 是 users。如果该查询返回的表空间名不是 users,就必须用前面的查询返回的名字替换脚本的 ALTER USER 语句中的 users。例如,如果表空间的名称是 another_ts,那么将脚本中的这条语 句改为:

    ALTER USER store QUOTA 10M ON another_ts;

3. 设置连接

脚本中的以下语句以 store 用户连接:

    CONNECT store/store_password;

如果正在连接其他计算机上的数据库,需要修改脚本中的 CONNECT 语句。例如,如果要连接到名为 orcl 的数据库,就要将脚本中的 CONNECT 语句改为:

    CONNECT store/store_password@orcl;

4. 使用可插拔数据库功能

可插拔数据库(pluggable database)是 Oracle Database 12c 中的一项新功能。可插拔数据库在 外部容器数据库中创建。可插拔数据库可节省系统资源、简化系统管理,并通常由数据库管理员执行。因此,对可插拔数据库的全面讨论超出了本书的范围。


如果正在使用可插拔数据库功能,就需要修改脚本中的 CONNECT 语句,使之包括可插拔 数据库的名称。例如,如果可插拔数据库的名称为 pdborcl,那么将该语句改为:

CONNECT store/store_password@pdborcl;如果对 store_schema.sql 脚本做了任何修改,请保存修改后的脚本。 脚本中的其余语句创建示例 store 所需的表和其他条目。本章后面将解释这些语句。


运行脚本

执行以下步骤来创建 store 模式:
(1) 启动 SQL*Plus。
(2) 以具有创建新用户、表和 PL/SQL 包权限的用户身份登录到数据库。在本人的数据库中,以 system 用户身份运行脚本,此用户具有所要求的全部权限。

(3) 如果使用可插拔数据库功能,那么必须将会话数据库容器设置为可插拔数据库名。例如,如果可插拔数据库名为 pdborcl,就运行下面的命令:

ALTER SESSION SET CONTAINER=pdborcl;

(4) 使用@命令运行 store_schema.sql 脚本。@命令的语法如下:

 @ directorystore_schema.sql

其中,directory 是 store_schema.sql 脚本所在的目录。 例如,如果这个脚本保存在 C:sql_bookSQL 中,那么应该输入:

@ C:sql_bookSQLstore_schema.sql

如果 store_schema.sql 脚本存放在包含空格的目录中,那么必须在@命令之后将目录和脚本置于引号中。例如:

 @ "C:Oracle SQL booksql_bookSQLstore_schema.sql"

如果使用的是 UNIX 或 Linux,并且将这个脚本保存到了 tmp 文件系统的 SQL 目录中,那么应该输入:

 @ /tmp/SQL/store_schema.sql

 注意:

Windows 在目录路径中使用反斜杠字符(),而 UNIX 和 Linux 则使用正斜杠字符(/)。

运行完 store_schema.sql 脚本后,用户将以 store 用户身份连接到数据库。这个用户的密码 是 store_password。

在本书后面会要求运行其他脚本。在运行每个脚本前都需要执行本节描述的步骤:
● 如果数据库中没有 users 表空间,就要编辑脚本中的 ALTER USER 语句。
● 如果需要设置主机字符串来连接到某个数据库,就要编辑脚本中的 CONNECT 语句。

●如果使用可插拔数据库功能,就要编辑脚本中的CONNECT语句并且在运行脚本前先执

行 ALTER SESSION SET CONTAINER 命令。 现在不必编辑所有的脚本,只要记得每个脚本在运行前可能必须修改就行了。


用来创建 store 模式的 DDL 语句

数据定义语言(Data Definition Language,DDL)语句用于创建用户和表,以及数据库中的各种其他类型的结构。将会介绍如何使用DDL语句创建store用户表。本章其余的 SQL 语句与store_schema.sql 脚本中包含的语句完全相同。不必自己输入这些 语句。

接下来将介绍以下内容:

● 如何创建数据库用户

● Oracle 数据库中常用的数据类型 ● 虚拟商店使用的一些表


1. 创建数据库用户

要在数据库中创建用户,使用 CREATE USER 语句。CREATE USER 语句的简化语法如下:

CREATE USER user_name IDENTIFIED BY password;

其中:

● user_name 是用户名

● password 是用户的密码

例如,下面的 CREATE USER 语句创建了 store 用户,密码为 store_password:

    CREATE USER store IDENTIFIED BY store_password;

如果想让这个用户操作数据库,就必须为该用户授予必需的权限。在 store 用户示例中, 用户必须能够登录数据库(这需要 connect 权限),而且能够创建一些诸如数据库表之类的条目 (这需要 resource 权限)。权限是由特权用户(例如 system 用户)使用 GRANT 语句授予的。

下面这个例子为 store 用户授予了 connect 和 resource 权限: GRANT connect, resource TO store;本书中的许多例子都使用 store 模式。在开始详细介绍 store 所需要的表之前,首先需要理 解 Oracle 数据库中的常用类型。


2. Oracle 数据库中的常用类型

有很多类型可以用来处理 Oracle 数据库中的数据。部分常用的数据类型如。本书附录中列出了所有的数据类型。


3. store 模式中的表

下面将会介绍如何创建 store 模式使用的表。store 模式用于存储虚拟商店的详细信息,包括:

● 顾客的详细信息

● 销售的产品类型

● 产品的详细信息

● 顾客购买产品的历史记录 

● 虚拟商店中员工的信息

● 工资等级

这些信息使用下列表来存储:

● customers 存储顾客的详细信息

● product_types 存储商店销售的产品类型

● products 存储产品的详细信息

● purchases 存储哪些顾客购买了哪些产品

● employees 存储员工的详细信息

● salary_grades 存储工资等级的详细信息

接下来将会介绍 store 模式中表的详细信息,以及 store_chema.sql 脚本中用来创建这些表的 CREATE TABLE 语句。

customers 表 customers 表用来存储虚拟商店的顾客的详细信息。该表会为商店的每个顾客存储以下信息: 

●名

●姓

● 生日(dob)

● 电话号码

每个条目占用 customers 表的一列,而 customers 表是由 store_schema.sql 脚本使用下面的

CREATE TABLE 语句创建的:

    CREATE TABLE customers (

       customer_id INTEGER CONSTRAINT customers_pk PRIMARY KEY,

       first_name VARCHAR2(10) NOT NULL,

       last_name VARCHAR2(10) NOT NULL,

       dob DATE,

       phone VARCHAR2(12)

);

除了前面列表中给出的 4 个条目各占一列外,还有另 外一列,名为 customer_id。下面详细介绍各列的内容:

● customer_id 为该表中的每行存储唯一的整数。每个表都有一列或多列来唯一地标识表中的每行,这样的列称为主键(primary key)。CREATE TABLE 语句中的 CONSTRAINT 子句表示 customer_id 列是该表的主键。CONSTRAINT 子句用来限制存储在列中的值, 对于customer_id列,PRIMARY KEY关键字表明每行的customer_id列必须包含唯一 的值。约束可以使用可选名称,可选名称必须紧跟在 CONSTRAINT 关键字之后——在本例中,约束名是 customers_pk。应该始终命名主键约束,这样当发生约束错误时, 就很容易确定错误发生在什么地方。

● first_name 存储顾客的名。注意 first_name 列使用了 NOT NULL 约束——这意味着当添加一行时,必须为 first_name 列提供值。如果不使用这个约束,用户就可以不提供 值。

● last_name 存储顾客的姓。本列也使用 NOT NULL 约束,因此当添加一行时必须提供值。

● dob 存储顾客的生日。由于没有为本列指定 NOT NULL 约束,因此使用默认的 NULL 约束,即当添加一行时该列的值是可选的。

● phone 存储顾客的电话号码。这个列也没有使用 NOT NULL 约束。 注意,customer_id 为 4 的顾客生日为空,customer_id 为 5 的顾客电话号码为空。可以使用 SQL*Plus 执行下面的 SELECT 语句来查看 customers 表中的数据行:

SELECT * FROM customers;

星号字符(*)表示要检索 customers 表中的所有列。product_types 表 product_types 表用来存储商店销售的产品类型。product_types 表是由 store_schema.sql 脚本使用下面的 CREATE TABLE 语句创建的:

        CREATE TABLE product_types (

          product_type_id INTEGER CONSTRAINT product_types_pk PRIMARY KEY,

          name VARCHAR2(10) NOT NULL

);

product_types 表包含如下两列:

● product_type_id 唯一地标识该表中的每一行。product_type_id 列是该表的主键。product_types 表中每一行的 product_type_id 列都必须有唯一的整数值。

● name 包含的是产品类型。这是 NOT NULL 列,因此当添加一行时必须提供值。 

该表定义了商店销售的产品类型,商店销售的每个产品都必须是这 5 种类型中的一种。 可以使用 SQL*Plus 执行下面的 SELECT 语句来查看 product_types 表中的行:

        SELECT * FROM product_types;

products 表 products 表用来存储本商店销售产品的详细信息。对于每个产品都要存储以下 信息:

● 产品类型

● 产品名称

● 产品介绍

● 产品价格

products 表是由 store_schema.sql 脚本使用下面的 CREATE TABLE 语句创建的:

        CREATE TABLE products (

         product_id INTEGER CONSTRAINT products_pk PRIMARY KEY,

         product_type_id INTEGER

          CONSTRAINT products_fk_product_types

          REFERENCES product_types(product_type_id),

         name VARCHAR2(30) NOT NULL,

         description VARCHAR2(50),

         price NUMBER(5, 2)

);

products 表包含以下 5 列:

● product_id 唯一标识该表中的每一行,这一列是该表的主键。

● product_type_id 为每个产品都关联一种产品类型。该列是对 product_types 表中product_type_id列的引用,称为外键(foreign key),因为它引用了其他表中的列。包含这个外键的表(products表)称为明细表(detail table)或子表(child table),被引用的表 (product types表)称为主表(master table)或父表(parent table)。这种关系称为主从关 系(master-detailrelationship)或父子关系(parent-child relationship)。当添加新产品时,应 该通过在 product_type_id 列中提供匹配的 product_types.product_type_id 值,为这种产 品关联一种类型(稍后将会看到示例)。

● name 存储产品名称。这是 NOT NULL 列。

● description 存储产品的介绍信息,可选。

● price 存储产品的价格,可选。该列类型为 NUMBER(5,2):精度是 5,因此这个数字最

大可以是 5 位;小数部分是 2,因此这 5 位中最多只能有两位在小数点的右边。 下面是 products 表前 4 行的数据:products 表中第 1 行的 product_type_id 值为 1,说明该产品是一本书(这个 product_type_id 值与 product_types 表中书籍的产品类型匹配)。第 2 行也表示一本书,而第 3 行和第 4 行则表 示录像(它们的 product_type_id 值是 2,这与 product_types 表中录像的产品类型匹配)。可以使用 SQL*Plus 执行下面的 SELECT 语句来查看 products 表中的所有行:

    SELECT * FROM products;

purchases 表 purchases 表用来存储顾客的购买记录。顾客每次购买产品时,都要存储以 下信息:

●产品ID

●顾客ID

● 顾客购买的产品数量

purchases 表是由 store_schema.sql 脚本使用下面的 CREATE TABLE 语句创建的:

    CREATE TABLE purchases (

     product_id INTEGER

          CONSTRAINT purchases_fk_products

          REFERENCES products(product_id),

          customer_id INTEGER

          CONSTRAINT purchases_fk_customers

          REFERENCES customers(customer_id),

          quantity INTEGER NOT NULL,

          CONSTRAINT purchases_pk PRIMARY KEY (product_id, customer_id)

);

purchases 表包含如下 3 列:

● product_id 存储所购买产品的 ID,该值必须与 products 表中某一行的 product_id 列的值匹配。

● customer_id 存储所购买产品的顾客ID,该值必须与customers表中某一行的customer_id列的值匹配。

● quantity 存储所购买产品的数量。

purchases 表有名为 purchases_pk 的主键约束,该主键约束由表中的两列组成:product_id和 customer_id。对于该表中的每行来说,这两列值的组合必须唯一。当主键由多列组成时,称 为复合主键。可以看到,product_id 和 customer_id 这两列的值的组合对于每一行都是唯一的。 可以使用 SQL*Plus 执行下面的 SELECT 语句来查看 purchases 表中的所有行:

        SELECT * FROM purchases;

employees表 employees表用来存储商店中员工的详细信息,包括以下内容: ●员工ID

● 该员工的上级管理者的员工 ID(假设该员工有上级管理者)

●名

●姓

●职位

●工资

employees 表是由 store_schema.sql 脚本使用下面的 CREATE TABLE 语句创建的:

        CREATE TABLE employees (

         employee_id INTEGER CONSTRAINT employees_pk PRIMARY KEY,

         manager_id INTEGER,

         first_name VARCHAR2(10) NOT NULL,

         last_name VARCHAR2(10) NOT NULL,

         title VARCHAR2(20),

         salary NUMBER(6, 0)

);

salary_grades表 salary_grades表用来存储员工工资的不同等级,包括以下内容: ● 工资等级 ID

● 该级工资的最低工资

● 该级工资的最高工资

salary_grades 表是由 store_schema.sql 脚本使用下面的 CREATE TABLE 语句创建的:

 CREATE TABLE salary_grades (

  salary_grade_id INTEGER CONSTRAINT salary_grade_pk PRIMARY KEY,

  low_salary NUMBER(6, 0),

  high_salary NUMBER(6, 0)

);


添加、修改和删除行

本节介绍如何使用 INSERT、UPDATE 和 DELETE SQL 语句对数据库表执行添加、修改以 及删除行的操作。使用 COMMIT 语句可以永久性地保存对行所做的修改,使用 ROLLBACK语句可以取消对行所做的修改。本节并不会详细介绍这些语句的具体用法,第 9 章将介绍更多有关这些SQL 语句的知识。


向表中添加行

INSERT 语句用于向表中添加新行,在 INSERT 语句中可以指定以下信息:

● 向哪个表中插入行

● 为哪些列指定值

● 存储到这些列中的值

在插入行时,至少要指定主键和其他所有被定义为NOT NULL列的值。除此之外,所有列的值都可以不指定。如果忽略它们的值,这些列的值都会被自动设置为空。

可以使用 SQL*Plus 的 DESCRIBE 命令来查看哪些列被定义为 NOT NULL,可以看到,customer_id、first_name 和 last_name 列都是 NOT NULL,这意味着必须为这些 列提供值。dob 和 phone 列则不需要提供值——如果不希望为这些列提供值,就可以将其忽略, 这些列都会被默认设置为空。

继续运行下面这条 INSERT 语句,此语句向 customers 表中添加一行。注意 VALUES 列表中值的顺序必须与列的列表中指定的列的顺序一致。

默认情况下,Oracle 数据库按照 DD-MON-YY 的格式来显示日期 1,其中 DD 是日,MON 是月的前三个字母(大写),YY 是年份的最后两位。数据库实际上为年份存储了 4 位,但是默

 认情况下只显示最后两位。

当向 customers 表中添加一行时,customer_id 列的值必须是唯一的。如果新增加行的主键

值在表中已经存在,Oracle 数据库会阻止这种添加行为。例如,下面的 INSERT 语句会产生错 误,因为 customer_id 为 1 的行已经存在:

INSERT INTO customers (

    *

    ERROR at line 1:

    ORA-00001: unique constraint (STORE.CUSTOMERS_PK) violated注意,错误信息中显示了约束名(STORE.CUSTOMERS_PK)。这就是为什么应该总是命名 主键约束的原因。否则,Oracle 数据库会为约束分配由系统生成的名称(例如 SYS_C0011277), 这种名称很难定位问题。

修改表中的现有行

可以使用 UPDATE 语句来修改表中现有的行。通常,在使用 UPDATE 语句时,需要指定以下内容:

● 包含要修改的行的表

● 指明要被修改的行的 WHERE 子句

● 列名的列表及其新值,这两部分内容使用 SET 子句来指定

使用同一条 UPDATE 语句可以修改一行或多行。如果指定了多行,就会对这些行进行相

同的修改操作。下面这条 UPDATE 语句将 customers 表中 customer_id 列值为 2 的行的 last_name 列修改为 Orange:

UPDATE customers

    SET last_name = 'Orange'

    WHERE customer_id = 2;

    1 row updated.

SQL*Plus 会确认有一行已被更新。 警告:

如果忘记在 UPDATE 语句中加上 WHERE 子句,那么所有的行都会被更新。

  可以使用下面的查询语句显示被更新的行:

    SELECT *

    FROM customers

    WHERE customer_id = 2;

CUSTOMER_IDFIRST_NAMELAST_NAME DOB PHONE

从表中删除行

DELETE 语句用于从表中删除行。一般情况下,使用 WHERE 子句来限制想要删除的行。 如果不使用 WHERE 子句,就会删除表中所有的行。

下面这条 DELETE 语句从 customers 表中删除 customer_id 为 6 的顾客: DELETE FROM customers

        WHERE customer_id = 6;

        1 row deleted.

要取消对数据库所做的修改,可以使用 ROLLBACK 命令: ROLLBACK;

        Rollback complete.


关注微信公号“书问”,免费领取万本好书!


内容来源:书问

作者 (美) 普赖斯 (Price,J.) , 著
出版清华大学出版社
定价79.8元
书籍比价

分享到

扫描二维码 ×

参与讨论

电子纸书

Oracle 11g SQL和PL/SQL编程指南

张宝银, 杨忠民, 蒋新民
清华大学出版社[2014] ¥20

Oracle 10g SQL和PL/SQL编程指南

杨忠民, 蒋新民, 晁阳, 编著
清华大学出版社[2009] ¥14

完全精通Nuendo电脑音乐及音频制作:精细操作与实践

钟金虎, 曹路明, 编著
清华大学出版社[2016] ¥58

宫腔镜手术操作及实例精选演示

夏恩兰
辽宁科技出版社[2015] ¥90

趋势分析及操作

江南小隐, 著
清华大学出版社[2014] ¥23

技术性人力资源管理:系统设计及实务操作(第二版)

石磊著
西南财经大学出版社[2012] ¥28

SQL Server 2012中文版数据库管理、应用与开发实践教程

董志鹏,侯艳书 著
清华大学出版社[2016] ¥38

Hadoop+Spark生态系统操作与实战指

余辉, 著
清华大学出版社[2017] ¥35

会计主管业务操作与技巧(第2版)

财政与税收编写租, 主编
清华大学出版社[2017] ¥19

出版业领先的TMT平台

使用社交账号直接登陆

Copyright © 2018 BookAsk 书问   |   京ICP证160134号


注册书问

一键登录

Copyright © 2018 BookAsk 书问   |   京ICP证160134号