SQL ( Structured Query Language,結構化查詢語言 ),起源於 IBM 在1974年啟動的 System/R 研究計畫,這是個關連式資料庫的原型,整個計畫在1979年結束,並且獲得兩項重要的成果:
一是驗證了關連式資料模型的可行性
二是發展出 SEQUEL _ Structured English Query Language,結構化英文查詢語言
IBM並沒有放棄 System/R 計畫的研究成果,1981年推出了 SQL/Data System( SQL/DS),1983年推出 Database 2( DB2 ) 的產品;而且,以IBM在業界的實力,SEQUEL 自然就成為相關業界的標準。
之後,SEQUEL 查詢語言經 美國國家標準局_ANSI 和國際標準組織_ISO 不斷地歸納與修改,於1986年訂定了 SQL-86 關聯性資料庫操作語言的國家標準,而更名現今大家熟知的SQL,但,它的發音仍然依循著 IBM SEQUEL( [`sikwl] )的唸法。之後, SQL-89 、 SQL-92 、 SQL:1999、 SQL:2003也相繼訂定 ... ... 茲簡要表列如下:
年度 | 名 稱 | 別 名 | 註 解 |
1986 | SQL-86 | SQL-87 | First published by ANSI. Ratified by ISO in 1987. |
1989 | SQL-89 | Minor revision. | |
1992 | SQL-92 | SQL2 | Major revision (ISO 9075). |
1999 | SQL:1999 | SQL3 | Added regular expression matching, recursive queries, triggers, non-scalar types and some object-oriented features. |
2003 | SQL:2003 | Introduced XML-related features, window functions, standardized sequences and columns with auto-generated values (including identity-columns). |
RDBMS ( Relational DataBase Management System,關聯式資料庫管理系統 ) 是以 SQL 命令文字作為系統操作的語言。目前市面上所有的主流資料庫產品,都屬於 RDBMS 的範疇,包括,跟 PHP 關係異常密切的 MySQL 資料庫管理系統也是如此;也就是說,這些產品設計時都起碼會遵守 SQL-92 的標準。因此,學習 SQL-92 對各種資料庫相關的IT人員或程式設計人員都非常重要。
雖然 SQL 語言的學習有它一定的困難度,尤其是,各家廠商也都針對其資料庫的特性對ANSI SQL有不同的擴充。可是,只要是想進入資料管理或軟體設計領域的人,卻也是無法逃避、不能視而不見的功課
再者,不管資料庫產品提供何種Client端的使用者操作介面,基本上,我們所習慣的視窗圖像式軟體操作視窗畫面,其最終的結果就是幫使用者產生一段 SQL 文字交付管理系統執行;也就是說,對於已經熟練 SQL 的人而言,直接輸入命令文字將要比在視窗上繁複的操作來得有彈性。
SQL 語言的學習過程需要許多經驗的累積 ... 就像,從牙牙學語開始,到我寫成這篇"文章"
我們會逗弄孩子咿咿呀呀地學說話,你想,是為什麼?
所以囉,不管你們喜不喜歡,我還是得試著逗弄你們 ... 咿呀咿呀喲
學生時代,我們也曾被要求被課文;你想,這又是為了什麼?
所以囉,不管你們喜不喜歡,我還是得試著強迫你們 ... 以前怎麼背,現在,依樣畫葫蘆
( 偶就不信 ... 如果不瞭解意思,ㄚ能夠背下多少東西!)
請學員依照偶的引導,將下列示範的 SQL 指令文字碼交付 MySQL 資料庫執行 ... ...
SQL 2 (SQL-92)提供了三種具有個別功能的關聯式資料庫管理系統命令語言:
資料控制語言 ( DCL_Data Control Language )
GRANT ALL PRIVILEGES ON * . * TO 'classic'@'localhost' IDENTIFIED BY 'the_pwd'
WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0
MAX_UPDATES_PER_HOUR 0 ;
GRANT SELECT , INSERT , UPDATE , DELETE , CREATE TEMPORARY TABLES ON classic.*
TO 'somebody'@'mysql2.byethost.com' IDENTIFIED BY 'his_pwd'
WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0
MAX_UPDATES_PER_HOUR 5 ;
資料定義語言 ( DDL_Data Definition Language )
CREATE DATABASE `classic` DEFAULT CHARACTER SET big5 COLLATE big5_chinese_ci;
CREATE TABLE customers (
cid CHAR(10) NOT NULL,
cname VARCHAR(30) NOT NULL,
csex CHAR(1) NOT NULL,
cadd VARCHAR(99),
cmail VARCHAR(50),
PRIMARY KEY (cId)
);
CREATE TABLE orders (
oid int UNSIGNED AUTO_INCREMENT,
cid VARCHAR(10),
done BOOL DEFAULT false,
odate TIMESTAMP,
PRIMARY KEY (oid),
FOREIGN KEY (cid) REFERENCES customers(cid)
ON DELETE SET NULL ON UPDATE CASCADE
);
CREATE TABLE sorts (
sid CHAR(6) NOT NULL,
cname VARCHAR(50) NOT NULL,
PRIMARY KEY (sid)
);
CREATE TABLE products (
pid CHAR(8) NOT NULL,
sid CHAR(6),
pname VARCHAR(30) NOT NULL,
price FLOAT(10, 2),
PRIMARY KEY (pid),
FOREIGN KEY (sid) REFERENCES sorts(sid)
ON DELETE SET NULL ON UPDATE CASCADE
);
CREATE TABLE items (
oid int UNSIGNED,
pid CHAR(8) NOT NULL,
quantity smallint DEFAULT 0,
PRIMARY KEY (oid, pid),
FOREIGN KEY (oid) REFERENCES orders(oid)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (pid) REFERENCES products(pid)
);
資料處理語言 ( DML_Data Manipulation Language )
INSERT INTO sorts VALUES ('xyz041', '個人電腦');
INSERT INTO sorts VALUES ('xyz042', '手提電腦');
INSERT INTO sorts VALUES ('xyz043', '電腦週邊');
INSERT INTO products VALUES ('pc060001', 'xyz041', '華碩雙核心魔幻精靈', 24999);
INSERT INTO products VALUES ('nb060005', 'xyz042', 'ACER宏碁AS3619ALCi', 29999);
INSERT INTO products VALUES ('pt060012', 'xyz043', 'HP_A310相片印表機', 2600);
INSERT INTO customers VALUES ('abcd060001', '趙一叔', 'M', '台北市', 'aaa@bbb.com');
INSERT INTO customers VALUES ('abcd060002', '錢二嫂', 'F', '台中市', 'ccc@ddd.com');
INSERT INTO customers VALUES ('abcd060003', '孫三妹', 'F', '高雄市', 'eee@fff.com.tw');
INSERT INTO orders (cid) VALUES ('abcd060002');
INSERT INTO items VALUES (1, 'pc060001', 1);
INSERT INTO items VALUES (1, 'nb060005', 1);
INSERT INTO items VALUES (1, 'pt060012', 2);
SELECT customers.cname AS 客戶名稱, customers.cadd AS 客戶住址,
customers.cmail AS 客戶信箱, Sum(items.quantity*products.price) AS 交易額,
orders.odate AS 交易日期, orders.oid AS 訂單編號
FROM sorts RIGHT JOIN (products RIGHT JOIN((customers RIGHT JOIN orders
ON customers.cid = orders.cid) RIGHT JOIN items ON orders.oid = items.oid)
ON products.pid = items.pid) ON sorts.sid = products.sid
WHERE orders.done=False AND customers.cid LIKE '_b%02'
GROUP BY customers.cname, customers.cadd, customers.cmail, orders.odate, orders.oid;
SELECT customers.cid AS 客戶編號, customers.cname AS 客戶名稱, items.oid AS 訂單編號,
items.pid AS 產品編號, items.quantity AS 採購數量
FROM (customers RIGHT JOIN orders ON customers.cid = orders.cid)
RIGHT JOIN items ON orders.oid = items.oid
WHERE customers.cid = 'abcd060002' OR customers.cname = '錢二嫂';
UPDATE items SET quantity = 1 WHERE oid = 1 AND pid = 'pt060012';
Delete From items WHERE oid = 1 AND pid = 'nb060005';
附記:
當 System/R 計畫進行中時,有一群工程師也相當看好關連式資料庫的潛力,因此,也在1977年成立了一家名為 Relational Software, Inc. ( 即現在的 Oracle company _ "甲骨文"公司 ),並在1979年推出了一個以 SQL 作為查詢語言的商業專用資料庫管理系統,也就是有名的 Oracle 資料庫
Oracle 執行長艾里森 ( Lawrence J. Ellison )
Oracle 公司目前的執行長,也是創辦人之一的艾里森(Lawrence J. Ellison),曾連續登上富比士雜誌全球十大億萬富豪的榜單,2000年時曾直追比爾蓋茲,名列世界第二;2006年,排名全球第 4 ... ... ㄚ這樣,大家應該就知道,資料庫管理系統是不容小覷的吼~
微軟是在1993年開始生產中小型商業專用資料庫管理系統 SQL Server 4.21 for Windows NT;目前常見的分別是1999年的 SQL Server 7.0;2000年的 SQL Server 2000 以及最新的 SQL Server 2005。至於微軟 Office 家族中 Access 資料庫的 Jet Database Engine,勉強也可歸納為 RDBMS之列
有興趣深入學習 SQL 語言的 PHP 網頁設計者,除了可以參考這裡 或其他網路資源外
我建議可以去買這本原文的工具書來研讀:
書名:Learning SQL
作者:Alan Beaulieu
出版社:O'Reilly
出版日期:2005年8月
ISBN:0-596-00727-2
頁數:306頁
目前,具有專利的關聯性資料庫系統軟體有:(依字母排序)
4th Dimension
Alpha Five
Alpha Software Inc Alpha Five - RAD for Web and Desktop
Bizgres MPP
CA-Datacom
DB2
Dataphor
Daffodil database
EnterpriseDB
FileMaker
Helix database
Informix
InterBase
Kognitio, WX2
Linter
Matisse
Microsoft Jet Database Engine (part of Microsoft Access)
Microsoft SQL Server
Microsoft Visual FoxPro
Mimer SQL
Netezza
NonStop SQL
Openbase
Oracle
Oracle Rdb for OpenVMS
OpenLink Virtuoso Universal Server
Pervasive
Pyrrho DBMS
Progress 4GL
Sand Analytic Server (formerly known as Nucleus)
SQLBase
Sybase Adaptive Server Anywhere (formerly known as Watcom SQL)
Sybase Adaptive Server Enterprise
Sybase Adaptive Server IQ
Teradata
ThinkSQL
TimesTen
Valentina (Database)
Vertica
VistaDB
VMDS
Whitecross Systems
WinBase602
免費或開放原始碼的關聯性資料庫系統軟體有:(依字母排序)
Cloudscape
Derby
Firebird
FrontBase
H2
HSQLDB
Ingres
Java DB
MaxDB
MonetDB
MySQL
PostgreSQL
SmallSQL
SQLite
tdbengine
OpenLink Virtuoso (Open Source Edition)
txtSQL
Mckoi SQL Database
Rebol sql-protocol