PostgreSQL是現在比較流行的資料庫之一,這個起源於伯克利(BSD)的資料庫研 究計劃目前已經衍產生一項國際開發項目,並且有非常廣泛的使用者。據我瞭解國內四大國產資料庫,其中三個都是基於PostgreSQL開發的。並且,因為許 可證的靈活,任何人都可以以任何目的免費使用,修改,和分發 PostgreSQL,不管是私用,商用,還是學術研究使用。本文只是簡單介紹一下postgresql的安裝和簡單的使用,文法方面涉及的比較少,以方 便新手上路為目的。
1.系統內容和安裝方法 ;
PostgreSQL的安裝方法比較靈活,可以用源碼包安裝,也可以用您使用的發行版所帶的軟體包來安裝,還可以採用線上安裝……
1.1 系統內容:Ubuntu Linux 7.04 ;Fedora;Slackware;
1.2 安裝;
Ubuntu下安裝
軟體其實很簡單,用新立得軟體包管理器搜尋psql便能查到postgresql-client-8.2(同時可以搜到8.1版本,哪一個都可以),選中-應用即可。或者在終端下輸入
xiaop@localhost$ sudo apt-get install postgresql-8.2
Slackware下安裝:
請到 linuxpackages.net 上尋找您所用系統的對應版本,用pkginstall 來安裝,或您安裝slap-get 工具,線上自動安裝;要用到root許可權,可以通用sudo。關於su和sudo的參考;《Linux 系統中的超級許可權的控制》
安裝postgresql的軟體包,可用下面的辦法 ;
xiaop@localhost# pkginstall post*.tgz
或
xiaop@localhost# slapt-get --install postgresql-8.2.4
在Fedora中,您可以用軟體包線上安裝工具來安裝
註:這樣就安裝好了PostgreSQL 8.2了,該安裝將自動建立一個預設的資料庫叢集(pgsqldb.org中的譯法)“main”,且產生一個資料庫超級使用者postgres。
2. 啟動PostgreSQL 資料庫伺服器;
2.1 在流行Linux發行版的啟動方法;
在Ubuntu系統中,伺服器啟動指令碼放在 /etc/init.d目錄中,您可以用下面的方法來啟動,對於Fedora和Gentoo 也是類似的;
xiaop@localhost~# /etc/init.d/postgresql-8.2 start 註:啟動;
xiaop@localhost~# /etc/init.d/postgresql-8.2 restart 註:重啟;
xiaop@localhost~# /etc/init.d/postgresql-8.2 stop 註:停止;
xiaop@localhost~# /etc/init.d/postgresql-8.2 status 註:查看狀態;
在Slackware中,PostgreSQL的啟動指令碼放在 /etc/rc.d目錄中,如果您用從linuxpackages.net 上下載的軟體包或線上安裝的軟體包;
xiaop@localhost~# /etc/rc.d/rc.postgres start
如果您用源碼包編譯安裝,啟動PostgreSQL,請查看PostgreSQL官方文檔;
2.2 關於 PostgreSQL啟動和儲存目錄;
啟動PostgreSQL伺服器時,一般是以postgres 使用者來啟動的,自編譯安裝的除外;對於資料庫的儲存一般是放在/var/lib中的相關目錄,比如 /var/lib/pgsql或 /var/lib/postgresql/8.2/main/ 目錄等;不同的發行版可能不太一樣,不過還是大同小異,您可以通過修改資料存放區位置把資料庫存在其它地方;
3.建立使用者
添加使用者命令格式。
createuser 是 SQL 命令 CREATE USER的封裝。
命令:createuser [-a] [-A] [-d] [-D] [-e] [-P] [-h 主機名稱] [-p port] 使用者名稱
參數說明:
[-a]:允許建立其他使用者,相當於建立一個超級使用者;
[-A]:不允許此使用者建立其他使用者;
[-d]:允許此使用者建立資料庫;
[-D]:不允許此使用者建立資料庫;
[-e]:將執行過程顯示到Shell上;
[-P]:建立使用者時,同時設定密碼;
[-h 主機名稱]:為某個主機上的Postgres建立使用者;
[-p port]:與-h參數一同使用,指定主機的連接埠。
3.1添加使用者;
3.1.1不帶參數的建立使用者;
xiaop@localhost~$ createuser testuser
Shall the new user be allowed to create databases? (y/n) n --------是否可以建立資料庫:否
Shall the new user be allowed to create more new users? (y/n) n ---------是否可以建立新使用者:否
CREATE USER
註:不帶參數建立使用者時,Postgres會詢問此使用者的許可權,上面的例子建立了一個普通使用者;
3.1.2 為指定的主機和連接埠上建立使用者 ;
xiaop@localhost~$ createuser -h 172.28.18.51 -p 5000 -D -A -e testuser
CREATE USER joe NOCREATEDB NOCREATEUSER;
CREATE USER
註:這個命令為主機172.28.18.51的5000連接埠建立使用者testuser, 此使用者不可以建立資料庫和其他使用者。
3.1.3建立超級使用者;
xiaop@localhost~$ createuser -P -d -a -e testuser
Enter password for new user: testuser
Enter it again: testuser
CREATE USER joe PASSWORD 'testuser' CREATEDB CREATEUSER;
CREATE USER
註:這個命令在本地建立一個超級使用者(-a),可以建立資料庫(-d), 同時要求設定密碼。
3.2 刪除使用者:
命令:dropuser [-i] [-h] [-p] [-e] 使用者名稱
參數說明:
[ -i]:刪除使用者前,要求確認;
[-h 主機名稱]:刪除某個主機上的Postgres使用者;
[-p port]:與-h參數一同使用,指定主機的連接埠;
[-e]:將執行過程顯示到Shell上。
3.2.1 刪除本地的Postgres使用者;
xiaop@localhost~$ dropuser testuser
DROP USER
3.2.2 刪除遠程Postgres伺服器上的使用者;
xiaop@localhost~$ dropuser -p 5000 -h 172.28.18.51 -i -e testuser
User "testuser" and any owned databases will be permanently deleted.
Are you sure? (y/n) y
DROP USER "testuser"
DROP USER
註:此命令刪除主機172.28.18.51(-h)的5000連接埠(-p)的使用者testuser,並且需要確認(-i);
4. 建立和刪除資料庫;
4.1建立資料庫
看看您能否訪問資料庫伺服器的第一個例子就是試著建立一個資料庫;
要建立一個新的資料庫,在我們這個例子裡叫 mydb,您可以使用下面的命令:
xiaop@localhost~$ createdb mydb
它應該產生下面這樣的響應:
CREATE DATABASE
如果這樣,那麼這一步就成功了,如果您看到類似下面這樣的資訊
createdb: command not found
那麼就是PostgreSQL沒有安裝好,要麼是就根本沒裝上;
您還可以用其它名字建立資料庫。 PostgreSQL 允許您在一個節點上建立任意數量的資料庫。 資料庫名必須是以字母開頭並且小於 63 個字元長。 一個方便的做法是建立和您目前使用者名同名的資料庫。 許多工具假設該資料庫名為預設資料庫名,所以這樣可以節省您的敲鍵。要建立這樣的資料庫,只需要鍵入 :
xiaop@localhost~$ createdb
4.2 刪除資料庫
如果您再也不想使用您的資料庫了,那麼您可以刪除它。 比如,如果您是資料庫 mydb 的所有人(建立人), 那麼您就可以用下面的命令刪除它:
xiaop@localhost~$ dropdb mydb
注:(對於這條命令而言,資料庫名不是預設的使用者名稱。這樣您就必須聲明它。) 這個動作物理上將所有與該資料庫相關的檔案都刪除並且不可取消, 因此做這件事之前一定要想清楚;
5.訪問資料庫
一旦您建立了資料庫,您就可以訪問它,您可以運行PostgreSQL互動的終端程式,叫psql,它允許您互動地輸入,編輯,和執行 SQL 命令。(圖形化登入請參見6. Postgresql圖形化管理工具pgAdmin3)
5.1 啟用資料庫
您需要啟動psql,實驗剛才的例子。您可以用下面的命令為 mydb 資料庫啟用它:
xiaop@localhost~$ psql mydb
如果您省略了資料庫名字,那麼它預設就是您的使用者帳號名字。
Welcome to psql 8.2.4, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
mydb=#
註:最後一行 mydb=#,這個提示符意味著您是資料庫超級使用者。
5.2 協助和退出資料庫
psql 程式有一些不屬於 SQL 命令的內部命令。 它們以反斜線開頭,""。 有些這種命令在歡迎資訊中列出。比如,您可以用下面的命令擷取各種PostgreSQL SQL 命令的協助文法:
mydb=> \h
要退出 psql,鍵入
mydb=> \q
然後 psql 就會退出並且給您返回到命令列 shell; (要擷取更多有關內部命令的資訊,您可以在 psql 提示符上鍵入 \?。)
6. Postgresql圖形化管理工具pgAdmin3 ;
版本:Version1.4.3
6.1 安裝;
6.1.1 Ubuntu安裝 ;
有兩種方法:
1.在新立得軟體包管理器中搜尋pgadmin3,找到pgadmin3--應用
2.終端下輸入命令:
xiaop@xiaop-laptop:~$ sudo apt-get install pgadmin3
6.1.2 其它系統的安裝;
您可以參考其它系統正常的軟體的安裝方法,起本類似,這裡就不多做介紹了;
6.2 pgAdmin3的簡單使用;
圖形化管理系統相對比較直觀,您可以在命令列下操作,然後在pgAdmin3下查看效果;
6.2.1 pgAdmin3的啟動
您可以在應用程式---系統工具中找到pgAdmin3的啟動項;
也可以在命令列下輸入:
xiaop@xiaop-laptop:~$ /usr/bin/pgadmin3 start
6.2.2 串連已建立的資料庫mydb ;
點擊檔案-----新增伺服器,然後在跳出的視窗下輸入:
地址:localhost
描述:伺服器名稱(隨意填寫)
維護資料庫:postgres
使用者名稱:自己建立一個(詳情參見建立使用者)
密碼:和使用者名稱對應(建立使用者時自己建立)
點擊確定後大家便可以查看postsql已有的資料庫了;
註:pgAdmin3的資料庫和終端下建立的資料庫是完全同步的(可以用重新整理查看效果), pgAdmin3是比較方便的圖形化管理工具,它可以建立圖表,管理資料庫等,有關pgAdmin3的詳細介紹我們在以後討論,本文主要介紹命令列下的操 作。圖形化管理工具能做到的命令列都可以做到,您可以在命令列下建立表,在pgAdmin3上查看是否同步:
7. 建立和刪除表;
7.1 建立新表;
建立完資料庫之後,您就可以建立新表了,可以通過聲明表的名字和所有欄位的名字及其類型來建立表,例如:
mydb#CREATE TABLE weather (
city varchar(80),
temp_lo int, -- 最低氣溫
temp_hi int, -- 最高氣溫
prcp real, -- 降水量
date date
);
註:您可以在 psql 裡連分行符號一起鍵入這些東西。 psql 可以識別該命令直到分號才結束,不要忘記“;”
您可以在 SQL 命令中自由使用空白(也就是空格,tab,和分行符號)。 這就意味著您可以用和上面不同的對齊鍵入命令。 兩個劃線("--") 引入注釋。 任何跟在它後面的東西直到該行的結尾都被忽略。 SQL 是對關鍵字和標識符大小寫不敏感的語言,只有在標識符用雙引號包圍時才能保留它們的大小寫屬性。
7.2 資料類型;
上面例子中的varchar(80) 聲明一個可以儲存最長 80 個字元的任一字元串的資料類型。 int 是普通的整數類型。 real 是一種用於儲存單精確度浮點數的類型。 date 類型應該可以自解釋。
PostgresSQL 支援標準的 SQL 類型 int,smallint, real,double precision, char(N), varchar(N),date, time,timestamp 和 interval,還支援其他的通用類型和豐富的幾何類型。 PostgreSQL 可以客戶化為定製任意的使用者定義的資料類型,您可以參考PostgreSQL的中文文檔來查詢;
7.3 刪除表;
如果您不再需要某個表,或者您想建立一個不同的表,那麼您可以用下面的命令刪除它:
mydb#DROP TABLE tablename
8. 向表中添加行;
8.1 INSERT;
INSERT 用於向表中添加行,您可以輸入(在資料庫中操作):
mydb#INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
註:所有資料類型都使用了相當明了的輸入格式。 那些不是簡單數字值的常量必需用單引號(')包圍, 就象在例子裡一樣。
8.2 point類型輸入;
point 類型要求一個座標對作為輸入,如下:
mydb#INSERT INTO cities VALUES ('San Francisco', '(-194.0, 53.0)');
8.3 COPY;
您還可以使用 COPY 從文字檔中裝載大量資料。 這麼幹通常更快,因為 COPY 命令就是為這類應用最佳化的, 只是比 INSERT 少一些靈活性.比如:
mydb#COPY weather FROM '/home/user/weather.txt';
註:weather.txt是您提前寫好的符合語式正確表格內容文檔;
9. 查詢一個表;
9.1 SELECT;
要從一個表中檢索資料就是查詢這個表。 SQL 的 SELECT 就是做這個用途的。 該語句分為挑選清單(列出要返回的欄位部分),表列表(列出從中檢索資料的表的部分), 以及可選的條件(聲明任意限制的部分)。比如,要檢索表 weather 的所有行,鍵入:
SELECT * FROM weather;
<code>
輸出結果:
<code>
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 43 | 57 | 0 | 1994-11-29
Hayward | 37 | 54 | | 1994-11-29
(3 rows)
您可以在挑選清單中寫任意運算式,而不僅僅是欄位列表。比如,您可以:
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;
這樣應該得出:
city | temp_avg | date
---------------+----------+------------
San Francisco | 48 | 1994-11-27
San Francisco | 50 | 1994-11-29
Hayward | 45 | 1994-11-29
(3 rows)
請注意這裡的 AS 子句是如何給輸出欄位重新命名的。(AS 子句是可選的。)
9.2 WHERE;
一個查詢可以使用 WHERE 子句"修飾",聲明需要哪些行。 WHERE 子句包含一個布爾(真值)運算式,只有那些布林運算式為真的行才會被返回。 允許您在條件中使用常用的布爾操作符(AND,OR, 和 NOT)。 比如,下面的查詢檢索舊金山的下雨天的天氣:
mydb#SELECT * FROM weather
WHERE city = 'San Francisco' AND prcp > 0.0;
結果:
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
(1 row)
9.3 排序;
您可以要求返回的查詢是排好序的:
mydb#SELECT * FROM weather
ORDER BY city;
得出結果:
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
Hayward | 37 | 54 | | 1994-11-29
San Francisco | 43 | 57 | 0 | 1994-11-29
San Francisco | 46 | 50 | 0.25 | 1994-11-27
在這個例子裡,排序的順序並非絕對清晰的,因此您可能看到 San Francisco 行隨機的排序。 但是如果您使用下面的語句,那麼就總是會得到上面的結果
SELECT * FROM weather
ORDER BY city, temp_lo;
您可以要求查詢的結果按照某種順序排序, 並且消除重複的行輸出:
mydb#SELECT DISTINCT city
FROM weather;
得出結果:
city
---------------
Hayward
San Francisco
(2 rows)
再次聲明,結果行的順序可能是隨機的。
10. 視圖;
假設您的應用對天氣記錄和城市位置的組合列表特別感興趣, 而您又不想每次鍵入這些查詢。那麼您可以在這個查詢上建立一個視圖, 它給這個查詢一個名字,您可以像普通表那樣引用它。
進入資料庫後輸入:
mydb#CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
建立視圖;
然後選擇建好的視圖:
SELECT * FROM myview;
結果如下:
city | temp_lo | temp_hi | prcp | date | location
---------------+---------+---------+------+------------+-----------
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | (-194,53)
San Francisco | 43 | 57 | 0 | 1994-11-29 | (-194,53)
(2 rows)
11. 更新行;
您可以用 UPDATE 命令更新現有的行。 假設您發現所有 11 月 28 日的溫度計數都低了兩度,那麼您就可以用下面的方式更新資料:
mydb#UPDATE weather
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
WHERE date > '1994-11-28';
看看資料的新狀態:
SELECT * FROM weather;
結果為:
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 41 | 55 | 0 | 1994-11-29
Hayward | 35 | 52 | | 1994-11-29
(3 rows)
12. 刪除行;
資料行可以用 DELETE 命令從表中刪除。假設您對Hayward的天氣不再感興趣,那麼您可以用下面的方法把那些行從表中刪除:
mydb#DELETE FROM weather WHERE city = 'Hayward';
我們用下面形式的語句的時候一定要小心
DELETE FROM tablename;
如果沒有條件,DELETE 將從指定表中刪除所有行,把它清空。做這些之前系統不會請求您確認!
13. 關於本文
關於資料庫的備份和恢複,將在PostgreSQL備份和恢複中介紹,本文大部分資料都是參照中文文檔,目的是讓兄弟們尋找方便一些,詳細的東西在中文文檔都有,多謝各位弟兄們指點 :)