第九部分 附录

    附录A 常用SQL命令

    附录B 使用数据库进行练习

    附录C 测验和练习的答案

    附录D 本书范例的CREATE TABLE语句

    附录E 书中范例所涉数据的 INSERT语句

    附录F 额外练习

    术语表

    附录A 常用SQL命令

    下面详细介绍最常用的SQL命令。正像本书中反复强调的,由于很多语句在不同实现中是有区别的,所以它们的详细情况请参见具体实现的文档。

    A.1 SQL语句

    ALTER TABLE

    figure_0327_0695

    描述:修改表格的字段。

    COMMIT

    figure_0327_0696

    描述:把事务保存到数据库。

    CREATE INDEX

    figure_0327_0697

    描述:创建表格上的一个索引。

    CREATE ROLE

    figure_0327_0698

    描述:创建一个数据库角色,它可以被分配一定的系统权限和对象权限。

    CREATE TABLE

    figure_0328_0699

    描述:创建数据库的一个表格。

    CREATE TABLE AS

    figure_0328_0700

    描述:基于数据库的一个表创建另一个表。

    CREATE TYPE

    figure_0328_0701

    描述:创建自定义类型,可以用于定义表里的字段。

    CREATE USER

    figure_0328_0702

    描述:在数据库中创建一个用户账户。

    CREATE VIEW

    figure_0328_0703

    描述:创建表格的视图。

    DELETE

    figure_0328_0704

    描述:从表格里删除记录。

    DROP INDEX

    figure_0329_0705

    描述:删除表格里的索引。

    DROP TABLE

    figure_0329_0706

    描述:从数据库里删除表。

    DROP USER

    figure_0329_0707

    描述:从数据库里删除用户账户。

    DROP VIEW

    figure_0329_0708

    描述:删除表的视图。

    GRANT

    figure_0329_0709

    描述:向用户授予权限。

    INSERT

    figure_0329_0710

    描述:向表里插入新记录。

    INSERT…SELECT

    figure_0329_0711

    描述:基于一个表向另一个表插入新记录。

    REVOKE

    figure_0329_0712

    描述:撤销用户的权限。

    ROLLBACK

    figure_0330_0713

    描述:撤销数据库事务。

    SAVEPOINT

    figure_0330_0714

    描述:创建事务保存点以备回退。

    SELECT

    figure_0330_0715

    描述:从一个或多个表返回数据,用于创建查询。

    UPDATE

    figure_0330_0716

    描述:更新表里的已有数据。

    A.2 SQL子句

    SELECT

    figure_0330_0717

    描述:定义要在查询输出里显示的字段。

    FROM

    figure_0330_0718

    描述:定义要获取数据的表。

    WHERE

    figure_0331_0719

    描述:定义查询里限制返回数据的条件。

    GROUP BY

    figure_0331_0720

    描述:排序操作的一种形式,用于把输出划分为逻辑组。

    HAVING

    figure_0331_0721

    描述:类似于WHERE子句,用于在GROUP BY子句里设置条件。

    ORDER BY

    figure_0331_0722

    描述:用于对查询结果进行排序。

    附录B 使用数据库进行练习

    本附录里包含了在Windows操作系统里安装MySQL、Microsoft SQL Server和Oracle的指令。MySQL还可以运行于MacOS和Linux。书中提供的指令在本书英文版出版时是正确的,但作者和出版社都不负责软件的授权或提供软件支持。如果遇到了安装问题,或是想获得软件支持,请查看相应实现的说明文档或联系客户支持。

    注意:MySQL安装说明

    用户可能需要查看MySQL的说明文档。访问http://www.mysql.com,在产品目录下即可找到在线文档链接。

    B.1 在Windows操作系统中安装MySQL的指令

    下面的指令用于在微软Windows操作系统上安装MySQL:

    1.从http://www.mysql.com下载MySQL.ZIP,这类程序需要使用WinZip或类似的程序对下载的文件进行解压。

    2.在网站上选择Downloads(下载)标签。

    3.选择最新的稳定版本,本书英文版出版时是MySQL Community Server 5.5.8。选择合适的Windows系统插件(msi)文件,并下载到用户的计算机上。

    4.双击msi文件进入安装程序。在欢迎界面,单击“Next”按钮,如图B.1所示。

    figure_0333_0723

    图B.1 MySQL 安装程序的欢迎界面

    5.在图B.2所示的界面上,选择“Typical”单选项,然后单击“Next”按钮。

    figure_0334_0724

    图B.2 MySQL 安装程序的选项

    6.在接下来的界面中,单击“Install”按钮,开始安装。

    7.安装成功后,单击“Next”按钮,关闭安装向导。

    8.在图B.3 所示的安装完成界面上,可以勾选复选框以便配置安装实例。之后,单击“Finish”按钮。使用配置向导要比手动配置简单很多。

    figure_0334_0725

    图B.3 MySQL 安装程序的完成界面

    9.在MySQL的实例配置向导界面上,单击“Next”按钮。

    10.可以选择相应的选项来配置实例,然后单击“Next”按钮。实例配置选项会创建一个新的实例。

    11.此处选择标准配置,然后单击“Next”按钮。

    12.确保在Windows系统设置中包含MySQL的安装路径,然后单击“Next”按钮。这样,即使用户不知道MySQL的安装路径,也可以使用命令行来运行MySQL。

    13.检查安全设置。输入一个 root(管理员)密码,然后单击“Next”按钮,如图B.4所示。

    14.单击“Execute”按钮,使设置生效。

    如果前面的步骤都成功完成,就可以在本书的练习里使用MySQL了。

    如果在安装过程中遇到了问题,就卸载MySQL并重复第1步到第14步。如果仍然不能获得或安装MySQL,请联系MySQL来获取帮助。

    figure_0335_0726

    图B.4 MySQL的安全配置

    B.2 在Windows操作系统中安装Oracle的指令

    下面的指令用于在微软Windows操作系统上安装Oracle:

    注意:Oracle安装说明

    用户可能需要查看 Oracle 的说明文档。访问 http://www.oracle.com,在产品和服务目录下即可找到在线文档链接。

    1.进入http://www.oracle.com,在下载区域下载合适的安装文件。本书所涉范例需要使用Oracle 10g Express Edition版本来执行,这是个免费版本。

    2.双击安装文件进入安装程序,在第一个界面上单击“Next”按钮。

    3.单击同意许可协议,然后单击“Next”按钮。

    4.在图B.5所示界面上,选择默认安装,并选择安装路径,然后单击“Next”按钮。

    figure_0335_0727

    图B.5 Oracle安装路径

    5.输入系统(管理员)密码,如图B.6所示,然后单击“Next”按钮。

    6.在接下来的界面中,单击“Install”按钮,开始安装。

    figure_0336_0728

    图B.6 设置系统密码

    如果安装成功,将会看到图B.7所示的完成界面。

    figure_0336_0729

    图B.7 Oracle 安装完成界面

    如果前面的步骤都成功完成,就可以在本书的练习里使用Oracle了。

    如果在安装过程中遇到了问题,就卸载Oracle并重复第1步到第6步。如果仍然不能获得或安装Oracle,请联系Oracle来获取帮助。

    B.3 在Windows操作系统中安装Microsoft SQL Server的指令

    下面的指令用于在微软Windows操作系统上安装Microsoft SQL Server:

    1.进入www.microsoft.com/sqlserver/2008/en/us/express.aspx,单击“Download”,选择合适的安装文件并下载。

    2.双击安装文件,进入图B.8所示的初始化界面。

    3.在右侧的区域选择新的安装选项,如图B.9所示,开始安装将在主安装程序中使用的支持文件。

    注意:Microsoft SQL Server安装说明

    用户可能需要查看Microsoft SQL Server的说明文档。访问www.microsoft. com/sqlserver/2008/en/us/default.aspx,在产品信息标签下即可找到在线文档链接。

    figure_0337_0730

    图B.8 SQL Server 初始化安装界面

    figure_0337_0731

    图B.9 SQL Server 安装选项界面

    4.选择全新安装,然后单击“Next”按钮。

    5.接受许可条款,然后单击“Next”按钮。

    6.选中所有的选项,然后单击“Next”按钮。

    7.选择默认实例,然后单击“Next”按钮。

    8.在所需磁盘空间界面单击“Next”按钮。

    9.在数据库发动机配置界面,单击“Add Current User”按钮,将用户添加为实例管理员,然后单击“Next”按钮。

    10.在错误报告界面单击“Next”按钮。

    11.在安装配置规则界面单击“Next”按钮,开始进行安装。

    如果前面的步骤都成功完成,将会看到一个完成界面。之后就可以在本书的练习里使用Microsoft SQL Server了。

    如果在安装过程中遇到了问题,就卸载SQL Server并重复第 1步到第 11步。如果仍然不能获得或安装Microsoft SQL Server,请联系Microsoft来获取帮助。

    附录C 测验和练习的答案

    第1章

    测验答案

    1.缩写“SQL”的含义是什么?

    SQL表示结构化查询语言。

    2.SQL命令的6个主要类别是什么?

    数据定义语言(DDL)

    数据操作语言(DML)

    数据查询语言(DQL)

    数据控制语言(DCL)

    数据管理命令(DAC)

    事务控制命令(TCC)

    3.4个事务控制命令是什么?

    figure_0339_0732

    4.对于数据库访问来说,客户端/服务器模型与Web技术之间的主要区别是什么?

    主要区别在于与数据库的连接。使用客户端连接会登录到服务器,直接连接到数据库;而使用Web时,我们会登录到能够到达数据库的互联网上。

    5.如果一个字段被定义为NULL,这是否表示这个字段必须要输入某些内容?

    不是。如果某个字段被定义为 NULL,表示字段可以不必输入任何内容。如果字段被定义为NOT NULL,则表示字段必须输入数据。

    练习答案

    1.说明下面的SQL命令分别属于哪个类别:

    figure_0340_0733

    CREATE TABLE:DDL,数据定义语言

    DELETE:DML,数据操作语言

    SELECT:DQL,数据查询语言

    INSERT:DML,数据操作语言

    ALTER TABLE:DDL,数据定义语言

    UPDATE:DML,数据操作语言

    2.观察下面这个表,选出适合作为主键的列:

    figure_0340_0734

    表EMPLOYEE_TBL的主键应该是雇员号码。每个雇员都会被分配一个唯一的号码,但雇员可能会有相同的姓名、电话号码、雇佣日期和地址。

    表INVENTORY_TBL的主键应该是物品号码,其他字段可能包含重复数据。

    表EQUIPMENT_TBL的主键应该是设备号码,其他字段可能包含重复数据。

    3.不需要答案。

    第2章

    测验答案

    1.判断对错:个人社会保险号码,输入格式为 '1111111111',它可以是下面任何一种数据类型:定长字符、变长字符、数值。

    答:对,只要有效数字达到必要长度。

    2.判断对错:数值类型的标度是指数值的总体长度。

    答:错。有效数字才是总体长度,而标度表示小数点右侧保留的位数。

    3.所有的SQL实现都使用同样的数据类型吗?

    答:不是。大多数实现的数据类型都有所不同。虽然它们都遵循ANSI描述的标准,但不同厂商采取了不同的存储方式,可能导致数据类型有所差异。

    4.下面定义的有效位数和标度分别是多少?

    figure_0341_0735

    答:DECIMAL(4,2)有效位数是4,标度是2;

    DECIMAL(10,2)有效位数是10,标度是2;

    DECIMAL(14,1)有效位数是14,标度是1。

    5.下面哪个数值能够输入到定义为DECIMAL(4,1)的字段里?

    A.16.2

    B.116.2

    C.16.21

    D.1116.2

    E.1116.21

    答:前3个数值可以,但16.21会被四舍五入为16.2。数值1116.2和1116.21超过了最多有效位数的限制(4)。

    6.什么是数据?

    答:数据是信息的集合,以某种数据类型保存在数据库里。

    练习答案

    1.考虑以下字段名称,为它们设置适当的数据类型,确定恰当的长度,并给出一些示范数据:

    a)ssn

    b)state

    c)city

    d)phone_number

    e)zip

    f)last_name

    g)first_name

    h)middle_name

    i)salary

    j)hourly_pay_rate

    k)date_hired

    答:SSN,定长字符串,‘11111111’;

    STATE,变长字符串,‘INDIANA’;

    CITY,变长字符串,‘INDIANAPOLIS’;

    PHONE_NUMBER,定长字符串,‘(555)555-5555’;

    ZIP,定长字符串,‘46113’;

    LAST_NAME,变长字符串,‘JONES’;

    FIRST_NAME,变长字符串,‘JACQUELINE’;

    MIDDLE_NAME,变长字符串,‘OLIVIA’;

    SALARY,数值,30000;

    HOURLY_PAY_RATE,小数,35.00;

    DATE_HIRED,日期,‘29/10/2007’

    2.同样是这些字段,判断它们应该是NULL或NOT NULL。体会在不同的应用场合,有些一般是NOT NULL的字段可能应该是NULL,反之亦然。

    a)ssn

    b)state

    c)city

    d)phone_number

    e)zip

    f)last_name

    g)first_name

    h)middle_name

    i)salary

    j)hourly_pay_rate

    k)date_hired

    figure_0342_0736

    不是每个人都有电话号码(虽然可能性不大),不是每个人都有中间名,所以这些字段应该允许包含NULL。另外,不是全部雇员都按小时支付工资。

    3.不需要答案。

    第3章

    测验答案

    1.下面这个CREATE TABLE命令能够正常执行吗?需要做什么修改?在不同的数据库(MySQL、Oracle、SQL Server)中执行,有什么限制吗?

    figure_0343_0737

    答:这个CREATE TABLE语句不能正常执行,语法中有几处错误。下面是正确的语句,适用于Oracle数据库,之后是错误列表。

    figure_0343_0738

    需要修改的是:

    (1)其中的AS,它不应该出现在这个CREATE TABLE语句里。

    (2)LAST_NAME字段的NOT NULL之后少了一个逗号。

    (3)字段MIDDLE_NAME应该是NULL,因为不是所有人都有中间名。

    (4)字段 ST ADDRESS应该是 ST_ADDRESS。如果分成两个单词,数据库会把 ST当作字段名称,把ADDRESS当作一个数据类型,这当然是无效的。

    (5)CITY字段可以正常工作,但使用数据类型VARCHAR2更好一些。如果全部城市名称都具有同样的长度,数据类型CHAR也可以。

    (6)STATE字段少了一个左圆括号。

    (7)ZIP字段的长度应该是5而不是4。

    (8)字段DATE HIRED应该是DATE_HIRED,也就是用下划线让字段名称成为一个连续的字符串。

    2.能从表里删除一个字段吗?

    答:当然。但是,虽然这是一个ANSI标准,但还是应该查看具体实现的文档来了解是否支持这个功能。

    3.在前面的表EMPLOYEE_TBL里创建一个主键约束应该使用什么语句?

    答:

    figure_0344_0739

    4.为了让前面的表EMPLOYEE_TBL里的MIDDLE_NAME字段可以接受NULL值,应该使用什么语句?

    答:

    figure_0344_0740

    5.为了让前面的表 EMPLOYEE_TBL 里添加的人员记录只能位于纽约州(‘NY’),应该使用什么语句?

    答:

    figure_0344_0741

    6.要在前面的表EMPLOYEE_TBL里添加一个名为EMPID的自动增量字段,应该使用什么语句,才能同时符合MySQL和SQL Server的语法结构?

    答:

    figure_0344_0742

    练习答案

    不需要答案。

    第4章

    测验答案

    1.判断正误。规格化是把数据划分为逻辑相关组的过程。

    答:对。

    2.判断正误。让数据库里没有重复或冗余数据,让数据库里所有内容都规格化,总是最好的方式。

    答:错,不一定。规格化会让更多的表需要结合,增加I/O和CPU时间,从而降低数据库性能。

    3.判断正误。如果数据是第三规格形式,它会自动属于第一和第二规格形式。

    答:对。

    4.与规格化数据库相比,反规格化数据库的主要优点是什么?

    答:最大优点是改善性能。

    5.反规格化的主要缺点是什么?

    答:冗余和重复数据会占据额外的空间,难以编程,需要更多的数据维护工作。

    6.在以数据库进行规格化时,如何决定数据是否需要转移到单独的表?

    答:如果表包含冗余的数据组,这些数据就可以转移到单独的表里。

    7.对数据库设计进行过度规格化的缺点是什么?

    答:过度规格化会大量占用CPU和内存资源,给服务器造成很大的压力。

    练习答案

    1.为一家小公司开发一个新数据库,使用如下数据,对其进行规格化。记住,即使是一家小公司,其数据库的复杂程度也会超过这里给出的范例。

    雇员:

    figure_0345_0743

    顾客:

    figure_0345_0744

    顾客订单:

    figure_0345_0745

    答:

    figure_0345_0746

    2.不需要答案。

    第5章

    测验答案

    使用具有如下结构的表EMPLOYEE_TBL:

    figure_0346_0747

    下列语句运行后会有什么结果?

    a)

    figure_0346_0748

    答:这个INSERT语句不会运行,因为缺少了关键字VALUES。

    b)

    figure_0346_0749

    答:一条记录会被插入到表EMPLOYEE_TBL。

    c)

    figure_0346_0750

    答:一条记录会被插入到表EMPLOYEE_TBL,字段PHONE的值是NULL。

    d)

    figure_0346_0751

    答:这个 INSERT语句不会执行,因为字段FIRST_NAME是NOT NULL。

    e)

    figure_0346_0752

    答:表EMPLOYEE_TBL里的全部记录都会被删除。

    f)

    figure_0346_0753

    答:表EMPLOYEE_TBL里全部姓SMITH的记录都会被删除。

    g)

    figure_0347_0754

    答:表EMPLOYEE_TBL里 JOHN SMITH的记录会被删除。

    h)

    figure_0347_0755

    答:所有记录的LAST_NAME字段都被设置为CONRAD。

    i)

    figure_0347_0756

    答:JOHN SMITH和SUE SMITH现在变成 JOHN CONRAD和SUE CONRAD。

    j)

    figure_0347_0757

    答:全部雇员的姓名现在都是LARRY CONRAD。

    k)

    figure_0347_0758

    答:JOHN SMITH现在变成LARRY CONRAD。

    练习答案

    1.不需要答案。

    2.使用表PRODUCTS_TBL进行下面的练习。

    a)向产品表添加如下产品:

    figure_0347_0759

    答:

    figure_0347_0760

    b)利用DML修改所添加两种服装的价格,它们应该与女巫的服装同价。

    答:

    figure_0348_0761

    c)现在要缩减产品线,首先对新产品下手。删除刚刚添加的3种产品。

    答:

    figure_0348_0762

    d)在执行DELETE语句之前,有什么办法可以用来确定所删除的数据准确无误呢?

    答:为了确保所删除的内容准确无误,需要先执行一个SELECT语句,其中的FROM和WHERE子句与删除语句相同。

    第6章

    测验答案

    1.判断正误。如果提交了一些事务,还有一些事务没有提交,这时执行ROLLBACK命令,同一过程里的全部事务都会被撤销。

    答:错。当事务被提交之后,是不能被回退的。

    2.判断正误。SAVEPOINT命令会把一定数量已执行事务之后的事务保存起来。

    答:错。保存点只是回退的一个标记点。

    3.简要叙述下面每个命令的作用:COMMIT、ROLLBACK和SAVEPOINT。

    答:COMMIT保存由事务产生的变化。ROLLBACK撤销由事务产生的变化。SAVEPOINT在事务里创建用于回退的逻辑点。

    4.在Microsoft SQL Server中执行事务有什么不同点?

    答:除非将语句置于事务之中,否则SQL Server会自动提交执行语句。此外,SQL Server中的SAVEPOINT语法也不同。同时,SQL Server不支持RELEASE SAVEPOINT命令。

    5.使用事务进行操作的实质是什么?

    答:事务会对临时存储空间进行操作,因为数据库服务器需要记录语句执行前的所有变化,以便在需要ROLLBACK的时候进行撤销。

    练习答案

    1.执行如下事务,并且在第 3 个事务之后创建一个保存点或者一个保存事务,然后在最后执行一条ROLLBACK命令。请说明上述操作完成之后表CUSTOMER_TBL的内容。

    答:

    figure_0349_0763

    2.执行如下事务,在第3个事务之后创建一个保存点。

    事务执行完之后添加一条COMMIT命令,之后再加上一条回退到保存点的ROLLBACK命令,这时会发生什么呢?

    答:

    figure_0349_0764

    由于语句已经被提交了,所以ROLLBACK语句没有任何效果。

    第7章

    测验答案

    1.说出任何SELECT语句都需要的组成部分。

    答:SELECT和FORM关键字,或称为子句,是所有SELECT语句都必须具有的。

    2.在WHERE子句里,任何数据都需要使用单引号吗?

    答:不是。字符数据类型需要使用单引号,数值数据不需要。

    3.SELECT语句属于SQL语言里哪一类命令?

    答:SELECT语句属于数据查询语言。

    4.WHERE子句里能使用多个条件吗?

    答:可以。SELECT、INSERT、UPDATE和DELETE语句里的WHERE子句可以包含多个条件,这些条件是通过操作符AND和OR关联在一起的,详情请见第8章。

    5.DISTINCT选项的作用是什么?

    答:使用这个选项时不会显示重复内容。

    6.选项ALL是必需的吗?

    答:不是。虽然这个选项是可以使用的,但它不是必需的。

    7.在基于字符字段进行排序时,数字字符是如何处理的?

    答:它们按照 ASCII 字符进行排序,这意味着数字字符会这样排序:1、12、2、222、22222、3、33。

    8.在大小写敏感性方面,Oracle与MySQL和Microsoft SQL Server有什么不同?

    答:Oracle默认是大小写敏感的。

    练习答案

    1.在计算机上运行RDBMS。使用数据库learnsql,输入以下SELECT命令。判断其语法是否正确,如果不正确就进行必要的修改。这里使用的是表EMPLOYEE_TBL。

    a)

    figure_0350_0765

    答:这个SELECT语句不会执行,因为FIRST_NAME字段后面多了一个逗号,正确的语法应该是这样的:

    a)

    figure_0350_0766

    b)

    figure_0350_0767

    答:这个SELECT语句不会执行,因为FROM和ORDER BY子句的次序有误。正确的语法应该是这样的:

    figure_0350_0768

    c)

    figure_0350_0769

    答:这个SELECT语句是正确的。

    d)

    figure_0351_0770

    答:这个SELECT语句是正确的。注意其中的EMP_ID字段被重命名为SSN。

    e)

    figure_0351_0771

    答:这个SELECT语句的语法是正确的。注意ORDER BY子句里字段的次序。返回数据的排序先后是:首先是FIRST_NAME,接着是EMP_ID,最后是LAST_NAME。

    2.下面这个SELECT语句能工作吗?

    figure_0351_0772

    答:虽然这个语句不会返回什么数据,但语法是正确的,语句可以执行。没有返回数据是因为没有记录的EMP_ID是333333333。

    3.编写一条SELECT语句,从表PRODUCTS_TBL里返回每件产品的名称和价格。哪个产品是最贵的?

    答:

    figure_0351_0773

    4.编写一个查询,生成全部顾客及其电话号码的列表。

    答:

    figure_0351_0774

    5.答案有所不同。

    第8章

    测验答案

    1.判断正误:在使用操作符OR时,全部条件都必须是TRUE。

    答:错。只需要有一个条件为TRUE。

    2.判断正误:在使用操作符IN时,所有指定的值都必须匹配。

    答:错。只需要有一个值匹配。

    3.判断正误:操作符AND可以用于SELECT和WHERE子句。

    答:错。操作符AND只能用于WHERE子句。

    4.判断正误:操作符ANY可以使用一个表达式列表。

    答:错。操作符ANY不能使用表达式列表。

    5.操作符IN的逻辑求反是什么?

    答:NOT IN。

    6.操作符ANY和ALL的逻辑求反是什么?

    答:<>ANY和<>ALL。

    7.下面的SELECT语句有错吗?错在何处?

    a)

    figure_0352_0775

    答:20000和30000之间少了AND。正确的语法是:

    figure_0352_0776

    b)

    figure_0352_0777

    答:字段DATE_HIRE的数据类型是DATE,不能用于算术函数。

    c)

    figure_0352_0778

    答:语法正确。

    练习答案

    1.使用下面这个表CUSTOMER_TBL,编写一条SELECT语句,选择住在Indiana、Ohio、Michigan和Illinois并且姓名以字母A或B开头的客户,返回它们的ID和姓名(以字母顺序)。

    figure_0352_0779

    答:

    figure_0353_0780

    2.使用下面这个表PRODUCTS_TBL,编写一个SQL语句,选择产品价格在$1.00与$12.50之间的产品,返回它们的ID、描述和价格。

    figure_0353_0781

    答:

    figure_0353_0782

    3.如果在第2个练习题里使用了操作符BETWEEN,重新编写SQL语句,使用另一种操作符来得到相同的结果。如果没有使用BETWEEN,现在就来用一用。

    答:

    figure_0353_0783

    4.编写一个SELECT语句,返回价格小于1.00或大于12.50产品。有两种方法可以实现。

    答:

    figure_0353_0784

    还要注意的是,BETWEEN包含上限和下限,而NOT BETWEEN不包含。

    5.编写一个SELECT语句,从表PRODUCTS_TBL返回以下信息:产品描述、产品价格、每个产品5%的销售税。产品列表按价格从高到低排列。

    答:

    figure_0353_0785

    6.编写一个SELECT语句,从表PRODUCTS_TBL返回以下信息:产品描述、产品价格、每个产品 5%的销售税、加上销售税的总价。产品列表按价格从高到低排列。有两种方法可以实现。

    答:

    figure_0354_0786

    7.任选PRODUCTS_TBL表中的3种产品。编写一个查询,返回这3种产品的相关记录。之后,再重新编写一个查询,返回除这3种产品之外的所有产品记录。在查询中,组合使用相等操作符和连接操作符。

    答:

    figure_0354_0787

    8.使用IN操作符重新编写练习题7中的查询。比较两种写法,哪种更高效?哪种更易读?

    答:

    figure_0354_0788

    9.编写一个查询,返回所有名称以P开头的产品的记录。之后,再重新编写一个查询,返回所有名称不以P开头的产品的记录。

    答:

    figure_0354_0789

    第9章

    测验答案

    1.判断正误:AVG函数返回全部行里指定字段的平均值,包括NULL值。

    答:错,不会考虑NULL值。

    2.判断正误:SUM函数用于统计字段之和。

    答:错,SUM函数用于返回一组记录之和。

    3.判断正误:COUNT(*)函数统计表里的行数。

    答:对。

    4.下面的SELECT语句能运行吗?如果不行,应该如何修改?

    a)

    figure_0355_0790

    答:这个语句不能执行,因为星号两侧少了一对圆括号。正确语法是:

    figure_0355_0791

    b)

    figure_0355_0792

    答:语法正确,语句可以执行。

    c)

    figure_0355_0793

    答:语法正确,语句可以执行。

    d)

    figure_0355_0794

    答:语法正确,语句可以执行。

    e)

    figure_0355_0795

    答:这个语句不能执行,因为字段LAST_NAME不是数值数据类型的。

    f)

    figure_0355_0796

    答:语法正确,语句可以执行。

    练习答案

    1.利用表EMPLOYEE_TBL构造SQL语句,完成如下练习。

    a)平均薪水是多少?

    答:平均薪水是$30 000.00。返回这个数据的SQL语句是:

    figure_0355_0797

    b)最大奖金是多少?

    答:最大资金是$2 000.00。返回这个数据的SQL语句是:

    figure_0356_0798

    c)总薪水是多少?

    答:总薪水是$90 000.00。返回这个数据的SQL语句是:

    figure_0356_0799

    d)最低小时工资是多少?

    答:最低小时工资是$11.00,返回这个数据的SQL语句是:

    figure_0356_0800

    e)表里有多少行记录?

    答:表里的记录总数是6,返回这个数据的SQL语句是:

    figure_0356_0801

    2.有多少雇员的姓以G开头?

    答:有两个。获得这个数据的SQL语句是:

    figure_0356_0802

    3.编写一个查询,来确定系统中所有订单的总额。如果每个产品的价格是$10.00,全部订单的总额是多少?

    答:

    figure_0356_0803

    4.如果所有雇员的姓名按照字母表排序,那么编写一个查询,来确定第一个和最后一个雇员的姓名是什么?

    答:

    figure_0356_0804

    5.编写一个查询,对雇员姓名列使用AVG函数。查询语句能运行吗?思考为什么会产生这样的结果。

    答:

    figure_0356_0805

    此处会报错,因为这里不是数值型数据。

    第10章

    测验答案

    1.下面的SQL语句能正常执行吗?

    a)

    figure_0357_0806

    答:不能。GROUP BY子句里的 and是不正确的,而且这里不能使用整数数字。正确的语法是:

    figure_0357_0807

    b)

    figure_0357_0808

    答:这个语句可以执行。

    c)

    figure_0357_0809

    答:这个语句不能执行。ORDER BY子句和GROUP BY子句的次序不正确,另外,GROUP BY子句里必须有EMP_ID字段。正确的语法是:

    figure_0357_0810

    d)

    figure_0357_0811

    答:这个语句可以执行。

    2.判断正误:在使用HAVING子句时一定也要使用GROUP BY子句。

    答:错。使用HAVING子句不是一定要使用GROUP BY子句。

    3.判断正误:下面的SQL语句返回分组的薪水总和:

    figure_0357_0812

    答:错,这个语句里没有GROUP BY子句,所以不能返回分组的薪水总和。

    4.判断正误:被选中的字段在GROUP BY子句里必须以相同次序出现。

    答:错。SELECT子句里的字段与GROUP BY子句里的字段可以具有不同次序。

    5.判断正误:HAVING子句告诉GROUP BY子句要包括哪些分组。

    答:对。

    练习答案

    1.不需要答案。

    2.不需要答案。

    3.不需要答案。

    4.修改练习3里的查询,把结果按降序排序,也就是数值从大到小。

    答:

    figure_0358_0813

    5.编写一个查询,从表EMPLOYEE_PAY_RATE里列出每个城市的平均税率和工资。

    答:

    figure_0358_0814

    6.编写一个查询,从表EMPLOYEE_PAY_RATE里列出城市平均薪水高于$20 000的每个城市的平均薪水。

    答:

    figure_0358_0815

    第11章

    测验答案

    1.匹配函数与其描述。

    答:

    描述 函数

    a.从字符串里选择一部分 SUBSTR

    b.从字符串左侧或右侧剪切字符串 LTRIM/RTRIM

    c.把全部字符都改变为大写 UPPER

    d.确定字符串的长度 LENGTH

    e.连接字符串 ||

    2.判断正误:在 SELECT 语句里使用函数调整数据输出外观时会影响数据库里存储的数据。

    答:错。

    3.判断正误:当查询里出现函数嵌套时,最外层的函数会首先被处理。

    答:错。最内层的函数会首先被处理。

    练习答案

    1.不需要答案。

    2.不需要答案。

    3.编写一个SQL语句,列出雇员的电子邮件地址。电子邮件地址并不是数据库里的一个字段,雇员的电子邮件地址应该由以下形式构成:

    figure_0359_0816

    举例来说,John Smith的电子邮件地址是 JOHN.SMITH@PERPTECH.COM。

    答:

    figure_0359_0817

    4.编写一个SQL语句,以如下形式列出雇员的姓名、ID和电话号码。

    a.姓名显示为SMITH,JOHN;

    b.雇员ID显示为999-99-9999;

    c.电话号码显示为(999)999-9999。

    答:

    figure_0359_0818

    第12章

    测验答案

    1.系统日期和时间源自于哪里?

    答:系统日期和时间源自于主机操作系统的当前日期和时间。

    2.列出DATETIME值的标准内部元素?

    答:YEAR、MONTH、DAY、HOUR、MINUTE和SECOND。

    3.如果公司是个国际公司,在处理日期和时间的比较与表示时,应该考虑的一个重要因素是什么?

    答:时区。

    4.字符串表示的日期值能不能与定义为DATETIME类型的日期值进行比较?

    答:DATETIME数据类型不能与定义字符串的日期值进行准确的比较,字符串必须首先转换为DATETIME数据类型。

    5.在SQL Server、MySQL和Oracle里,使用什么函数获取当前日期和时间?

    答:NOW()。

    练习答案

    1.不需要答案。

    2.不需要答案。

    3.不需要答案。

    4.不需要答案。

    5.不需要答案。

    6.每名雇员是在星期几被雇用的?

    答:利用如下语句获得数据:

    figure_0360_0819

    7.今天的儒略日期是多少(积日)?

    答:使用如下语句获得数据:

    figure_0360_0820

    8.不需要答案。

    第13章

    测验答案

    1.如果不论相关表里是否存在匹配的记录,都要从表里返回记录,应该使用什么类型的结合?

    答:使用外向结合。

    2.JOIN条件位于SQL语句的什么位置?

    答:JOIN条件位于WHERE子句里。

    3.使用什么类型的结合来判断相关表的记录之间的相等关系?

    答:相等结合。

    4.如果从两个不同的表获取数据,但它们没有结合,会产生什么结果?

    答:我们会得到表的笛卡尔积(这也被称为交叉结合)。

    5.使用如下的表:

    figure_0361_0821

    下面使用外部结合的语法正确吗?

    figure_0361_0822

    答:不正确。加号(+)应该只在WHERE子句里的O.CUST_ID字段之后。正确的语法是:

    figure_0361_0823

    如果使用繁琐语法,上述查询语句会是什么样子?

    figure_0361_0824

    练习答案

    1.不需要答案。

    2.不需要答案。

    3.改写练习2里的SQL查询语句,使用 INNER JOIN语法。

    答:

    figure_0361_0825

    4.编写一个SQL语句,从表EMPLOYEE_TBL返回EMP_ID、LAST_NAME和FIRST_NAME字段,从表EMPLOYEE_PAY_TBL返回SALARY和BONUS字段。使用两种类型的 INNER JOIN技术。完成上述查询以后,再进一步计算出每个城市雇员的平均薪水是多少。

    答:

    figure_0361_0826

    figure_0362_0827

    5.不需要答案。

    第14章

    测验答案

    1.在用于SELECT语句时,子查询的功能是什么?

    答:在用于SELECT语句时,子查询的主要功能是返回主查询需要的数据。

    2.在子查询与UPDATE语句配合使用时,能够更新多个字段吗?

    答:是,使用一个UPDATE和子查询语句可以同时更新多个字段。

    3.下面的语法正确吗?如果不正确,那正确的语法应该是怎样?

    a)

    figure_0362_0828

    答:语法正确。

    b)

    figure_0362_0829

    答:不正确。操作符BETWEEN不能以这种格式使用。

    c)

    figure_0362_0830

    答:语法正确。

    4.下面语句执行的结果是什么?

    figure_0363_0831

    答:表EMPLOYEE_TBL里与表EMPLOYEE_PAY_TBL里具有相同EMP_ID的记录会被全部删除。这时,我们强烈推荐在子查询里使用WHERE子句。

    练习答案

    1.不需要答案。

    2.使用子查询编写一个SQL语句来更新表CUSTOMER_TBL,找到ORD_NUM列中订单号码为 23E934的顾客,把顾客名称修改为DAVIDS MARKET。

    答:

    figure_0363_0832

    3.使用子查询编写一个SQL语句,返回章工资高于 JOHN DOE的全部雇员的姓名;JOHN DOE的雇员标识号码是 343559876。

    答:

    figure_0363_0833

    4.使用子查询编写一个SQL语句,列出所有价格高于全部产品平均价格的产品。

    答:

    figure_0363_0834

    第15章

    测验答案

    在下面的练习里使用INTERSECT或EXCEPT操作符时,请参考Oracle的语法。

    1.下面组合查询的语法正确吗?如果不正确,请修改它们。它们使用的表EMPLOYEE_TBL和EMPLOYEE_PAY_TBL如下所示:

    figure_0364_0835

    a)

    figure_0364_0836

    答:这个组合查询不会执行,因为数据类型不匹配。EMP_ID字段是匹配的,但LAST_NAME和FIRST_NAME并不匹配POSITION和DATE_HIRE数据类型。

    b)

    figure_0364_0837

    答:语句正确。

    c)

    figure_0364_0838

    答:这个组合查询会正常执行。

    2.匹配操作符与相应的描述。

    figure_0364_0839

    练习答案

    下面的练习请参考本章介绍的语法。由于 MySQL 不支持本章介绍的两个操作符,所以请自行编写查询语句,并与书中提供的进行比较。

    使用的表CUSTOMER_TBL和ORDERS_TBL如下所示:

    figure_0365_0840

    3.编写一个组合查询,返回下了订单的顾客。

    答:

    figure_0365_0841

    4.编写一个组合查询,返回没有下订单的顾客。

    答:

    figure_0365_0842

    第16章

    测验答案

    1.使用索引的主要缺点是什么?

    答:索引的主要缺点包括会减缓批处理操作、占据磁盘空间、维护开销。

    2.组合索引里的字段顺序为什么很重要?

    答:因为先执行最严格的条件就会改善性能。

    3.具有大量NULL值的字段是否应该设置索引?

    答:不,具有大量NULL值的字段不应该设置索引。当很多记录的值相同时,访问它们的速度会因此而下降。

    4.索引的主要作用是去除表里的重复数据吗?

    答:不是。索引的主要作用是提高数据检索速度。当然,唯一索引会禁止表里包含重复数据。

    5.判断正误:使用组合索引的主要原因是在索引里使用汇聚函数。

    答:错。组合索引的主要是对同一个表里的两个或多个字段设置索引。

    6.基数是什么含义?什么样的字段可以被看作是高基数的?

    答:基数是指数据在字段里的唯一性。SSN(社会保险号码)就是这种字段的一个范例。

    练习答案

    1.判断在下列情况下是否应该使用索引,如果是,请选择索引的类型。

    A.字段很多,但表的规模相对较小。

    答:小规模表不需要设置索引。

    B.中等规模的表,不允许有重复值。

    答:可以使用唯一索引。

    C.多个字段,大规模的表,多个字段用在WHERE子句作为过滤器。

    答:可以针对WHERE子句里使用的字段设置组合索引。

    D.大规模表,很多字段,大量数据操作。

    答:可以根据过滤、排序和分级的要求设置单字段索引或组合索引。对于大规模数据操作来说,可以在执行INSERT、UPDATE或DELETE语句之前删除索引,之后再重新创建。

    2.不需要答案。

    3.修改练习2所创建的索引,将其变成唯一索引。要为SALARY字段创建唯一索引,需要做些什么?编写并依次运行这些命令。

    答:

    figure_0366_0843

    4.研究本书里使用的表,根据用户可能对表进行的检索方式,判断哪些字段适合设置索引。

    答:

    figure_0366_0844

    5.在表 ORDERS_TBL 上创建一个多字段索引,包含下列字段:CUST_ID、PROD_ID和ORD_DATE。

    答:

    figure_0367_0845

    6.答案不确定。

    第17章

    测验答案

    1.在小规模表上使用唯一索引会带来什么好处吗?

    答:这个索引对于性能来说没有任何好处,但有助于保持引用完整性。关于引用完整性请见第3章。

    2.当查询执行时,如果优化器决定不使用表上的索引,会发生什么呢?

    答:全表扫描。

    3.WHERE子句里的最严格条件应该放在结合条件之前还是之后呢?

    答:最严格条件应该在结合条件之前求值,因此结合条件通常会返回大量的数据。

    练习答案

    1 .改写下面的 SQL 语句来改善性能。使用如下所示的表 EMPLOYEE_TBL 和表EMPLOYEE_PAY_TBL。

    figure_0367_0846

    a)

    figure_0367_0847

    figure_0368_0848

    答:

    figure_0368_0849

    根据经验,把OR条件转换为IN列表会更好一些。

    b)

    figure_0368_0850

    答:

    figure_0368_0851

    如果在条件值里不包含首字符,就不能发挥索引的作用。

    c)

    figure_0368_0852

    答:

    figure_0368_0853

    2.添加一个名为EMPLOYEE_PAYHIST_TBL的表,用于存放大量的支付历史数据。使用下面的表来编写SQL语句,解决后续的问题。

    figure_0368_0854

    首先思考,用什么方法能够确定所写的查询可以正确执行?

    a.查询正式员工(salaried employee)和非正式员工(nonsalaried employee)在付薪第一年各自的总人数。

    答:

    figure_0369_0855

    b.查询正式员工和非正式员工在付薪第一年各自总人数的差异。其中,非正式员工全年无缺勤(PAY_RATE 52 40)。

    答:

    figure_0369_0856

    c.查询正式员工现在和刚入职时的薪酬差别。同样,非正式员工全年无缺勤。并且,员工的薪水在EMPLOYEE_PAY_TBL和EMPLOYEE_PAYHIST_TBL两个表中都有记录。在支付历史表中,当前支付记录的END_DATE字段为NULL值。

    答:

    figure_0370_0857

    第18章

    测验答案

    1.使用什么命令创建会话?

    答:CONNECT TO语句。

    2.在删除包含数据库对象的规划时,必须要使用什么选项?

    答:使用CASCADE选项可以删除包含对象的规划。

    3.MySQL里使用什么命令创建规划?

    答:CREATE SCHEMA命令。

    4.使用什么命令撤销数据库权限?

    答:REVOKE命令用于撤销数据库权限。

    5.什么命令能够创建表、视图和权限的组或集合?

    答:CREATE SCHEMA语句。

    6.在SQL Server中,登录账户和数据库账户有什么区别?

    答:登录账户可以登录SQL Server实例并访问资源。数据库账户可以访问数据库并被赋予了相应的权限。

    练习答案

    1.描述如何在learnsql数据库里创建一个新用户“John”。

    答:

    figure_0371_0858

    2.如何让新用户John能够访问表Employee_tbl。

    答: figure_0371_0859

    3.描述如何设置John的权限,让它访问learnsql数据库里的全部对象?

    答: figure_0371_0860

    4.描述如何撤销John的权限并且删除他的账户。

    答: figure_0371_0861

    第19章

    测验答案

    1.如果用户要把不是其所属对象的权限授予另一个用户,必须具有什么选项?

    答: figure_0371_0862

    2.当权限被授予PUBLIC之后,是数据库的全部用户,还是仅特定用户获得这些权限?

    答:数据库的全部用户都会获得这些权限。

    3.查看指定表里的数据需要什么权限?

    答:SELECT权限。

    4.SELECT是什么类型的权限?

    答:对象级权限。

    5.如果想撤销用户对某个对象的权限,以及其他使用GRANT分配了这个对象权限的用户的权限,应该使用什么选项?

    答:在REMOVE命令里使用CASCADE选项可以删除该对象分配出去的权限。

    练习答案

    1.不需要答案。

    2.不需要答案。

    3.不需要答案。

    4.不需要答案。

    第20章

    测验答案

    1.在一个基于多个表创建的视图里,我们可以删除记录吗?

    答:不能。只有基於单个表创建的视图才能使用DELETE、INSERT和UPDATE命令。

    2.在创建一个表时,所有者会自动被授予适当的权限。在创建视图时也是这样吗?

    答:是的。视图所有者自动被授予关于视图的适当权限。

    3.在创建视图时,使用什么子句对数据进行排序?

    答:在视图里GROUP BY子句起到了普通查询中ORDER BY子句(或GROUP BY子句)的作用。

    4.在基于视图创建视图时,使用什么选项检查完整性约束?

    答:WITH CHECK OPTION。

    5.在尝试删除视图时,由于存在着多个底层视图,操作出现了错误。这时怎样做才能删除视图?

    答:在DROP语句里添加CASCADE选项,这样可以删除全部的底层视图。

    练习答案

    1.编写一个语句,基于表EMPLOYEE_TBL的全部内容创建一个视图。

    答:

    figure_0372_0863

    2.编写一个语句创建一个包含摘要数据的视图,显示表 EMPLOYEE_TBL 里每个城市的平均章工资和平均薪水。

    答:

    figure_0372_0864

    3.再次创建练习2中的摘要数据视图,但不要使用表EMPLOYEE_TBL,而是使用练习1中所创建的视图。比较两个结果。

    答:

    figure_0372_0865

    4.使用练习2中创建的视图来创建一个名为EMPLOYEE_PAY_SUMMARIZED的表。想办法确定视图和表拥有相同的数据。

    答:

    figure_0372_0866

    5.编写SQL语句来删除表和刚刚创建的视图。

    答:

    figure_0373_0867

    第21章

    测验答案

    1.在某些实现里,系统目录也被称为什么?

    答:系统目录也被称为“数据目录”。

    2.普通用户能够更新系统目录吗?

    答:不能直接更新。但是当用户创建对象时,系统目录会自动更新。

    3.在Microsoft SQL Server里哪个系统表格包含了数据库里视图的信息?

    答:SYSVIEWS。

    4.谁拥有系统目录?

    答:系统目录的拥有者通常是名为SYS或SYSTEM的用户,它也可以属于数据库的其他用户,但通常不会属于数据库里某个特定规划。

    5.Oracle数据对象ALL_TABLES和DBA_TABLES之间的区别是什么?

    答:ALL_TABLES包含由特定用户访问的全部表,而DBA_TABLES包含数据库里的全部表。

    6.谁修改系统表格?

    答:数据库服务程序。

    练习答案

    1.不需要答案。

    2.不需要答案。

    3.不需要答案。

    第22章

    测验答案

    1.触发器能够被修改吗?

    答:触发器必须被替换或重新创建。

    2.当光标被关闭之后,我们能够重用它的名称吗?

    答:这取决于具体的实现。在某些实现里,关闭光标之后就可以重新使用它的名称、释放内存,而其他一些实现必须先使用DEALLOCATE语句,然后才能重用它的名称。

    3.当光标被打开之后,使用什么命令获取它的结果?

    答:FETCH命令。

    4.触发器能够在INSERT、DELECT或UPDATE语句之前或之后执行吗?

    答:触发器能够在INSERT、DELECT或UPDATE语句之前或之后执行,而且触发器有多种类型。

    5.在MySQL里使用什么语句从XML片断里获取信息?

    答:EXTRACTVALUE语句。

    6.为什么Oracle和MySQL不支持针对光标的DEALLOCATE语法?

    答:因为在光标被关闭之后,这两种SQL实现会自动释放光标的资源。

    7.为什么光标不是基于数据集的操作?

    答:光标不是基于数据集的操作,是因为光标每次只作用于一行数据,它将数据从内存中取出并进行相应的操作。

    练习答案

    1.不需要答案。

    2.编写一个 SELECT 语句来生成 SQL 代码,统计每个表里的记录数量。(提示:类似于练习1。)

    答:

    figure_0374_0868

    3.编写一组SQL命令来创建一个光标,返回所有用户及其销售数据。确保在用户所使用的实现中,正确关闭光标并回收资源。

    答:

    figure_0374_0869

    figure_0375_0870

    第23章

    测验答案

    1.一台服务器上的数据库能够被另一台服务器访问吗?

    答:可以,通过使用中间件,这被称为访问远程数据库。

    2.公司可以使用什么方式向自己的雇员发布信息?

    答:内部网。

    3.提供对数据库连接的产品被称为什么?

    答:中间件。

    4.SQL能够嵌入到互联网编程语言里吗?

    答:可以。SQL可以嵌入到互联网编程语言,比如Java。

    5.如何通过Web程序访问远程数据库?

    答:通过Web服务器。

    练习答案

    1.答案不确定。

    2.不需要答案。

    第24章

    测验答案

    1.SQL是过程语言还是非过程语言?

    答:SQL 是非过程语言,表示数据库决定如何执行 SQL 语句。本章介绍的扩展是过程语言。

    2.除了声明光标之外,光标的3个基本操作是什么?

    答:OPEN、FETCH和CLOSE。

    3.过程或非过程:数据库发动机在处理什么语句时会决定对SQL语句进行估值和执行?

    答:非过程语句。

    练习答案

    不需要答案。

    附录D 本书范例的CREATE TABLE语句

    这个附录很有用,其中不仅列出了本书范例所使用的CREATE TABLE语句,还展示了不同数据库平台的语法差别。读者可以用这些语句创建自己的表格,从而完成书中的练习。

    D.1 MySQL

    EMPLOYEE_TBL

    figure_0377_0871

    EMPLOYEE_PAY_TBL

    figure_0377_0872

    CUSTOMER_TBL

    figure_0378_0873

    ORDERS_TBL

    figure_0378_0874

    PRODUCTS_TBL

    figure_0378_0875

    D.2 Oracle和SQL Server

    EMPLOYEE_TBL

    figure_0378_0876

    EMPLOYEE_PAY_TBL

    figure_0379_0877

    CUSTOMER_TBL

    figure_0379_0878

    ORDERS_TBL

    figure_0379_0879

    PRODUCTS_TBL

    figure_0379_0880

    附录E 书中范例所涉数据的INSERT语句

    这个附录列出的INSERT语句用于填充附录D里的表格。创建了上述表格之后,我们就可以使用这些INSERT语句来填充数据。

    E.1 MySQL和SQL Server

    E.1.1 EMPLOYEE_TBL

    figure_0380_0881

    E.1.2 EMPLOYEE_PAY_TBL

    figure_0381_0882

    figure_0382_0883

    E.1.3 CUSTOMER_TBL

    figure_0382_0884

    figure_0383_0885

    E.1.4 ORDERS_TBL

    figure_0383_0886

    E.1.5 PRODUCTS_TBL

    figure_0383_0887

    figure_0384_0888

    E.2 Oracle

    E.2.1 EMPLOYEE_TBL

    figure_0384_0889

    E.2.2 EMPLOYEE_PAY_TBL

    figure_0384_0890

    figure_0385_0891

    E.2.3 CUSTOMER_TBL

    figure_0385_0892

    figure_0386_0893

    E.2.4 ORDERS_TBL

    figure_0386_0894

    E.2.5 PRODUCTS_TBL

    figure_0386_0895

    附录F 额外练习

    这个附录包含一些额外的练习,而且是针对MySQL的。在这些练习里,首先是说明或问题,然后是需要在mysql>提示符下输入的符合MySQL语法的SQL代码。请记住,SQL代码在不同的实现中是不同的,所以需要根据所使用的系统来对代码进行调整。请仔细学习这些问题、代码和结果,从而更好地掌握SQL。

    1.新建一个名为BONUS的数据库来进行以下的练习。

    figure_0387_0896

    2.指向新建的数据库。

    figure_0387_0897

    3.创建一个表格来记录篮球队。

    figure_0387_0898

    4.创建一个表格记录队员。

    figure_0387_0899

    5.创建一个表格记录队员的个人信息。

    figure_0387_0900

    6.创建一个表格记录比赛。

    figure_0387_0901

    7.创建一个表格记录每支球队在每场比赛里的成绩。

    figure_0388_0902

    8.查看创建的这些表。

    figure_0388_0903

    9.生成篮球队的记录。

    figure_0388_0904

    10.生成队员的记录。

    figure_0388_0905

    11.生成队员的个人信息。

    figure_0388_0906

    12.基于已经安排的比赛生成GAMES表里的记录。

    figure_0388_0907

    13.基于已经进行的比赛生成SCORES表里的记录。

    figure_0388_0908

    figure_0389_0909

    14.球员的平均身高是多少?

    figure_0389_0910

    15.球员的平均体重是多少?

    figure_0389_0911

    16.像下面这样查看球员信息:

    figure_0389_0912

    17.像下面这样创建一个球队的人名单:

    figure_0389_0913

    18.哪支球队在全部比赛中获得了最多的分数?

    figure_0389_0914

    19.哪只球队在一场比赛里获得了最高分数?

    figure_0389_0915

    20.在一场比赛里,两队分数之和最高是多少?

    figure_0389_0916

    21.哪个球员不属于任何球队?

    figure_0389_0917

    22.一共有多少只球队?

    figure_0390_0918

    23.一共有多少球员?

    figure_0390_0919

    24.2002年5月5日有多少场比赛?

    figure_0390_0920

    25.谁是最高的球员?

    figure_0390_0921

    26.把Ron Hammer的记录从数据库里删除,用Al Knotgood替换他。

    figure_0390_0922

    27.谁是Al Knotgood的新队友?

    figure_0390_0923

    28.生成一个列表,列出全部比赛和比赛日期,以及每场比赛的主队和客队。

    figure_0390_0924

    29.为数据库里的全部姓名设置索引。我们经常会根据姓名进行搜索,所以一般会被设置索引。

    figure_0390_0925

    figure_0391_0926

    30.哪支球队赢的比赛最多?

    figure_0391_0927

    31.哪支球队输的比赛最多?

    figure_0391_0928

    32.哪支球队的场均得分最高?

    figure_0391_0929

    33.生成一个报告来展示每支球队的记录。输出结果首先按赢的场次多排序,再按输的场次少排序。

    figure_0391_0930

    34.每场比赛的最终比分是多少?

    figure_0391_0931

    术语表

    别名 表或字段的另一个名称。

    ANSI 美国国家标准化组织。该组织负责为各种课题发布标准。SQL标准即为该组织所发布。

    应用程序 一组菜单、表单、报告和代码,通常利用数据库执行商务功能。

    缓存 内存里的一个区域,用于编辑或执行SQL。

    笛卡尔积 在WHERE子句里不结合表而产生的结果。当查询里的表没有结合时,一个表里的全部记录都与另一个表里的每条记录配对。

    客户端 客户端通常是个人计算机,但也可以是一台服务器,它依赖于另一个计算机的数据、服务或处理。客户端程序可以让客户端计算机与服务器通信。

     表的组成部分,具有名称和特定的数据类型。

    COMMIT 一个命令,让数据的修改生效。

    组合索引 由两个或多个字段组成的索引。

    条件 查询的WHERE子句里的搜索准则,其值为TRUE或FALSE。

    常数 不会变化的值。

    约束 在数据级对数据的限制。

    光标 内存里的一个工作区域,使用SQL语句对数据集进行以行为单位的操作。

    数据目录 系统目录的别称。参见系统目录。

    数据类型 以不同的类型定义数据,比如数值、日期或字符。

    数据库 数据的集合,通常用一系列表来组织数据。

    DBA 数据库管理员,是负责管理数据库的人。

    DDL 数据定义语言。这部分SQL语句专门用于定义数据库对象,比如表格、视图和函数。

    默认 不指定任何值时使用的值。

    DISTINCT 一个选项,在SELECT语句里用于返回不重复的值。

    DML 数据操作语言。这部分SQL语句专门用于操作数据,比如更新数据。

     一个与数据类型相关联的对象,还可以包含约束;类似于自定义类型。

    DQL 数据查询语言。这部分SQL语句专门用于利用SELECT语句查询数据。

    终端用户 根据工作需要对数据库进行查询或操作数据的用户,是数据库存在的根本原因。

    字段 表格中列的别称,参见“列”。

    外键 一个或多个字段,其值基于另一个表的主键。

    全表扫描 在不使用索引的情况下,查询对表进行的搜索。

    函数 预定义的操作,可以用在SQL语句里操作数据。

    GUI 图形用户界面。当应用接口需要向用户提供图形元素以便进行交互的时候,往往需要使用GUI。

    主机 数据库所在的计算机。

    索引 指向表格数据的指针,能够提高表格访问的效率。

    JDBC Java数据库连接软件。允许Java程序与数据库进行通信来处理数据。

    结合 通过链接字段组合来自不同表格的数据。用在SQL语句的WHERE子句里。

     一个或多个字段,用于区别表格里的不同记录。

    规格化 在设计数据库时,把大型表格划分为较小的、更容易管理的表格,从而减少冗余。

    NULL值 一个未知值。

    对象 数据库里的元素,比如触发器、表格、视图和过程。

    ODBC 开放数据库连接,是与数据库进行标准通信的软件。ODBC通常用于不同实现之间的数据库通信,以及客户端程序与数据库的通信。

    操作符 用于执行操作的保留字或符号。

    优化器 数据库的内部机制,决定如何执行SQL语句和返回结果。

    参数 用于解析SQL语句或程序的一个值或一个范围内的值。

    主键 表格里一个专用字段,用于区别不同的记录。

    权限 授予用户的特定许可,允许在数据库里执行特定操作。

    过程 一组被保存起来的指令,可以重复调用和执行。

    PUBLIC 数据库的一个用户账户,代表数据库的全部用户。

    查询 用于从数据库检索数据的SQL语句。

    记录 表格里一行数据的别称,参见“行”。

    引用完整性 确保来自一个字段的值依赖于另一个字段的值,用于确保数据库中数据的一致性。它通常用于两个表之间,但有时也可以用于一个表,让表来引用自己。自引用表格被称为递归关系。在数据库中,通常称之为外键关系。

    关系型数据库 由表格组成的数据库,表格由记录组成,这些记录具有相同的数据元素,而这些表格之间通过共同的字段产生关联。

    角色 与一组系统权限和/或对象权限相关联的数据库对象,用于简化安全管理工作。

    ROLLBACK 一个命令,可以撤销自最后一个COMMIT或 SAVEPOINT命令之后的全部事务。

     表里一组数据。

    保存点 事务里的指定点,用于回退或撤销修改。

    规划 一个用户所属的一组相关联的数据库对象。

    安全 确保数据库里的数据受到全时全方位保护的过程。

    SQL 结构化查询语言。专为数据库设计,用于在数据库中进行操作。

    存储过程 存储在数据库里的、可以直接执行的SQL代码。

    子查询 嵌套在另一个SQL语句里的SELECT语句。

    异名 赋予表格或视图的另一个名称。

    SQL语法 规定SQL语句结构中必要部分和可选部分的一组规则。

    系统目录 包含数据库相关信息的表格与视图的集合。

    表格 关系型数据库里数据的基本逻辑存储单元。

    事务 以一个整体执行的一个或多个SQL语句。

    触发器 根据数据库里特定事件运行的存储过程,比如在表格更新之前或之后。

    自定义类型 由用户定义的数据类型,可以用于定义表格字段。

    变量 能够变化的值。

    视图 基于一个或多个表格创建的数据库对象,能够像表格一样被使用。视图是一个虚拟表格,不需要存储数据的空间。