9.2.2 标识符限定词
对象名称可能不合格或合格。在名称解释不明确的情况下,允许使用不合格的名称。合格名称至少包括一个限定符,以通过覆盖默认上下文或提供缺少的上下文来阐明解释性上下文。
例如,以下语句使用不限定名称t1
创建一个 table:
CREATE TABLE t1 (i INT);
由于t1
不包含用于指定数据库的限定符,因此该语句在默认数据库中创建 table。如果没有默认数据库,则会发生错误。
该语句使用限定名称db1.t1
创建一个 table:
CREATE TABLE db1.t1 (i INT);
因为db1.t1
包含数据库限定符db1
,所以无论默认数据库如何,该语句都会在名为db1
的数据库中创建t1
。如果没有默认数据库,则必须指定限定符*。如果存在默认数据库,则可以指定修饰符*,以指定与默认数据库不同的数据库,或者如果默认数据库与指定数据库相同,则使数据库明确。
限定词具有以下 Feature:
-
不合格的名称由单个标识符组成。合格名称包含多个标识符。
-
Multipart 名称的组成部分必须由句点(
.
)字符分隔。Multipart 名称的开头部分充当限定符,这些修饰符影响解释最终标识符的上下文。 -
限定符是一个单独的标记,不需要与关联的标识符相邻。例如,*
tbl_name.col_name
和tbl_name . col_name
*是等效的。 -
如果 Multipart 名称的任何组成部分都需要引用,请分别引用它们,而不要整体引用该名称。例如,Importing“
my-table
.my-column
”,而不是“my-table.my-column
”。 -
限定名称中句点后的保留字必须是标识符,因此在这种情况下无需引用。
-
语法
.tbl_name
table 示默认数据库中的 table*tbl_name
*。
Note
从 MySQL 5.7.20 开始不推荐使用此语法,并且在将来的 MySQL 版本中将删除该语法。
对象名称允许的限定符取决于对象类型:
- 数据库名称是完全限定的,不包含限定符:
CREATE DATABASE db1;
- 可以为 table,视图或存储的程序名称提供数据库名称限定符。
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 ...;
- 触发器与 table 相关联,因此任何限定符都适用于 table 名称:
CREATE TRIGGER mytrigger ... ON mytable ...;
CREATE TRIGGER mytrigger ... ON mydb.mytable ...;
- 列名可以被赋予多个限定符以指示引用它的语句中的上下文,如下 table 所示。
Column Reference | Meaning |
---|---|
col_name | 语句中使用的任何 table 中的列* col_name *都包含该名称的列 |
tbl_name.col_name | 默认数据库的 table* tbl_name 中的列 col_name * |
db_name.tbl_name.col_name | 数据库的 table* tbl_name 的列 col_name * * db_name * |
换句话说,可以给列名一个 table 名限定符,它本身可以给数据库名限定符。 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
仅出现在 tablet1
中,c2
仅出现在t2
中,而c
出现在t1
和t2
中。在引用两个 table 的语句中,任何对c
的不合格引用都是模棱两可的,并且必须将其限定为t1.c
或t2.c
,以 table 明您的意思是哪个 table:
SELECT c1, c2, t1.c FROM t1 INNER JOIN t2
WHERE t2.c > 100;
同样,要在同一条语句中从数据库db1
中的 tablet
和数据库db2
中的 tablet
检索 table,必须对 table 引用进行限定:对于这些 table 中的列的引用,仅在两个 table 中都出现的列名才需要使用限定符 table。假设列c1
仅出现在 tabledb1.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;
table 别名使合格列引用的编写更加简单:
SELECT c1, c2, t1.c FROM db1.t AS t1 INNER JOIN db2.t AS t2
WHERE t2.c > 100;