PostgreSQL 的整理與研究
1.安裝後的基本動作
PostgreSQL裝完後,會在linux自動產生postgres帳號,此為PostgreSQL的超級使用者,
等同於linux的root。 請先建立linux及postgres的一般使用者帳號,可與以資料庫同名
(因為psql預設以linux的帳號登入,並直接開啟同的的資料庫)
adduser <testdb>
su <testdb>
createuser <testdb>
Is user allowed to create databasees...(y/n)_
Is user allowed to create user0..(y/n)_
su <testdb>
psql(成功!!...以testdb登入PostgreSQL,並開啟testdb資料庫)
(註1:此PostgreSQL同名帳號與同名資料庫,會以該帳號登入PostgreSQL能用)
(註2:<testdb>也必需是linux上的帳號 (廢話!不然怎麼su?))
2.PostgreSQL在linux下的命令檔
createuser 建立PostgreSQL的使用者帳號
dropuser 刪除PostgreSQL的使用者帳號
createdb 建立資料庫
destorydb 刪除資料庫
psql 交談式client端
(一定要指定連要連接的資料庫,如果不知有那些資料庫可用,psql -l即可看到)
pg_encoding<n>查詢<n>代碼的內碼名稱1=ECU_JP 2=EUC_CN 3=EUC_KR 4=EUC_TW....
3.心得
PostgreSQL好像只能用linux的指令createdb來建立資料庫
每一個資料庫互不相干(不像MySQL可以互通)
建立這個資料庫的linux user,就是這個資料庫的administrator
3.使用者管理
linux:createuser <user>建立新使用者
linux:dropuser <user>刪除使用者(要沒資料庫才行)
sql:alter user <user> with password '<password>' 設定密碼
sql:grant all on <table> to <user> 開放table權限給<user>
(一定要一個一個table嗎?)
[PostgreSQL查詢語法研究]
SELECT [ALL|DISTINCT] ColeEpr1 [as ColAlias1] [,ColExprn [as ColAliasn]]
ALL 傳回全部的資料(預設值)
DISTINCT 僅傳回不重複的資料
cols別名的用法
select cuno as 客戶編號, cunm as 客戶名稱
^^^^^^^^^^^^
FROM
table別名的用法
select cu.cuno, ord.orderno from customer cu, orders ord
^^^ ^^^^
WHERE過濾條件
如果所有有過濾的條件有索引可用,就可達到最佳化的效果
合併(JOIN)
直接選自多重table,指定之間的過濾關係即可(還是不太懂說)
select a.cuno, b.ordno, c.pname from customer a, oders b, parts c
where a.cuno=b.cuno and b.pno=c.pno
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
GROUP BY cols...依所指定的欄位合併
HAVING過濾條件
having和where有何不同
where的過濾會被先執行,而且會使用最佳化的方式(如索引)
having則是取自where過濾後的資料再行過濾,且不會用最佳化的方式
是故當過濾條件很複雜時,請先將可最佳化的部分放在where,其餘的部
分再放到having中. 不然你耍賤全放在一起也行. 就慢慢查給你看.....
GROUP BY col[ASC|DESC]|Expr...結果依指定的欄位排序後再傳回
ASC 由小到大排(預設值)
DESC 由大到小排
巢狀查詢 原SELCT中的某一個運值是另一個SELECT
WHERE [NOT EXISTS] (SELECT...)
UNION聯集(聯合)查詢,將要好幾個SELECT的敘述的查詢,任一成立即送回
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNAME = 'Jones'
--->UNION
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNAME = 'Adams';
INTERSECT交集(交叉)查詢,與UNIO相反,多個SELECT的敘述均成立時才送合
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 1
--->INTERSECT
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 2;
EXCEPT刪去(消滅)查詢法,與INTERSECT相反,不在第二個查詢結果內的才傳回
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 1
--->EXCEPT
SELECT S.SNO, S.SNAME, S.CITY
FROM SUPPLIER S
WHERE S.SNO > 3;
常用函數
AVG()平均值
COUNT()次(個)數
MAX()最大值
MIN()最小值
[PostgreSQL資料庫指令]
建立表格
CREATE TABLE <tb> ( col1 type, coln type...)
建立表格的索引
CREATE INDEX <idx> ON <tb> (col1,coln...)
建立檢索(View)
檢索就是常用的查詢條件,我們可以將立儲在server上,當一個表格來操作,當然實際
上是沒有這個表格,只是我們要操作時,server才執行跑出這個假的表格.....
CREATE VIEW <view> AS select.....
以後就可以用-->Select * form <view> where ....
刪除表格
DROP TABLE <tb>
刪除索引
DROP INDEX <idx>
刪除檢索
DROP VIEW <view>
[PostgreSQL資料操作]
新增一筆記錄(row)
INSERT INTO <tb>[(col1,coln...)]
VALUES (val1,valn....)
修改記錄
UPDATE <tb> SET col1=val1, coln=valn... WHERE <where>
最重要的是where的過濾條件,不要弄不好將整個資料庫全搞
成一模一樣的同一筆資料了哦
刪除記錄
DELETE FROM <tb> WHERE <where>
最重要的是where的過濾條件,不要弄不好將整個資料庫全刪了
[PostgreSQL問題]
1.PostgreSQL是否不提供MySQL跨資料庫的存取?
ex: modern.cu1, test.addr (modern,test均為database)
2.PostgreSQL有無如MySQL之show databases; show tables;類似指令?
[PostgreSQL的安裝與中文問題]
1.安裝問題:以rpm安裝:請裝以下兩個套件
postgresql-version..........rpm
postgresql-server-version...rpm
2.中文問題:修改/etc/init.d/postgresql
找到一行有postmaster start的內容,這在行之前,插入下面這行的內容
export PGCLIENTENCODING=BIG5 //(指定使用BIG5的文字編碼)
createdb時,請記得加 -E MULE_INTERNAL
ex: createdb abcdb -E MULE_INTERNAL
註:此時指前端clinet送來的資料一律當成big5碼,而後端將前端的資料
轉換成MULE_INTERNAL編碼後儲存。MULE_INTERNAL是新一代的萬國碼,
可以同時顯示各國文字,不論那一個,一個字都是4Bytes。
A(4Bytes)
中(4Bytes)
1(4Bytes)
耗用量實在太驚人,且
char_length('a')=1
char_length('中')=1
char_length('1')=1
char_length('中1')=2
char_length('中華民國1234')=8
都是萬國碼的長度,以上也是我棄pgsql重回mysql的原因之一
3.帳號問題:建立user (nobody)
su postgres //先變成pgsql的superuser
createuser nobody //建立pgsql的新使用者帳號:nobody
//允許nobody開立新資料庫
Shall the new user be allowed to create databases? (y/n) n
//允許nobody開立新使用者帳號
Shall the new user be allowed to create more new users? (y/n) n
刪除帳號用dropuser <user>
密碼設定請用sql command: alter user <user> with password '<password>'
4.啟動問題
注意:postgresql為了安全問題,不允許使用unix上的超級帳號root帳號來啟動,
一般我們都以postgres帳號(和postgresql的超級帳號同名)來啟動之
開帳號
adduser postgres
設定此帳號的環境
vi /home/postgres/.bashrc_profile 加入以下六行
PATH="$PATH":/usr/local/pgsql/bin ;;設定程式路徑
PG=/usr/local/pgsql
export PGLIB=$PG/lib
export PGDATA=$PG/data ;;如果你的資料庫不是放在這,請改這行
export LD_LIBRARY_PATH=$PGLIB
export PG_CLIENTENCODING=BIG5 ;;指定前端送來的未指定編碼,都當成BIG5碼
初始化資料庫
su postgres
initdb -E MULE_INTERNAL
啟動
pg_ctl start ;;如果不使用PGDATA環境變數,想要手動指定資料庫位置,可加參數:
-D path/to/yourdatabase