对象名称可以是非限定的或限定的。在名称解释没有歧义的上下文中,允许使用非限定名称。限定名包括至少一个限定符,用于通过重写默认上下文或提供缺少的上下文来明确解释上下文。因为 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 语句中的非限定名和限定名示例: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 ...;
● 一个列名可以被赋予多个限定符,以指示引用它的语句中的上下文,如下表所示。 | |
| |
| 从默认数据库的 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;
https://dev.mysql.com/doc/refman/8.0/en/identifier-qualifiers.html