1. 程式人生 > 遊戲 >《龍珠Z:卡卡羅特》第三彈DLC發售預告 為保衛地球而戰

《龍珠Z:卡卡羅特》第三彈DLC發售預告 為保衛地球而戰

本章主要講解資料庫安裝和資料庫基本介紹,考慮易用性及普及度,本課程採取mysql進行教學。

1.1 初識資料庫

資料庫是將大量資料儲存起來,通過計算機加工而成的可以進行高效訪問的資料集合。該資料集合稱為資料庫(Database,DB)。用來管理資料庫的計算機系統稱為資料庫管理系統(Database Management System,DBMS)。

1.1.1 DBMS的種類

DBMS 主要通過資料的儲存格式(資料庫的種類)來進行分類,現階段主要有以下 5 種類型.

  • 層次資料庫(Hierarchical Database,HDB)

  • 關係資料庫(Relational Database,RDB)

    • Oracle Database:甲骨文公司的RDBMS
    • SQL Server:微軟公司的RDBMS
    • DB2:IBM公司的RDBMS
    • PostgreSQL:開源的RDBMS
    • MySQL:開源的RDBMS

    如上是5種具有代表性的RDBMS,其特點是由行和列組成的二維表來管理資料,這種型別的 DBMS 稱為關係資料庫管理系統(Relational Database Management System,RDBMS)。

  • 面向物件資料庫(Object Oriented Database,OODB)

  • XML資料庫(XML Database,XMLDB)

  • 鍵值儲存系統(Key-Value Store,KVS),舉例:MongoDB

本課程將向大家介紹使用 SQL 語言的資料庫管理系統,也就是關係資料庫管理系統(RDBMS)的操作方法。

1.1.2 RDBMS的常見系統結構

使用 RDBMS 時,最常見的系統結構就是客戶端 / 伺服器型別(C/S型別)這種結構(圖 1-3)

1.2 初識 SQL

資料庫中儲存的表結構類似於excel中的行和列,在資料庫中,行稱為記錄,它相當於一條記錄,列稱為欄位,它代表了表中儲存的資料專案。

行和列交匯的地方稱為單元格,一個單元格中只能輸入一條記錄。

SQL是為操作資料庫而開發的語言。國際標準化組織(ISO)為 SQL 制定了相應的標準,以此為基準的SQL 稱為標準 SQL。

完全基於標準 SQL 的 RDBMS 很少,通常需要根據不同的 RDBMS 來編寫特定的 SQL 語句,原則上,本課程介紹的是標準 SQL 的書寫方式。

根據對 RDBMS 賦予的指令種類的不同,SQL 語句可以分為以下三類.

  • DDL

DDL(Data Definition Language,資料定義語言) 用來建立或者刪除儲存資料用的資料庫以及資料庫中的表等物件。DDL 包含以下幾種指令。

  • CREATE : 建立資料庫和表等物件

  • DROP : 刪除資料庫和表等物件

  • ALTER : 修改資料庫和表等物件的結構

  • DML

DML(Data Manipulation Language,資料操縱語言) 用來查詢或者變更表中的記錄。DML 包含以下幾種指令。

  • SELECT :查詢表中的資料

  • INSERT :向表中插入新資料

  • UPDATE :更新表中的資料

  • DELETE :刪除表中的資料

  • DCL

DCL(Data Control Language,資料控制語言) 用來確認或者取消對資料庫中的資料進行的變更。除此之外,還可以對 RDBMS 的使用者是否有許可權操作資料庫中的物件(資料庫表等)進行設定。DCL 包含以下幾種指令。

  • COMMIT : 確認對資料庫中的資料進行的變更

  • ROLLBACK : 取消對資料庫中的資料進行的變更

  • GRANT : 賦予使用者操作許可權

  • REVOKE : 取消使用者的操作許可權

實際使用的 SQL 語句當中有 90% 屬於 DML,本書同樣會以 DML 為中心進行講解。

1.2.1 SQL的基本書寫規則

  • SQL語句要以分號( ; )結尾
  • SQL 不區分關鍵字的大小寫,但是插入到表中的資料是區分大小寫的
  • win 系統預設不區分表名及欄位名的大小寫
  • linux / mac 預設嚴格區分表名及欄位名的大小寫
    * 本教程已統一調整表名及欄位名的為小寫,以方便初學者學習使用。··
  • 常數的書寫方式是固定的

'abc', 1234, '26 Jan 2010', '10/01/26', '2010-01-26'......

  • 單詞需要用半形空格或者換行來分隔

SQL 語句的單詞之間需使用半形空格或換行符來進行分隔,且不能使用全形空格作為單詞的分隔符,否則會發生錯誤,出現無法預期的結果。

請大家認真查閱《附錄1 - SQL 語法規範》,養成規範的書寫習慣。

1.2.2 資料庫的建立( CREATE DATABASE 語句)

語法:

CREATE DATABASE < 資料庫名稱 > ;

建立本課程使用的資料庫

CREATE DATABASE shop;

1.2.3 表的建立( CREATE TABLE 語句)

語法:

CREATE TABLE < 表名 >
( < 列名 1> < 資料型別 > < 該列所需約束 > ,
 < 列名 2> < 資料型別 > < 該列所需約束 > ,
 < 列名 3> < 資料型別 > < 該列所需約束 > ,
 < 列名 4> < 資料型別 > < 該列所需約束 > ,
 .
 .
 .
 < 該表的約束 1> , < 該表的約束 2> ,……);

建立本課程用到的商品表

CREATE TABLE product
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));

1.2.4 命名規則

  • 只能使用半形英文字母、數字、下劃線(_)作為資料庫、表和列的名稱
  • 名稱必須以半形英文字母開頭

表1-3 商品表和 product 表列名的對應關係

1.2.5 資料型別的指定

資料庫建立的表,所有的列都必須指定資料型別,每一列都不能儲存與該列資料型別不符的資料。

四種最基本的資料型別

  • INTEGER 型

用來指定儲存整數的列的資料型別(數字型),不能儲存小數。

  • CHAR 型

用來儲存定長字串,當列中儲存的字串長度達不到最大長度的時候,使用半形空格進行補足,由於會浪費儲存空間,所以一般不使用。

  • VARCHAR 型

用來儲存可變長度字串,定長字串在字元數未達到最大長度時會用半形空格補足,但可變長字串不同,即使字元數未達到最大長度,也不會用半形空格補足。

  • DATE 型

用來指定儲存日期(年月日)的列的資料型別(日期型)。

1.2.6 約束的設定

約束是除了資料型別之外,對列中儲存的資料進行限制或者追加條件的功能。

NOT NULL是非空約束,即該列必須輸入資料。

PRIMARY KEY是主鍵約束,代表該列是唯一值,可以通過該列取出特定的行的資料。

1.2.7 表的刪除和更新

  • 刪除表的語法:
DROP TABLE < 表名 > ;
  • 刪除 product 表

需要特別注意的是,刪除的表是無法恢復的,只能重新插入,請執行刪除操作時要特別謹慎。

DROP TABLE product;
  • 新增列的 ALTER TABLE 語句
ALTER TABLE < 表名 > ADD COLUMN < 列的定義 >;
  • 新增一列可以儲存100位的可變長字串的 product_name_pinyin 列
ALTER TABLE product ADD COLUMN product_name_pinyin VARCHAR(100);
  • 刪除列的 ALTER TABLE 語句
ALTER TABLE < 表名 > DROP COLUMN < 列名 >;
  • 刪除 product_name_pinyin 列
ALTER TABLE product DROP COLUMN product_name_pinyin;

ALTER TABLE 語句和 DROP TABLE 語句一樣,執行之後無法恢復。誤添的列可以通過 ALTER TABLE 語句刪除,或者將表全部刪除之後重新再建立。
【擴充套件內容】

  • 清空表內容
TRUNCATE TABLE TABLE_NAME;

優點:相比drop / deletetruncate用來清除資料時,速度最快。

  • 資料的更新

基本語法:

UPDATE <表名>
   SET <列名> = <表示式> [, <列名2>=<表示式2>...];
 WHERE <條件>;-- 可選,非常重要。
 ORDER BY 子句;  --可選
 LIMIT 子句; --可選

使用 update 時要注意新增 where 條件,否則將會將所有的行按照語句修改

-- 修改所有的註冊時間
UPDATE product
   SET regist_date = '2009-10-10';
-- 僅修改部分商品的單價
UPDATE product
   SET sale_price = sale_price * 10
 WHERE product_type = '廚房用具';

使用 UPDATE 也可以將列更新為 NULL(該更新俗稱為NULL清空)。此時只需要將賦值表示式右邊的值直接寫為 NULL 即可。

-- 將商品編號為0008的資料(圓珠筆)的登記日期更新為NULL
UPDATE product
   SET regist_date = NULL
 WHERE product_id = '0008';

和 INSERT 語句一樣, UPDATE 語句也可以將 NULL 作為一個值來使用。
但是,只有未設定 NOT NULL 約束和主鍵約束的列才可以清空為NULL。如果將設定了上述約束的列更新為 NULL,就會出錯,這點與INSERT 語句相同。

多列更新

UPDATE 語句的 SET 子句支援同時將多個列作為更新物件。

-- 基礎寫法,一條UPDATE語句只更新一列
UPDATE product
   SET sale_price = sale_price * 10
 WHERE product_type = '廚房用具';
UPDATE product
   SET purchase_price = purchase_price / 2
 WHERE product_type = '廚房用具';

該寫法可以得到正確結果,但是程式碼較為繁瑣。可以採用合併的方法來簡化程式碼。

-- 合併後的寫法
UPDATE product
   SET sale_price = sale_price * 10,
       purchase_price = purchase_price / 2
 WHERE product_type = '廚房用具';

需要明確的是,SET 子句中的列不僅可以是兩列,還可以是三列或者更多。

1.2.8 向 product 表中插入資料

為了學習 INSERT 語句用法,我們首先建立一個名為 productins 的表,建表語句如下:

CREATE TABLE productins
(product_id    CHAR(4)      NOT NULL,
product_name   VARCHAR(100) NOT NULL,
product_type   VARCHAR(32)  NOT NULL,
sale_price     INTEGER      DEFAULT 0,
purchase_price INTEGER ,
regist_date    DATE ,
PRIMARY KEY (product_id)); 

基本語法:

INSERT INTO <表名> (列1, 列2, 列3, ……) VALUES (值1, 值2, 值3, ……);

對錶進行全列 INSERT 時,可以省略表名後的列清單。這時 VALUES子句的值會預設按照從左到右的順序賦給每一列。

-- 包含列清單
INSERT INTO productins (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15');
-- 省略列清單
INSERT INTO productins VALUES ('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15');

原則上,執行一次 INSERT 語句會插入一行資料。插入多行時,通常需要迴圈執行相應次數的 INSERT 語句。其實很多 RDBMS 都支援一次插入多行資料

-- 通常的INSERT
INSERT INTO productins VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11');
INSERT INTO productins VALUES ('0003', '運動T恤', '衣服', 4000, 2800, NULL);
INSERT INTO productins VALUES ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20');
-- 多行INSERT ( DB2、SQL、SQL Server、 PostgreSQL 和 MySQL多行插入)
INSERT INTO productins VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11'),
                              ('0003', '運動T恤', '衣服', 4000, 2800, NULL),
                              ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20');
-- Oracle中的多行INSERT
INSERT ALL INTO productins VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11')
           INTO productins VALUES ('0003', '運動T恤', '衣服', 4000, 2800, NULL)
           INTO productins VALUES ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20')
SELECT * FROM DUAL;
-- DUAL是Oracle特有(安裝時的必選項)的一種臨時表A。因此“SELECT *FROM DUAL” 部分也只是臨時性的,並沒有實際意義。

INSERT 語句中想給某一列賦予 NULL 值時,可以直接在 VALUES子句的值清單中寫入 NULL。想要插入 NULL 的列一定不能設定 NOT NULL 約束。

INSERT INTO productins (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0006', '叉子', '廚房用具', 500, NULL, '2009-09-20');

還可以向表中插入預設值(初始值)。可以通過在建立表的CREATE TABLE 語句中設定DEFAULT約束來設定預設值。

CREATE TABLE productins
(product_id CHAR(4) NOT NULL,
(略)
sale_price INTEGER
(略)	DEFAULT 0, -- 銷售單價的預設值設定為0;
PRIMARY KEY (product_id));

可以使用INSERT … SELECT 語句從其他表複製資料。

-- 將商品表中的資料複製到商品複製表中
INSERT INTO productcopy (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
SELECT product_id, product_name, product_type, sale_price, purchase_price, regist_date
  FROM Product;
  • 本課程用表插入資料sql如下:
- DML :插入資料
STARTTRANSACTION;
INSERT INTO product VALUES('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
INSERT INTO product VALUES('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11');
INSERT INTO product VALUES('0003', '運動T恤', '衣服', 4000, 2800, NULL);
INSERT INTO product VALUES('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20');
INSERT INTO product VALUES('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15');
INSERT INTO product VALUES('0006', '叉子', '廚房用具', 500, NULL, '2009-09-20');
INSERT INTO product VALUES('0007', '擦菜板', '廚房用具', 880, 790, '2008-04-28');
INSERT INTO product VALUES('0008', '圓珠筆', '辦公用品', 100, NULL, '2009-11-11');
COMMIT;

練習題

1.1

編寫一條 CREATE TABLE 語句,用來建立一個包含表 1-A 中所列各項的表 Addressbook (地址簿),併為 regist_no (註冊編號)列設定主鍵約束

表1-A 表 Addressbook (地址簿)中的列

CREATE TABLE Addressbook (
	regist_no INT NOT NULL PRIMARY KEY,
	NAME VARCHAR ( 128 ) NOT NULL,
	address VARCHAR ( 256 ) NOT NULL,
	tel_no CHAR ( 10 ),
mail_address CHAR ( 10 ) 
)

1.2

假設在建立練習1.1中的 Addressbook 表時忘記新增如下一列 postal_code (郵政編碼)了,請把此列新增到 Addressbook 表中。

列名 : postal_code

資料型別 :定長字串型別(長度為 8)

約束 :不能為 NULL

ALTER TABLE Addressbook ADD COLUMN (
postal_code CHAR ( 8 ) NOT NULL)

1.3

編寫 SQL 語句來刪除 Addressbook 表。

DROP TABLE Addressbook

1.4

編寫 SQL 語句來恢復刪除掉的 Addressbook 表。

CREATE TABLE Addressbook (
	regist_no INT NOT NULL PRIMARY KEY,
	NAME VARCHAR ( 128 ) NOT NULL,
	address VARCHAR ( 256 ) NOT NULL,
	tel_no CHAR ( 10 ),
	mail_address CHAR ( 10 ),
postal_code CHAR ( 8 ) NOT NULL 
)