42

第 5 章 关系数据库标准语言 SQL

  • Upload
    kaloni

  • View
    300

  • Download
    0

Embed Size (px)

DESCRIPTION

第 5 章 关系数据库标准语言 SQL. 本章要点. SQL 概述以及特点 查询功能,简单查、简单的联接查询、嵌套查询 、 SQL SELECT 中特殊运算符 、排序、简单的计算查询、分组与计算查询、利用空值查询、别名与自联接查询、内外层相互关联的嵌套查询、使用量词和谓词的查询、超联接查询、集合的并运算. 5.1 SQL 概述. 1 . SQL 定义 SQL 是一种非过程化的语言,也是 结构化查询语言 的缩写,是关系数据库的标准语言。 2 . SQL 特点 SQL 是一种一体化的语言,包括数据定义、数据查询、数据操纵和数据控制等方面的功能。 - PowerPoint PPT Presentation

Citation preview

第第 55 章 关系数据库标章 关系数据库标准语言准语言 SQLSQL

本章要点本章要点 SQLSQL 概述以及特点概述以及特点 查询功能,简单查、简单的联接查询、嵌查询功能,简单查、简单的联接查询、嵌

套查询 、套查询 、 SQL SELECTSQL SELECT 中特殊运算符 、中特殊运算符 、排序、简单的计算查询、分组与计算查询、排序、简单的计算查询、分组与计算查询、利用空值查询、别名与自联接查询、内外利用空值查询、别名与自联接查询、内外层相互关联的嵌套查询、使用量词和谓词层相互关联的嵌套查询、使用量词和谓词的查询、超联接查询、集合的并运算的查询、超联接查询、集合的并运算

5.1 5.1 SQLSQL 概述概述

11 .. SQLSQL 定义定义 SQLSQL 是一种非过程化的语言,也是是一种非过程化的语言,也是结构化查询语结构化查询语

言言的缩写,是关系数据库的标准语言。的缩写,是关系数据库的标准语言。 22 .. SQLSQL 特点特点

SQLSQL 是一种一体化的语言,包括数据定义、数据是一种一体化的语言,包括数据定义、数据查询、数据操纵和数据控制等方面的功能。查询、数据操纵和数据控制等方面的功能。

SQLSQL 是一种高度非过程化的语言,用户不必告诉是一种高度非过程化的语言,用户不必告诉计算机怎么去做,只需告诉计算机做什么。计算机怎么去做,只需告诉计算机做什么。

SQLSQL 语言非常简洁。语言非常简洁。 SQLSQL 可以直接以命令方式交互使用,也可以嵌入可以直接以命令方式交互使用,也可以嵌入

到程序设计语言中以程序方式使用。到程序设计语言中以程序方式使用。

5.2 5.2 查询功能查询功能

11 .. SQLSQL SQLSQL 的核心是查询,的核心是查询, SQLSQL 的查询命令也称的查询命令也称 SELECSELEC

TT 命令,它提供了简单而又丰富的命令,它提供了简单而又丰富的 SELECTSELECT 数据数据查询语句。查询语句。

SELECT-SQLSELECT-SQL 命令指定查询条件并执行查询命令,命令指定查询条件并执行查询命令,从而从一个表或多个表中检索数据。从而从一个表或多个表中检索数据。

22 ..创建创建 SELECTSELECT 命令命令 在命令窗口中创建在命令窗口中创建 在在 VFPVFP 程序中创建程序中创建 在查询设计器中创建在查询设计器中创建

33 . . SELECTSELECT 命令命令 语法格式:语法格式:

SELECT SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT][Alia[ALL | DISTINCT] [TOP nExpr [PERCENT][Alias.] Select_Item [AS Column_Name][s.] Select_Item [AS Column_Name][ ,, [Alias.] Select_It[Alias.] Select_Item [AS Column_Name]…]FROM [FORCE][DatabaseNaem [AS Column_Name]…]FROM [FORCE][DatabaseName!] Table [[AS] Local_Alias][[INNER |LEFT [OUTER] | me!] Table [[AS] Local_Alias][[INNER |LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN[DatabaseNamRIGHT [OUTER] | FULL [OUTER] JOIN[DatabaseName!] Table [[AS] Local_Alias][ON JoinCondition]]…][[INTe!] Table [[AS] Local_Alias][ON JoinCondition]]…][[INTO Destination][TO FILE FileName [ADDITIVE] | TO PRIO Destination][TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT]| TO SCREEN]][PREFERENCE PreferenNTER [PROMPT]| TO SCREEN]][PREFERENCE PreferenceName][NOCONSOLE][PLAIN][NOWAIT] [WHERE JoiceName][NOCONSOLE][PLAIN][NOWAIT] [WHERE JoinCondition [AND JoinCondition…][AND |OR FilterConnCondition [AND JoinCondition…][AND |OR FilterCondition [AND | OR FilterCondition…]]][GROUP BY Groupdition [AND | OR FilterCondition…]]][GROUP BY GroupColumn [Column [ ,, GroupColumn…]][HAVING FilterConditioGroupColumn…]][HAVING FilterCondition][UNION [ALL] SELECTCommand][ORDER BY Order_n][UNION [ALL] SELECTCommand][ORDER BY Order_Item [ASC | DESC][Item [ASC | DESC][ ,, Order_Item [ASC | DESC]…]]Order_Item [ASC | DESC]…]]

命令说明:命令说明: FROMFROM 子句指出要查询的数据来自哪个或哪些表,子句指出要查询的数据来自哪个或哪些表,

可以对单个表或多个表进行查询。可以对单个表或多个表进行查询。 DISTINCTDISTINCT 短语将在查询结果中排除重复的行。短语将在查询结果中排除重复的行。 TOP nExpr [PERCENT]TOP nExpr [PERCENT] 表示在符合条件的所有记表示在符合条件的所有记

录中,选取指定数量或百分比的记录。录中,选取指定数量或百分比的记录。 Select_ItemSelect_Item 指定包括在查询结果中的项。指定包括在查询结果中的项。 AS Column_NameAS Column_Name 指查询结果中列的标题。指查询结果中列的标题。 FROMFROM 列出所有表中检索数据的表。列出所有表中检索数据的表。 INTOINTO Destination Destination 指定在何处保存查询结果。指定在何处保存查询结果。

命令说明:(续)命令说明:(续) WHEREWHERE 指定查询条件。指定查询条件。 JoinConditionJoinCondition 指定一个字段指定一个字段 ,, 该字段连接。该字段连接。 GROUP BYGROUP BY 按列的值对查询结果的行进行分组。按列的值对查询结果的行进行分组。 HAVINGHAVING 指定包括在查询结果中的组必须满足的筛指定包括在查询结果中的组必须满足的筛

选条件,选条件, HAVINGHAVING 应该同应该同 GROUP BYGROUP BY 一起使用。一起使用。 ADDITIVEADDITIVE 使查询结果追加到使查询结果追加到 TO FILE FileNameTO FILE FileName

所指定文本文件的内容后面。所指定文本文件的内容后面。 TO PRINTERTO PRINTER 使查询结果定向输出到打印机。使查询结果定向输出到打印机。 TO SCREENTO SCREEN 使查询结果定向输出到使查询结果定向输出到 VFPVFP 主窗口或主窗口或

活动的用户自定义窗口中。活动的用户自定义窗口中。

5.2.1 5.2.1 简单查询简单查询 11 .定义:.定义:

简单查询是针对单个表的查询,由简单查询是针对单个表的查询,由 SELECTSELECT 和和FROMFROM 短语构成无条件查询或由短语构成无条件查询或由 SELECTSELECT 、、FROMFROM 和和 WHEREWHERE 短语构成条件查询。短语构成条件查询。

22 .举例:.举例: 例例 1 1 从从 zgzg 关系中检索所有的工资值。关系中检索所有的工资值。 例例 2 2 检索检索 gysgys 关系中的所有字段。关系中的所有字段。 例例 3 3 检索工资多于检索工资多于 12501250 元的职工号。元的职工号。 例例 4 4 检索哪些仓库有工资多于检索哪些仓库有工资多于 12601260 元的职工元的职工

号。号。

