1.Base基础/3.Icon图标/操作/search备份
1.Base基础/3.Icon图标/操作/search备份
EN
文档
关于AntDB
部署与升级
快速入门
运维
调优
工具和插件
高级服务
数据安全
参考
  • 文档首页 /
  • 使用教程 /
  • Oracle兼容 /
  • SQL语法

SQL语法

更新时间:2024-07-01 14:39:46

概述

本节介绍了 SQL 语言的基本语法,这是深入理解后面章节中关于如何使用 SQL 语言定义和修改数据内容的基础。

词法结构

SQL 语言由一个命令序列组成。一条命令由多个符号构成,以分号结束。当输入完所有的字符后就结束了命令的输入。关于哪些符号可以在命令中使用这些命令的指定语法决定的。

一个符号可以是一个关键词,一个标识符,一个用括号引起来的标识符,文字(或常量),或者一个特定的字符。这些符号通常由空格(如空格,Tab 键,换行符)进行分隔的,但是如果没有语义上不明确的地方(通常是指特定的字符与其它类型的符号相连接),则是不需要的。

除此之外,在输入的 SQL语句中通常会遇到注释。注释不是符号,注释可以等同于空格。

例如,下面是在语法上有效的 SQL 语句:

SELECT * FROM MY_TABLE;
UPDATE MY_TABLE SET A = 5;
INSERT INTO MY_TABLE VALUES (3, 'hi there');

这是由 3 条命令组成的序列,每一行有一条命令。(通常这不是必须的,事实上,在一行中可以存放多条命令,或者将命令分拆到不同的行中)

SQL 语法与用什么符号标识命令,什么是操作符或者是参数不是完全一致的。在一条命令中前几个符号通常是命令名称,所以在上面的示例中,通常是谈论一条SELECT,UPDATE 和 INSERT 命令。但是例如,UPDATE 命令要求在指定的位置上出现一个 SET 符号。而对于另外一种不同形式的 INSER T命令,则会要求只有在指定的地方出现一个 VALUES 记号,才能完成这条命令的输入。将在章节 2.3 中介绍每条命令精确的语法规则。

标识符和关键字

在上面示例中出现的符号,例如 SELECT、UPDATE 或者是 VALUES,实际上是关键字的示例。这就是说,在 SQL 语言中,一些词是有固定含义的。符号 MY_TABLE 和 A 是关于标识符的示例。根据在命令中使用的情况,这些符号表示数据表,列或者其他数据库对象的名称。因此,一些时候,他们被简称为“names”。关键字和标识符有相同的句法结构,这就意味着在不知道所使用语言的情况下,不能确认符号是标识符或者是关键字。

