mysql必知必會

基本知識

  1. 關係數據庫設計把數據存儲在多個表中,使數據更容易操縱、維護和重用。不用深究如何以及爲什麼進行關係數據庫設計,在某種程度上說,設計良好的數據庫模式都是關聯的。

  2. help show | select | update …; 查看相關命令的幫助

  3. MySql語句都以(;)結尾。(多條SQL語句必須以分號(;)分隔。 MySQL如同多數DBMS一樣,不需要在單條SQL語句後加分號。但特定的DBMS可能必須在單條SQL語句後加上分號。當然,如果願意可以總是加上分號。事實上,即使不一定需要,但加上分號肯定沒有壞處。如果你使用的是mysql命令行,必須加上分號來結束SQL語句。)

  4. 對所有SQL關鍵字使用大寫,而對所有列和表名使用小寫。(SQL語句不區分大小寫,因此SELECT與select是相同的。同樣,寫成Select也沒有關係。許多SQL開發人員喜歡對所有SQL關鍵字使用大寫,而對所有列和表名使用小寫,這樣做使代碼更易於閱讀和調試。)

  5. 將SQL語句分成多行更容易閱讀和調試。(使用空格 在處理SQL語句時,其中所有空格都被忽略。 SQL語句可以在一行上給出,也可以分成許多行。多數SQL開發人員認爲將SQL語句分成多行更容易閱讀和調試。)


連接MySQL數據庫

mysqlu用戶名 [–h主機名或者IP地址]p密碼

說明:用戶名是你登錄的用戶,主機名或者IP地址爲可選項,如果是本地連接則不需要,遠程連接需要填寫,端口默認是3306,否則需要填寫端口號,密碼是對應用戶的密碼。

注意:
1. 該命令是在Windows命令行窗口下執行,而不是MySQL的命令行;
2. 輸入-p後可以直接跟上密碼,也可以按回車,會提示你輸入密碼,二者都是相同的效果;
3. –p密碼選項不一定是要在最後;
4. –u、-h、-p後無空格。


數據庫基本操作

1. 選擇數據庫

USE 數據庫名; 

注意: 必須先使用USE打開數據庫,才能讀取其中的數據。

2. 顯示數據庫和表

SHOW DATABASES;  

說明:返回可用數據庫的一個列表。包含在這個列
表中的可能有MySQL內部使用的數據庫。

SHOW TABLES; 

說明:返回當前選擇的數據庫內可用表的列表。

SHOW COLUMNS FROM 表名;  
DESCRIBE 表名;(更快捷的方式)

說明:要求給出一個表名,它對每個字段返回一行,行中包含字段名、數據類型、是否允許NULL、鍵信息、默認值以及其他信息。


數據查詢

SELECT 列名 FROM 表名;

說明:上述語句利用SELECT語句從表中檢索一列。所需的列名在SELECT關鍵字之後給出, FROM關鍵字指出從其中檢索數據的表名。

注意:如果沒有明確排序查詢結果,則返回的數據的順序沒有特殊意義。返回數據的順序可能是數據被添加到表中的順序,也可能不是。只要返回相同數目的行,就是正常的。

SELECT 列名1, 列名2, 列名3 FROM 表名;

說明:這條語句使用SELECT語句從表中選擇數據。在這個例子中,指定了3個列名,列名之間用逗號分隔。

SELECT * FROM 表名;  

說明:如果給定一個通配符(*),則返回表中所有列。列的順序一般是列在表定義中出現的順序。但有時候並不是這樣的,表的模式的變化(如添加或刪除列)可能會導致順序的變化。

注意:
1. 一般,除非你確實需要表中的每個列,否則最好別使用*通配符。雖然使用通配符可能會使你自己省事,不用明確列出所需列,但檢索不需要的列通常會降低檢索和應用程序的性能。
2. 使用通配符有一個大優點。由於不明確指定列名(因爲星號檢索每個列),所以能檢索出名字未知的列。

SELECT DISTINCT 列名 FROM 表名; 

