暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的语言结构 - 模式对象名 - 标识符限定符

林员外聊编程 2021-05-13
318
标识符限定符
 
对象名称可以是非限定的或限定的。在名称解释没有歧义的上下文中,允许使用非限定名称。限定名包括至少一个限定符,用于通过重写默认上下文或提供缺少的上下文来明确解释上下文。
 
例如,此语句使用非限定名称 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;
 
 
 
官方文档:
https://dev.mysql.com/doc/refman/8.0/en/identifier-qualifiers.html
 
文章转载自林员外聊编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论