MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開(kāi)發(fā),目前屬于 Oracle 旗下產(chǎn)品。MySQL 最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在 WEB 應(yīng)用方面MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之一。
MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫(kù)管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi),這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語(yǔ)言是用于訪問(wèn)數(shù)據(jù)庫(kù)的最常用標(biāo)準(zhǔn)化語(yǔ)言。MySQL 軟件采用了雙授權(quán)政策,它分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開(kāi)放源碼這一特點(diǎn),一般中小型網(wǎng)站的開(kāi)發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫(kù)。由于其社區(qū)版的性能卓越,搭配 PHP 和 Apache 可組成良好的開(kāi)發(fā)環(huán)境。

創(chuàng)建表
MySQL不僅用于表數(shù)據(jù)操縱,而且還可以用來(lái)執(zhí)行數(shù)據(jù)庫(kù)和表的所有操作,包括表本身的創(chuàng)建和處理。一般有兩種創(chuàng)建表的方法:
(1)使用具有交互式創(chuàng)建和管理表的工具;
(2)表也可以直接用MySQL語(yǔ)句操縱。
一、表創(chuàng)建基礎(chǔ)
為利用CREATE TABLE創(chuàng)建表,必須給出下列信息:
(1)新表的名字,在關(guān)鍵字CREATE TABLE之后給出;
(2)表列的名字和定義,用逗號(hào)隔開(kāi)。
CREATE TABLE語(yǔ)句也可能會(huì)包括其他關(guān)鍵字或選項(xiàng),但至少要包括表的名字和列的細(xì)節(jié)。創(chuàng)建customers的代碼如下:
CREATE TABLE customers
(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL,
cust_address char(50) NULL,
cust_city char(50) NULL,
cust_state char(50) NULL,
cust_zip char(50) NULL,
cust_country char(50) NULL,
cust_contact char(50) NULL,
cust_email char(50) NULL,
PRIMARY KEY (cust_id)
)ENGINE=InnoDB;
二、使用NULL值
NULL值就是沒(méi)有值或缺值。允許NULL值的列也允許在插入行時(shí)不給出該列的值。不允許NULL值的列不接受該列沒(méi)有值的行,換句話說(shuō),在插入或更新行時(shí),該列必須有值。
每個(gè)表列或者是NULL列,或者是NOT NULL列,這種狀態(tài)在創(chuàng)建時(shí)由表的定義規(guī)定。NULL為默認(rèn)設(shè)置,如果不指定NOT NULL,則認(rèn)為指定的是NULL。
三、主鍵介紹
主鍵值必須唯一。即,表中的每個(gè)行必須具有唯一的主鍵值。如果主鍵使用單個(gè)列,則它的值必須唯一。如果使用多個(gè)列,則這些列的組合值必須唯一。為創(chuàng)建由多個(gè)列組成的主鍵,應(yīng)該以逗號(hào)分隔的列表給出各列名,如下所示:
CREATE TABLE orderitems
(
order_num int NOT NULL,
order_item int NOT NULL,
prod_id char(10) NOT NULL,
quantity int NOT NULL,
item_price decimal(8,2) NOT NULL,
PRIMARY KEY (order_num,order_item)
)ENGINE=InnoDB;
四、使用AUTO_INCREMENT
AUTO_INCREMENT告訴MySQL,本列每當(dāng)增加一行時(shí)自動(dòng)增量。每次執(zhí)行一個(gè)INAERT操作時(shí),MySQL自動(dòng)對(duì)該列增量(從而才有了這個(gè)關(guān)鍵字AUTO_INCREMENT),給該列賦予下一個(gè)可用的值。這樣給每個(gè)行分配一個(gè)唯一的cust_id,從而可以用作主鍵值。
每個(gè)表只允許一個(gè)AUTO_INCREMENT列,而且它必須被索引(如,通過(guò)使它成為主鍵)。
五、指定默認(rèn)值
如果在插入行時(shí)沒(méi)有給出值,MySQL允許指定此時(shí)使用的默認(rèn)值。默認(rèn)值用CREATAE TABLE語(yǔ)句的列定義中的DEFAULT關(guān)鍵字指定。示例如下:
CREATAE TABLE orderitems
(
order_num int NOT NULL,
order_item int NOT NULL,
prod_id char(10) NOT NULL,
quantity int NOT NULL DEFAULT 1,
item_price decimal(8,2) NOT NULL,
PRIMARY KEY(order_num,order_item)
)ENGINE=InnoDB;
quantity列包含訂單中每項(xiàng)物品的數(shù)量。在例子中,給該列的描述添加文本DEFAULT 1指示MySQL,在未給出數(shù)量的情況下使用數(shù)量1。
六、引擎類(lèi)型
與其他DBMS一樣,MySQL有一個(gè)具體管理和處理數(shù)據(jù)的內(nèi)部引擎。在使用CREATE TABLE語(yǔ)句時(shí),該引擎具體創(chuàng)建表,而在你使用SELECT語(yǔ)句或進(jìn)行其他數(shù)據(jù)庫(kù)處理時(shí),該引擎在內(nèi)部處理你的請(qǐng)求。多數(shù)時(shí)候,此引擎都隱藏在DBMS內(nèi),不需要過(guò)多關(guān)注它。
但MySQL與其他DBMS不一樣,它具有多種引擎。它打包多個(gè)引擎,這些引擎都隱藏在MySQL服務(wù)器內(nèi),全都能執(zhí)行CREATE TABLE和SELECT等命令。每個(gè)引擎具有各自不同的功能和特性,為不同的任務(wù)選擇正確的引擎能獲得良好的功能和靈活性。如果忽略ENGINE=語(yǔ)句,則使用默認(rèn)引擎(很可能是MyISAM),多數(shù)SQL語(yǔ)句都會(huì)默認(rèn)使用它。但并不是所有的語(yǔ)句都默認(rèn)使用它,這就是為什么ENGINE=語(yǔ)句很重要的原因。以下十幾個(gè)需要知道的引擎:
(1)InnoDB是一個(gè)可靠的事務(wù)處理引擎,它不支持全文本搜索;
(2)MEMORY在功能等同于MyISAM,但由于數(shù)據(jù)存儲(chǔ)在內(nèi)存(不是磁盤(pán))中,速度很快(特別適合于臨時(shí)表);
(3)MyISAM是一個(gè)性能極高的引擎,它支持全文本搜索,但不支持事務(wù)處理。
操縱表
一、更新表
為更新表定義,可使用ALERT TABLE 語(yǔ)句。為了使用ALERT TABLE更改表結(jié)構(gòu),必須給出下邊的信息:
(1)在ALERT TABLE之后給出要改的表名(該表必須存在,否則將出錯(cuò));
(2)所做更改的列表。
給表添加一個(gè)列:
ALTER TABLE vendors ADD vend_phone CHAR(20);
這條語(yǔ)句給表vendors增加一個(gè)名為vend_phone的列,必須明確其數(shù)據(jù)類(lèi)型。刪除剛添加的列:
ALTER TABLE vendors DROP COLUMN vend_phone;
二、刪除表
刪除表(刪除整個(gè)表而不是其內(nèi)容),使用DROP TABLE語(yǔ)句即可:
DROP TABLE customers2;
這條語(yǔ)句刪除customers2(假設(shè)它存在)。刪除表沒(méi)有確認(rèn),也不能撤銷(xiāo),執(zhí)行這條語(yǔ)句將永久刪除該表。
三、重命名表
使用RENAME TABLE語(yǔ)句可以重命名一個(gè)表:
RENAME TABLE customers2 TO customers;
RENAME TABLE語(yǔ)句所做的僅是重命名一個(gè)表。可以使用下面的語(yǔ)句對(duì)多個(gè)表重命名:
RENAME TABLE backup_customers TO customers,
backup_vendors TO vendors,
backup_products TO products;