例例 5 5 给出在仓库“给出在仓库“ WH2”WH2” 或“或“ WH1”WH1” 工工作,并且工资少于作,并且工资少于 12501250 元的职工号。元的职工号。

33 .说明:.说明: 如果有如果有 WHEREWHERE 子句,系统首先根据指定的子句,系统首先根据指定的

条件依次检验关系中的每个字段。条件依次检验关系中的每个字段。 如果没有指定如果没有指定 WHEREWHERE 子句,则不进行检验,子句,则不进行检验,

然后选出满足条件的字段,显示然后选出满足条件的字段,显示 SELECTSELECT 子子句中满足条件的记录。句中满足条件的记录。

5.2.2 5.2.2 简单的联接查询简单的联接查询 11 .定义:.定义:

简单联接查询也是一类基于多个表的查询,与简单联接查询也是一类基于多个表的查询,与嵌套查询的区别是要查询的结果可以出自多个嵌套查询的区别是要查询的结果可以出自多个表中,而嵌套查询的结果是基于一个表中。表中,而嵌套查询的结果是基于一个表中。

22 .举例:.举例: 例例 6 6 找出工资多于找出工资多于 12501250 元的职工号与他们所元的职工号与他们所

在的城市。在的城市。 例例 7 7 找出工作在面积大于找出工作在面积大于 300300 的仓库的职工的仓库的职工

号和职工所在的城市。号和职工所在的城市。

33 .说明:.说明: 如果在检索命令的如果在检索命令的 FROMFROM 之后有两个关系,之后有两个关系,

那么这两个关系之间肯定有一种联系,否则无那么这两个关系之间肯定有一种联系,否则无法构成检索表达式。法构成检索表达式。

在联接中如果需要查询不同表中的相同字段名在联接中如果需要查询不同表中的相同字段名时,必须用关系前缀指明字段所属的表,运算时,必须用关系前缀指明字段所属的表,运算符为“符为“ .”.” ,即,即 << 表名表名 >.<>.< 字段名字段名 >> 。。

WHEREWHERE 短语后面也用表名作前缀,但通常是短语后面也用表名作前缀,但通常是在在 FROMFROM 短语后为表名定义别名,这样可以短语后为表名定义别名,这样可以方便输入。方便输入。

5.2.3 5.2.3 嵌套查询嵌套查询 11 .定义:.定义:

嵌套查询基于多个关系的查询,查询的结果是嵌套查询基于多个关系的查询,查询的结果是来自一个表,而查询的条件却涉及到多个表。来自一个表,而查询的条件却涉及到多个表。

22 .举例:.举例: 例例 8 8 哪些城市至少有一个仓库的职工工资为哪些城市至少有一个仓库的职工工资为 11

250250 元?元? 例例 9 9 查询所有职工工资都多于查询所有职工工资都多于 12001200 元的仓库元的仓库信息。信息。

例例 10 10 查询和查询和 E4E4 工资相同的所有职工记录。工资相同的所有职工记录。

5.2.4 5.2.4 几个特殊运算符几个特殊运算符 11 .. LIKELIKE 和“!和“! =”=” 22 .举例:.举例:

例例 12 12 从从 gysgys 表中查询出全部公司的信息,不表中查询出全部公司的信息,不要工厂或其他要工厂或其他 gysgys信息。信息。 SELECT *FROM gys WHERE SELECT *FROM gys WHERE 供应商名 供应商名

LIKE“%LIKE“%公司”公司” LIKELIKE 运算符是字符串匹配运算符,可以用“运算符是字符串匹配运算符,可以用“ *”*”

表示表示 00 个或多个字符,另外还有一个通配符“个或多个字符,另外还有一个通配符“ _”_”表示一个字符。表示一个字符。

例例 13 13 查询出地址不在北京的所有查询出地址不在北京的所有 gysgys信息。信息。 SELECT *FROM gys WHERESELECT *FROM gys WHERE 地址!地址! =“=“北京”北京”

与上述查询命令等价的命令为:与上述查询命令等价的命令为: SELECT *FROM gys WHERE NOTSELECT *FROM gys WHERE NOT (地址(地址 ==

““北京”)北京”) SQLSQL 中,不等于用“!中,不等于用“! =”=” 表示。表示。

