一 . 數據類型
一個數據表由多列字段構成,每一個字段都指定了數據類型,之后這個字段就只能存儲指定數據類型的值。
PostgreSQL支持多種數據類型,主要的數據類型有整數類型、浮點類型、任意精度數值、日期與實踐類型、字符串類型、布爾類型、數組類型、二進制類型。
- 整數
類型 | 說明 | 占用空間 | 取值范圍 |
---|---|---|---|
smallint | 小范圍整數 | 2個字節 | -32768~32767 |
int(integer) | 普通整型 | 4個字節 | -231~(231-1)大概正負21億多 |
bigint | 大整數 | 8個字節 | -263~(263-1)大概正負922億億 |
- 浮點數
浮點數的類型有兩種 real和double precision
數據類型 | 說明 | 占用空間 | 取值范圍 |
---|---|---|---|
real | 精度至少6位小數 | 4個字節 | 1E-37~1E+37 |
double precision | 精度至少是15位小數 | 8個字節 | 1E-307~1E+308 |
PostgreSQL也支持標准的SQL表示法,float和float(p)用戶聲明非精確的數值類型。p聲明以二進制位表示的最低可接受精度。在使用real類型的時候,PostgreSQL接受float(1)到float(24),使用double precision類型的時候,接受float(25)到float(53)。沒有聲明精度的float默認被當做double precision。
create table temp_table(column1 float(5),column2 real,column3 double precision) #創建三種類型的字段
在PostgreSQL中,浮點類型有幾個特殊的值
值 | 說明 |
---|---|
Infinity | 正無窮 |
- Infinity | 負無窮 |
NaN | 不是一個數字 |
- 任意精度類型 numeric
在PostgreSQL中使用numeric(m,n)表示任意精度的類型,m表示精度,n表示標度。
如: 536.188中精度為6,標度為3。如果用戶數據超出指定的精度,那么會默認進行四舍五入處理。
numeric 可以存儲最多1000位精度的數字並且准確地進行計算。因此非常適合用於貨幣金額和其它要求計算准確的數量。不過,numeric類型上的算術運算比整數類型或者浮點數類型要慢的多。
create table tmp1(x numric(8,2),y numeric(500,3));
insert into tmp1 values (8889.23,556688889999987987.333); - 日期與時間類型
表示日期和時間的數據類型有多種,主要包括: time、date、timestamp和interval
|數據類型|說明|占用空間|取值范圍|
|:-||:-||
|time|僅存儲時間|8個字節|00:00:00~24:00:00|
|date|僅存儲日期|4個字節|4713 BC~5874897 AD|
|timestamp|存儲日期和時間|8個字節|4713 BC~294276 AD|
|interval|時間間隔|12個字節|-178000000 年~178000000 年|
說明: BC-公元前 AD-公元后
- 關於時區
time類型和timestamp類型默認情況下是不帶時區的,如果需要可以設置為帶時區。
alter table tmp1 alter column c1 type timestamp with time zone; - 關於精度
time、timestamp 和interval可以定義精度值p,這個精度值定義用來表示秒的小數位的個數。對於timestamp和interval,p的取值范圍是0到6,默認為6,也就是可以精確到微秒。對於time,p的取值范圍是0到10,默認為10。 - 格式
在給字段賦值數據時十分靈活只要符合一定的格式即可,時間只要符合HH:MM:SS或HHMMSS或HHMM就可以。日期只要符合YYYYMMDD或者YYYY-MM-DD
例如如下語句均是可以使用的
insert into tmp1 values ('10:20:22'),('102022'),('1020');
insert into tmp1 values ('20150913'),('2015-09-13');
insert into tmp1 values ('20150913 10:20:00'),(2015-09-13 22:22:00);
- 字符串類型
PostgreSQL中字符串類型指 char、varchar和text。
類型 | 說明 |
---|---|
char(n)/character(n) | 固定長度非二進制字符串,不足補空白 |
varchar(n)/character varying(n) | 變長非二進制字符串,有長度限制 |
text | 變長非二進制字符串,無長度限制 |
在PostgreSQL中,這三種類型的字符串數據並沒有明顯的性能差別,而character(n)類型的數據因為固定長度導致更多的存儲空間。所以,一般來說,推薦使用text或者character varying就行了。
create table tmp_str(ch char(4),vch varchar(4),txt text);
insert into tmp_str values ('ab','cd','efghijklmn');
- 數組類型
PostgreSQL允許將字段定義成變長的多維數組, 數組類型可以是任何基本類型或用戶定義類型。
為說明這些用法,我們先創建一個由基本類型數組構成的表
create table tmp_array(name text,pay_by_quarter integer[5],schedule text[][]);
如上所示,一個數組類型是通過在數組元素類型名后面附加中括號([])來命名的。目前,PostgreSQL並不強制聲明數組的長度,所以上述聲明長度和不聲明長度是一樣的。特定元素類型的數組都被認為是相同的類型, 不管他們的大小或者維數。
數組類型的使用
#插入數據
insert into tmp_array values ('array test','{1,2,3}','{{"meeting", "lunch"}, {"training", "presentation"}}');
#查詢
select name from tmp_array where pay_by_quarter[1] <> pay_by_quarter[2];
select pay_by_quarter[3] from tmp_array;
- 二進制類型
PostgreSQL提供了bytea類型,用來存儲二進制字符串
|數據類型|說明|長度|
|-||
|bytea|變長的二進制字符串|4字節加上實際的二進制字符串長度|
二進制字符串是一個字節序列。二進制字符串和普通字符字符串的區別有兩個:
- 二進制字符串完全可以存儲字節零值以及其它"不可打印的" 字節(定義在 32 到 126 范圍之外的字節)。字符串不允許字節零值, 並且也不允許那些不符合選定的字符集編碼的非法字節值或者字節序列。
- 對二進制字符串的處理實際上就是處理字節,而對字符串的處理則取決於區域設置。 簡單說,二進制字符串適用於存儲那些程序員認為是"原始字節"的數據, 而字符串適合存儲文本。
- 布爾類型
PostgreSQL支持SQL標准的 boolean數據類型。 boolean只能有 true/false/unknown(用NULL表示)三種狀態。
|數據類型|說明|占用空間|
|-||
|boolean|true/false/unknown|1個字節(以t或f存儲)
代表真和假的有效文本,真(true/t/yes/y/on/1) 假(false/f/no/n/off/0)
create table test1 (a boolean, b text);
insert into test1 values ('t','this value is true'),('off','this value is false');
二 . 如何選擇數據類型
三 . 常見運算符

(2) . 比較運算符
> < >= <= != IN LIKE LEAST BENTWEEN AND GREATEST

(3) . 邏輯運算符
TRUE FALSE AND OR NOT


(4) . 位運算符
& | ~ ^ << >>
2 . 規則
①、 如果有一個或是兩個參數為null,那么比較的結果為空;
②、若同一個運算符中兩個參數都是字符串,那么比較結果按照字符串進行比較;
③、如果兩個參數均為整數,那么在比較的時候會按照整數類型來比較;
④、如果一個字符串和數值類型進行比較,那么PostgreSQL數據庫會自動將字符串類型轉換成數值進行比較。

運算符的優先級:
