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'); #更改當前登入用戶口令