postgresql笔记006——SQL语句——词法结构
SQL语句中的词法结构
SQL输入由一系列命令组成,一条命令由一系列记号构成,用一个分号 “;” 来结尾。输入流的终止也结束一条命令。
记号可以是一个关键字,标识符,引号包围的标识符,文本(或者常量),特殊的字符符号。记号通常由空白分割(空格/tab/换行符),但是如果不存在混淆的时候也可以不用(通常只是一个特殊字符与一些其他记号类型相连的时候)。
SQL输入里面可以有注释,他们不是记号,实际上等效于空白。
标识符和关键字
案例:
select * from my_table;
update my_table set A =4;
insert into my_table values (3,‘hello’);
像 select,update, values 这样的记号都是关键字的例子,意思就是在SQL语句中有特定的含义的单词。
而记号 my_table和A是标识符的例子。根据使用他们的命令的不同,他们的标识表,字段,或者其它数据库对象的名字。因此,有时候知识简单地叫他们 “名字”。关键字和标识符有着相同的此法结构,意思是我们在没有认识这种语言之前是无法区分一个记号是标识符还是名字。
SQL标识符和关键字必须是以一个字母(a-z以及带变音符的字母和非拉丁字母)或者下划线"_” 开头。 随后的字符可以是字母,下划线,数字,美元符。
根据SQL标准,美元符号不允许出现在标识符中,因此使用美元符号将不易移植。
系统中使用不超过namedatalen-1 个字符作为标识符。
我们在命令中写更长的名字,但它们会被截断。namedatelen的省缺值是64,因此标识符的最大长度为63字节。如果觉得这个限制有问题,我们可以在 src/include/pg_config_manual.h里面修改 namedatelen来改变它。
关键字和未被引号包围的标识符都是大小写无关的。
UPDATE MY_TABLE SET A=5;
也可以等效的写为:
update my_table set a=5;
好的习惯是: 把关键字写成 大写,而名称等用小写;
UPDATE my_table SET a=5;
还有另外的标识符: 分割标识符 或者说是引号包围的标识符。
它是通过双引号 “” 中包围相应的字符序列形成的。分隔标识符总是一个标识符,而不是关键字。
因此,我们可以用 “select” 来表示一个字段,或者表的名字,而一个没有引号的select将被当做一条
命令的一部分,因此如果把它当做一个表名,或者字段名使用的话,就会产生一个分析错误。
上面的例子也可以用如下的方式来进行表示
UPDATE "my_table" SET "a"=5;
引号包围的标识符可以包含编码不等于零的任意字符。
(要包含一个双引号,可以写成两个相连的双引号)这样我们就可以构造那些原本是不允许的表名或者字段名,比如包含空白或者与号(&)的名字。不过长度依旧有限制。
转义字符可以是一个十六进制数字以外的任何单个字符,加号,一个单引号,一个双引号,或者一个空白字符。
注意:转义字符是写在单引号中,而不是写在双引号中。
把一个标识符用引号包围起来同时也令它大小写相关,而没有引号包围起来的名字总是转换成小写。
比如 在postgresql 中,我们认识的标识符 FOO ,foo 和"foo" 是等价的。
但是"Foo"和"FOO" 与上面三个,以及他们之间都是不同的。
postgresql里面对未加引号的名字总是转换成小写,这个和SQL标准是不兼容的,SQL标准要求未用引号包围起来的名字总是转换成大写。根据SQL标准,foo等于"FOO"但是不等于"foo"。如果我们在编写可移植的程序时,最好总是用引号包围某个名字,或者从来不用引号。
上一篇: vector使用过程出现的问题记录
下一篇: postgre函数008—常用的数学函数