MySQL命令學習筆記(六)

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;

結果如下:
create
各列之間用逗號分隔,表的主鍵可以在創建表時用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);

結果如下:
ALTER
注意添加列的時候,要在列名後面指定列的數據類型

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;

結果如下圖:
CREATE 3parameter
說明: 由於在語句中使用了分號,因此要使用前面提到的臨時修改分隔符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';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章