Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (E-O)

 

FROM 子句

此子句用于指定 DELETE、SELECT 或 UPDATE 语句中涉及的数据库表或视图。当在 SELECT 语句中使用时,FROM 子句也可以用在 MERGE 或 INSERT 语句中。

语法
FROM  table-expression, ...
table-expression :
  table-name
| view-name
| procedure-name
| derived-table
| lateral-derived-table
| join-expression 
| ( table-expression, ... )
| openstring-expression
| apply-expression
| contains-expression
table-name :
[ userid.]table-name
[ [ AS ] correlation-name ]
[ WITH ( hint [...] ) ]
view-name :
[ userid.]view-name [ [ AS ] correlation-name ]
[ WITH ( table-hint ) ]
procedure-name :
[ owner.]procedure-name ( [ parameter, ... ] )
[ WITH ( column-name data-type, ... ) ]
[ [ AS ] correlation-name ]
derived-table :
( select-statement ) 
[ AS ] correlation-name [ ( column-name, ... ) ]
lateral-derived-table :
LATERAL ( select-statement | table-expression )
[ AS ] correlation-name [ ( column-name, ... ) ]
join-expression :
table-expression join-operator table-expression 
[ ON join-condition ]
join-operator :
[ KEY | NATURAL ] [ join-type ] JOIN
| CROSS JOIN
join-type :
  INNER
| LEFT [ OUTER ]
| RIGHT [ OUTER ]
| FULL [ OUTER ]
hint :
table-hint | index-hint
table-hint :
READPAST
| UPDLOCK 
| XLOCK
| FASTFIRSTROW
| HOLDLOCK 
| NOLOCK 
| READCOMMITTED
| READUNCOMMITTED
| REPEATABLEREAD
| SERIALIZABLE
index-hint : 
NO INDEX 
| INDEX ( index-name [, ...] ) [ INDEX ONLY { ON | OFF } ]
| FORCE INDEX ( index-name )
openstring-expression : 
OPENSTRING ( { FILE | VALUE } string-expression ) 
WITH ( rowset-schema ) 
 [ OPTION ( scan-option ...  ) ]
 [ AS ] correlation-name
apply-expression :
table-expression { CROSS | OUTER } APPLY table-expression
contains-expression : 
{table-name  | view-name } CONTAINS ( column-name [,...], contains-query ) [ [ AS ] score-correlation-name ]
rowset-schema :
column-schema-list
| TABLE [owner.]table-name [ ( column-list ) ]
column-schema-list :
{ column-name user-or-base-type |  filler( ) } [ , ... ]
column-list :
      { column-name | filler( ) } [ , ... ]
