相关的文档10bet官方网站 本手册下载 本手册摘录

9.2.2标识符限定符

对象名称可以是非限定的,也可以是限定的。在对名称的解释是明确的上下文中,允许使用非限定名称。限定名包括至少一个限定符,通过覆盖默认上下文或提供缺少的上下文来澄清解释上下文。

例如,该语句使用非限定名称创建一个表t1

CREATE TABLE t1 (i INT);

因为t1不包含指定数据库的限定符,语句将在默认数据库中创建表。如果没有默认数据库,则会发生错误。

此语句使用限定名创建一个表db1.t1

db1创建表。t1 (INT);

因为db1.t1包括一个数据库限定符db1,该语句创建t1在名为db1,不管默认数据库是什么。限定符必须如果没有默认数据库,则指定。限定符五月如果有默认数据库,则指定;如果指定与默认数据库不同的数据库;如果默认与指定的数据库相同,则指定显式数据库。

限定符有以下特征:

  • 非限定名由单个标识符组成。限定名由多个标识符组成。

  • 由多个部分组成的名称必须用句点()字符。多部分名称的初始部分充当限定词,影响在其中解释最终标识符的上下文。

  • 限定符字符是一个单独的标记,不需要与相关标识符相连。例如,tbl_name.col_nametbl_name。col_name是等价的。

  • 如果包含多个部分的名称的任何组件需要引用,请单独引用它们,而不是引用整个名称。例如,写“桌子”。“我的专栏”,而不是“my-table.my-column”

  • 限定名中句点后面的保留字必须是标识符,因此在该上下文中不需要用引号引用。

允许的对象名称限定符取决于对象类型:

  • 数据库名称是完全限定的,没有限定符:

    创建数据库db1;
  • 可以给表、视图或存储的程序名一个数据库名限定符。中不限定名和限定名的例子创建声明:

    CREATE TABLE mytable…CREATE VIEW myview…;CREATE PROCEDURE myproc…创建myfunc函数CREATE EVENT myevent…;mydb创建表。mytable…;mydb创建视图。myview…;mydb创建过程。myproc…;mydb创建函数。myfunc…;创建事件mydb。myevent…;
  • 触发器与表相关联,所以任何限定符都适用于表名:

    CREATE TRIGGER mytrigger…mytable……;CREATE TRIGGER mytrigger…mydb。mytable…;
  • 列名可以被赋予多个限定符来指示引用它的语句中的上下文,如下表所示。

    列引用 意义
    col_name col_name在语句中使用的包含该名称的列的任何表中
    tbl_name.col_name col_name从表tbl_name默认数据库的
    db_name.tbl_name.col_name col_name从表tbl_name数据库的db_name

    换句话说,可以为列名提供一个表名限定符,而表名限定符本身也可以提供一个数据库名限定符。中未限定和限定列引用的示例选择声明:

    SELECT c1 FROM mytable WHERE c2 > 100;选择mytable。c1FROM mytable WHERE mytable.c2 > 100; SELECT mydb.mytable.c1 FROM mydb.mytable WHERE mydb.mytable.c2 > 100;

您不需要在语句中为对象引用指定限定符,除非非限定引用具有二义性。假设这一列c1仅在表中出现t1c2只有在t2,c在这两个t1t2.任何对c引用两个表的语句是否有歧义,必须限定为t1.ct2.c要指出你指的是哪张表:

SELECT c1, c2, t1.c FROM t1 INNER JOIN t2 WHERE t2.c > 100;

类似地,从表中检索t在数据库db1从一张桌子上t在数据库db2在同一语句中,必须限定表引用:对于那些表中的列的引用,限定符只需要对两个表中出现的列名进行限定。假设这一列c1仅在表中出现db1.tc2只有在db2.t,c在这两个db1.tdb2.t.在这种情况下,c是模棱两可且必须限定但是c1c2不需要:

SELECT c1, c2, db1.t.c FROM db1。t INNER JOIN db2。tWHERE db2.t.c > 100;

表别名使符合条件的列引用可以更简单地写:

SELECT c1, c2, t1.c FROM db1。db2. t AS t1 INNER JOIN db2. ttAS t2 WHERE t2.c > 100;