对象名称可以是未限定的或限定的。在名称解释明确的上下文中允许使用未限定的名称。限定名称包含至少一个限定符,通过覆盖默认上下文或提供缺失的上下文来澄清解释上下文。
例如,此语句使用未限定的名称 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 ...;
列名称可以被赋予多个限定符,以在引用它的语句中指示上下文,如以下表格所示。
列引用 含义 col_name
来自语句中使用的任何包含该名称列的表的列 col_name
tbl_name.col_name
来自默认数据库中的表 tbl_name
的列col_name
db_name.tbl_name.col_name
来自数据库 db_name
中的表tbl_name
的列col_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;