5.2.5 5.2.5 排序排序 11 .排序短语.排序短语

ORDER BYORDER BY 22 .格式:.格式:

ORDER BY Order_Item [ASC | DESC][,OrdORDER BY Order_Item [ASC | DESC][,Order_Item [ASC |DESC]…]er_Item [ASC |DESC]…] 每个每个 Order_ItemOrder_Item 都必须对应查询结果中的一列。都必须对应查询结果中的一列。 ASCASC 指定查询结果根据排序项以升序排列,系统系指定查询结果根据排序项以升序排列,系统系

统的是升序排列。统的是升序排列。 DESCDESC 指定查询结果以降序排列。指定查询结果以降序排列。 如果不使用如果不使用 ORDER BYORDER BY 指定查询结果的排列顺序,指定查询结果的排列顺序,

则查询结果不排序。则查询结果不排序。

33 .举例:.举例: 例例 14 14 按按 zgzg 表中的工资值升序查找出所有职表中的工资值升序查找出所有职

工信息。工信息。 例例 15 15 将将 zgzg 表中的值排序,先按仓库号排序,表中的值排序,先按仓库号排序,再按工资排序并查询所以再按工资排序并查询所以 zgzg 表中的信息。表中的信息。

5.2.6 5.2.6 简单的计算查询简单的计算查询 11 .字段函数.字段函数

COUNTCOUNT 计算列中选定项的数目,计算查询输出的行数。计算列中选定项的数目,计算查询输出的行数。

SUMSUM 计算列中数值的和。计算列中数值的和。

AVGAVG 计算列中数值的平均值。计算列中数值的平均值。

MAXMAX确定列中的最大值。确定列中的最大值。

MINMIN确定列中的最小值。确定列中的最小值。

22 .举例:.举例: 例例 16 16 查询查询 gysgys 表中所在地的数目。表中所在地的数目。

SELECT COUNT(DISTINCT SELECT COUNT(DISTINCT 地址地址 ) FROM gys) FROM gys 上例中,若查询上例中,若查询 gysgys 表中的记录数,应使用命表中的记录数,应使用命

令:令: SELECT COUNT(*) FROM gysSELECT COUNT(*) FROM gys 。。 一般一般 COUNTCOUNT 函数应该使用函数应该使用 DISTINCTDISTINCT 短语,除短语,除了对表中的记录个数进行统计。例了对表中的记录个数进行统计。例 10 10 查询和查询和 E4E4工资相同的所有职工记录。工资相同的所有职工记录。

22 .举例:.举例: 例例 17 17 求求 zgzg 表中支付的工资总数。表中支付的工资总数。 例例 18 18 求北京和西安的求北京和西安的 ckck ,, zgzg 表中的所有表中的所有

工资总和。工资总和。 例例 19 19 求所有求所有 zgzg 表中的工资都大于表中的工资都大于 11201120 元元

的的 ckck 的平均面积。的平均面积。 例例 20 20 求在求在 WH1WH1 仓库工作的仓库工作的 zgzg最高工资值。最高工资值。 例例 21 21 求在求在 WH1WH1 仓库工作的仓库工作的 zgzg最低工资值。最低工资值。

5.2.7 5.2.7 分组与计算查询分组与计算查询 11 .格式.格式

GROUP BY GroupColumn [GROUP BY GroupColumn [ , , GroupColuGroupColumn…] [HAVING FilterCondition]mn…] [HAVING FilterCondition]

22 .说明.说明 GroupColumnGroupColumn 可以是常规的表字段名,也可可以是常规的表字段名,也可

是一个包含是一个包含 SQLSQL 字段函数的字段名或一个数字段函数的字段名或一个数值表达式,指定查询结果表中的列位置。值表达式,指定查询结果表中的列位置。

可以按一列或多列分组,还可以用可以按一列或多列分组,还可以用 HAVINGHAVING进一步限定分组的条件。进一步限定分组的条件。

33 .举例:.举例: 例例 22 22 求每个仓库的求每个仓库的 zgzg平均工资。平均工资。 例例 23 23 求至少有求至少有 33 个个 zgzg 的仓库的平均工资。的仓库的平均工资。

