### 9.2.2 标识符限定符

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

例如，此语句使用非限定名称创建表`t1`：

```
CREATE TABLE t1 (i INT);
```

因为`t1`不包括指定数据库的限定符，该语句在默认数据库中创建表。如果没有默认数据库，则会发生错误。

此语句使用限定名称创建表`db1.t1`：

```
CREATE TABLE db1.t1 (i INT);
```

因为`db1.t1`包括一个数据库限定符`db1`, 该语句创建`t1`在名为的数据库中`db1`，无论默认数据库如何。预选赛*必须*如果没有默认数据库，则指定。预选赛*可能*如果存在默认数据库，则指定，以指定与默认数据库不同的数据库，或者如果默认数据库与指定的数据库相同，则使数据库显式。

限定符具有以下特点：

-   非限定名称由单个标识符组成。限定名称由多个标识符组成。

-   多部分名称的组成部分必须用句点 (`.`） 人物。多部分名称的初始部分充当限定符，影响解释最终标识符的上下文。

-   限定符字符是一个单独的标记，不需要与相关的标识符连续。例如，*`tbl_name.col_name`*和*`tbl_name 。col_name`*是等价的。

-   如果多部分名称的任何组成部分需要引用，请单独引用它们而不是引用整个名称。例如，写``我的表`.`我的列``， 不是`my-table.my-column`.

-   在限定名称中跟在句点后面的保留字必须是标识符，因此在该上下文中它不需要被引用。

    对象名称的允许限定符取决于对象类型：

-   数据库名称是完全限定的，不带限定符：

    ```
    CREATE DATABASE db1;
    ```

-   可以为表、视图或存储的程序名称指定数据库名称限定符。中的非限定名称和限定名称示例`创建`声明：

    ```
    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`* | 柱子*`col_name`*从表*`tbl_name`*默认数据库的 |
    | *`db_name.tbl_name.col_name`* | 柱子*`col_name`*从表*`tbl_name`*数据库的*`数据库名称`* |

    换句话说，列名可以被赋予一个表名限定符，它本身可以被赋予一个数据库名限定符。中不合格和合格的列引用示例`选择`声明：

    ```
    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`并从一张桌子`吨`在数据库中`数据库2`在同一语句中，您必须限定表引用：对于这些表中的列的引用，限定符仅对出现在两个表中的列名是必需的。假设该列`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;
```