說明:SELECT DISTINCT列名告訴MySQL只返回不同(唯一)的對應列名的行,去掉重複行,如果使用DISTINCT關鍵字,它必須直接放在列名的前面。

注意:不能部分使用DISTINCT,DISTINCT關鍵字應用於所有列而不僅是前置它的列。如果給出SELECT DISTINCT 列1,列2,除非指定的兩個列都不同,否則所有行都將被檢索出來。

SELECT 列名 FROM 表名 LIMIT 5, 5;   
SELECT 列名 FROM 表名 LIMIT 5;

說明:
1. LIMIT 5, 5指示MySQL返回從行5開始的5行。第一個數爲開始位置,第二個數爲要檢索的行數。
2. LIMIT 5 指示MySQL返回不多於5行。

注意:
1. 行0檢索出來的第一行爲行0而不是行1。因此,LIMIT 1, 1將檢索出第二行而不是第一行。
2. 在行數不夠時,LIMIT中指定要檢索的行數爲檢索的最大行數。如果沒有足夠的行(例如,給出LIMIT 10, 5,但只有13行),MySQL將只返回它能返回的那麼多行。

SELECT 表名.列名 FROM 數據庫名.表名;

說明:指定了一個完全限定的列名和表名。

排序查詢數據

SELECT 列名 FROM 表名 ORDER BY 列名;  

說明:將輸出的結果根據列進行排序。

注意:通過非選擇列進行排序。通常,ORDER BY子句中使用的列將是爲顯示所選擇的列。但是,實際上並不一定要這樣,用非檢索的列排序數據是完全合法的。

SELECT 列名1, 列名2, 列名3 FROM 表名 ORDER BY 列名1, 列名2;  

說明:上面的代碼將檢索3個列,並按其中兩個列對結果進行排序,首先按
列1,然後再按列2排序。

SELECT 列名1, 列名2, 列名3 FROM 表名 ORDER BY 列名1 DESC, 列名2 ;  

說明:DESC關鍵字只應用到直接位於其前面的列名。在上例中,只對列名1指定DESC,對列名2不指定。因此,列名1以降序排序,而列名2(在每個價格內)仍然按標準的升序排序。

注意:在多個列上降序排序,如果想在多個列上進行降序排序,必須對每個列指定DESC關鍵字。

應用:使用ORDER BY和LIMIT的組合,能夠找出一個列中最高或最低的值。

SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1; 

分析:prod_price DESC保證行是按照由最昂貴到最便宜檢索的,而LIMIT 1告訴MySQL僅返回一行。

過濾查詢數據

SELECT 列名1, 列名2 FROM 表名 WHERE 列名 [ = | < | <= | > | >= | <> | != ] 值;  
SELECT 列名1, 列名2 FROM 表名 WHERE 列名 BETWEEN 值1 AND2; 
SELECT 列名1, 列名2 FROM 表名 WHERE 列名 IS NULL; 

說明:單引號用來限定字符串。如果將值與串類型的列進行比較,則需要限定引號。用來與數值列進行比較的值不用引號。

注意:不匹配不會返回空值(不匹配的前提表示有值,而NULL值根本就沒有值,所以不會在有值的範圍內,因此需要對無值進行單獨處理。)

參考:過濾數據

複合的過濾查詢數據

SELECT 列名1, 列名2 FROM 表名 WHERE 條件1 AND 條件2; 
SELECT 列名1, 列名2 FROM 表名 WHERE 條件1 OR 條件2; 
SELECT 列名1, 列名2 FROM 表名 WHERE 條件1 OR 條件2 AND 條件3; 
SELECT 列名1, 列名2 FROM 表名 WHERE (條件1 OR 條件2) AND 條件3;
SELECT 列名1, 列名2 FROM 表名 WHERE 列名 IN (值1,值2) ORDER BY 列名;
SELECT 列名1, 列名2 FROM 表名 WHERE 列名 NOT IN (值1,值2) ORDER BY 列名;

說明:
1. SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。
2. IN操作符和OR操作符完成相同功能

