Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo not available]
Jose M. Fernández

內容目錄
簡介
主要特性
安裝
第一步, 系統管理 (安全性)
在 MySQL 下使用 SQL 語言
結論


與作者聯繫

MySQL
一種資料庫伺服軟體

[Ilustration]

內容摘要 MySQL 是一個結構化查詢語言資料庫伺服器, 並且支援許多種的平台, 當中包括了 Linux。 其 Linux 版本是以快速的效能作為設計的考量。




簡介

MySQL 是一個結構化查詢語言資料庫伺服軟體, 它是一種主-客式的應用程式, 而且可由一部伺服主機, 及許多的用戶主機一同運作。

要深入討論 SQL 資料庫, 是一件非常複雜的事情, 因為那必須回溯到關聯式資料庫 (relational database) 的源起, 而本篇文章之目的, 並非有意要描述那麼多, 只是要想辦法來描述、 並示範某個特殊應用場合的 SQL 伺服程式。

讓我們先來回憶一些歷史事件, 約一九八一年時, IBM 開始把 SQL 弄上市, 且從那個時候開始, 這個 SQL 就在關聯式資料庫的發展上, 持續扮演著重要角色。 IBM 曾經提出一種版本的 SQL 給美國國家標準組識 (ANSI), 後來被通過成為標準, 而且從那個時候開始, SQL 就廣泛的被使用在一般的關聯式資料庫中。 在當時, DB2 是該類型資料庫中, 最受歡迎的一種, 它是在 1983 年被設計出來, 大部份用在大型主機環境。

在 GNU 的世界裡, MySQL 是 Linux 環境中, 最常被引用來介紹關聯式資料庫的程式之一。 這個應用程式, 通常是不會包含在各式安裝套件中, 因為它不是遵照 GNU 的軟體使用許可發行的; 如果是使用於商業場合, 或在其它應用程式中採用它, 就需要取得許可證照才可以。

不管資料量的大小, 這套資料庫伺服軟體, 都被認為 ( 僅管已在 MySQL 的文件裡載明 ) 是速度快速、 系統強固的一個 ( 當然是在同一等級中, 與其它的資料庫相比 )。 我們等一下會詳細討論到, 其快速的處理能力, 是捨棄某些 SQL 標準功能的犧牲而來。

MySQL 的原始檔, 以及可執行檔, 可以用在: Linux 2.0+, SCO, Solaris 2.5, 2.6, SUNOS 4.x, BSDI 2.x, 3.0, SGI IRIX 6.x, AIX 4.x, DEC UNIX 4.x, HPUX 10.20, Windows 95 ( 再說一次! 沒搞錯吧? ), 幾乎所有常見的作業系統都支援了。

這個免費的版本, 是由 Michael Windenis 所寫的, 另外商業版是由 TCX Datakonsulter AB 所發行。

主要特性

  • Mysql 的主要設計的目標, 是快速及強固。
  • 以 C 及 C++ 寫成, 並使用 GCC 2.7.2.1 來測試, 使用 GNU 的自動偵測, 來增加可移值性。
  • 用戶端可以用 C, C++, JAVA, Perl, TCL 多種語言。
  • 支援多重處理器, 如果可能取得多個處理器資源, 伺服程式可以加以利用。
  • 可以在各式平台及作業系統上執行。
  • 系統的密碼及個人使用權限設定, 非常的安全及靈活。
  • 所有經過網路傳送的密碼, 都經過加密處理。
  • 有可變及固定的記錄 (records) 大小。
  • 每個表格 (table) 可以有 16 個索引 (index), 每個索引可以由一至十五個欄位, 或其中一部分所組成, 且最大長度可以到 127 個位元組 (bytes)。
  • 所有的欄位都可以有預設值。
  • 有一個工具 (Isamchk) 可以用來檢查、 最佳化、 以及修正表格。
  • 所有的資料, 都是用 ISO8859_1 格式來儲存。
  • 用戶端可以用 TCP 或 UNIX 封包 (sockets) 來和伺服軟體溝通。
  • 在顯示錯誤訊息時可支援多國語言。
  • 所有的指令都可用 -help 或 -? 來尋求協助。
  • 有許多種類的欄位資料型態, 如: 1, 2, 3, 4 及 8 個位元組的整數 (int)、 浮點數 (floats)、 倍精度浮點數 (double)、 字元 (character)、 日期 (date)、 列舉 (enum) 等。
  • 有給 Windows 95 使用的 ODBC 驅動程式 (含原始檔), 可用 ACCESS 來和伺服軟體連接。

安裝

很自然地, 在安裝這個資料庫之前, 你需要先到底下的站台下載檔案來安裝:

http://www.tcx.se


或經由 FTP :
ftp://ftp.sunet.se/pub/unix/databases/relational/mysql

首先, 當然要先決定要下載原始檔或者是可執行檔, 選擇用執行檔安裝, 會是最簡單的安裝方法, 不過, 要找得到配合我們所用平台的可執行檔才行 ( 在最常見的平台上, 當然是會有的 )。

直接安裝可執行檔

先下載這個檔:

mysql-Version.tar.gz

然後解開它,我常用的方法如下:

  1. 先解壓縮檔案:
    gunzip -dfv mysql-Version.tar.gz
  2. 然後把 .tar 檔案解開:
    tar -xvf mysql-Version.tar

    我在 /usr/local 這個目錄下執行 tar 這個命令,所以解開的檔案會是在
    /usr/local/mysql-3.20.32a-pc-linux-gnu-i586 底下。

    這個名字非常的不實用, 所以我以建立一個符號鏈結 (symbolic link) 的方式, 將其連到 mysql:

    > ln -s mysql-3.20.32a-pc-linux-gnu-i586/bin mysql

    這個目錄底下包括了底下的東西:

    drwxr-xr-x 8192 Nov 24 1993 bin
    drwxr-xr-x 8192 Nov 24 1993 etc
    drwxr-xr-x 8192 Aug 17 1997 i18n
    drwxr-xrx 8192 Mar 16 1994 include
    drwxr-xr-x 8192 Mar 19 02:03 jdk1.1.3
    drwxr-xr-x 8192 Aug 17 1997 jre
    drwxr-xr-x 8192 Mar 16 1994 lib
    lrwxrwxrwx 36 Jan 18 19:40 mysql
    drwxr-xr-x 8192 Feb 5 00:07 mysql-3.20.32a-pc-linux-gnu-i586
    drwxr-xr-x 8192 Nov 24 1993 sbin
    drwxr-xr-x 8192 Nov 24 1993 src

    接者執行 `cd mysql`, 就可以看到 MySQL 的一些可執行檔, 一切正常的話, 就可以準備啟動資料庫伺服軟體囉。

從原始碼安裝

使用先前的方法來解壓縮原始檔。 接著執行下面的動作:


cd mysql-Version
./configure
make install

抓回來的原始碼套件裡面, 通常都附有許多關於安裝程序的文件。 有一些己知的臭蟲、 特定平台和作業系統所需注意的事項、 設定所需要的參數、 和一些搜集起來的 FAQ。 當第一次安裝時都很順利時, 會產生一個含有可執行檔的目錄, 就像先前提到可執行檔安裝時的檔案一樣。

建議使用者, 要在安裝及編譯程式方面, 具有不錯的經驗, 才用原始檔來安裝, 而且進行這些動作, 若遇到問題時, 一定要有充裕的時間和耐心。

第一步, 系統管理 (安全性)

在用上面提到的任何一種方式完成安裝 MySQL 以後,你的系統裡面應該有以下這 個目錄:

/usr/local/mysql-3.20.32a-pc-linux-gnu-i586

should contain these files and directories:

-rw-r--r-- 1 root root 4133 Oct 1 1997 INSTALL-BINARY
-rw-r--r-- 1 root root 16666 Oct 7 21:10 INSTALL-SOURCE
-rw-r--r-- 1 root root 24088 Oct 27 23:06 NEWS
-rw-r--r-- 1 root root 3562 Apr 11 1997 PORTING
-rw-r--r-- 1 root root 8512 May 21 1997 PUBLIC
-rw-r--r-- 1 root root 1963 Jul 31 1997 README
-rw-r--r-- 1 root root 3416 Jun 4 1997 TODO
drwxr-xr-x 6 root root 8192 Oct 28 00:44 bench
drwxr-xr-x 2 cuenta1 users 8192 Mar 27 00:42 bin
drwxr-xr-x 5 root root 8192 Mar 31 00:26 data
drwxr-xr-x 2 root root 8192 Oct 28 00:44 include
drwxr-xr-x 2 root root 8192 Oct 28 00:44 lib
-rw-r--r-- 1 root root 132883 Jun 8 1997 mysql-faq.html
-rw-r--r-- 1 root root 117622 Jun 10 1997 mysql-faq.txt
-rw-r--r-- 1 root root 9301 Jun 8 1997 mysql-faq_toc.html
drwxr-xr-x 4 root root 8192 Oct 28 00:44 mysqlperl
drwxr-xr-x 2 root root 8192 Oct 28 00:44 scripts
drwxr-xr-x 3 root root 8192 Oct 28 00:44 share
drwxr-xr-x 2 root root 8192 Oct 28 00:44 tests