scan-option :
BYTE ORDER MARK { ON | OFF }
| COMMENTS INTRODUCED BY comment-prefix
| DELIMITED BY string      
| ENCODING encoding
| ESCAPE CHARACTER character
| ESCAPES { ON | OFF }
| FORMAT { TEXT | BCP }
| HEXADECIMAL { ON | OFF }
| QUOTE string
| QUOTES { ON | OFF }
| ROW DELIMITED BY string
| SKIP integer
| STRIP { ON | OFF | LTRIM | RTRIM | BOTH } 
contains-query : string
参数
  • table-name   基表或临时表。其他用户拥有的表可以通过指定用户 ID 来限定。缺省情况下,如果未指定用户 ID,找到的是由当前用户所属的组拥有的表(请参见引用组拥有的表)。

  • view-name   指定要在查询中包含的视图。同表一样,其他用户拥有的视图可以通过指定用户 ID 来限定。缺省情况下,如果未指定用户 ID,找到的是由当前用户所属的组拥有的视图。

    尽管语法上允许在视图上使用表提示,但这类提示不起作用。

  • procedure-name   返回结果集的存储过程。此子句仅适用于 SELECT 语句的 FROM 子句。过程名后需要加括号,即使该过程没有参数。如果存储过程返回多个结果集,则仅使用第一个结果集。

    WITH 子句提供了一种为过程结果集指定列名别名的方法。如果指定了 WITH 子句,列数必须与过程结果集的列数一致,而且数据类型也必须与过程结果集中的数据类型兼容。如果未指定 WITH 子句,则列名和类型为由过程定义中确定的列名和类型。以下查询说明了 WITH 子句的用法:

    SELECT sp.ident, sp.quantity, Products.name
    FROM ShowCustomerProducts( 149 ) WITH ( ident INT, description CHAR(20), quantity INT ) sp
       JOIN Products
    ON sp.ident = Products.ID;

  • derived-table   可以在 FROM 子句中提供 SELECT 语句来代替的表名或视图名。以这种方式使用 SELECT 语句被称为派生表,并且必须要向其提供一个别名。例如,以下语句包含一个派生表 MyDerivedTable,它按照 UnitPrice 对 Products 表中的产品进行排序。
    SELECT TOP 3 *
           FROM ( SELECT Description, 
                         Quantity, 
                         UnitPrice,
                         RANK() OVER ( ORDER BY UnitPrice ASC ) 
                     AS Rank 
                     FROM Products ) AS MyDerivedTable
    ORDER BY Rank;

    有关派生表的详细信息,请参见查询派生表

  • lateral-derived-table   可能包含对父语句中对象的引用(外部引用)的派生表、存储过程或连接表。如果要在 FROM 子句中使用外部引用,则必须使用横向派生表。

    只能将外部引用用于 FROM 子句中位于横向派生表之前的表。例如,不能将外部引用用于 select-list 中的项。

    表和外部引用必须用逗号分开。例如,以下查询全部有效:

    SELECT *
     FROM A, LATERAL( B LEFT OUTER JOIN C ON ( A.x = B.x ) ) LDT;
    SELECT *
     FROM A, LATERAL( SELECT * FROM B WHERE A.x = B.x ) LDT;
    SELECT *
     FROM A, LATERAL( procedure-name( A.x ) ) LDT;

    指定 LATERAL (table-expression) 等同于指定 LATERAL (SELECT * FROM table-expression)。

  • openstring-expression   指定 OPENSTRING 子句以便在文件或 BLOB 中进行查询,此时将这些源的内容视作行的集合。这样做时,由于不是对已定义的结构(如表或视图)进行查询,因此还需为将要生成的结果集指定有关文件或 BLOB 的模式的信息。此子句适用于 SELECT 语句的 FROM 子句。UPDATE 或 DELETE 语句不支持此子句。

    ROWID 函数可用于对 OPENSTRING 表达式生成的表的结果集进行操作。

    以下所示为 OPENSTRING 子句的次级子句和参数,以及如何使用它们在文件和 BLOB 中定义及查询数据:

    • FILE 和 VALUE 子句   使用 FILE 子句可指定要查询的文件。使用 VALUE 子句可指定要查询的 BLOB 表达式。假定 BLOB 表达式的数据类型为 LONG BINARY。可以将 READ_CLIENT_FILE 函数指定为 VALUE 子句的值。

      如果 FILE 或 VALUE 关键字都未指定,则假定关键字为 VALUE。

    • WITH 子句   此子句用于指定要查询的数据的行集模式(列名和数据类型)。可以直接指定列(例如,WITH ( Surname CHAR(30), GivenName CHAR(30) ))。也可以使用 TABLE 次级子句引用要使用的表,以便从中获取模式信息(例如,WITH TABLE dba.Employees ( Surname, GivenName ))。您必须拥有指定的表,或者具有对该表的 SELECT 权限。

      指定列时,可以在输入数据中对要跳过的列指定 filler( )(例如,WITH ( filler( ), Surname CHAR(30), GivenName CHAR(30) ))。有关 filler( ) 用法的详细信息,请参见LOAD TABLE 语句

    • OPTION 子句   使用 OPTION 子句可指定要对输入文件使用的分析选项,如转义字符、分隔符、编码等。支持的选项包括 LOAD TABLE 语句中用于控制输入文件分析的那些选项。请参见LOAD TABLE 语句

  • scan-option   有关各个扫描选项的说明,请参见LOAD TABLE 语句中介绍的装载选项。

  • apply-expression   此子句用于指定一个连接条件,即针对左侧 table-expression 的每一行计算右侧的 table-expression。例如,可以使用 apply 表达式为表表达式中的每一行计算函数、过程或派生表。请参见从 apply 表达式生成的连接

  • contains-expression   在表名后使用 CONTAINS 子句可对表进行过滤,从而仅返回与 contains-query 所指定的全文查询相匹配的行。表的每个匹配行与分数列一起返回,可以使用 score-correlation-name (如果已指定)引用此分数列。如果未指定 score-correlation-name,则使用缺省相关名 contains 来引用分数列。

    如果可选的相关名参数出现异常,则 CONTAINS 子句将采用与 CONTAINS 搜索条件相同的参数。请参见CONTAINS 搜索条件

    在 CONTAINS 子句中列出的列必须具有文本索引。请参见文本索引

  • correlation-name   correlation-name 用于为 FROM 子句中的表或视图指定替换名。然后即可在语句的任何其它位置引用该替换名。例如,emp 和 dep 分别是 Employees 表和 Departments 表的相关名。
    SELECT Surname, GivenName, DepartmentName
       FROM Employees emp, Departments dep,
       WHERE emp.DepartmentID=dep.DepartmentID;

  • WITH table-hint 子句   WITH table-hint 子句允许指定仅供此表和仅供此语句使用的行为。使用此子句可以在不更改隔离级别或者设置数据库选项或连接选项的情况下更改行为。表提示可用于基表、临时表和实例化视图。

    小心

    WITH table-hint 子句是一项高级功能,只应在需要时使用,且只能由经验丰富的数据库管理员使用。此外,并非在所有情况下都应用此设置。

  • 隔离级别相关的表提示   隔离级别表提示用于指定查询表时的隔离级别行为。它们指定仅供指定表使用的锁定方法,且仅用于当前查询。不能指定快照隔离级别作为表提示。

    以下是所支持的隔离级别相关表提示的列表:

    表提示 说明
    HOLDLOCK 将行为设置为与隔离级别 3 相当。此表提示与 SERIALIZABLE 同义。
    NOLOCK 将行为设置为与隔离级别 0 相当。此表提示与 READUNCOMMITTED 同义。
    READCOMMITTED 将行为设置为与隔离级别 1 相当。
    READPAST 指示数据库服务器忽略而不是阻塞写锁定的行。此表提示只能与隔离级别 1 一起使用。只有当 FROM 子句中的相关名引用基表或全局共享临时表时才会考虑 READPAST 提示。在其它情况下(视图、代理表和表函数)则忽略 READPAST 提示。只要为基表的相关名指定了提示,在视图中的查询就可能使用 READPAST 提示。由于服务器中锁定和谓语计算的相互作用,使用 READPAST 表提示可能会导致异常。另外,您不能对 DELETE、INSERT、或 UPDATE 语句的目标表使用 READPAST 提示。
    READUNCOMMITTED 将行为设置为与隔离级别 0 相当。此表提示与 NOLOCK 同义。
    REPEATABLEREAD 将行为设置为与隔离级别 2 相当。
    SERIALIZABLE 将行为设置为与隔离级别 3 相当。此表提示与 HOLDLOCK 同义。
    UPDLOCK 指示将使用意图锁锁定由提示表中的语句所处理的行。在事务结束前,受影响的行将保持锁定状态。UPDLOCK 可以工作在所有隔离级别且使用意图锁。请参见意图锁
    XLOCK 指示将独占锁定由提示表中的语句所处理的行。在事务结束前,受影响的行将保持锁定状态。XLOCK 可以工作在所有隔离级别且使用写锁。请参见写锁定

    有关隔离级别的信息,请参见隔离级别和一致性

    对 MobiLink 同步使用 READPAST

    如果正在为参与 MobiLink 同步的数据库编写查询,建议不要在同步脚本中使用 READPAST 表提示。

    有关详细信息,请参见:

    如果由于应用程序执行了许多影响下载性能的更新而考虑使用 READPAST,则可以将快照隔离作为一种替代解决方案。请参见MobiLink 隔离级别

  • 优化表提示 (FASTFIRSTROW)   FASTFIRSTROW 表提示允许您在不将 optimization_goal 选项设置为 First-row 的情况下为查询设置优化目标。使用 FASTFIRSTROW 时,SQL Anywhere 会选择一种能够缩短读取查询结果第一行所需时间的访问计划。请参见optimization_goal 选项 [数据库]

  • WITH ( index-hint ) 子句   使用 WITH ( index-hint ) 子句可替换查询优化程序的计划选择算法,并告知优化程序使用索引来访问表的准确方式。索引提示可用于基表、临时表和实例化视图。

  • NO INDEX   使用此子句强制对表执行顺序扫描(不使用索引)。请注意,顺序扫描的开销可能非常大。

  • INDEX ( index-name [,... ] )   使用此子句可指定索引(最多四个),优化程序必须使用这些索引来满足查询。如果有任何一个指定的索引不能使用,则会返回错误。

  • INDEX ONLY { ON | OFF }   此子句用于控制是否对数据执行仅索引检索。如果使用 INDEX ONLY ON 指定了 INDEX (index-name...) 子句,则数据库服务器会使用指定的索引尝试仅索引检索。如果任一指定的索引无法满足仅索引检索(例如,没有索引,或现有的索引不能满足查询),则返回错误。

    指定 INDEX ONLY OFF 可阻止仅索引检索。

  • FORCE INDEX ( index-name )   此子句用于指定索引,优化程序必须使用该索引在满足查询的表中查找行。出于兼容性考虑,语法为 FORCE INDEX ( index-name ),它不支持指定一个以上的索引。

    小心

    索引提示会替换查询优化程序的决策逻辑,因此只应由经验丰富的用户使用。使用索引提示可能会导致访问计划达不到最优,并会导致性能较差。

