关系数据库外文翻译资料

 2022-08-22 10:50:43

Chapter 22

Relational Databases

CHAPTER GOALS

      • To understand how relational databases store information
      • To learn how to query a database with the Structured Query Language (SQL)
      • To connect to a database with Java Database Connectivity (JDBC)
      • To write database programs that insert, update, and query data in a relational database

In Chapter 19 you saw how to store data in a file. When you store

data, you will want to be able to add more data items, remove data, change data items, and find items that match certain criteria. However, if you have a lot of data, it can be difficult to carry out these operations quickly and efficiently. Because data storage is such a common task, special database management systems (DBMS) have been invented that let the programmer think in terms of the data rather than file storage. In this chapter you will learn how to use SQL, the Structured Query Language, to query and update information in a relational database, and how to access database information from Java programs.

865

22.1 Organizing Database Information

22.1.1 Database Tables

A relational database stores information in tables. Figure 1 shows a typical table. As you can see, each row in this table corresponds to a product. The column headers correspond to attributes of the product: the product code, description, and unit price. Note that all items in a particular column have the same type: product codes and descriptions are strings, unit prices are floating-point numbers. The allowable column types differ somewhat from one database to another. Table 1 shows types that are commonly available in relational databases that follow the SQL (for Struc- tured Query Language; often pronounced “sequel”) standard.

A relational database stores information in tables. Each table column has a name and a data type.

Most relational databases follow the SQL standard. There is no relationship between SQL and Java—they are different languages. However, as you will see later in this chapter, you can use Java to send SQL commands to a database. You will see in the next section how to use SQL commands to carry out queries, but there are other SQL commands.

SQL (Structured Query Language) is a command language for interacting with a database.

For example, here is the SQL command to create a product table:

CREATE TABLE Product (

Product_Code CHAR(7), Description VARCHAR(40), Price DECIMAL(10, 2)

)

Product

Product_Code

Description

Price

116-064

Toaster

24.95

257-535

Hair dryer

29.95

643-119

Car vacuum

19.99

Figure 1 A Product Table in a Relational Database

866

Table 1 Some Standard SQL Types and Their Corresponding Java Types

SQL Data Type

Java Data Type

INTEGER or INT

int

REAL

float

DOUBLE

double

DECIMAL(m, n)

Fixed-point decimal numbers with m total digits and n digits after the decimal point; similar to BigDecimal.

BOOLEAN

boolean

VARCHAR(n)

Variable-length String of length up to n

CHARACTER(n) or CHAR(n)

Fixed-length String of length n

Unlike Java, SQL is not case sensitive. For example, you could spell the command create table instead of CREATE TABLE. However, as a matter of convention, we will use uppercase letters for SQL keywords and mixed case for table and column names.

Use the SQL commands CREATE TABLE and

INSERT INTO to add data to a database.

To insert rows into the table, use the INSERT INTO command. Issue one command for each row, such as

INSERT INTO Product

VALUES (257-535, Hair dryer, 29.95)

SQL uses single quotes (), not double quotes, to delimit strings. What if you have a string that contains a single quote? Rather than using an escape sequence (such as

) as in Java, you just write the single quote twice, such as

Sams Small Appliances

If you create a table and subsequently want to remove it, use the DROP TABLE com- mand. For example,

DROP TABLE Test

22.1.2 Linking Tables

If you have objects whose instance variables are strings, numbers, dates, or other types that are permissible as table column types, then you can easily store them as rows in a database table. For example, consider a Java class Customer:

public class Customer

{

private String name; private String address; private String city; private String state; private String zip;

. . .

}

Customer

Name

Address

City

State

Zip

VARCHAR(40)

VARCHAR(40)

VARCHAR(30)

CHAR(2)

CHAR(5)

Samrsquo;s Small Appliances

100 Main Street

Anytown

CA

98765

Figure 2 A Customer Table

It is simple to come up with a database table structure th

剩余内容已隐藏,支付完成后下载完整资料


第22章 关系数据库
章节目标
·了解关系数据库如何存储信息

·了解如何使用结构化查询语言(SQL)查询数据库

·使用java数据库连接(JDBC)连接到数据库

·编写在关系数据库中插入,更新和查询数据的数据库程序

在第19章中,您了解了如何在文件中存储数据。当你存储数据,您将希望能够添加更多数据项,删除数据,更改数据项以及查找符合特定条件的项目。是,如果您有大量数据,则可能难以快速有效地执行这些操作。由于数据存储是一项常见的任务,因此发明了特殊的数据库管理系统(DBMS),使程序员可以根据数据而不是文件存储进行思考。在本章中,您将学习如何使用SQL(结构化查询语言)来查询和更新关系数据库中的信息,以及如何从Java程序访问数据库信息。


22.1管理数据库信息

22.1.1数据库表

关系数据库将信息存储在表中。图1显示了一个典型表。如您所见,该表中的每一行都对应一个产品。列标题对应于产品的属性:产品代码,描述和单价。请注意,特定列中的所有项目都具有相同的类型:产品代码和说明是字符串,单价是浮点数。从一个数据库到另一个数据库,允许的列类型有所不同。表1显示了遵循SQL(对于结构化查询语言:通常称为“续集”)标准的关系数据库中常见的类型。

大多数关系数据库都遵循SQL标准。SQL和Java之间没有关系-它们是不同的语言。但是,正如本章后面将看到的那样,您可以使用Java将SQL命令发送到数据库。在下一部分中,您将看到如何使用SQL命令执行查询,但是还有其他SQL命令。
例如,以下是用于创建产品表的SQL命令

SQL(结构化查询语言)是一种用于与数据库交互的命令语言

关系数据库将信忘存储在表中,每个表列都有一个名称和一个数据类型。





与Java不同,SQL不区分大小写。例如,您可以拼写命令 create table 而不是CREATE TABLE。但是,按照惯例,对于SQL关键字,我们将使用大写字母,对于表名和列名,将使用混合大小写。 要将行插入表中,请使用| NSERT|NTO命令。对每一行发出一个命令,例如

使用SQL命令CREAT TABLE和INSERT INTO将数据添加到数据库

SQL使用单引号(rsquo;)而不是双引号来分隔字符串。如果您的字符串包含单引号怎么办?而不是像Java中那样使用转义序列(例如),您只需编写两次单引号,例如

如果创建表并随后要删除它,请使用DROP TABLE命令。例如,

22.1.2链接表

如果您的对象的实例变量是字符串,数字,日期或其他允许作为表列类型的类型,则可以轻松地将它们作为行存储在数据库表中。例如,考虑一个Java类Customer:

很容易得到一个数据库表结构,它允许您存储customers-见图2。
对于其他对象,并不是那么容易。考虑一张发票。每个发票对象都包含对客户对象的引用。

因为Customer不是标准的SQL类型,所以您可以考虑简单地将所有客户数据输入到发票表中(请参见图3)。但是,这不是一个好主意。如果查看图3中的样本数据,您会注意到Sam的Small Appliances有两个发票,编号分别为11731和11733。但是,该客户的所有信息都被复制到两行中。
此复制有两个问题。首先,多次存储相同的信息很浪费。如果同一客户下很多订单,则复制的信息会占用很多空间。更重要的是,复制是危险的。假设客户移至新地址。然后,很容易误以为在某些发票记录中更新客户信息,而在其他发票记录中保留旧地址。

在Java程序中,这些问题均不会发生。多个发票对象可以包含对单个共享客户对象的引用。



在数据库中实现相同效果的第一步是将数据组织到多个表中,如图4所示。将列分成两个表可以解决复制问题。客户数据不再被复制-发票表不包含客户信息,并且客户表仅包含每个客户的一条记录。但是,我们如何参考开具发票的客户呢?注意,在图4中,“Customer”表和“Invoice”表中现在都存在一个“客户编号”列。现在,Sams Small Appliances的所有Invoice仅共享客户编号。这两个表通过Customer_Number字段链接。要查找有关此客户的更多详细信息,您需要使用客户编号在“Customer”表中查找该客户。

请注意,客户编号是唯一标识符。我们介绍了客户编号,因为客户名称本身可能不是唯一的。例如,在各个位置可能都有多个 Electronics Unlimited商店。因此,仅客户名称并不能唯一地标识一条记录(一行数据),因此我们不能使用该名称作为两个表之间的链接。
在数据库术语中,唯一标识表中一行的列(或列的组合)称为主键。在我们的客户表中,Customer_Number列是主键。并非所有数据库表都需要主键。如果要从另一个表建立链接,则需要一个主键。例如,“Customer”表需要一个主键,以便您可以将客户链接到Invoice。主键是一列(或一组列),其值唯一地指定

主键是一列(或一组列),其值唯一指定表记录。

您应该避免包含复制数据的行。而是将数据分布在多个表上。

当主键链接到另一个表时于,该表中的匹配列(或列的组合)称为外键。例如,“Invoice”表中的“Customer_Number”是一个外键,链接到“Customer”表中的主键。与主键不同,外键不必唯一。例如,在我们的“Invoice”表中,有几条记录具有相同的Customer_Number外键值。

外键是对链接表中主键的引用。

22.1.3实现多值关系


每张发票都链接到一个客户。这称为单值关系,另一方面,每个发票都有许多行项目。 (与第12章一样,行项目标识产品,数量和单价。 )因此,发票和行项目之间存在多值关系。在Java类中,Lineltem对象存储在数组列表中:


但是,在关系数据库中,您需要将信息存储在表中。令人惊讶的是,面对这种情况,许多程序员会犯下主要的错误并复制列,每个列对应一个列,如下图5所示。
显然,这种设计并不令人满意。如果发票上有三个以上的订单项,我们该怎么办?也许我们应该有10个订单项?但是,如果大多数发票只有几个订单项,那将很浪费,并且对于偶尔有很多订单项的发票,它仍然不能解决我们的问题。
而是将信息分配到两个表中:一个用于发票,另一个用于订单项。使用Lineltem表中的Invoice_Number外键将每个订单项链接回其发票-见图6.

我们的数据库现在包含四个表:

bull; Invoice

使用链接表而不是复制列实现一对多关系。

bull; Customer

bull; Lineltem

bull; Product

图7显示了这些表之间的链接。在下一节中,您将看到如何查询该数据库以获取有关发票,客户和产品的信息。查询将利用表之间的链接。
1、telephone number会成为customer 表的一个好主键吗?

2.在22.1.3节的数据库中,客户3176订购的所有产品是什么?

特别提示
Java语言是高度标准化的,您很少会找到允许您指定与标准不同的Java代码的编译器,如果这样做,则始终是编译器错误。但是,SQL实现通常更为宽容。例如,许多SQL供应商都允许您使用Java样式的转义序列,例如

在SQL字符串中,供应商可能认为这对熟悉Java或C的程序员“有帮助(C语言使用相同的转义机制来表示特殊字符。)
但是,这是一种幻想,偏离标准限制了可移植性,假设您以后想将数据库代码移至其他供应商,也许是为了提高性能或降低数据库软件的成本。如果其他供应商未实施特定偏差,那么您的代码将不再起作用,您需要花费时间来解决它。
为避免这些问题,您应该遵守标准。使用SQL,您不能依靠数据库来标记所有错误-其中一些可能被认为是“有用的'扩展。这意味着您需要了解标准并遵循纪律。(有关更多信息,请参见Chris J.Date和Hugh Darwen(撰写的《SQL标准指南:标准数据库语言用户指南》(Addison-Wesley,1996)。)



最初的数据库设计器复制数据是非常常见的。在复制表中的数据时,请自问是否可以将复制的数据移动到单独的表中,并使用键(如代码或ID号)链接表。
考虑Invoice表中的以下示例:


如您所见,一些产品信息被复制。这个复制是个错误吗?这要看情况。代码为116-064的产品的产品描述始终是“烤面包机”。因此,该对应关系应存储在外部产品表中。

避免不必要的数据复制

然而,产品价格会随着时间的推移而变化。如果是,旧发票不会自动使用新价格。因此,将客户实际收取的价格存储在发票表中是有意义的。但是,当前的标价最好存储在外部产品表中。


专题22.1
主键和索引

回想一下,主键是唯一标识表中行的列(或列组合)。当表具有主键时,数据库可以构建索引文件:该文件存储有关在知道主键后如何快速访问行的信息。索引可以大大提高数据库查询的速度。

如果主键包含在单个列中,则可以使用PRIMARY KEY属性,如下所示:

如果主键包含在多个列中,则在CREATE TABLE命令的末尼添加一个PRIMARY KEY子句,如下所示:

有时,可以通过构建二级索引来加快查询速度:二级目录索引的素引文件不一定是唯一的。这是一种高级技术,我们将不在这里讨论。


生产率提示22.3
不要复制表中的列

如果您发现带有后缀1、2等的表中的编号栏(例如,Quantity1, Quantity2, Quantity3), 那么您可能走错了方向。您怎么知道一共有三个数量?在这种情况下,是时候换一张表了.
添加一个表以保存您为其复制列的信息。在该表中,添加一列,该列链接回到第一个表中的键,例如本例中的发票编号。通过使用附加表,您可以实现多值关系。

22.2查询

假设已经在数据库中创建了表,并且已插入记录。数据库填充数据后,您将需要在数据库中查询信息,例如
bull; 所有客户的姓名和地址是什么?
bull;加利福尼亚所有客户的姓名和地址是什么?
bull;购买烤面包机的所有顾客的名字和地址是什么?
bull;所有带有未付发票的客户的名字和地址是什么?

在本节中,您将学习如何在SQL中构造简单和复杂的查询,我们将使用图8所示的数据作为示例。

22.2.1 单查询

在SQL中,使用SELECT命令发出查询。例如,从Customer表中选择所有数据的命令是

使用SQL SELECT命令查询数据库。

结果是

查询的结果是一个视图,一组行和列提供了一个“窗口”,通过它可以看到一些数据库数据。如果您从一个表中选择了所有行和列,当然您只会看到该表的视图。

许多数据库系统都有一些工具可以让您发出交互式SQL命令—图9显示了一个典型的示例。发出选择命令时,工具将显示结果视图。您可能需要跳到22.3节并安装数据库。或者你的计算机实验室已经安装了数据库。然后,可以运行数据库的交互式SQL工具并尝试一些查询。

22.2.2 查询列

通常,您并不关心表中的所有列。假设你的旅行推销员儿子计划去拜访所有的顾客。为了规划路线,销售人员想知道所有客户的城市和州。以下是查询:

结果是

如您所见,查询列的语法非常简单。只需指定所需列的名称,用逗号分隔。

22.2.3 选择子集


您刚刚看到了如何限制视图以显示选定的列。有时您想选择符合特定条件的某些行。例如,您可能想找到加利福尼亚的所有客户。每当您想要选择一个子集时,都可以使用WHERE子句,后跟描述该子集的条件。这是一个例子。


剩余内容已隐藏,支付完成后下载完整资料


资料编号:[409461],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。