GROUP BYGROUP BY 短语一般跟在短语一般跟在 WHEREWHERE 短语后面,若短语后面,若没有没有 WHERE WHERE 短语,就跟在短语,就跟在 FROMFROM 短语后面。短语后面。

GROUP BYGROUP BY还可以根据多个属性进行分组。还可以根据多个属性进行分组。 在分组查询时,有时要求查询满足条件的记录时,在分组查询时,有时要求查询满足条件的记录时,

可以用可以用 HAVINGHAVING 短语来限定分组。短语来限定分组。 HAVINGHAVING 必须同必须同 GROUP BYGROUP BY 一起使用,不能单一起使用,不能单独使用,独使用, HAVINGHAVING 与与 WHEREWHERE 短语一起使用时,短语一起使用时,首先由首先由 WHEREWHERE限制满足筛选条件的记录,然后限制满足筛选条件的记录,然后再由再由 HAVINGHAVING 子句来限定分组。子句来限定分组。

5.2.8 5.2.8 利用空值查询利用空值查询 11 .. NULLNULL 值值

特点特点 等价于没有任何值。等价于没有任何值。 与与 00 、空格和空字符串不同。、空格和空字符串不同。 排序时具有最大的优先权。排序时具有最大的优先权。 可以用于计算和大多数的函数中。可以用于计算和大多数的函数中。 NULLNULL 值不改变变量或字段的数据类型。值不改变变量或字段的数据类型。 NULLNULL 值会影响命令、函数、表达式的执行。值会影响命令、函数、表达式的执行。

22 .举例:.举例: 例例 24 24 查询已经确定供应商号的查询已经确定供应商号的 dgddgd信息。信息。

查询空值时使用查询空值时使用 IS NULLIS NULL ,, =NULL=NULL 是无效的,空是无效的,空值是一个不确定的值,所以不能用等于号进行比较。值是一个不确定的值,所以不能用等于号进行比较。

5.2.9 5.2.9 别名与自联接查询别名与自联接查询 11 .格式.格式

<< 关系名关系名 ><>< 别名别名 >> 22 .举例:.举例:

例如:例如: SELECT SELECT 供应商空值是一个不确定的供应商空值是一个不确定的值,所以不能用等于号进行比较。名 值,所以不能用等于号进行比较。名 FORM FORM gys,dgd,zg, ck;WHERE gys,dgd,zg, ck;WHERE 地址地址 =“=“北京”北京” AAND ND 城市城市 =“=“北京”北京” ; AND dgd.; AND dgd. 职工号职工号 =zg. =zg. 职工号职工号 ;AND zg.;AND zg. 仓库号仓库号 =ck. =ck. 仓库号仓库号 ;AND g;AND gys.ys.供应商号供应商号 =dgd.=dgd.供应商号。供应商号。

下面是使用别名的同样的联接查询语句下面是使用别名的同样的联接查询语句 SELECT SELECT 供应商名 供应商名 FORM gys AFORM gys A ,, dgd Bdgd B ,,

zg Czg C ,, ck Dck D;;WHERE WHERE 地址地址 =“=“北京”北京” AAND ND 城市城市 =“=“北京”北京” ;AND A.;AND A.供应商号供应商号 = B.= B.供应商号供应商号 ;AND B.;AND B. 职工号职工号 = C. = C. 职工号职工号 ;AND ;AND C.C. 仓库号仓库号 = D. = D. 仓库号仓库号

别名并不是必须的,在关系的自联接操作中,别名并不是必须的,在关系的自联接操作中,别名是必不可少的。别名是必不可少的。

SQLSQL 不仅可以对多个表进行联接操作,也可以不仅可以对多个表进行联接操作,也可以将同一关系与其自身进行联接,这种联接就称将同一关系与其自身进行联接,这种联接就称为自联接。为自联接。

11 .举例:.举例: 例例 26 26 列出每个职工办理的具有最高总金额的列出每个职工办理的具有最高总金额的订购单信息。订购单信息。 SELECT out.SELECT out. 职工号,职工号, out.out.供应商号,供应商号, out.out.订购订购