IN 操作符的優點:
1. 在使用長的合法選項清單時,IN操作符的語法更清楚且更直觀。
2. 在使用IN時,計算的次序更容易管理(因爲使用的操作符更少)。
3. IN操作符一般比OR操作符清單執行更快。
4. IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建立WHERE子句。

NOT操作符:
對於簡單的WHERE子句,使用NOT確實沒有什麼優勢。但在更復雜的子句中,NOT是非常有用的。例如,在與IN操作符聯合使用時,NOT使找出與條件列表不匹配的行非常簡單。

通配符過濾查詢數據

SELECT 列名1, 列名2 FROM 表名 WHERE 列名 LIKE 'jet%'; 

說明:在執行這條子句時,將檢索任意以jet起頭的詞。

SELECT 列名1, 列名2 FROM 表名 WHERE 列名 LIKE '_ ton anvil';

說明:在執行這條子句時,將檢索任意以一個字符開頭, ton anvil結尾的詞。

通配符:
%: 代表搜索模式中給定位置的0個、1個或多個字符。
_ : 與%能匹配0個字符不一樣,_總是匹配一個字符,不能多也不能少。

注意:
1. MySQL的通配符很有用。但是通配符搜索的處理一般要比前面討論的其他搜索所花時間更長。
2. 根據MySQL的配置方式,搜索可以是區分大小寫的。如果區分大小寫,’jet%’與JetPack 1000將不匹配。

技巧:
1. 不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。
2. 在確實需要使用通配符時,除非絕對有必要,否則不要把它們用在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起來是最慢的。
3. 仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數


正則表達式

說明:
1. 當出現複雜的過濾條件時,可以使用正則表達式。
2. 所有種類的程序設計語言、文本編輯器、操作系統等都支持正則表達式。
3. MySQL僅支持多數正則表達式實現的一個很小的子集。

SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;

結果:
JetPack 1000
JetPack 2000

分析:
這裏使用了正則表達式.000。 .是正則表達式語言中一個特殊的字符。它表示匹配任意一個字符,因此, 1000和2000都匹配
且返回。

LIKE與REGEXP區別:
1. LIKE匹配整個列。如果被匹配的文本在列值中出現,LIKE將不會找到它,相應的行也不被返回(除非使用通配符)。
2. REGEXP在列值內進行匹配,如果被匹配的文本在列值中出現,REGEXP將會找到它,相應的行將被返回。這是一個非常重要的差別。

注意:
MySQL中的正則表達式匹配(自版本3.23.4後)不區分大小寫(即,大寫和小寫都匹配)。爲區分大小寫,可使用BINARY關鍵字,如WHERE prod_name REGEXP BINARY ‘JetPack .000’。

  1. OR 匹配等價
    ‘1 | 2’ 匹配含1或2的字符串
    ‘[123]’ 匹配含1或2或3的字符串
    ‘[^123]’ 非123其中的字符

  2. 範圍匹配
    [1-3] [6-9] [a-z]

  3. 匹配特殊字符
    ‘\\.’用來匹配.

說明:
多數正則表達式實現使用單個反斜槓轉義特殊字符,以便能使用這些字符本身。但MySQL要求兩個反斜槓( MySQL自己解釋一個,正則表達式庫解釋另一個)。

匹配多個實例

符號 說明
* 0個或多個匹配
+ 1個或多個匹配(等於{1,})
? 0個或1個匹配(等於{0,1})
{n} 指定數目的匹配
{n,} 不少於指定數目的匹配



匹配特定位置

符號 說明
^ 文本的開始
+ 文本的結尾
[[:<:]] 詞的開始
[[:>:]] 詞的結尾

創建計算字段(別名)

說明:計算字段並不實際存在於數據庫表中。計算字段是運行時在SELECT語句內創建的。

1. 拼接字段(Concat())

注意:
多數DBMS使用+或||來實現拼接,MySQL則使用Concat()函數來實現。當把SQL語句轉換成
MySQL語句時一定要把這個區別銘記在心。

刪除多餘空格
LTrim() 刪除左邊空格
RTrim() 刪除右邊空格
Trim() 同時刪除左右空格

2. AS 別名

實例:

