




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一、數值類型: 下面是PostgreSQL所支持的數值類型的列表和簡單說明:名字存儲空間描述范圍smallint2 字節小范圍整數-32768 到 +32767integer4 字節常用的整數-2147483648 到 +2147483647bigint8 字節大范圍的整數-9223372036854775808 到 9223372036854775807decimal變長用戶聲明精度,精確無限制numeric變長用戶聲明精度,精確無限制real4 字節變精度,不精確6 位十進制數字精度double8 字節變精度,不精確15 位十進制數字精度serial4
2、字節自增整數1 到 +2147483647bigserial8 字節大范圍的自增整數1 到 9223372036854775807 1. 整數類型: 類型smallint、integer和bigint存儲各種范圍的全部是數字的數,也就是沒有小數部分的數字。試圖存儲超出范圍以外的數值將導致一個錯誤。常用的類型是integer,因為它提供了在范圍、存儲空間和性能之間的最佳平衡。一般只有在磁盤空間緊張的時候才使用smallint。而只有在integer的范圍不夠的時候才使用bigint,因為前者(integer)絕對快得多。
3、160; 2. 任意精度數值: 類型numeric可以存儲最多1000位精度的數字并且準確地進行計算。因此非常適合用于貨幣金額和其它要求計算準確的數量。不過,numeric類型上的算術運算比整數類型或者浮點數類型要慢很多。 numeric字段的最大精度和最大比例都是可以配置的。要聲明一個類型為numeric的字段,你可以用下面的語法: NUMERIC(precision,scale) 比如數字23.5141的精度為6,而刻度為4
4、。 在目前的PostgreSQL版本中,decimal和numeric是等效的。 3. 浮點數類型: 數據類型real和double是不準確的、犧牲精度的數字類型。不準確意味著一些數值不能準確地轉換成內部格式并且是以近似的形式存儲的,因此存儲后再把數據打印出來可能顯示一些缺失。 4. Serial(序號)類型: serial和bigserial
5、類型不是真正的類型,只是為在表中設置唯一標識做的概念上的便利。 CREATE TABLE tablename ( colname SERIAL ); 等價于 CREATE SEQUENCE tablename_colname_seq; CREATE TABLE tablename(
6、60; colname integer DEFAULT nextval('tablename_colname_seq') NOT NULL ); 這樣,我們就創建了一個整數字段并且把它的缺省數值安排為從一個序列發生器取值。應用了一個NOT NULL約束以確保空值不會被插入。在大多數情況下你可能還希望附加一個UNIQUE或者PRIMARY KEY約束避免意外地插入重復的數值,但這個不是自動發生的。因此,如果你希望一個序列字段有一個唯一約束或者一個主鍵,那么你現在必須聲明,就像
7、其它數據類型一樣。 還需要另外說明的是,一個serial類型創建的序列在其所屬字段被刪除時,該序列也將被自動刪除,但是其它情況下是不會被刪除的。因此,如果你想用同一個序列發生器同時給幾個字段提供數據,那么就應該以獨立對象的方式創建該序列發生器。 二、字符類型: 下面是PostgreSQL所支持的字符類型的列表和簡單說明:名字描述varchar(n)變長,有長度限制char(n)定長,不足補空白text變長,無長度限制 SQL 定義了兩種基本的字符類型,varchar(n)和ch
8、ar(n),這里的n是一個正整數。兩種類型都可以存儲最多n個字符長的字串,試圖存儲更長的字串到這些類型的字段里會產生一個錯誤,除非超出長度的字符都是空白,這種情況下該字串將被截斷為最大長度。如果沒有長度聲明,char等于char(1),而varchar則可以接受任何長度的字串。 MyTest=> CREATE TABLE testtable(first_col varchar(2); CREATE TABLE MyTest=> INSERT INTO testtable VA
9、LUES('333'); -插入字符串的長度,超過其字段定義的長度,因此報錯。 ERROR: value too long for type character varying(2) -插入字符串中,超出字段定義長度的部分是空格,因此可以插入,但是空白符被截斷。 MyTest=> INSERT INTO testtable VALUES('33 ');
10、60; INSERT 0 1 MyTest=> SELECT * FROM testtable; first_col - 33 (1 row) 這里需要注意的是,如果是將數值轉換成char(n)或者varchar(n),那么超長的數值將被截斷成n個字符,而不會拋出錯誤。 MyTest=> select 1234:var
11、char(2); varchar - 12 (1 row) 最后需要提示的是,這三種類型之間沒有性能差別,只不過是在使用char類型時增加了存儲尺寸。雖然在某些其它的數據庫系統里,char(n)有一定的性能優勢,但在PostgreSQL里沒有。在大多數情況下,應該使用text或者varchar。 三、日期/時間類型: 下面
12、是PostgreSQL所支持的日期/時間類型的列表和簡單說明:名字存儲空間描述最低值最高值分辨率timestamp無時區8字節包括日期和時間4713 BC5874897AD1毫秒/14位timestamp含時區8字節日期和時間,帶時區4713 BC5874897AD1毫秒/14位interval12字節時間間隔-178000000年178000000年1毫秒/14位date4字節只用于日期4713 BC32767AD1天time無時區8字節只用于一日內時間00:00:0024:00:001毫秒/14位 1. 日期/時間輸入:
13、0;任何日期或者時間的文本輸入均需要由單引號包圍,就象一個文本字符串一樣。 1). 日期: 以下為合法的日期格式列表:例子描述January 8, 1999在任何datestyle輸入模式下都無歧義1999-01-08ISO-8601格式,任何方式下都是1999年1月8號,(建議格式)1/8/1999歧義,在MDY下是1月8號;在 DMY模式下讀做8月1日1/18/1999在MDY模式下讀做1月18日,其它模式下被拒絕01/02/03MDY模式下的2003年1月2日;DMY模式下的2003年2月1日;YMD 模式下的200
14、1年2月3日1999-Jan-08任何模式下都是1月8日Jan-08-1999任何模式下都是1月8日08-Jan-1999任何模式下都是1月8日99-Jan-08在YMD模式下是1月8日,否則錯誤08-Jan-991月8日,除了在YMD模式下是錯誤的之外Jan-08-991月8日,除了在YMD模式下是錯誤的之外19990108ISO-8601; 任何模式下都是1999年1月8日990108ISO-8601; 任何模式下都是1999年1月8日 2). 時間: 以下為合法的時間格式列表:例子描述04:05:06.789ISO
15、860104:05:06ISO 860104:05ISO 8601040506ISO 860104:05 AM與04:05一樣;AM不影響數值04:05 PM與16:05一樣;輸入小時數必須 <= 1204:05:06.789-8ISO 860104:05:06-08:00ISO 860104:05-08:00ISO 8601040506-08ISO 8601 3). 時間戳: 時間戳類型的有效輸入由一個日期和時間的聯接組成,后面跟著一個可選的時區。因此,1999-01-08 04:05:06和1999-01-08
16、04:05:06 -8:00都是有效的數值。 2. 示例: 1). 在插入數據之前先查看datestyle系統變量的值: MyTest=> show datestyle; DateStyle - ISO, YMD (1 row) 2). 創建包含日期、時間和時間戳類型
17、的示例表: MyTest=> CREATE TABLE testtable (id integer, date_col date, time_col time, timestamp_col timestamp); CREATE TABLE 3). 插入數據: MyTest=> INSERT INTO testtable(id,date_col) VALUES(1, DATE'01/02/03');
18、60;-datestyle為YMD INSERT 0 1 MyTest=> SELECT id, date_col FROM testtable; id | date_col -+- 1 | 2001-02-03 (1 row)
19、MyTest=> set datestyle = MDY; SET MyTest=> INSERT INTO testtable(id,date_col) VALUES(2, DATE'01/02/03'); -datestyle為MDY INSERT 0 1 MyTest=> SELECT id,date_col FROM testtable;
20、60; id | date_col -+- 1 | 2001-02-03 2 | 2003-01-02 MyTest=> INSERT INTO testtable(id,time_col) VALUES(3, TIME'10:20:00'); -插入時間。
21、60;INSERT 0 1 MyTest=> SELECT id,time_col FROM testtable WHERE time_col IS NOT NULL; id | time_col -+- 3 | 10:20:00 (1 row) MyTest=> INSERT INTO testtable(id,t
22、imestamp_col) VALUES(4, DATE'01/02/03'); INSERT 0 1 MyTest=> INSERT INTO testtable(id,timestamp_col) VALUES(5, TIMESTAMP'01/02/03 10:20:00'); INSERT 0 1 MyTest=> SELECT id,timestamp_col
23、 FROM testtable WHERE timestamp_col IS NOT NULL; id | timestamp_col -+- 4 | 2003-01-02 00:00:00 5 | 2003-01-02 10:20:00 (2 rows)四、布爾類型:
24、;PostgreSQL支持標準的SQL boolean數據類型。boolean只能有兩個狀態之一:真(True)或 假(False)。該類型占用1個字節。 "真"值的有效文本值是: TRUE 't' 'true' 'y' 'yes' '1'
25、0; 而對于"假"而言,你可以使用下面這些: FALSE 'f' 'false' 'n' 'no' '0' 見如下使用方式: MyTest=> CREATE TABLE testtable (a boolean, b
26、text); CREATE TABLE MyTest=> INSERT INTO testtable VALUES(TRUE, 'sic est'); INSERT 0 1 MyTest=> INSERT INTO testtable VALUES(FALSE, 'non est'); INSERT 0 1 MyTest=> SEL
27、ECT * FROM testtable; a | b -+- t | sic est f | non est (2 rows) MyTest=> SELECT * FROM testtable WHERE a;
28、a | b -+- t | sic est (1 row) MyTest=> SELECT * FROM testtable WHERE a = true; a | b -+- t
29、 | sic est (1 row) 五、位串類型: 位串就是一串1和0的字串。它們可以用于存儲和視覺化位掩碼。我們有兩種類型的SQL位類型:bit(n)和bit varying(n); 這里的n是一個正整數。bit類型的數據必須準確匹配長度n; 試圖存儲短些或者長一些的數據都是錯誤的。類型bit varying數據是最長n的變長類型;更長的串會被拒絕。寫一個沒有長度的bit等效于bit(1),沒有長度的bit varying相當于沒有長度限制。
30、0; 針對該類型,最后需要提醒的是,如果我們明確地把一個位串值轉換成bit(n),那么它的右邊將被截斷或者在右邊補齊零,直到剛好n位,而不會拋出任何錯誤。類似地,如果我們明確地把一個位串數值轉換成bit varying(n),如果它超過n位,那么它的右邊將被截斷。 見如下具體使用方式: MyTest=> CREATE TABLE testtable (a bit(3), b bit varying(5); CREATE TABLE
31、MyTest=> INSERT INTO testtable VALUES (B'101', B'00'); INSERT 0 1 MyTest=> INSERT INTO testtable VALUES (B'10', B'101'); ERROR: bit string length 2 does not match type bit(3)
32、;MyTest=> INSERT INTO testtable VALUES (B'10':bit(3), B'101'); INSERT 0 1 MyTest=> SELECT * FROM testtable; a | b -+- 101 | 00 100 | 101
33、160; (2 rows) MyTest=> SELECT B'11':bit(3); bit - 110 (1 row)六、數組: 1. 數組類型聲明: 1). 創建字段含有數組類型的表。 CREATE TABLE sal_emp (
34、60; name text, pay_by_quarter integer -還可以定義為integer4或integer ARRAY4 ); 2). 插入數組數據: MyTest=# INSERT INTO sa
35、l_emp VALUES ('Bill', '11000, 12000, 13000, 14000'); INSERT 0 1 MyTest=# INSERT INTO sal_emp VALUES ('Carol', ARRAY21000, 22000, 23000, 24000); INSERT 0 1 MyTest=# SELECT * FROM sal_emp;
36、 name | pay_by_quarter -+- Bill | 11000,12000,13000,14000 Carol | 21000,22000,23000,24000 (2 rows) 2. 訪問數組:
37、0; 和其他語言一樣,PostgreSQL中數組也是通過下標數字(寫在方括弧內)的方式進行訪問,只是PostgreSQL中數組元素的下標是從1開始n結束。 MyTest=# SELECT pay_by_quarter3 FROM sal_emp; pay_by_quarter - 13000 &
38、#160; 23000 (2 rows) MyTest=# SELECT name FROM sal_emp WHERE pay_by_quarter1 <> pay_by_quarter2; name - Bill Carol (2
39、 rows) PostgreSQL中還提供了訪問數組范圍的功能,即ARRAY腳標下界:腳標上界。 MyTest=# SELECT name,pay_by_quarter1:3 FROM sal_emp; name | pay_by_quarter -+- Bill | 11000,12000,13000
40、60; Carol | 21000,22000,23000 (2 rows) 3. 修改數組: 1). 代替全部數組值: -UPDATE sal_emp SET pay_by_quarter = ARRAY25000,25000,27000,27000 WHERE name = 'Carol' 也可以。 MyTest=# UPD
41、ATE sal_emp SET pay_by_quarter = '31000,32000,33000,34000' WHERE name = 'Carol' UPDATE 1 MyTest=# SELECT * FROM sal_emp; name | pay_by_quarter -+- Bill
42、; | 11000,12000,13000,14000 Carol | 31000,32000,33000,34000 (2 rows) 2). 更新數組中某一元素: MyTest=# UPDATE sal_emp SET pay_by_quarter4 = 15000 WHERE name = 'Bill' UPDATE 1
43、 MyTest=# SELECT * FROM sal_emp; name | pay_by_quarter -+- Carol | 31000,32000,33000,34000 Bill | 11000,12000,13000,15000 (2 rows)
44、 3). 更新數組某一范圍的元素: MyTest=# UPDATE sal_emp SET pay_by_quarter1:2 = '37000,37000' WHERE name = 'Carol' UPDATE 1 MyTest=# SELECT * FROM sal_emp; name | pay_by_quarter
45、 -+- Bill | 11000,12000,13000,15000 Carol | 37000,37000,33000,34000 (2 rows) 4). 直接賦值擴大數組: MyTest=# UPDATE sal_emp SET pay_by_quarter5 = 45000 WHERE name = '
46、;Bill' UPDATE 1 MyTest=# SELECT * FROM sal_emp; name | pay_by_quarter -+- Carol | 37000,37000,33000,34000 Bill
47、| 11000,12000,13000,15000,45000 (2 rows) 4. 在數組中檢索: 1). 最簡單直接的方法: SELECT * FROM sal_emp WHERE pay_by_quarter1 = 10000 OR
48、 pay_by_quarter2 = 10000 OR pay_by_quarter3 = 10000 OR
49、 pay_by_quarter4 = 10000; 2). 更加有效的方法: SELECT * FROM sal_emp WHERE 10000 = ANY (pay_by_quarter); -
50、數組元素中有任何一個等于10000,where條件將成立。 SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter); -只有當數組中所有的元素都等于10000時,where條件才成立。七、復合類型: PostgreSQL中復合類型有些類似于C語言中的結構體,也可以被視為Oracle中的記錄類型,但是還是感覺復合類型這個命名比較貼切。它實際上只是一個字段名和它們的數據類型的列表。PostgreSQL允許像簡單數據類型那樣使用復合類型。比如
51、,表字段可以聲明為一個復合類型。 1. 聲明復合類型: 下面是兩個簡單的聲明示例: CREATE TYPE complex AS ( r double, i double ); CREATE TYPE
52、60;inventory_item AS ( name text, supplier_id integer, price
53、; numeric ); 和聲明一個數據表相比,聲明類型時需要加AS關鍵字,同時在聲明TYPE時不能定義任何約束。下面我們看一下如何在表中指定復合類型的字段,如: CREATE TABLE on_hand ( item inventory_item,
54、 count integer ); 最后需要指出的是,在創建表的時候,PostgreSQL也會自動創建一個與該表對應的復合類型,名字與表字相同,即表示該表的復合類型。 2. 復合類型值輸入: 我們可以使用文本常量的方式表示復合類型值,即在圓括號里包圍字段值并且用逗號分隔它們。你也可以將任何字段值用雙引號括起,如果值本身包含逗號或者圓括號,那么就用雙引號括起,對于上面的inventory_item復合類型的輸入如下:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 夏日荷花盛開時寫景(5篇)
- 2025年臭氧發生器項目規劃申請報告
- 美麗的秋天寫景類作文6篇
- 兒童營養和生長發育的指導和建議
- 介紹一項傳統藝術形式的作文(10篇)
- 游戲化營銷在2025年品牌忠誠度培養中的應用效果分析001
- 醫院電子病歷系統在醫院管理中的應用優化報告2025
- 2025年汽車芯片短缺下的汽車行業市場發展趨勢與技術創新報告
- 金融科技行業競爭格局報告:國內外金融科技企業對比分析
- 2024-2025學年甘肅省蘭州市第四片區高一下學期期中考試地理試卷(解析版)
- 浙江杭州市2024-2025學年高一下學期6月期末考試英語試題及答案
- 診所院內感染管理制度
- 2025年初中數學知識點測試題及答案
- 小學生集體活動安全課件
- 2025-2030年中國高爾夫產品行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年中國經顱磁刺激儀行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025年江蘇高考歷史真題(解析版)
- 動火工作方案
- 廣西來賓市2023-2024學年高二下學期7月期末考試物理試題(含答案)
- 會員月底抽獎活動方案
- (2025)發展對象考試試題附及答案
評論
0/150
提交評論