单号,单号, out.out.订购日期,订购日期, out.out.总金额;总金额; FROM dgd FROM dgd out WHERE out WHERE 总金额总金额 ==;(;( SELECT MAXSELECT MAX (总金(总金额)额) FROM dgd inner1FROM dgd inner1 ;;WHERE out.WHERE out. 职工号职工号= inner1. = inner1. 职工号)职工号)

在上述查询中,内层和外层查询使用的是同一个关在上述查询中,内层和外层查询使用的是同一个关系,分别命名为系,分别命名为 inner1inner1 和和 outout 。。

5.2.11 5.2.11 使用量词和谓词的查询使用量词和谓词的查询 11 .格式说明:.格式说明:

<< 表达式表达式 ><>< 比较运算符比较运算符 >[ANY|ALL|SOME] (>[ANY|ALL|SOME] ( 子子查询查询 )[NOT] EXISTS)[NOT] EXISTS (子查询)(子查询)

ANYANY 、、 ALLALL 和和 SOMESOME 是量词,其中是量词,其中 ANYANY 和和 SOSOMEME 在查询中有一行能使结果为真,则结果为真,在查询中有一行能使结果为真,则结果为真,ALLALL 是要求子查询中的所有行都使结果为真时,结是要求子查询中的所有行都使结果为真时,结果为真。果为真。

EXISTSEXISTS 是谓词,是谓词, EXISTSEXISTS 或或 NOT EXISTSNOT EXISTS 是用来是用来查询在子查询中是否有结果返回,即存在元组或不查询在子查询中是否有结果返回,即存在元组或不存在元组。存在元组。

11 .举例:.举例: 例例 27 27 查询哪些仓库中至少有一名职工的仓库查询哪些仓库中至少有一名职工的仓库信息。信息。 SELECT *FROM ck WHERE EXISTSSELECT *FROM ck WHERE EXISTS ;;

(( SELECT *FROM zg WHERE zg.SELECT *FROM zg WHERE zg.仓库号仓库号 =ck.=ck. 仓库号)仓库号)

上述的查询命令与以下查询命令等价:上述的查询命令与以下查询命令等价: SELECT *FROM ckWHERE INSELECT *FROM ckWHERE IN (( SELECT SELECT 仓仓

库号库号 FROM zgFROM zg )) 例例 28 28 查询有职工的工资大于或等于查询有职工的工资大于或等于 WH2WH2 仓仓

库中的任何一名职工工资的信息。库中的任何一名职工工资的信息。

33 .举例:.举例: 例例 28 28 列出每个职工办理的具有最高总金额列出每个职工办理的具有最高总金额

的订购单信息。的订购单信息。 SELECT DISTINCT * FROM zg WHERESELECT DISTINCT * FROM zg WHERE 工资工资

>=ANY>=ANY;(;( SELECTSELECT 工资工资 FROM zg WHERE FROM zg WHERE 仓库号仓库号 =“WH2”=“WH2” ))

上述的查询命令与以下查询命令等价:上述的查询命令与以下查询命令等价: SELECT DISTINCT * FROM zg WHERESELECT DISTINCT * FROM zg WHERE 工资工资

>=>=;; SELECT MINSELECT MIN (工资)(工资) FROM zg WHERFROM zg WHERE E 仓库号仓库号 =“WH2”=“WH2” ))

33 .举例:.举例: 例例 29 29 查询有职工的工资大于或等于查询有职工的工资大于或等于 WH2WH2

仓库中的所有职工工资的信息。仓库中的所有职工工资的信息。 SELECT DISTINCT * FROM zg WHERESELECT DISTINCT * FROM zg WHERE 工资工资

>=ALL>=ALL;(;( SELECTSELECT 工资工资 FROM zg WHERE FROM zg WHERE 仓库号仓库号 =“WH2”=“WH2” ))

上述的查询命令与以下查询命令等价:上述的查询命令与以下查询命令等价: SELECT DISTINCT * FROM zg WHERESELECT DISTINCT * FROM zg WHERE 工资工资

>=>=;(;( SELECT MAXSELECT MAX (工资)(工资) FROM zg WHFROM zg WHERE ERE 仓库号仓库号 =“WH2”=“WH2” ))