你可以看看 README、 TODO、 INSTALL、 mysql-faq 等文字檔, 以獲得更多關於安裝的資訊, 這些文件都很完整而且實際, 值得一看 (這篇文章的一部分, 就是從這裡看來的)。

/data 目錄底下, 會依不同目錄, 放置您在這個系統上, 所建立的資料庫內容, 在剛安裝完系統的時候, 這底下會有一個名為 “mysql” 的資料庫, 它是用來支援安全性功能,

/bench 目錄底下有幾個 SQL 指令檔範例。 特別注意當用原始碼安裝的會有許許多多用可執行檔安裝時沒有的範例檔。

/share 目錄底下會放置許多不同語言的錯誤訊息資料檔。

/include/lib 目錄底下是 MySQL 安裝套件 提供的標頭檔 (header files) 以及程式庫。

你一定猜得到 /bin 底下是放可執行檔的吧, 這些可執行檔裡面最重要的幾個是:


`mysql'

一個支援 GNU readline 的 SQL 命令殼 (command shell), 可以交談式或批次式的處理 SQL 指令。


`mysqladmin'

MySQL 的管理工具, 可用來建立或刪除資料庫, 或者用來獲得相關的資訊。


`mysqld'

SQL “deamon” ,必須一直在背景中執行。


`mysqlshow'

用來檢視資料庫、 表格或欄位的相關資訊。


`safe_mysqld'

用來啟動 “mysqld” 的小程式。


`mysqlaccess'

用來檢查主機 (Host)、使用者 (User) 以及資料庫 (Database) 之間遇到某種組合時的權限。


`mysqlbug'

用來回報在伺服軟體裡找到的臭蟲。


`mysql_install_db'

建立一個內有預設權限的巨大表格; 通常在安裝完一個新系統以後執行。


