是否有像SQL连接中使用的'DOT(。)表示法这样的术语?

时间:2013-11-19 04:55:42

标签: sql join

SQL连接中是否使用了'DOT(。)表示法这样的术语? 如果练习,请解释如何使用它。

提前致谢。

2 个答案:

答案 0 :(得分:2)

是的,这是你如何做的

执行SELECT

SELECT firstname, lastname from dbo.names n - n成为别名 JOIN address a ---另一个别名

on a.userid = n.userid

答案 1 :(得分:1)

multiple sources官方文档整理而来。

点表示法(有时称为成员资格运算符)允许您使用另一个SQL标识符来限定SQL标识符,该标识符是其组件。您将标识符与句点(。)符号分开。例如,您可以使用以下任何SQL标识符限定列名称:

Table name: table_name.column_name
View name: view_name.column_name
Synonym name: syn_name.column_name

这些点符号形式称为列投影。

您还可以使用点表示法直接访问已命名或未命名的ROW列的字段,如下例所示:

row-column name.field name

这种点符号的使用称为场投影。例如,假设您有一个名为rect的列,其定义如下:

CREATE TABLE rectangles
(
   area float,
   rect ROW(x int, y int, length float, width float)
)

以下SELECT语句使用点表示法来访问rect列的字段长度:

SELECT rect.length FROM rectangles WHERE area = 64

选择嵌套字段

当定义列本身的ROW类型包含其他ROW类型时,该列包含嵌套字段。使用点表示法访问列中的这些嵌套字段。

例如,假设employee表的地址列包含以下字段:street,city,state和zip。此外,zip字段包含嵌套字段:z_code和z_suffix。对zip字段的查询返回z_code和z_suffix字段的值。但是,您可以指定查询仅返回特定的嵌套字段。以下示例显示如何使用点表示法构造SELECT语句,该语句仅返回地址列的z_code字段的行:

SELECT address.zip.z_code 
   FROM employee 

优先顺序

数据库服务器使用以下优先级规则来解释点表示法:

schema name_a . table name_b . column name_c . field name_d
table name_a . column name_b . field name_c . field name_d
column name_a . field name_b . field name_c . field name_d

当标识符的含义不明确时,数据库服务器使用优先级规则来确定标识符指定的数据库对象。请考虑以下两个表:

CREATE TABLE b (c ROW(d INTEGER, e CHAR(2));
CREATE TABLE c (d INTEGER);

在下面的SELECT语句中,表达式c.d引用表c的列d(而不是表b中列c的字段d),因为表标识符的优先级高于列标识符:

SELECT * 
FROM b,c 
WHERE c.d = 10

有关优先规则以及如何对ROW列使用点表示法的更多信息,请参阅“IBM Informix:SQL教程指南”。

将点表示法与行型表达式一起使用

除了指定ROW数据类型的列之外,您还可以将点表示法与任何计算结果为ROW类型的表达式一起使用。例如,在INSERT语句中,您可以在返回单行值的子查询中使用点表示法。假设您创建了一个名为row_t的ROW类型:

CREATE ROW TYPE row_t (part_id INT, amt INT)

还假设您创建了一个名为tab1的类型表,该表基于row_t ROW类型:

CREATE TABLE tab1 OF TYPE row_t

还假设您将以下值插入表tab1:

INSERT INTO tab1 VALUES (ROW(1,7));
INSERT INTO tab1 VALUES (ROW(2,10));

最后,假设您创建了另一个名为tab2的表:

CREATE TABLE tab2 (colx INT)

现在,您可以使用点表示法将表tab1的part_id列中的值插入到tab2表中:

INSERT INTO tab2
   VALUES ((SELECT t FROM tab1 t
      WHERE part_id = 1).part_id)

如果要选择ROW类型列的所有字段,则不需要星号形式的点表示法,因为您可以单独指定列名称以选择其所有字段。但是,当您使用子查询时,如前面的示例中所示,或者当您调用用户定义的函数以返回ROW类型的值时,点符号的星号形式可能非常有用。

假设名为new_row的用户定义函数返回ROW类型的值,并且您希望调用此函数将ROW类型值插入表中。使用星号表示法可以轻松指定将new_row()函数返回的所有ROW类型值插入到表中:

INSERT INTO mytab2 SELECT new_row (mycol).* FROM mytab1

片段表达式中不允许引用ROW类型列或ROW类型表达式的字段。片段表达式是一种表达式,用于在CREATE TABLE, CREATE INDEX, and ALTER FRAGMENT等SQL语句中定义表片段或索引片段。

如何使用点表示法指定名称的其他示例 点表示法用于标识记录字段,对象属性以及包或其他模式中的项目。组合这些项目时,可能需要使用具有多个点级别的表达式,其中并不总是清楚每个点所指的内容。以下是一些组合:

函数返回值的字段或属性

func_name().field_name
func_name().attribute_name
Schema Object Owned by Another Schema

schema_name.table_name
schema_name.procedure_name()
schema_name.type_name.member_name()
Packaged Object Owned by Another User

schema_name.package_name.procedure_name()
schema_name.package_name.record_name.field_name
Record Containing an Object Type

record_name.field_name.attribute_name
record_name.field_name.member_name()

PL / SQL和SQL之间的名称解析差异 PL / SQL和SQL的名称解析规则类似。如果您遵循捕获避免规则,则可以避免一些差异。为了兼容性,SQL规则比PL / SQL规则更宽松。 SQL规则(主要是上下文敏感的)被认为是比PL / SQL规则更合法的情况和DML语句。

当PL / SQL编译器处理SQL语句(如DML语句)时,PL / SQL使用与SQL相同的名称解析规则。例如,对于诸如HR.JOBS之类的名称,SQL首先匹配HR模式中的对象,然后匹配当前模式中的包,类型,表和视图。

PL / SQL使用不同的顺序来解析PL / SQL语句中的名称,例如赋值和过程调用。对于名称为HR.JOBS的情况,PL / SQL首先搜索当前模式中名为HR的包,类型,表和视图,然后搜索HR模式中的对象。