对象名称可以是未限定的或限定的。未限定的名称在名称解释无歧义的上下文中是允许的。限定的名称包括至少一个限定符,以明确解释上下文,覆盖默认上下文或提供缺失的上下文。
例如,这个语句使用未限定的名称 t1 创建表:
CREATE TABLE t1 (i INT);
因为 t1 不包括指定数据库的限定符,因此语句在默认数据库中创建表。如果没有默认数据库,将发生错误。
这个语句使用限定的名称 db1.t1 创建表:
CREATE TABLE db1.t1 (i INT);
因为 db1.t1 包括数据库限定符 db1,因此语句在名为 db1 的数据库中创建 t1,无论默认数据库是什么。限定符 必须 在没有默认数据库时指定,或者在有默认数据库时指定,以指定不同的数据库或明确默认数据库。
限定符具有以下特征:
-
未限定的名称由单个标识符组成。限定的名称由多个标识符组成。
-
多部分名称的组件必须用点 (
.) 字符分隔。名称的初始部分作为限定符,影响最终标识符的解释上下文。 -
限定符字符是一个单独的标记,不需要与关联的标识符相连续。例如,
tbl_name.col_name和tbl_name . col_name是等效的。 -
如果多部分名称的任何组件需要引号,分别引号它们,而不是将名称作为一个整体引号。例如,写作
`my-table`.`my-column`,而不是`my-table.my-column`。 -
在限定名称中跟随点的保留字需要是一个标识符,因此在该上下文中不需要引号。
对象名称的允许限定符取决于对象类型:
-
数据库名称是完全限定的,不需要限定符:
CREATE DATABASE db1; -
表、视图或存储程序名称可以给定数据库名称限定符。例如,在
CREATE语句中的未限定和限定的名称:CREATE TABLE mytable ...; CREATE VIEW myview ...; CREATE PROCEDURE myproc ...; CREATE FUNCTION myfunc ...; CREATE EVENT myevent ...; CREATE TABLE mydb.mytable ...; CREATE VIEW mydb.myview ...; CREATE PROCEDURE mydb.myproc ...; CREATE FUNCTION mydb.myfunc ...; CREATE EVENT mydb.myevent ...; -
触发器与表关联,因此任何限定符都应用于表名称:
CREATE TRIGGER mytrigger ... ON mytable ...; CREATE TRIGGER mytrigger ... ON mydb.mytable ...; -
列名称可以给定多个限定符,以在语句中指定上下文,如下表所示。
Column Reference Meaning col_name列 col_name来自语句中使用的任何表,其中包含该名称的列tbl_name.col_name列 col_name来自默认数据库中的表tbl_namedb_name.tbl_name.col_name列 col_name来自数据库db_name中的表tbl_name换言之,列名称可以给定表名称限定符,该限定符本身可以给定数据库名称限定符。例如,在
SELECT语句中的未限定和限定的列引用:SELECT c1 FROM mytable WHERE c2 > 100; SELECT mytable.c1 FROM mytable WHERE mytable.c2 > 100; SELECT mydb.mytable.c1 FROM mydb.mytable WHERE mydb.mytable.c2 > 100;
您不需要在语句中指定限定符,除非未限定的引用是歧义的。假设列 c1 只出现在表 t1 中,c2 只出现在 t2 中,而 c 在 t1 和 t2 中都出现。任何未限定的 c 引用在引用两个表的语句中都是歧义的,必须限定为 t1.c 或 t2.c 以指定要引用的表:
SELECT c1, c2, t1.c FROM t1 INNER JOIN t2
WHERE t2.c > 100;
类似地,要从数据库 db1 的表 t 和数据库 db2 的表 t 中检索数据,在同一个语句中,您必须限定表引用:对于这些表中的列引用,限定符仅在列名称出现在两个表中时才需要。假设列 c1 只出现在表 db1.t 中,c2 只出现在 db2.t 中,而 c 在 db1.t 和 db2.t 中都出现。在这种情况下,c 是歧义的,必须限定,但 c1 和 c2 不需要:
SELECT c1, c2, db1.t.c FROM db1.t INNER JOIN db2.t
WHERE db2.t.c > 100;
表别名使得限定列引用可以更简单地编写:
SELECT c1, c2, t1.c FROM db1.t AS t1 INNER JOIN db2.t AS t2
WHERE t2.c > 100;