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