《MySQL必知必會》筆記2

2016/2/26-27
mysql

第二十一章建立和操縱表sql


建立表數據庫

CREATE TABLE語句安全


IF NOT EXISTS:查看錶名是否存在,而且僅在表名不存在時建立它。服務器


NULL列和NOT NULL列。(NULL爲默認設置)函數


PRIMARY KEY:定義主鍵(能夠單個列做爲主鍵,也能夠多個列組成主鍵)oop


主鍵中只能使用不容許NULL值的列。this


AUTO_INCREMENT:(每一個表只容許一個AUTO_INCREMENT列)編碼

last_insert_id()函數:返回最後一個AUTO_INCREMENT值。spa


DEFAULT:指定默認值。MySQL不容許使用函數做爲默認值,它只支持常量。


使用默認值而不是NULL值。


MySQL有多種引擎。

InnoDB:事務處理

MEMORY:功能同MyISAM,數據存儲在內存。

MyISAM:全文本搜索


外鍵不能跨引擎:使用一個引擎的表不能引用具備使用不一樣引擎的表的外鍵。


ALTER TABLE語句:更新表

ALTER TABLE vendors
ADD vend_phone CHAR(20);

刪除列

ALTER TABLE vendors
DROP COLUMN vend_phone;


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


刪除表:DROP TABLE語句。刪除表沒有確認,也不能撤銷。


重命名錶:RENAME TABLE語句



第二十二章使用視圖


視圖:虛擬的表。視圖僅僅是用來查看存儲在別處的數據的一種設施。視圖自己不包含數據,所以它們返回的數據是從其餘表中檢索出來的。


利用視圖簡化複雜的聯結

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;

SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = 'TNT2';


用視圖從新格式化檢索出的數據

CREATE VIEW vendorlocations AS
SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')') AS vend_title
FROM vendors
ORDER BY vend_name;

SELECT *
FROM vendorlocations;


用視圖過濾不想要的數據

CREATE VIEW customeremaillist AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email IS NOT NULL;

SELECT *
FROM customeremaillist;


使用視圖與計算字段

CREATE VIEW orderitemsexpanded AS
SELECT order_num,
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems;

SELECT *
FROM orderitemsexpanded
WHERE order_num = 20005;



第二十三章使用存儲過程


建立存儲過程

DELIMITER //

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

DELIMITER ;

DELIMITER //    臨時更改命令行實用程序的語句分隔符。

(mysql命令行實用程序使用;做爲語句分隔符。若是命令行實用程序要解釋存儲過程自身內的;字符,則它們最終不會成爲存儲過程的成分,

這會使存儲過程當中的SQL出現句法錯誤)

DELIMITER ;      恢復。


執行存儲過程(存儲過程其實是一種函數)

CALL productpricing();


刪除存儲過程

DROP PROCEDURE productpricing;


變量:內存中一個特定的位置,用來臨時存儲數據。

通常存儲過程並不顯示結果,而是把結果返回給你指定的變量。

DELIMITER //

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 //

DELIMITER ;

OUT:指出相應的參數用來從存儲過程傳出一個值(返回給調用者)

IN:傳遞給存儲過程

INOUT:

INTO:保存到相應變量。


調用存儲過程,及變量顯示。

(全部MySQL變量必須以@開頭)

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

SELECT @priceaverage;

SELECT @pricehigh, @pricelow, @priceaverage;



使用IN和OUT參數

DELIMITER //

CREATE PROCEDURE ordertotal(
IN onumber INT,
OUT ototal DECIMAL(8,2)
)
BEGIN
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO ototal;
END //

DELIMITER ;

CALL ordertotal(20005, @total);
SELECT @total;

CALL ordertotal(20009, @total);
SELECT @total;


創建智能存儲過程

-- Name: ordertotal
-- Parameters: onumber = order number
--             taxable = 0 if not taxable, 1 if taxable
--             ototal  = order total variable

DELIMITER //

CREATE PROCEDURE ordertotal(
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)
)COMMENT 'Obtain order total, optionally adding tax'

BEGIN

-- Declare variable for total
DECLARE total DECIMAL(8,2);
-- Declare tax percentage
DECLARE taxrate INT DEFAULT 6;

-- Get the order total
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO total;

-- Is this taxable?
IF taxable THEN
-- Yes, so add taxrate to the total
SELECT total+(total/100*taxrate) INTO total;
END IF;

-- And finally, save to out variable
SELECT total INTO ototal

END//

DELIMITER ;

CALL ordertotal(20005, 0, @total);
SELECT @total;

CALL ordertotal(20005, 1, @total);
SELECT @total;

-- :註釋

DECLARE語句:定義局部變量

COMMENT關鍵字:在SHOW PROCEDURE STATUS 的結果中顯示的內容。


檢查存儲過程

顯示用來建立一個存儲過程的CREATE語句。

SHOW CREATE PROCEDURE ordertotal;