SELECT prod_id, quantity, item_price, quantity * item_price 
AS expanded_price FROM orderitems WHERE order_num = 200005;

高級查詢


1. 分組查詢

SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;

說明:通過GROUP BY關鍵字來分組,同時將分組後的數據通過HAVING關鍵字來過濾查詢數據。

SELECT子句順序

子句 說明 是否必須使用
SELECT 要返回的列或表達式
FROM 從中檢索的數據表 僅在從表選擇數據時使用
WHERE 行級過濾
GROUP BY 分組說明 僅在按組計算聚集時使用
HAVING 組級過濾
ORDER BY 輸出排序順序
LIMIT 要檢索的行數


2. 子查詢

SELECT cust_name, cust_contact FROM customers WHERE cust_id IN 
                (SELECT cust_id FROM orders WHERE order_num IN 
                (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'));

說明:爲了執行上述SELECT語句, MySQL實際上必須執行3條SELECT語句。最裏邊的子查詢返回訂單號列表,此列表用於其外面的子查詢的WHERE子句。外面的子查詢返回客戶ID列表,此客戶ID列表用於最外層查詢的WHERE子句。最外層查詢確實返回所需的數據。


3. 聯結查詢
1) 內部聯結

SELECT vend_name, prod_name, prod_price 
FROM vendors INNER JOIN products 
ON vendors.vend_id = products.vend_id;

說明:這裏,兩個表之間的關係是FROM子句的組成部分,以INNER JOIN指定。在使用這種語法時,聯結條件用特定的ON子句而不是WHERE
子句給出。傳遞給ON的實際條件與傳遞給WHERE的相同。(無法檢索出含有空的信息)。

2) 外部聯結
定義:聯結包含了那些在相關表中沒有關聯行的行。這種類型的聯結稱爲外部聯結。

SELECT customers.cust_id, orders.order_num FROM customers 
LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;

說明:在使用OUTER JOIN語法時,必須使用RIGHT或LEFT關鍵字
指定包括其所有行的表(RIGHT指出的是OUTER JOIN右邊的表,而LEFT
指出的是OUTER JOIN左邊的表)。

3) 自聯結

SELECT p1.prod_id, p1.prod_name
FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = 'DTNTR';

說明: 此查詢中需要的兩個表實際上是相同的表,因此products表在FROM子句中出現了兩次。雖然這是完全合法的,但對products的引用具有二義性,因爲MySQL不知道你引用的是products表中的哪個實例。(也可以用子查詢實現)

4) 自然聯結
定義:自然聯結排除多次出現,使每個列只返回一次。

SELECT c.*, o.order_num, o.order_date,
oi.prod_id, oi.quantity, OI.item_price
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = 'FB';

說明:在這個例子中,通配符只對第一個表使用。所有其他列明確列出,所以沒有重複的列被檢索出來。

高級聯結(博客幫助理解)

5) 組合查詢

SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION 
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002);

說明:UNION指示MySQL執行兩條SELECT語句,並把輸出組合成單個查詢結果集。對於更復雜的過濾條件,或者從多個表(而不是單個表)中檢索數據的情形,使用UNION可能會使處理更簡單。
注意:返回重複行,可使用UNION ALL而不是UNION。

6) 全文本搜索
1. 性能相比一般通配符,正則表達式效率要高。
2. 可以將搜索出來的結果按照更好的匹配來排列它們,還可以匹配出不包含該詞,但是包含其它詞的記錄。


插入數據

INSERT INTO customers(
    cust_name,
    cust_email,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country)
VALUES(
    'Pep E. LaPew',
    NULL,
    NULL,
    '100 Main Street',
    'Los Angeles',
    'CA',
    '90046',
    'USA');

說明:總是使用列的列表一般不要使用沒有明確給出列的列表的INSERT語句。使用列的列表能使SQL代碼繼續發揮作用,即使表結構發生了變化。

注意:INSERT操作可能很耗時(特別是有很多索引需要更新時),而且它可能降低等待處理的SELECT語句的性能。如果數據檢索是最重要的(通常是這樣),則可以通過在
INSERT和INTO之間添加關鍵字LOW_PRIORITY,指示MySQL降低INSERT語句的優先級。這也適合於UPDATE 和 DELETE 語句。