注释

SELECT、UPDATE 和 DELETE 语句需要用一个表列表来指定此语句要使用的表。

视图和派生表

虽然 FROM 子句描述针对的是表,但它同样适用于视图和派生表,除非另外说明。

FROM 子句创建由所有指定表中的所有列组成的结果集。组件表中行的所有组合最初都在结果集中,但 JOIN 条件和/或 WHERE 条件通常会减少组合数。

您不能将 ON 短语与 CROSS JOIN 一起使用。

对于语法 2,如果 FILE 子句或 VALUE 子句都未指定,则假定指定了 VALUE 子句。也就是说假定 string-expression 为要查询的值。

权限

openstring-expression 的 FILE 子句需要 DBA 权限或 READFILE 权限。

openstring-expression 的 TABLE 子句要求用户拥有指定的表,或是具有对指定表的 SELECT 权限。

副作用

无。

另请参见
标准和兼容性
  • SQL/2003   核心特性,但以下列出的内容除外。FROM 子句的复杂性意味着应根据标准检查各个子句。

    • KEY JOIN,服务商扩充

    • FULL OUTER JOIN 和 NATURAL JOIN,核心 SQL 外部的 SQL/基础特性

    • READPAST 表提示,服务商扩充

    • LATERAL ( table-expression ),服务商扩充。注意,LATERAL ( select-statement ) 是 ANSI SQL 标准中的特性 T491。

    • 派生表是特性 F591

    • FROM 子句(表函数)中的过程是特性 T326

    • 公用表表达式是特性 T121

    • 递归表表达式是特性 T131

