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

OceanBase SQL语句Schema对象名称

2024-04-27
374

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

    要在同一语句中从不同数据库的相同表中检索,必须限定表。如果对这些表中的列进行引用,则只有同时出现在两个表中的列名需要限定表。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论