Schema 对象包括数据库、表、索引、列、别名、视图、存储过程、分区和表空间等,统称为标识符。
引用标识符
标识符的引号字符是反引号 (`),标识符可以带引号或不带引号。如果标识符包含特殊字符或者是保留字,则在引用时必须带引号。
obclient> SELECT * FROM `table` WHERE `table`.id > 10;
在内部,标识符被转换并存储为 Unicode (UTF-8),标识符可能包含以下字符:
不带引号的标识符中允许的字符:
ASCII: [0-9,a-z,A-Z$_] (ASCII: [0-基本拉丁字母、数字 0-9、美元、下划线)
扩展字符:U+0080 .. U+FFFF
带引号的标识符中允许的字符包括完整的 Unicode BMP,但 U+0000 除外:
ASCII: U+0001 .. U+007F
扩展字符:U+0080 .. U+FFFF
带引号或不带引号的标识符中不允许使用 ASCII NUL (U+0000) 和补充字符(U+10000 及以上)。
标识符可以以数字开头,除非被引用,否则不能仅由数字组成。
数据库、表和列名称不能以空格字符结尾。
如果引用标识符,标识符引号字符可以包含在标识符中。如果包含在标识符中的字符与用于引用标识符本身的字符相同,则需要重复两次引用。
如下例所示,创建一个名为 a"b 的表,其中包含一个名为 c`d 的列:
obclient> CREATE TABLE `a"b` (`c``d` INT);
Query OK, 0 rows affected
在语句的其他地方引用别名时,必须使用标识符引用,否则将被视为字符串文字。
obclient> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
| 1 | 2 |
+-----+-----+
1 row in set
标识符的限定符
对象名称可以是限定的或非限定的(省略的)。限定名称至少包括一个限定符。
如下例所示,使用非限定名称 t1 创建一个表:
obclient> CREATE TABLE t1 (c INT);
Query OK, 0 rows affected
由于 t1 不包含用于指定数据库的限定符,因此该语句在默认数据库中创建表。如果没有默认数据库,则会发生错误。
如下例所示,使用限定名称 ob1.t1 创建一个表:
obclient> CREATE TABLE ob1.t1 (c INT);
Query OK, 0 rows affected
因为 ob1.t1 包含数据库限定符 ob1,该语句在名为 ob1 的数据库中创建 t1。如果没有默认数据库,则必须指定限定符。如果存在默认数据库,则可以通过限定符指定非默认数据库。
限定符有如下特点:
非限定名称由单个标识符组成。限定名称由多个标识符组成。
标识符和限定符使用句点 (.) 字符分隔。
限定符是一个独立的标记,标识符和限定符之间可以有空格。例如,
tbl_name.col_name和tbl_name . col_name是等价的。标识符和限定符同时存在时,需要分别引用。例如,
my-table`.`my-column是正确的,```my-table.my-column` `` 是错误的。限定名称中的句点 (.) 后面的保留字必须是标识符。
语法
.tbl_name表示默认数据库中的表tbl_name。
对象名称所允许的限定符取决于对象类型,规则如下:
数据库名称是完全限定的并且不带限定符:
CREATE DATABASE obdb1;表、视图或存储的程序名可以被指定一个数据库限定符。
CREATE语句中非限定名称和限定名称的示例如下:CREATE TABLE mytable ...; CREATE VIEW myview ...; CREATE TABLE obdb.mytable ...; CREATE VIEW obdb.myview ...;列名可以被指定多个限定符。如下表所示。
列引用 含义 col_name语句中使用的任何表中的包含 col_name名称的列。tbl_name.col_name默认数据库的表 tbl_name中的列col_name。db_name.tbl_name.col_name来自 db_name数据库的tbl_name表的列col_name。要在同一语句中从不同数据库的相同表中检索,必须限定表。如果对这些表中的列进行引用,则只有同时出现在两个表中的列名需要限定表。