更新數據

UPDATE customers 
SET cust_email = '[email protected]'
WHERE cust_id = 1005;

說明:UPDATE語句以WHERE子句結束,它告訴MySQL更新哪一行。沒有WHERE子句,MySQL將會用這個電子郵件地址更新customers表中所有行。

注意:
1. 爲了刪除某個列的值,可設置它爲NULL(假如表定義允許NULL值)
2. 在更新多個列時,只需要使用單個SET命令,每個“列=值”對之間用逗號分隔(最後一列之後不用逗號)。

刪除數據

DELETE FROM customers 
WHERE cust_id = 10006;

注意:
1. ELETE不需要列名或通配符。DELETE刪除整行而不是刪除列。爲了刪除指定的列,請使用UPDATE語句。
2. 如果想從表中刪除所有行,不要使用DELETE。可使用TRUNCATETABLE語句,它完成相同的工作,但速度更快( TRUNCATE實際是刪除原來的表並重新創建一個表,而不
是逐行刪除表中的數據)。


表操作

創建表

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(5) NULL,
    cust_zip char(10) NULL,
    cust_country char(50) NULL,
    cust_contact char(50) NULL,
    cust_email char(255) NULL,
    PRIMARY KEY (cust_id)
) ENGINE=InnoDB;

注意:在創建新表時,指定的表名必須不存在,否則將出錯。如果要防止意外覆蓋已有的表,SQL要求首先手工刪除該表(請參閱後面的小節),然後再重建它,而不是簡單地用創建表語句覆蓋它。

更新表

ALTER TABLE vendors
ADD vend_phone CHAR(20);

說明:這條語句給vendors表增加一個名爲vend_phone的列,必須明確其數據類型。

ALTER TABLE vendors
DROP COLUMN vend_phone;

說明:刪除某列。

ALTER TABLE的一種常見用途是定義外鍵

ALTER TABLE orderitems
ADD CONSTRAINT fk_orderitems_orders
FOREIGN KEY (order_num) REFERENCES orders (order_num);

說明:對單個表進行多個更改,可以使用單條ALTER TABLE語句,每個更改用逗號分隔。

刪除表

DROP TABLE customers2;

說明:這條語句刪除customers2表(假設它存在)。刪除表沒有確認,也不能撤銷,執行這條語句將永久刪除該表。

重命名錶

RENAME TABLE customers2 TO customers;

說明:將表customers2 重命名爲customers.


視圖

定義:視圖是虛擬的表。與包含數據的表不一樣,視圖只包含使用時動態檢索數據的查詢。

  1. 視圖用CREATE VIEW語句來創建。
  2. 使用SHOW CREATE VIEW viewname;來查看創建視圖的語句。
  3. 用DROP刪除視圖,其語法爲DROP VIEW viewname;。
  4. 更新視圖時,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW。如果要更新的視圖不存在,則第2條更新語句會創建一個視圖;如果要更新的視圖存在,則第2條更新語句會替換原有視圖。

視圖的最常見的應用之一是隱藏複雜的SQL,這通常都會涉及聯結。

CREATE VIEW productcustomers AS
SELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num;

說明:這條語句創建一個名爲productcustomers的視圖,它聯結三個表,以返回已訂購了任意產品的所有客戶的列表。如果執行SELECT * FROM productcustomers,將列出訂購了任意產品的客戶。

存儲過程(函數)

定義: 存儲過程簡單來說,就是爲以後的使用而保存的一條或多條MySQL語句的集合。可將其視爲批文件,雖然它們的作用不僅限於批處理。

1. 創建存儲過程

1) 簡化版本

CREATE PROCEDURE productpricing()
BEGIN
    SELECT Avg(prod_price) AS priceaverage
    FROM products;
END;

說明: 在MySQL處理這段代碼時,它創建一個新的存儲過程productpricing。沒有返回數據,因爲這段代碼並未調用存儲過程,這裏只是爲以後使用而創建它。