5.2.125.2.12 超联接查询超联接查询 11 .分类.分类

左联接左联接 右联接右联接 完全联接完全联接

22 .命令格式:.命令格式: SELECTSELECT…………FROM Table INNER | LEFT | RIGHT | FROM Table INNER | LEFT | RIGHT |

FULL JOIN Table ON JoinCondition WHERE……FULL JOIN Table ON JoinCondition WHERE…… 33 .命令说明:.命令说明:

INNER JOININNER JOIN 等价于等价于 JOINJOIN ,为普通联接,在,为普通联接,在 Visual Visual FoxProFoxPro 中称为内部联接。中称为内部联接。

LEFT JOINLEFT JOIN 为左联接。在查询结果中包含为左联接。在查询结果中包含 JOINJOIN 左左侧表中的所有记录,以及侧表中的所有记录,以及 JOINJOIN 右侧表中匹配的记右侧表中匹配的记录。录。

RIGHT JOINRIGHT JOIN 为右联接。在查询结果中包含为右联接。在查询结果中包含 JOINJOIN右侧表中的所有记录,以及右侧表中的所有记录,以及 JOINJOIN 左侧表中匹配的左侧表中匹配的记录。记录。

FULL JOINFULL JOIN 为全联接,在查询结果中包含为全联接,在查询结果中包含 JOINJOIN两侧所有的匹配和不匹配的记录。两侧所有的匹配和不匹配的记录。

ON JoinConditionON JoinCondition 表示联接条件。表示联接条件。 超联接查询的联接条件在超联接查询的联接条件在 ONON 短语中给出,而不在短语中给出,而不在

WHEREWHERE 短语中给出,联接类型在短语中给出,联接类型在 FROMFROM 短语中短语中给出。给出。

33 .举例:.举例: 例例 30 30 普通联接,也就是只有满足条件的记录普通联接,也就是只有满足条件的记录才出现在查询的结果中。才出现在查询的结果中。 SELECT ck.SELECT ck. 仓库号,仓库号, ck.ck. 面积,面积, zg.zg. 职工号,职工号, zg.zg.

工资;工资; FROM ck JOINFROM ck JOIN 职工;职工; ON ck.ON ck. 仓库号仓库号 =zg.=zg.仓库号仓库号

与上述查询显示结果相同的命令如下:与上述查询显示结果相同的命令如下: SELECT ck.SELECT ck. 仓库号,仓库号, ck.ck. 面积,面积, zg.zg. 职工号,职工号, zg.zg.

工资;工资; FROM ck INNER JOINFROM ck INNER JOIN 职工;职工; ON ck.ON ck. 仓仓库号库号 =zg.=zg. 仓库号仓库号

和和 SELECT ck.SELECT ck. 仓库号,仓库号, ck.ck. 面积,面积, zg.zg. 职工号,职工号, zg.zg.

工资;工资; FROM ckFROM ck ,, zg WHERE ck.zg WHERE ck. 仓库号仓库号 =zg.=zg.仓库号仓库号

例例 31 31 左联接,也就是除满足条件的记录出左联接,也就是除满足条件的记录出现在查询结果外,第一个表中不满足条件的现在查询结果外,第一个表中不满足条件的记录也出现在查询结果中。记录也出现在查询结果中。 SELECT ck.SELECT ck. 仓库号,仓库号, ck.ck. 面积,面积, zg.zg. 职工号,职工号, zz

g.g. 工资;工资; FROM ck LEFT JOINFROM ck LEFT JOIN 职工;职工; ON ck.ON ck.仓库号仓库号 =zg.=zg. 仓库号仓库号

例例 32 32 右联接,也就是除满足条件的记录出右联接,也就是除满足条件的记录出现在查询结果外,第二个表中不满足条件的现在查询结果外,第二个表中不满足条件的记录也出现在查询结果中。记录也出现在查询结果中。 SELECT ck.SELECT ck. 仓库号,仓库号, ck.ck. 面积,面积, zg.zg. 职工号,职工号, zz

g.g. 工资; 工资; FROM ck RIGHT JOINFROM ck RIGHT JOIN 职工;职工; ON cON ck.k. 仓库号仓库号 =zg.=zg. 仓库号仓库号

