PostgreSQL中使用的SQL語法
本文將介紹PostgreSQL中使用的幾個SQL語法。
識別符號和關鍵詞
SQL識別符號和關鍵詞必須以一個字母(a-z,也可以是帶變音符的字母和非拉丁字母)或一個下劃線(_)開始。後續字元可以是字母、下劃線(_)、數字(0-9)或美元符號($)。注意根據SQL標準的字母規定,美元符號是不允許出現在識別符號中的,因此它們的使用可能會降低應用的可移植性。
系統中一個識別符號的長度不能超過 NAMEDATALEN-1 位元組,在命令中可以寫超過此長度的識別符號,但是它們會被截斷。預設情況下,NAMEDATALEN 的值為64,因此識別符號的長度上限為63位元組。
常量
在PostgreSQL中有三種隱式型別常量:字串、位串和數字。
為了在一個字串中包括一個單引號,可以寫兩個相連的單引號。需要注意的是這和使用一個雙引號(")是不同的。
一個轉義字串常量可以通過在單引號前面寫一個字母E(大寫或小寫形式)來指定,例如E'foo'。
操作符
一個操作符名中的字元來自下面的列表:
+ - * / < > = ~ ! @ # % ^ & | ` ?
不過,在操作符名上有一些限制:
1)-- 和 /*不能在一個操作符名的任何地方出現,因為它們將被作為一段註釋的開始。
2)一個多字元操作符名不能以+或-結尾,除非該名稱也至少包含這些字元中的一個:
~ ! @ # % ^ & | ` ?
例如,#-是一個被允許的操作符名,但*-不是。
特殊字元
1) 跟隨在一個美元符號($)後面的數字被用來表示在一個函式定義或一個預備語句中的位置引數。在其他上下文中該美元符號可以作為一個識別符號或者一個美元引用字串常量的一部分。
2) 圓括號(())用來分組表示式並且強制優先。
3) 方括號([])被用來選擇一個數組中的元素。
4) 逗號(,)被用在某些語法結構中來分割一個列表的元素。
5) 分號(;)結束一個 SQL 命令。它不能出現在一個命令中間的任何位置,除了在一個字串常量中或者一個被引用的識別符號中。
6) 冒號(:)被用來從陣列中選擇“切片”。
7) 星號(*)被用在某些上下文中標記一個表的所有域或者組合值。當它被用作一個聚合函式的引數時,該聚合不要求任何顯式引數。
8) 句點(.)被用在數字常量中,並且被用來分割模式、表和列名。
標量子查詢
一個標量子查詢是一種圓括號內的普通SELECT查詢,它剛好返回一行一列。將一個返回超過一行或一列的查詢作為一個標量子查詢使用是一種錯誤(但是如果在一次特定執行期間該子查詢沒有返回行則不是錯誤,該標量結果被當做為空)。
陣列構造器
一個數組構造器是一個能構建一個數組值並且將值用於它的成員元素的表示式。例如:
postgres=# select array[12,63,99+1];
array
-------------
{12,63,100}
(1 row)
多維陣列值可以通過巢狀陣列構造器來構建。在內層的構造器中,關鍵詞ARRAY可以被忽略。例如,這些語句產生相同的結果:
postgres=# select array[array[12,23],array[7,1]];
array
-----------------
{{12,23},{7,1}}
(1 row)
postgres=# select array[[12,23],[7,1]];
array
-----------------
{{12,23},{7,1}}
(1 row)
用ARRAY構建的一個數組值的下標總是從1開始。
行構造器
一個行構造器是能夠構建一個行值(也稱作一個組合型別)並用值作為其成員域的表示式。例如:
postgres=# select row(2,3.7,'postgres test.');
row
--------------------------
(2,3.7,"postgres test.")
(1 row)
當在列表中有超過一個表示式時,關鍵詞ROW是可選的。
postgres=# select (2);
?column?
----------
2
(1 row)
postgres=# select row(2);
row
-----
(2)
(1 row)
postgres=# select (2,3.5);
row
---------
(2,3.5)
(1 row)
呼叫函式
PostgreSQL允許帶有命名引數的函式被使用位置或命名記號法呼叫。命名記號法對於有大量引數的函式特別有用,因為它讓引數和實際引數之間的關聯更明顯和可靠。在位置記號法中,書寫一個函式呼叫時,其引數值要按照它們在函式宣告中被定義的順序書寫。在命名記號法中,引數根據名稱匹配函式引數,並且可以以任何順序書寫。
在任意一種記號法中,在函式宣告中給出了預設值的引數根本不需要在呼叫中寫出。但是這在命名記號法中特別有用,因為任何引數的組合都可以被忽略。而在位置記號法中引數只能從右往左忽略。
PostgreSQL也支援混合記號法,它組合了位置和命名記號法。在這種情況中,位置引數被首先寫出並且命名引數出現在其後。
By kalath