1 資料庫和SQL
1 資料庫和SQL
1-1 資料庫是什麼
將大量資料儲存起來,通過計算機加工而成的可以進行高效訪問的資料集合稱為資料庫(Database, DB)。
法則
用來管理資料庫的計算機系統稱為資料庫管理系統(Database Management System, DBMS)。
為什麼DBMS那麼重要?文字文件和Excel工作表等與DBMS比較
無法多人共享資料;
無法提供操作大量資料所需的格式;
實現讀寫自動化需要程式設計技術能力;
無法應對突發事故;
DBMS可以克服這些不足,能夠實現多個使用者同時安全簡單地操作大量資料(無需高超的程式設計技術就可以操作資料庫)。這也是我們一定要使用DBMS的原因。
DBMS種類(資料的儲存格式即資料庫種類)
- 層次型資料庫(Hierarchi Database, HDB)
最古老的資料庫之一,它把資料通過層次結構(樹形結構)的方式表現出來。(現在很少使用)
- 關係型資料庫(Relational Database, RDB)
也稱為關係資料庫,是現在應用最廣泛的資料庫。關係型資料庫1969年誕生,可謂歷史悠久。和Excel工作表一樣,它也採用行列二維表結構來管理資料,所以簡單易懂。同時,它還使用專門的SQL(Structured Query Language, 結構化查詢語言)語言對資料庫進行操作。
這種型別的DBMS稱為關係資料庫管理系統(Relational Database Management System, RDBMS)。比較具有代表性的RDBMS有如下五種:
l Oracle Database : 甲骨文公司的RDBMS
l SQL Server : 微軟公司的RDBMS
l DB2 : IBM公司的RDBMS
l PostgreSQL : 開源的RDBMS
l MySQL : 開源的RDBMS
- 面向物件資料庫(Object Oriented Database, OODB)
程式語言當中有一種被稱為面向物件的語言。該類資料庫把資料以及對資料的操作集合起來以物件為單位進行管理,因此得名。面向物件資料庫就是用來儲存這些物件的資料庫。
- XML資料庫(XML Database, XMLDB)
最近幾年,XML作為在網路上進行資料互動傳輸的形式逐漸普及起來。XML資料庫可以對XML形式的大量資料進行高速處理。
- 鍵值儲存系統(Key-Value Store, KVS)
這是一種單純用來儲存查詢所使用的主鍵(Key)和值(Value)的資料庫。具有程式語言經驗的讀者可以把它想象成關聯陣列或者是雜湊(hash)。
1-2 資料庫的結構
使用RDBMS時,最常見的系統結構就是客戶端/伺服器(C/S型別)這種型別。
根據SQL語句的內容返回的資料,同樣必須是二維表的形式,這也是關係資料庫的特徵之一。
表的列(垂直的方向)稱為欄位,它代表了儲存在表中的資料專案。
表的行(水平的方向)稱為記錄,它相當於一條資料。
關係資料庫必須以行為單位進行資料讀寫。
法則1-1 |
關係資料庫以行為單位讀寫資料。 |
此處將行和列交匯的方格稱為單元格,在一個單元格中自能輸入一個數據。
法則1-2 |
一個單元格中只能輸入一個數據。 |
1-3 SQL概要
國際標準化組織(ISO)為SQL制定了相應的標準,以此為基礎的SQL稱為標準SQL(相關資訊請參考專欄—標準的SQL和特定的SQL)。
法則1-3 |
學會標準的SQL就可以在各種RDBMS中書寫SQL語句了。 |
SQL用關鍵字、表名、列名等組合而成的一條語句(SQL語句)來描述操作的內容。
根據對RDBMS賦予的指令種類的不同,SQL語句可以分為以下三類:
- DDL(Data Definition Language, 資料定義語言)
用來建立或者刪除儲存資料用的資料庫以及資料庫中的表等物件。
CREATE : 建立資料庫和表等物件
DROP : 刪除資料庫和表等物件
ALTER : 修改資料庫和表等物件的結構
- DML(Data Manipulation Language, 資料操作語言)
用來查詢或者變更表中的記錄。
SELECT : 查詢表中的資料
INSERT : 向表中插入新資料
UPDATE : 變更表中的資料
DELETE : 刪除表中的資料
- DCL(Data Control Language, 資料控制語言)
用來確認或者取消對資料庫中的資料進行的變更。除此之外,還可以對RDBMS的使用者是否有許可權操作資料庫中的物件(資料庫表等)進行設定。
COMMIT : 確認對資料庫中的資料進行的變更
ROLLBACK : 取消對資料庫中的資料進行的變更
GRANT : 賦予使用者操作許可權
REVOKE : 取消使用者的操作許可權
法則1-4 |
SQL根據功能不同可以分為三類,其中使用最多的是DML。 |
一條SQL語句可以描述一個數據庫操作。在RDBMS當中,SQL語句也是逐一執行的。
法則1-5 |
SQL語句以分號(;)結尾。 |
法則1-6 |
關鍵字不區分大小寫。 |
SQL語句常常需要直接書寫字串、日期或者數字。
在SQL語句中直接書寫的字串、日期(年-月-日、年月/日、‘26 Jan 2010’、‘10/01/26’、‘2010-01-26’)或者數字等稱為常數。
法則1-7 |
字串和日期常數需要使用單引號(’)括起來。 數字常數無需加註單引號(直接書寫數字即可)。 |
SQL語句的單詞之間需要使用半形空格或換行符來進行分隔。
法則1-8 |
單詞之間需要使用半形空格或者換行進行分隔。 |
1-4 表的建立
資料庫的建立 |
-- CREATE DATABASE <資料庫名稱>; CREATE DATABASE shop; |
表的建立 |
/** CREATE TABLE <表名> ( <列名1> <資料型別> <該列所需要的約束>, <列名2> <資料型別> <該列所需要的約束>, <該表的約束1>, <該表的約束2>, ......); */ CREATE TABLE `shohin` ( `shohin_id` char(4) NOT NULL, `shohin_mei` varchar(100) NOT NULL, `shohin_bunrui` varchar(32) NOT NULL, `hanbai_tanka` int(11) DEFAULT NULL, `shiire_tanka` int(11) DEFAULT NULL, `torokubi` date DEFAULT NULL, PRIMARY KEY (`shohin_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
我們只能使用半形英文字母、數字、下劃線(_)作為資料庫、表、和列的名稱。
法則1-9 |
資料庫名稱、表名和列名等可以使用以下三種字元。 半形英文字母、半形數字、下劃線(_) |
法則1-10 |
名稱必須以半形英文字母作為開頭。 |
在同一個資料庫中不能建立兩個相同名稱的表,在同一個表中也不能建立兩個名稱相同的列。
法則1-11 |
名稱不能重複。 |
資料型別表示資料的種類,包括數字型、字元型和日期型等。每一列都不能儲存與該列資料型別不符的資料。資料庫中每一列都不能儲存與該列資料型別不符的資料。
INTEGER : 用來指定儲存整數的列的資料型別(數字型),不能儲存小數。
CHAR : CHAR是CHARACTER(字元)的簡稱,是用來指定儲存字串的列的資料型別(字元型)。
字串以定長字串的形式儲存在被指定為CHAR型的列中。所謂定長字串,就是單列中儲存的字串長度達不到最大長度的時候,使用半形空格進行補充。例如:CHAR(8)型別中輸入’abc’的時候,會以‘abc ‘多出五個空格儲存起來。
VARCHAR : 同CHAR型別一樣,VAHRCHAR型也是用來指定儲存字串的列的資料型別(字串型別)。也可以通過括號內的數字來指定字串的長度(最大長度).但該型別的列是以可變長字串的形式來儲存字串的。即不會補充空格儲存。定長字串在字元數未達到最大長度時會用半形空格補充,但是可變長字串不同,即使字元數未達到最大長度,也不會用半形空格補充。
DATE: 用來指定儲存日期(年月日)的列的資料型別(日期型)。
約束是除了資料型別之外,對列中儲存的資料進行限制或者追加條件的功能。
資料型別的右側設定了NOT NULL的約束。
主鍵的約束。
所謂的鍵值,就是在指定特定資料是使用的列的組合。鍵值種類多樣,主鍵(primary key)就是可以特定一行資料的列。
1-5 表的刪除和更新
表的刪除 |
-- DROP TABLE <表名>; DROP TABLE shohin; |
法則1-12 |
刪除了的表是無法恢復的。 在執行DROP TABLE 語句之前請務必仔細確認。 |
表定義的更新 |
-- ALTER TABLE <表名> ADD COLUMN <列的定義>; ALTER TABLE shohin ADD COLUMN shohin_mei_kana VARCHAR(100); -- ALTER TABLE <表名> DROP COLUMN <列名>; ALTER TABLE shohin DROP COLUMN shohin_mei_kana; |
法則1-13 |
表定義變更(alter table)之後資料無法恢復,慎重使用 |
表中插入資料 |
-- DML :插入資料 START TRANSACTION; INSERT INTO shohin VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20'); INSERT INTO shohin VALUES ('0002', '打孔器', '辦公用品', 500, 300, '2009-09-11'); INSERT INTO shohin VALUES ('0003', '運動T恤', '衣服', 4000, 2800, NULL); INSERT INTO shohin VALUES ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20'); INSERT INTO shohin VALUES ('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15'); INSERT INTO shohin VALUES ('0006', '叉子', '廚房用具', 500, NULL, '2009-09-20'); INSERT INTO shohin VALUES ('0007', '擦菜飯', '廚房用具', 880, 790, '2008-04-28'); INSERT INTO shohin VALUES ('0008', '圓珠筆', '辦公用品', 100, NULL, '2009-11-11'); COMMIT; |
表名變更 |
-- 變更表名 將A更名為B; 僅用於MySQL RENAME TABLE A TO B; |