SHOW PROCEDURE STATUS LIKE 'ordertotal';



第二十四章使用遊標


遊標的使用緣由:在檢索出來的行中前進或後退一行或多行。


遊標:一個存儲在MySQL服務器上的數據庫查詢,它不是一條SELECT語句,而是被該語句檢索出來的結果集。


遊標主要用於交互式應用。


MySQL遊標只能用於存儲過程。


對遊標結果進行循環以及逐行處理的技術。

DELIMITER //

CREATE PROCEDURE processorders()
BEGIN
-- Declare local variables
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE t DECIMAL(8,2);

-- Declare the cursor
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;

-- Declare continue handler
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

-- Create a table to store the results
CREATE TABLE IF NOT EXISTS ordertotals
(order_num INT, total DECIMAL(8,2));


-- Open the cursor
OPEN ordernumbers;

-- Loop through all rows
REPEAT

-- Get order number
FETCH ordernumbers INTO o;

-- Get the total for this order
CALL ordertotal(o, 1, t);

-- Insert order and total into ordertotals
INSERT INTO ordertotals(order_num, total)
VALUES(o,t);


-- End of loop
UNTIL done END REPEAT;

-- Close the cursor
CLOSE ordernumbers;
END//

DELIMITER ;

CALL processorders();

SELECT *
FROM ordertotals;



第二十五章使用觸發器


觸發器是MySQL響應一下任意語句而自動執行的一條MySQL語句(或位於BEGIN和END語句之間的一組語句)

    DELETE;

    INSERT;

    UPDATE。



2016/2/28 

最新版本的MySQL沒法執行書上的代碼。



第二十六章管理事務處理


事務處理:維護數據庫的完整性,它保證成批的MySQL操做要麼徹底執行,要麼徹底不執行。

(用來管理成批執行的MySQL操做,以保證數據庫不包含不完整的操做結果)


事務:指一組SQL語句;

回退:

提交:

保留點:


SELECT * FROM ordertotals;
START TRANSACTION;
DELETE FROM ordertotals;
SELECT * FROM ordertotals;
ROLLBACK;
SELECT * FROM ordertotals;

START TRANSACTION語句標識事務的開始

ROLLBACK語句回退START TRANSACTION以後的全部語句。ROLLBACK只能在一個事務處理內使用。


事務處理用來管理INSERT、UPDATE和DELETE語句。

不能回退SELECT語句、CREATE或DROP操做。


隱含提交:通常的MySQL語句都是直接針對數據庫表執行和編寫的。提交(寫或保存)操做時自動進行的。


事務處理塊中,提交不會隱含地進行。進行明確提交。


使用COMMIT語句進行明確提交。

START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;


COMMIT或ROLLBACK語句執行後,事務會自動關閉。


使用保留點:部分提交或回退;佔位符;能夠設置任意多的保留點。


釋放保留點:事務處理完成後自動釋放;或使用語句明確釋放。


可設置MySQL不自動提交。



第二十七章全球化和本地化


字符集

編碼

校對


SHOW CHARACTER SET; #查看所支持的字符集的完整列表

SHOW COLLATION; #查看所支持校對的完整列表

SHOW VARIABLES LIKE 'character%'; #肯定所用的字符集和校對
SHOW VARIABLES LIKE 'collation%';

CREATE TABLE mytable #給表指定字符集和校對
(
columnn1 INT,
columnn2 VARCHAR(10)
)DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;

DROP TABLE mytable; #刪除表

CREATE TABLE mytable
(
columnn1 INT,
columnn2 VARCHAR(10),
columnn3 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_general_ci #對某列單獨設置字符集和校對
)DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;

SELECT *
FROM customers
ORDER BY lastname, firstname COLLATE latin1_general_cs; #用與建立表時不一樣的校對順序排序特定的SELECT語句。



第二十八章安全管理


USE mysql;SELECT user FROM user; #得到全部用戶帳號列表CREATE USER ben IDENTIFIED BY 'p@$$w0rd'; #建立一個新的用戶帳號,並給出了一個口令RENAME USER ben TO bforta; #從新命名一個用戶帳戶DROP USER bforta; #刪除用戶帳戶SHOW GRANTS FOR bforta; #查看賦予用戶帳戶的權限GRANT SELECT ON crashcourse.* TO bforta; #設置權限;bforta用戶對crashcourse數據庫中的全部數據具備只讀訪問權限#GRANT語句至少須要的信息#要授予的權限#被授予訪問權限的數據庫或表#用戶名REVOKE SELECT ON crashcourse.* FROM bforta; #撤銷特定權限GRANT SELECT, INSERT ON crashcourse.* TO bforta; #賦予多條權限SET PASSWORD FOR bforta = Password('n3w p@$$w0rd'); #更改用戶口令SET PASSWORD = Password('n3w p@$$w0rd'); #更改當前登入用戶口令
相關文章
相關標籤/搜索