PostgreSQL数据库Dig7—SQL 语法(Syntax)

来源:互联网 发布:尼克杨数据 编辑:程序博客网 时间:2024/05/24 05:56

本节主要关于SQL语法,对于后续的SQL学习来说是基础,是为了以后更好的学习SQL命令操作数据。对于有过SQL经验的人来说,本章也还会值得一读,因为其包含了一些与其他数据库不同的规则和概念,具有PostgreSQL独特性。

词典结构(Lexical Structure)

SQL是由一系列标志组成,并且由分号‘;’结尾.
标志可以是关键字、标识符、引用标识符、词典或者特殊符号;标志一般有空格分割
例如以下是合理的SQL输入:

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

以上SQL输入是由三条命令组成的,并且以新行作为分割,在SQL中也可以添加注释。

1.1. 标识符和关键字(Identifiers and Key Words) **

像SELECT,UPDATE,或者VALUES这些输入属于关键字,即在SQL语言中有固定意思的单词或者短语。

MY_TABLE和A是标识符的示例,他们标志了表名,列名和其他一些数据库对象,这些都取决于他们被用在什么样的命令中。

有时候他们都被称作‘名字’,关键字和标识符具有相同的字典结构,这意味着一个人如果不了解这门语言那么他可能无法分清楚关键字和标识符,完整的关键字列表可以在Appendix C中找到。

SQL关键字和标识符必须以字母或者下划线开头关键字或者标识符的中间部分可以是数字字母或者下划线、或者也可以是$,但是尽量不要使用$,因为这会降低可移植性。

SQL标准不会用包含数字、以下划线开头或者结尾的关键字,所以以这种形式命名的标识符是安全的!

系统使用不超过NAMEDATALEN-1位的字节来命名标识符,尽管更长的名字可以被写在命令中,但他们将会被截取处理。

默认情况NAMEDATALEN是64 ,所以标识符的最大长度为63,如果这种限制有问题,你也可以修改这种限制,修改文件如下:

src/include/pg_config_manual.h

.
关键字和标识符都是大小写不敏感的,所以一下命令是等价的:

UPDATE MY_TABLE SET A = 5;uPDaTE my_TabLE SeT a = 5;UPDATE my_table SET a = 5;

一般情况下关键字都是大写的,名字都是小写的。

1.2. 常量(Constants)

在PostgreSQL中有三种固有类型的常量: strings, bit strings, 和 numbers.常量也可以被指定为明确类型,这样系统处理起来就会更加的高效快捷,这些可选项如下:

1.2.1. String常量

一个SQL string常量是由一串任意序列的字符组成 ,如果要在一个 string常量中包含引号,可以这样写:

’Dianne”s horse’

注意这并不和双引号(“)一样

1.2.2. 含有C风格转义的String常量

PostgreSQL也接受转义的string常量, 这是扩展的SQL标准,一个转义string常量通过在常量引号前加上E来起作用,例E’foo’

可转义的字符列表如下:
这里写图片描述

1.2.3. 含有Unicode转义的String常量

PostgreSQL也提供另一种转义语法使得我们可以使用任意的Unicode字符来定义字符串,Unicode 转义字符串常量以U& (大小写的U都是可以的)开始,中间不得包含任何的空格,例如:U&’foo’ .在引用内部, Unicode可以通过反斜线来进行转义,例如字符串’data’可以写成:U&’d\0061t\+000061’以下写法是俄语的“slon”的写法:U&’\0441\043B\043E\043D’

1.2.4. $引用的字符串常量(Dollar-quoted String Constants)

尽管指定字符串常量的语法通常是比较方便的,但是对于包含很多单引用或者斜线和反斜线的需求字符串来说理解起来就会变得困难,因为这些字符都必须成对的出现,为了实现更加可读的查询,PostgreSQL提供了另外一种方法,叫做$引用(dollar quoting)。$引用的字符串常量由( $ )、包含零个到多个字符的标签(tag)、另外一个$、一个任意的字符串序列组成的字符串实体、一个$、与开始相同的标签、另外一个$。

例如:表示“Dianne’s horse”的两种方法
使用$引用,标签为空:

$$Dianne’s horse$$

使用$引用,标签不为空:

$SomeTag$Dianne’s horse$SomeTag$

注意:在引用内部的字符串都不需要转义,所有字符都只需要照字面来写就可以。
我们也可以在$引用内部嵌套$引用,这在写函数定义的时候经常用到,例如:

$function$BEGINRETURN ($1 ~ $q$[\t\r\n\v\\]$q$);END;$function$

在这里,序列$q$[\t\r\n\v\]$q$代表着$引用[\t\r\n\v\],当PostgreSQL执行函数体的时候会被识别。
对于标签,不是必须的,但是如果要指定的话就必须注意它是大小写敏感的,并且不能包含$符号:

$tag$String content$tag$是正确的$TAG$String content$tag$是错误的

紧跟着关键字或者标识符的引用就会被认为是标识符的一部分。
$引用不是SQL标准的一部分,但是他对于复杂的字符串非常的便利和有用,特别是在其他变量中使用变量时以及函数定义时。

1.2.5. 位字符串常量(Bit-string Constants)

位字符串常量看起来像是普通的字符串常量之前加了B (大小写都可以)e.g., B’1001’ ,在位字符常量中唯一允许的字符只有 0 和 1 .
而且位字符串常量可以被指定为十六进制的,使用前X (大小写都可以), e.g., X’1FF’, 这等同于四位二进制的位字符串常量
$引用也可以在位字符串常量中使用。

1.2.6. 数字常量(Numeric Constants)

数字常量通常可以是以下形式:

digitsdigits .[ digits ][e[+-] digits ][ digits ]. digits [e[+-] digits ]digits e[+-] digits

数字可以是一个或者多个0-9的十进制数字. 在小数点之前或者后面必须要包含数字。至少要有一个数字跟在指数标记( e )后 。不能有任何的空格或者其他字符嵌入常量中,要注意任何起始的加号或者减号不是常量的一部分,而是应用于常量的操作符
以下位有效的数字常量

423.54..0015e21.925e-3

既不包含小数点也不包含值数标记的数字常量被认为是一个整数(如果值匹配int的类型,32位);或者说被认为是一个大整数(如果值匹配bigint的类型,64位),否则被认为是数字类型 .对于包含了小数点和/或者指数标记的数字常量一般被认为是数字常量。大多数情况下常量将会根据上下文被强制自动转换为最合适的类型,当需要的时候,你也可以强制将一个数字常量转换为指定的数据类型,例如你可以通过以下写法将一个数字常量转化为实数( float4 )

REAL ’1.23’1.23::REAL-- string style-- PostgreSQL (historical) style