例例 33 33 全联接,也就是除满足条件的记录出全联接,也就是除满足条件的记录出现在查询结果外,两个表中不满足条件的记现在查询结果外,两个表中不满足条件的记录也出现在查询结果中。录也出现在查询结果中。 SELECT ck.SELECT ck. 仓库号,仓库号, ck.ck. 面积,面积, zg.zg. 职工号,职工号, zz

g.g. 工资;工资; FROM ck FULL JOINFROM ck FULL JOIN 职工;职工; ON ck.ON ck.仓库号仓库号 =zg.=zg. 仓库号仓库号

JOINJOIN 联接格式在连接多个表时应注意其书写方式,联接格式在连接多个表时应注意其书写方式,JOINJOIN 的顺序和的顺序和 ONON 的顺序是很重要的。的顺序是很重要的。

JOINJOIN 和和 ONON 的顺序应相反的顺序应相反

5.2.13 5.2.13 集合的并运算集合的并运算 11 .定义:.定义:

并运算是将两个并运算是将两个 SELECTSELECT 语句的查询结果合并成一语句的查询结果合并成一个查询结果。个查询结果。

22 .运算符.运算符 UNION UNION

33 .. UNIONUNION 子句遵守的规则:子句遵守的规则: 不能使用不能使用 UNIONUNION 来组合子查询。来组合子查询。 两个两个 SELECTSELECT 命令的查询结果中的列数必须相同。命令的查询结果中的列数必须相同。 两个两个 SELECTSELECT 查询结果中的对应列必须有相同的数查询结果中的对应列必须有相同的数

据类型和宽度。据类型和宽度。 只有最后的只有最后的 SELECTSELECT 中可以包含中可以包含 ORDER BYORDER BY 子句,子句,

并且必须按顺序指出所输出的列。并且必须按顺序指出所输出的列。

44 .举例:.举例: 例例 34 34 查询结果是城市是北京和西安的仓库查询结果是城市是北京和西安的仓库信息。信息。 在在 SQLSQL 语句中不能使用语句中不能使用 UNIONUNION 来组合子查询。来组合子查询。 用用 UNIONUNION 运算时,两个运算时,两个 SELECTSELECT 命令的查询结命令的查询结

果中的列数必须相同。果中的列数必须相同。 两个两个 SELECTSELECT 查询中的对应列必须有相同的数据查询中的对应列必须有相同的数据

类型和宽度。类型和宽度。

5.2.14 5.2.14 SOL SELECTSOL SELECT 的几个特的几个特殊选项殊选项

11 .显示部分结果.显示部分结果 SQLSQL 命令可以显示部分结果,使用命令可以显示部分结果,使用 TOPTOP 子句。子句。

22 .将查询结果放到数组中.将查询结果放到数组中 要将查询结果放到数组中,使用要将查询结果放到数组中,使用 INTO ARRAY INTO ARRAY 短短

语。语。 33 .将查询结果放到临时文件中.将查询结果放到临时文件中

要将查询结果存放到临时文件中,使用要将查询结果存放到临时文件中,使用 INTO CURINTO CURSORSOR 短语。短语。

44 .将查询结果存放到永久表中.将查询结果存放到永久表中 使用短语使用短语 INTO DBF | TABLEINTO DBF | TABLE 将查询结果存放到将查询结果存放到永久表中。永久表中。

55 ..将查询结果存放到文本文件中将查询结果存放到文本文件中 可以将查询结果存放到文本文件中,使用可以将查询结果存放到文本文件中,使用 TO FILTO FIL

E E 短语。短语。 66 ..将查询结果直接输出到打印机将查询结果直接输出到打印机

可以将查询结果直接输出到打印机,使用可以将查询结果直接输出到打印机,使用 TO PRITO PRINTERNTER 子句。子句。

例例 35 35 显示工资最高的四位职工的信息。显示工资最高的四位职工的信息。 例例 36 36 显示工资最低的那显示工资最低的那 30%30% 职工的信职工的信

息。息。 例例 37 37 显示工资最高的那显示工资最高的那 30%30% 职工的信职工的信

息。息。