示例

以下是有效的 FROM 子句:

...
FROM Employees
...
...
FROM Employees NATURAL JOIN Departments
...
...
FROM Customers
KEY JOIN SalesOrders
KEY JOIN SalesOrderItems
KEY JOIN Products
...
...
FROM Employees CONTAINS ( Street, ' Way ' )
...

以下查询说明如何在查询中使用派生表:

SELECT Surname, GivenName, number_of_orders
FROM Customers JOIN
     ( SELECT CustomerID, COUNT(*)
       FROM SalesOrders
        GROUP BY CustomerID )
     AS sales_order_counts( CustomerID,
                             number_of_orders )
ON ( Customers.ID = sales_order_counts.CustomerID )
WHERE number_of_orders > 3;

以下查询说明如何从存储过程结果集中选择行:

SELECT t.ID, t.QuantityOrdered AS q, p.name
FROM ShowCustomerProducts( 149 ) t JOIN Products p
ON t.ID = p.ID;

以下示例说明如何使用 OPENSTRING 子句执行对文件的查询。CREATE TABLE 语句创建名为 testtable 的表,该表含有两列(column1 和 columns2)。UNLOAD 语句通过卸载 RowGenerator 表中的行创建一个名为 testfile.dat 的文件。SELECT 语句在 FROM 子句中使用了 OPENSTRING 子句,并同时使用 testtable 和 RowGenerator 这两个表中的模式信息来查询 testfile.dat 文件。此查询将返回具有值 49 的行。

CREATE TABLE testtable( column1 CHAR(10), column2 INT );
UNLOAD SELECT * FROM RowGenerator TO 'testfile.dat'; 
SELECT A.column2 
  FROM OPENSTRING( FILE 'testfile.dat' ) 
  WITH ( TABLE testtable( column2 ) ) A, RowGenerator B
  WHERE A.column2 = B.row_num
  AND A.column2 < 50
  AND B.row_num > 48;

以下示例说明如何使用 OPENSTRING 子句执行对字符串值的查询。SELECT 语句在 FROM 子句中使用了 OPENSTRING 子句,并同时使用 WITH 子句中提供的模式信息来查询字符串值。该查询将返回两列三行。

SELECT *
  FROM OPENSTRING( VALUE '1,"First"$2,"Second"$3,"Third"')
  WITH (c1 INT, c2 VARCHAR(30))
  OPTION ( DELIMITED BY ',' ROW DELIMITED BY '$')
  AS VALS