1 創建和操作表
1.1 創建表
MySQL不僅用於表數據操作,而且還可以用來執行數據庫和表的所有操作,包括表本身的創建和處理。創建表的兩種方法:
- 使用具有交互式創建和管理表的工具
- 表也可以直接用MySQL語句操作
1.1.1 表創建基礎
爲利用CREATE TABLE創建表,必須給出下列信息:
- 新表的名字,在關鍵字CREATE TABLE之後給出
- 表列的名字和定義,用逗號分隔
示例如下:
CREATE TABLE table3
(
id int NOT NULL AUTO_INCREMENT,
name char(50) NOT NULL,
phone char(50) NOT NULL,
home char(50) NOT NULL,
PRIMARY KEY(id)
)ENGINE=InnoDB;
結果如下:
各列之間用逗號分隔,表的主鍵可以在創建表時用PRIMARY KEY關鍵字指定。在創建新表時,指定的表名必須不存在,否則將出錯。
1.1.2 使用NULL值
NULL值就是沒有值或缺省值,允許NULL值的列(NULL)也允許在插入行時不給出該列的值。不允許NULL值的列(NOT NULL)不接受該列沒有值的行,即在插入或更新行時,該列必須有值
1.1.3 主鍵再介紹
主鍵值必須唯一,即表中的每個行必須具有唯一的主鍵值。若主鍵使用單個列,則其值必須唯一,若使用多個列,則這些列的組合值必須唯一。
PRIMARY KEY(id) #單列組成的主鍵
PRIMARY KEY(id,name) #多列組成的主鍵
1.1.4 使用AUTO_INCREMENT
AUTO_INCREMENT告訴MySQL,本列每當增加一行時自動增量。每次執行一個INSERT操作時, MySQL自動對該列增量,給該列賦予下一個可用的值。每個表只允許一個AUTO_INCREMENT列,而且它必須被索引
1.1.5 指定默認值
如果在插入行時沒有給出值, MySQL允許指定此時使用的默認值。默認值用CREATE TABLE語句的列定義中的DEFAULT關鍵字指定。
示例如下:
CREATE TABLE table3
(
id int NOT NULL AUTO_INCREMENT,
name char(50) NOT NULL,
phone char(50) NOT NULL,
home char(50) NOT NULL,
quantity int NOT NULL DEFAULT 1,
PRIMARY KEY(id)
)ENGINE=InnoDB;
1.1.6 引擎類型
現在解釋上面例子中的ENGINE=InnoDB語句。
與其他DBMS一樣, MySQL有一個具體管理和處理數據的內部引擎。在你使用CREATE TABLE語句時,該引擎具體創建表,而在你使用SELECT語句或進行其他數據庫處理時,該引擎在內部處理請求。這些引擎具有各自不同的功能和特性,爲不同的任務選擇正確的引擎能獲得良好的功能和靈活性。
以下是幾個需要知道的引擎:
- InnoDB是一個可靠的事務處理引擎,它不支持全文本搜索;
- MEMORY在功能上等同於MyISAM,但由於數據存儲在內存(不是磁盤)中,速度很快(特別是適合於臨時表);
- MyISAM是一個性能極高的引擎,其支持全文本搜索,但不支持事務處理。
1.2 更新表
爲更新表定義,可使用ALTER TABLE語句。使用ALTER TABLE更改表結構時,必須給出下面的信息:
- 在ALTER TABLE之後給出要更改的表名(該表必須存在,否則將出錯);
- 所做更改的列表
例如給table3增加一個列:
ALTER TABLE table3 ADD order_date char(20);
結果如下:
注意添加列的時候,要在列名後面指定列的數據類型
1.3 刪除表
刪除表(刪除整個表而不是其內容),使用DROP TABLE語句即可:
DROP TABLE table3;
這條語句刪除customers 2表(假設它存在)。刪除表沒有確認,
也不能撤銷,執行這條語句將永久刪除該表。
1.4 重命名錶
使用RENAME TABLE語句可以重命名一個表:
RENAME TABLE table3 TO mysqltable;
2 使用視圖
視圖是虛擬的表,與包含數據的表不同,視圖只包含使用時動態檢索數據的查詢。
2.1 視圖
2.1.1 使用視圖的原因
視圖的常見應用:
- 重用SQL語句
- 簡化複雜的SQL操作
- 使用表的組成部分而不是整個表
- 保護數據
- 更改數據格式和表示
在視圖創建之後,可以用於表基本相同的方式利用它們,可以對視圖執行SELECT操作,過濾和排序數據。
2.1.2 視圖的規則和限制
關於視圖創建和使用的一些最常見的規則和限制:
- 與表一樣,視圖必須唯一命名
- 對於可以創建的視圖數目沒有限制
- 視圖可以嵌套,即可以利用從其他視圖中檢索數據的查詢來構造一個視圖
- ORDER BY可以用在視圖中,但如果從該視圖檢索數據SELECT中也含有ORDER BY,那麼該視圖中的ORDER BY將被覆蓋。
- 視圖不能索引,也不能有關聯的觸發器或默認值
- 視圖和表可以一起用
2.2 使用視圖
- 視圖用CREATE VIEW語句來創建
- 使用SHOW CREATE VIEW viewname;來查看創建視圖的語句
- 用DROP刪除視圖,其語法爲DROP VIEW viewname;
- 更新視圖時,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW。
3 使用存儲過程
存儲過程簡單來說,就是爲以後的使用而保存的一條或多條MySQL語句的集合。可將其視爲批文件,雖然其作用不僅限於批處理
使用存儲過程的原因:
-
通過把處理封裝在容易使用的單元中,從而簡化複雜的操作
-
由於不要求反覆建立一系列處理步驟,這保證了數據的完整性。如果所有開發人員和應用程序都使用同一(試驗和測試)存儲過程,則所使用的代碼都是相同的
-
簡化對變動的管理。如果表名、列名或業務邏輯(或別的內容)有變化,只需要更改存儲過程的代碼。使用它的人員甚至不需要知道這些變化
-
提高性能,因爲使用存儲過程比使用單獨的SQL語句要快。
-
存在一些只能用在單個請求中的MySQL元素和特性,存儲過程可使用其來編寫功能更加靈活的代碼
3.1 執行存儲過程
MySQL稱存儲過程的執行爲調用,因此MySQL執行存儲過程的語句爲CALL。CALL接受存儲過程的名字以及需要傳遞給它的任意參數。示例如下:
CALL productpricing(@pricelow, @pricehigh, @priceaverage);
執行名爲productpricing的存儲過程,它計算並返回產品最低、最高和平均價格。
3.2 創建存儲過程
示例如下,返回產品平均價格的存儲過程
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(price) AS priceaverage
FROM products;
END;
BEGIN和END語句用來限定存儲過程體
mysql命令行客戶機的分隔符: 默認的MySQL語句分隔行爲分號(;)。mysql命令行實用程序也使用(;)作爲語句分隔符。如果命令行實用程序要解釋存儲過程自身內的;字符,則它們最終不會成爲存儲過程的成分,這會使存儲過程中的SQL出現句法錯誤。
解決辦法是臨時更改命令行實用程序的語句分隔符,如下所示:
DELIMITER //
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(price) AS priceaverage
FROM table1;
END //
DELIMITER ;
其中,DELIMITER //
告訴命令行實用程序使用//
作爲新的語句結束分隔符,可以看到標誌存儲過程結束的END定義爲END //
而不是END
。這樣,存儲過程體內的;仍然保持不動,並且
正確地傳遞給數據庫引擎。最後,爲恢復爲原來的語句分隔符,可使用DELIMITER ;
。
除\符號外,任何字符都可以用作語句分隔符。
使用上述存儲過程:
CALL productpricing();
3.3 刪除存儲過程
存儲過程在創建之後,被保存在服務器上以供使用,直至被刪除。刪除命令從服務器中刪除存儲過程,可使用以下語句實現刪除操作:
DROP PROCEDURE productpricing;
這裏存儲過程名的後面沒有使用(),只給出了存儲過程名。
3.4 使用參數
使用OUT參數
productpricing只是一個簡單的存儲過程,它簡單地顯示SELECT語句的結果。存儲過程並不顯示結果,而是把結果返回給所指定的變量內存中一個特定的位置,用來臨時存儲是數據。
DELIMITER //
CREATE PROCEDURE productpricing(
OUT pl DECIMAL(8,2),
OUT ph DECIMAL(8,2),
OUT pa DECIMAL(8,2)
)
BEGIN
SELECT Min(price) INTO pl FROM table1;
SELECT Max(price)INTO ph FROM table1;
SELECT Avg(price) INTO pa FROM table1;
END //
DELIMITER ;
此存儲過程接受3個參數: pl存儲最低價格, ph存儲最高價格, pa存儲平均價格。每個參數必須具有指定的類型,這裏使用十進制值。
爲調用此修改過的存儲過程,必須指定3個變量名,如下所示:
CALL productpricing(@pricelow,@pricehigh,@priceaverage);
變量名 所有MySQL變量都必須以@開始。
爲顯示檢索出的最低價格,可進行如下操作:
SELECT @pricelow;
結果如下圖:
說明: 由於在語句中使用了分號,因此要使用前面提到的臨時修改分隔符DELIMITER //
,這樣才能在BEGIN後面的語句中使用分號,END使用//
作爲分隔符,最後使用DELIMITER ;
語句恢復分號作爲分隔符。使用CALL語句調用該存儲過程,這裏指定了三個參數,使用SELECT @pricelow;
語句顯示結果。
**說明:**這裏一定要使用DELIMITER //
該語句修改分隔符,否則在SELECT語句後面的分號回報錯。
使用IN參數
DELIMITER //
CREATE PROCEDURE ordetotal(
IN number INT,
OUT total DECIMAL(8,2)
)
BEGIN
SELECT Sum(price * quantity) FROM table1 WHERE id = number INTO total;
END //
DELIMITER ;
調用示例:
CALL ordetotal(2,@total);
爲顯示檢索出的結果,可進行如下操作:
SELECT @total;
再次計算另外一個id的時候,需要再次調用存儲過程,然後重新顯示變量
3.5 檢查存儲過程
爲顯示用來創建一個存儲過程的CREATE語句,使用SHOW CREATE PROCEDURE語句:
SHOW CREATE PROCEDURE pricing;
限制過程狀態結果 SHOW PROCEDURE STATUS列出所有存儲過程。爲限制其輸出,可使用LIKE指定一個過濾模式,例如:
SHOW PROCEDURE STATUS LIKE 'pricing';