注意:如果是命令行實用程序要解釋存儲過程自身內的 ; 字符,它們不會成爲存儲過程的一部分,會出現語法錯誤。

可以如下操作(臨時更改分隔符):

DELIMITER //

CREATE PROCEDURE productpricing()
BEGIN
    SELECT Avg(prod_price) AS priceaverage
    FROM products;
END //

DELIMITER ;

注意: 除\符號外,任何字符都可以用作語句分隔符。

2) 帶參數版本

CREATE PROCEDURE productpricing(
    OUT p1 DECIMAL(8,2),
    OUT ph DECIMAL(8,2),
    OUT pa DECIMAL(8,2)
)
BEGIN
    SELECT Min(prod_price)
    INTO p1
    FROM products;
    SELECT Max(prod_price)
    INTO ph
    FROM products;
    SELECT Avg(prod_price)
    INTO pa
    FROM products;
END;

說明: 此存儲過程接受3個參數: pl存儲產品最低價格, ph存儲產品最高價格, pa存儲產品平均價格。每個參數必須具有指定的類型,這裏使用十進制值。關鍵字OUT指出相應的參數用來從存儲過程傳出一個值(返回給調用者)。MySQL支持IN(傳遞給存儲過程)、 OUT(從存儲過程傳出,如這裏所用)和INOUT(對存儲過程傳入和傳出)類型的參數。存儲過程的代碼位於BEGIN和END語句內,如前所見,它們是一系列
SELECT語句,用來檢索值,然後保存到相應的變量(通過指定INTO關鍵字)


2. 刪除存儲過程

DROP PROCEDURE productpricing;

注意:
- 這條語句刪除剛創建的存儲過程。請注意沒有使用後面的(),只給出存儲過程名。
- 當過程存在想刪除它時(如果過程不存在也不產生錯誤)可使用DROP PROCEDURE IF EXISTS。


3. 執行存儲過程

CALL productpricing(@pricelow, @pricehigh, @priceaverage);

說明: 由於此存儲過程要求3個參數,因此必須正好傳遞3個參數,不多也不少。所以,這條CALL語句給出3個參數。它們是存儲過程將保存結果的3個變量的名字。

注意: 所有MySQL變量都必須以@開始。

遊標

來源:使用簡單的SELECT語句,例如,沒有辦法得到第一行、下一行或前10行,也不存在每次一行地處理所有行的簡單方法(相對於成批地處理它們)。有時,需要在檢索出來的行中前進或後退一行或多行。這就是使用遊標的原因。

定義:就自己的理解是,遊標相當於一個指針,用來靈活的處理從表中查詢出來的數據,通常是與存儲過程結合起來一起使用的。

創建遊標

CREATE PROCEDURE productpricing()
BEGIN 
    DECLARE ordernumbers CURSOR
    FOR 
    SELECT order_num FROM orders;
END;

打開和關閉遊標

-- 打開遊標
OPEN ordernumbers;

-- 關閉遊標
CLOSE rodernumbers;

遊標使用可參考: 遊標的具體使用詳解

觸發器

來源:想要某條語句(或某些語句)在事件發生時自動執行。
定義:觸發器是MySQL響應以下任意語句而自動執行的一條MySQL語句(語句執行之前或者之後)(或位於BEGIN和END語句之間的一組語句)。
僅支持:

  1. DELETE
  2. INSERT
  3. UPDATE

其他MySQL語句不支持觸發器。

注意:
1. 在MySQL 5中,觸發器名必須在每個表中唯一,但不是在每個數據庫中唯一。
2. 現在最好是在數據庫範圍內使用唯一的觸發器名。

CREATE TRIGGER newproduct AFTER INSERT ON products
FOR EACH ROW SELECT 'Product added';

說明:對每個成功的插入,控制檯都會顯示Product added信息。

各語句具體使用查閱相關資料。

事務管理

定義: 事務處理是一種機制,用來管理必須成批執行的MySQL操作,以保證數據庫不包含不完整的操作結果。

