对象名称可以是未限定的或限定的。未限定的名称在名称解释无歧义的上下文中是允许的。限定的名称包括至少一个限定符,以明确解释上下文,覆盖默认上下文或提供缺失的上下文。
例如,这个语句使用未限定的名称 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_name
db_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;