`isamchk'

用來檢查、最佳化及修正表格。

安全性

MySQL 的保全系統可以保證使用者僅能執行經過嚴格認證 (authorized) 的工作 (不多也不少)。

系統作任何異動 (transaction) 時都會依據 “哪個使用者” (WHICH USER) 從 “哪台主機” (WHICH HOST) 連上 “特定資料庫” (GIVEN DATABASE) 而給與不同的權限, 系統是依據 “mysql” 資料庫裡面的 “USER”、“HOST” 與 “DB” 這三個表 格的內容來決定是否准許某項操作。


這幾個表格裡面的欄位如下:


資料庫: mysql
Tables
db
host
user


表格: db
Field Type Null Key Default Extra
Host char(60)   PRI    
Db char(32)   PRI    
User char(16)   PRI    
Select_priv char(1)     N  
Insert_priv char(1)     N  
Update_priv char(1)     N  
Delete_priv char(1)     N  
Create_priv char(1)     N  
Drop_priv char(1)     N  

表格: host
Field Type Null Key Default Extra
Host char(60)   PRI    
Db char(32)   PRI    
Select_priv char(1)     N  
Insert_priv char(1)     N  
Update_priv char(1)     N  
Delete_priv char(1)     N  
Create_priv char(1)     N  
Drop_priv char(1)     N  

表格: user
Field Type Null Key Default Extra
Host char(60)   PRI    
User char(16)   PRI    
Password char(16)        
Select_priv char(1)     N  
Insert_priv char(1)     N  
Update_priv char(1)     N  
Delete_priv char(1)     N  
Create_priv char(1)     N  
Drop_priv char(1)     N  
Reload_priv char(1)     N  
Shutdown_priv char(1)     N  
Process_priv char(1)     N  
File_priv char(1)     N  

你可以藉更改這些表格賦與使用者對某一個表格進行選出 (SELECT)、 插入 (INSERT)、 更新 (UPDATE) 或 刪除 (DELETE) 等動作的權限。

也能在此設定允不允許建立 (CREATE)、刪除 (DROP) 表格或資料庫。

另外有趣的是,你還可以設定使用 “shutdown”、 “reload”、“process” 等系統指令的權限。

此外,可以用 “mysqlaccess” 這個命令手稿 (script) 來檢視系統目前的各種權限設定。

在設定權限時,主機 (HOST) 必須是 “host local” 、IP 位址 或是一個 SQL 表示式 (expression)。假如在表格 “db” 裡面 "host" 欄位是空的, 這表示是 “host” 表格裡面的 “any host”;相對的,假如在表格 “host” 或 “user” 裡面的 "host" 欄位是空的, 就代表了任何能與本伺服器建立 TCP 連線的主機。

"Db" 是此資料庫的名稱。

一個空白的 “USER” 欄位代表任何的使用者。

第一步

啟動 MySQL 伺服軟體最快的方法就是執行以下指令:

mysql.server start

想要停止伺服軟體可以執行:

mysql.server stop

如同在 MySQL 的安裝指南中提到的, 以上的動作都可以藉命令手稿 safe_mysql 來達成,不過不管如何,結果都是會執行 “mysqld” 這個背景程式 (deamon)。

我們很容易可以理解,必須要啟動資料庫伺服程式來對資料庫進行所有的操作; 當伺服程式在背景執行的時候,我們才可以進行 "mysqladmin" 裡的操作 ,mysqladmin 的語法如下:

mysqladmin [OPTIONS] command command …

選項 OPTIONS 可以是:

-f, --force 在刪除表格之前不會先要求使用者作確認動作, 直接刪除。
-?, --help 顯示你正在看的這個說明訊息。
-h, --host=# 連上主機。
-p, --password[=...] 存取此伺服器的密碼。
-P --port=... 用來連線的埠號 (Port number)。
-S --socket=... 用來連線的封包檔案 (Socket file)。
-u, --user=# 用來連線的使用者帳號。
-V, --version 顯示目前伺服軟體的版本。

command 可以是一個或多個的下列指令:

  • create database_name
    建立新的資料庫。
  • drop database_name
    刪除這個資料庫及其中的所有表格。
  • kill process_id
    刪除聯結到 mysql 的一個程序。
  • processlist
    列出聯結到 mysql 的所有程序。
  • shutdown
    關閉伺服軟體。
  • status
    顯示伺服軟體目前的狀態。
  • version
    顯示此伺服軟體的版本。

    舉例來講,執行:

    mysqladmin create newdatabase

    會新建一個名為 "newdatabase" 的資料庫。

    要列出正在這台伺服器上跑的所有程序,可以:

    mysqladmin processlist

    還有一個重要的指令是 "mysqlshow",它可以顯示目前所有的資料庫, 舉例 而言,不加任何參數執行 mysqlshow 的話:

    > mysqlshow

    	+-----------+
    	| Databases |
    	+-----------+
    	| mysql     |
    	| people    |
    	| test      |
    	+-----------+
    

    在 MySQL 下使用 SQL 語言

    我們在緒論裡面已經指出 MySQL 這套 SQL 伺服軟體被認為是同等級的軟體 裡面速度最快的一個,同時也提到性能表現好的代價就是未能提供一些我個 人認為很重要的 SQL 特性,其中兩個未提供的重要特性就是觸發器 (Triggers) 與異動邏輯 (Transactional Logic)。

    所謂的觸發器其實只是一小段程式碼,這段程式碼在資料庫被施以某特定動 作 (如更新、刪除等等) 時就會被 "觸發" --執行--,系統顯然要消耗額外 的資源來測試觸發器被觸發的條件以及管理這些觸發器,這就是 MySQL 並不 提供觸發器的唯一原因。

    在關連性資料庫裡面, 各個表格 (table) 之間必須保持一致性, 是非常重要的, SQL 提供了一個簡單的機制, 來保證這樣的一致性: 「異動邏輯」, 伺服軟體不但要提供機制來鎖定 (blocking) 檔案, 而且要統一對資料庫的操作, 並在某個指令操作完以後, 還能夠退回未下指令之前的狀態; 好啦, MySQL 為了改善處理的速度, 所以並未提供異動邏輯 (至少文件上是這麼說的), 我們唯一自助的方法, 就是在更動資料庫之前用 LOCK tables/UNLOCK tables 這些指令, 來鎖定檔案不讓其他使用者來使用, 不過, 還是沒辦法移除已經對資料施行的操作。

    腦子裡面考慮清楚這套伺服軟體的限制以後, 接著該來複習幾個 SQL 指令囉, 這一段的目地, 不是要來跟大家分析研究 SQL 指令, 只是要讓大家看看這伺服軟體, 是如何提供這些指令而已。

    在啟動伺服軟體以後, 就完成送出指令的準備了。 現在, 讓我們來建立一個名字叫作 "people"、 裡面含有 "clients"、 "states"、 "counties" 三個表格的資料庫, 這是一個很簡單, 而且不太實用的範例, 不過, 已足以讓我們瞭解, 要如何處理在真實世界裡面的資料。 首先必須說明一下, 其實這幾個動作, 可以用很多方法來達成: 你可以利用 MySQL 提供的應用程式介面 (API) ,撰寫 C、 C++ 或 JAVA 程式, 在 Windows95 底下工作的人可以透過 ODBC 介面和 MySQL 溝通 (大家再原諒我一次),或者也可以使用 MySQL 提供的命令殼 (shell) 來操作。接下來我將 會選擇用最後一個方法來示範操作,因為對這 篇文章的目地而言,使用命令 殼來操作資料庫已經夠強了,也可以避免要去 描述其它程式語言的特性。

    可以執行下面指令來啟動 Mysql 的命令殼:

    mysql databasename

    下完指令後就會進到 MySQL 命令殼的提示符號下, 就可以開始送指令給伺服軟體了。

    此外也可以用命令殼的批次模式來執行指令:

    mysql -e (“SQL command …… “)databasename

    上面的指令會把 SQL 指令直接送給伺服軟體,不會進入命令殼的提示符號。

    在我們的範例裡面, 要先建立一個資料庫 "people", 所以我們要先執行下面指令:

    mysqladmin create people

    接著再執行 MySQL 命令殼:

    mysql people

    現在我們可以開始在命令殼裡面, 把指令送給適當的伺服軟體了, 例如可以用下面指令, 看看這個資料庫裡面有哪些表格:

    > show tables /g

    系統的回應是:


    Database: people
    	+-------------+
    	|   Tables    |
    	+-------------+
    	| clients     |
    	| counties    |
    	|  states     |
    	+-------------+
    

    所有由命令殼送到伺服軟體的指令都要以 /g 結尾, 用來告訴系統指令結束, 可以送到伺服器端去執行了。

    在你的系統上面, 可能無法得到如上所述的系統回應, 當然啦, 想要得到如此回應的話, 就必須先用 CREATE 指令, 來建立相應的表格才行, 你可以用下面這幾個典型的 CREATE 指令, 建立這三個表格:

    	CREATE TABLE clients
    (NIF CHAR(9) NOT NULL PRIMARY KEY, Name CHAR(15) NOT NULL, Family_name CHAR(35) NOT NULL, Address CHAR(50) NOT NULL, City INT(5) NOT NULL, State INT(2) NOT NULL, Phone INT(9), Date DATE NOT NULL) /g

        CREATE TABLE states    
    (Cod_state INT(2) NOT NULL PRIMARY KEY, Description_s CHAR(30) NOT NULL) /g

        CREATE TABLE counties  
    	      (Cod_state           INT(2)    NOT NULL,
    	       Cod_county          INT(3)    NOT NULL,
    	       Description_c       CHAR(30)  NOT NULL,
    	          PRIMARY KEY(Cod_state,Cod_county)) /g          
    

    接著, 可以在建立好表格之後, 執行下面指令:

    > show colums from clients from people /g
    > show columns from states from people /g
    > show columns from counties from people /g

    我們將會得到:

    Database: people   	Table: clients   Rows: 4
    +--------------+----------+------+-----+---------+-------+
    | Field        | Type     | Null | Key | Default | Extra |
    +--------------+----------+------+-----+---------+-------+
    | NIF          | char(9)  |      |PRI  |         |       |
    | Name         | char(15) | YES  |     |         |       |
    | Family_name  | char(35) |      |     |         |       |
    | Address      | char(50) |      |     |         |       |
    | City         | int(5)   |      |     |   0     |       |
    | State        | int(2)   |      |     |   0     |       |
    | Phone        | int(9)   | YES  |     |         |       |
    | Date         | date     | YES  |     |         |       |
    +--------------+----------+------+-----+---------+-------+
    
    Database: people   	Table: states      Rows: 3
    +-----------------+----------+------+-----+---------+-------+
    | Field           | Type     | Null | Key| Default  | Extra |
    +-----------------+----------+------+-----+---------+-------+
    | Cod_state       | int(2)   |      | PRI |    0    |       |
    | Descripcion_s   | char(30) |      |     |         |       |
    +-----------------+----------+------+-----+---------+-------+
    
    Database: people   	Table: counties    Rows: 9
    +------------------+----------+------+-----+---------+-------+
    | Field            | Type     | Null | Key| Default  | Extra |
    +------------------+----------+------+-----+---------+-------+
    | Cod_state        | int(2)   |      | PRI |   0     |       |
    | Cod_county       |  int(3)  |      | PRI |   0     |       |
    | Descripcion_c    | char(30) |      |     |         |       |
    +------------------+----------+------+-----+---------+-------+
    

    接下來要進行的是, 在每個表格裡面插入 (insert) 資料; 讓我們用 INSERT 這個 SQL 指令來達成工作, 毋須使用到其他程式語言, 或任何應用程式介面程序 (API routine):

    以下列指令在 "clients"、"counties" 以及 "states" 這三個表格裡, 各插入一筆資料:

    INSERT INTO clients VALUES
    ("5316828K","PEDRO","ROMERO DIAZ","C/ HOLA 9 ",29003,29,911111111,19980203)
    /g

    INSERT INTO counties VALUES
    (28,001,"Fuenlabrada") /g

    INSERT INTO states VALUES
    (08,"Barcelona") /g

    最後作一個總結, 用 SQL 指令, 將剛剛插入資料庫表格裡面的資料行, 選擇 (select) 出來, 讓我們先從 "counties" 這個表格選出 Cod_state 為 28 的紀錄, 再依不同的選取條件從 "clients" 裡面, 選出想要的紀錄:

    > SELECT ALL Cod_state, Cod_county, Description_c from counties where Cod_state = 28 /g
    Cod_state	Cod_county	Description_c
    28              1               Fuenlabrada
    28              2               Pozuelo
    28              3               Madrid
    
    > SELECT ALL NIF,Name,Family_name,Address from clientes where City = 28001
    NIF Name Family_name direccion
    2416728U JOSE FERNANDEZ ROMERO C/ FELIZ 1 3G


    > SELECT ALL NIF,Name,Family_name,Address from clients
    where State = 29

    NIF        Name           Family_name           Address   
    23198623N  JUAN ANDRES    RUIZ MORALES          C/ CATEDRAL 12 2B
    5316828K   PEDRO          ROMERO DIAZ           C/ HOLA 9
    52312844J  LUIS ALBERTO   LISTO JIMENEZ         C/ ROSA DE LOS VIENTOS 129  3I  
    

    結論

    我們在一開頭, 已經說明了這份文件的目標, 是在於展示某個特定 SQL 伺服軟體 (MySQL) 的基本特性, 我們並不想要把這份文件縮水為 MySQL 的使用步驟及指令列表, 取而代之的是, 我們希望在這裡, 研究一下這套軟體的可能性與限制所在; 只有像如此深入的瞭解一套軟體, 才能夠真正的獲得這套軟體提供的巨大好處, MySQL 省略了提供觸發器以及異動邏輯, 因而使得資料的管理 (插入、修改、刪除紀錄) 在多使用者的應用程式, 以及使用到許多個相互關連的表格時, 變得非常複雜。 雖然如此, 在應用到需要對大型資料庫作快速存取的時候, 我會推荐使用這套軟體。

    最後我很樂意告訴大家, 這份文件裡面大部份的資料, 都可以在包含於 MySQL 套件裡面的文件中找到, 另外一部分, 則是我在幾篇技術性雜誌的文章, 還有一本已經發黃的 IBM 關於 SQL 的手冊裡面看來的。


本文由 郭谷彰、 鄭原忠 所翻譯

主網站由 Miguel Angel Sepulveda 維護
© Jose M. Fernández 1998
LinuxFocus 1998