說明:利用事務處理,可以保證一組操作不會中途停止,它們或者作爲整體執行,或者完全不執行(除非明確指示)。如果沒有錯誤發生,整組語句提交給(寫到)數據庫表。如果發生錯誤,則進行回退(撤銷)以恢復數據庫到某個已知且安全的狀態。

MyISAM引擎不支持事務處理

InnoDB引擎支持事務處理

基本術語:
1. 事務(transaction)指一組SQL語句;
2. 回退(rollback)指撤銷指定SQL語句的過程;
3. 提交(commit)指將未存儲的SQL語句結果寫入數據庫表;
4. 保留點(savepoint)指事務處理中設置的臨時佔位符(placeholder),你可以對它發佈回退(與回退整個事務處理不同)。

-- 事務開始
START TRANSACTION
-- 回退事務
SELECT * FROM ordertotals;
START TRANSACTION;
DELETE FROM ordertotals;
SELECT * FROM ordertotals;
ROLLBACK;
SELECT * FROM ordertotals;

說明: 首先執行一條SELECT以顯示該表不爲空。然後開始一個事務處理,用一條DELETE語句刪除ordertotals中的所有行。另一條SELECT語句驗證ordertotals確實爲空。這時用一條ROLLBACK語句回退START TRANSACTION之後的所有語句,最後一條SELECT語句顯示該表不爲空。

注意:
1. ROLLBACK只能在一個事務處理內使用(在執行一條START TRANSACTION命令之後)。
2. 事務處理用來管理INSERT、 UPDATE和DELETE語句。你不能回退SELECT語句。(這樣做也沒有什麼意義。)你不能回退CREATE或DROP操作。事務處理塊中可以使用這兩條語句,但如果你執行回退,它們不會被撤銷。

-- 提交事務
START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 2010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;

說明:在這個例子中,從系統中完全刪除訂單20010。因爲涉及更新
兩個數據庫表orders和orderItems,所以使用事務處理塊來
保證訂單不被部分刪除。最後的COMMIT語句僅在不出錯時寫出更改。如
果第一條DELETE起作用,但第二條失敗,則DELETE不會提交(實際上,
它是被自動撤銷的)。

注意:
1. 一般MySQL語句的使用都是隱含提交的,但是在事務處理中,提交不會隱含進行,需要使用COMMIT語句。
2. 當COMMIT或ROLLBACK語句執行後,事務會自動關閉(將來的更改會隱含提交)。

-- 保留點
-- 設置保留點
SAVEPOINT delete1;
-- 事務回退到保留點
ROLLBACK TO delete1;

說明:爲了支持回退部分事務處理,必須能在事務處理塊中合適的位置放置佔位符。這樣,如果需要回退,可以回退到某個佔位符。

注意:保留點在事務處理完成(執行一條ROLLBACK或COMMIT)後自動釋放。

-- 設置數據庫不默認提交
SET autocommit=0;

說明:autocommit標誌決定是否自動提交更改,不管有沒有COMMIT語句。設置autocommit爲0(假)指示MySQL不自動提交更改(直到autocommit被設置爲真爲止)

注意: autocommit標誌是針對每個連接而不是服務器的。


用戶管理

-- 創建用戶賬號
CREATE USER ben IDENTIFIED BY '123456';

說明:創建用戶名爲 ‘ben’, 密碼爲 ‘123456’的用戶。

用戶的賬號信息存儲在Mysql.user表中。

-- 重命名用戶
RENAME USER ben TO bforta;
-- 刪除用戶賬號
DROP USER bforta;
-- 顯示用戶的權限信息
SHOW GRANTS FOR bforta;
-- 此GRANT允許用戶在crashcourse.*(crashcourse數據庫的所有表)上使用SELECT。在所有表中只有只讀訪問權限。
GRANT SELECT ON crashcourse.* TO bforta;
-- 撤銷特定訪問權限
REVOKE SELECT ON crashcourse.* FROM bforta;
-- 修改bforta賬戶密碼
SET PASSWORD FOR bforta = Password('root');
-- 修改登錄賬戶密碼
SET PASSWORD = Password('root');
發佈了19 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章