SQL 语言的标识符和关键字必须以一个字母(a-z或者A-Z)开头,而后面的字符可以是字母,下划线,数字(0-9),$符号或者数值符号(#)。

标识符和关键词不区分大小写的,因此,

UPDATE MY_TABLE SET A = 5;

等同于:

UPDATE my_TabLE SeT a = 5; 

通常的书写习惯是关键词大写,而名称小写,例如:

UPDATE my_table SET a = 5; 

第二种类型的标识符包括:分隔标识符或者引用标识符—是由双引号引起的一个字符序列构成。分隔标识符只能是一个标识符,而不能是一个关键字。所以,可以使用"select"表示一个名称为”select”的列或者数据表。然而如果没有用引号将 select 引起来,那么它只能被当作一个关键字,在这种情况下如果用它表示一个数据表名和列名,将会引发一个错误。

使用引用标识符的示例如下:

UPDATE "my_table" SET "a" = 5; 

除了带有编码 0 的字符,引用标识符能够包含任何字符。(可以写 2 个双引号来包含一个双引号)这样可以允许创建包含空格和&符号的表名或者列名。但是依然适用名称长度的限制。

如果使用双引号将标识符引起来,那么这个标识符就会大小写敏感,但是那些没有放到引号中的标识符会被当成小写。例如,AntDB 认为标识符 FOO, foo 和 "foo" 相同,但是对于 "Foo" 和 "FOO" 来说,无论是这两者之间相互比较,还是和上面三个标识符相比较都是不同的。(在 AntDB 中,将未用引号引起来的名称自动变成小写,这与 Oracle 不兼容,实际上在 Oracle 中未被引号引起来的名称会变成大写。因此在 Oracle 中 foo 等同于 "FOO",而不等于 "foo"。如果你想写一个简洁的应用程序,对于特定的名称,建议你要么都用引号引起来,要么永远不要这么做)。但是,在 AntDB 中,未用双引号引起来的列名,select 查询出来的列名都是以大写展示,与 Oracle 一致。

关于大小写的示例如下

CREATE TABLE tb1(ID int, NAME varchar(5));
INSERT INTO tb1(name) VALUES('Tom');
SELECT * FROM tb1;

CREATE TABLE tb2("ID" int, "NAME" varchar(5));
INSERT INTO tb2("NAME") VALUES('Tom');
SELECT * FROM tb2;

CREATE TABLE "tb3"(ID int, NAME varchar(5));
INSERT INTO "tb3" (NAME) VALUES('Tom');
SELECT * FROM "tb3";

上面 select 语句查询的结果一样,如下:

 ID | NAME 
----+------
    | Tom
(1 row)

常量

在 AntDB 中隐含状态下指定类型的常量是字符串和数值。也可以明确指定常量的类型,这样可以更加精确地表示常量,同时也便于系统对常量进行更有效率的处理。

在本章节后面的部分中,将讨论这些可供选择的方法。

字符串常量

在 SQL 语言中字符串常量是由单引号引起来的任意字符串,例如 ‘This is a string'就是一个字符串常量。如果想在字符串常量中包含一个单引号,需要写 2 个相连续的单引号,例如, 'Dianne''s horse'。 需要注意的是这和包含双引号的用法不同。

数值常量

下面是一些可使用的数值常量:

digits
digits.[digits][e[+-]digits]
[digits].digits[e[+-]digits]
digitse[+-]digits

其中 digits 是一位或多位的数字(每一位数字范围是 0 到 9)。如果使用了一个小数点,那么在小数点前面或后面必须至少有一位数字。如果出现了指数底(e),那么指数的底数后面必须至少跟随一位数字。在常量中不得嵌入任何空格或者除了上面提到字符之外的其他字符。需要注意的是在常量前面出现的正号或负号不是常量的一部分,而是只是常量上的操作符。

下面是一些有效数值常量的示例:

42
3.5
4.
0.001
5e2
1.925e-3

如果一个数值型常量既不包括小数点也不包括指数,它的值符合 INTEGER 类型(32 bit),那么这个数值在初始状态下就被认为是 INTEGER 类型, 如果它的值符合 BIGINT 类型(64 bit),那么就会被认为是 BIGINT 类型,否则就会被当成 NUMBER 类型。把包含小数点或者指数的常量当成 NUMBER 类型。

在初始状态下,分配给一个数值常量的数据类型仅仅是类型解析算法的开始。在大多数情况下,会根据使用环境把最合适的数据类型自动赋给常量。必要的时候,通过使用下一节中介绍的关于指派类型的内容,可以把一个数值型变量的值解释为指定数据类型的值。

其它类型的常量

可以使用下面的的表示法输入任意类型的常量:

CAST('string' AS type)

为了将常量转换成参数 type 指定的类型,将字符串常量的文本传递到输入转换部分。转换后的结果是变成了指定数据类型的常量。如果关于常量的类型没有不明确的地方(例如,直接把常量赋予一个数据表的列),那么可以省略明确的类型指派。

CAST 也可以用于在运行时指定任意表达式的类型转换。

注释

注释是以 2 个破折号开头的字符串,一直到一行的结尾。例如:

-- This is a standard SQL comment

也可以使用 C 语言风格的注释:

/* multiline comment
* block
*/

注释以/*开始,遇到*/结束。

在作进一步语法分析前,会从输入的 SQL 语句中删除注释,用空格替代。

问题反馈