• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 标识符限定符

    对象名称可能不合格或合格。在名称解释不明确的情况下,允许使用不合格的名称。合格名称至少包括一个限定符,以通过覆盖默认上下文或提供缺少的上下文来阐明解释性上下文。

    例如,以下语句使用非限定名称创建表t1

    CREATE TABLE t1 (i INT);
    

    由于不t1包含用于指定数据库的限定符,因此该语句在默认数据库中创建表。如果没有默认数据库,则会发生错误。

    该语句使用限定名称创建一个表db1.t1

    CREATE TABLE db1.t1 (i INT);
    

    由于db1.t1包含数据库限定符db1,因此无论默认数据库如何,该语句都会t1在名为的数据库中创建db1。如果没有默认数据库,则必须指定限定符。如果存在默认数据库,可以指定限定符,以指定与默认数据库不同的数据库,或者如果默认数据库与指定的数据库相同,则使数据库明确。

    限定词具有以下特征:

    • 不合格的名称由一个标识符组成。合格名称包含多个标识符。
    • 多部分名称的组成部分必须由句点(.)字符分隔。多部分名称的开头部分充当限定符,这些修饰符影响解释最终标识符的上下文。
    • 限定符是一个单独的标记,不需要与关联的标识符相邻。例如,tbl_name.col_nametbl_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_namecol_name从语句中使用哪个表包含名称的列
      tbl_name.col_name默认数据库col_nametbl_name中的列
      db_name.tbl_name.col_name数据库col_nametbl_name中的列db_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仅出现在table中t1c2仅出现在中t2,并且都出现ct1和中t2c在引用两个表的语句中,任何不合格的引用都是模棱两可的,并且必须被限定为t1.ct2.c表示您的意思是哪个表:

    SELECT c1, c2, t1.c FROM t1 INNER JOIN t2
    WHERE t2.c > 100;
    

    同样,从表中检索t数据库db1和表t数据库db2在同一语句,你必须限定表引用:对于那些表中的列参考文献,预选赛只需要对出现在两个表中列名。假设该列c1仅出现在table中db1.tc2仅出现在中db2.t,并且都出现cdb1.t和中db2.t。在这种情况下,c是不明确的,并且必须是合格的,但c1c2不必是:

    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;