1.簡介
mysql是一個快速的、多線程的、多用戶的、支持健壯SQL的數據庫管理系統(DBMS)。mysql可以應用在關鍵任務、高并發的系統上,也可以用來部署大規模軟件。mysql最新版本5.7用戶手冊官網: mysql5.7用戶手冊
2.連接mysql
要使用mysql數據庫,需要用mysql客戶端連接到mysql服務器。服務器可以是你自己創建的,也可以是他人提供的主機,客戶端有三種:mysql命令行工具、mysql administrator和mysql query browser。
連接上mysql服務器主機后,可以查看服務器上有哪些數據庫、數據庫有哪些表、表的構成以及你想操縱的數據庫等:
1.SHOW DATABASES; #查看服務器上所有的數據庫
2.SHOW TABLES; #查看當前數據庫上所有的表
3.USE DATABASE; #選擇所要操縱的書籍
4.DESCRIBE TABLE; #描述表結構
3.查詢
-
檢索數據
1.SELECT * FROM table; #檢測全部列
2.SELECT column1,column2 ... FROM table; #檢索部分列
3.SELECT DISTINCT * FROM table; #檢索不同列,DISTINCT后面所有列
4.SELECT * FROM table LIMIT 3 OFFSET 0; #限制輸出結果
5.SELECT * FROM table ORDER BY column DESC/ASC;#輸出結果按序排列
-
過濾數據
檢索的數據可以通過where子句過濾。
比如:SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;語句檢索的是prod_price值為2.50的行記錄。SELECT prod_name, prod_price FROM products WHERE prod_price < 10;語句檢索的是prod_price小于10的行記錄。
where子句支持如下操作符:此外,where子句也支持 空值檢查,SELECT cust_id FROM customers WHERE cust_email IS NULL;語句檢索的email值為空的行記錄。
where子句 IN 操作符用來指定條件范圍,SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;語句檢索的是供應商1002和1003制造的所有產品。
where子句 NOT 操作符否定它之后所跟的任何條件,SELECT prod_name, prod_price FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;語句比上述多了一個NOT操作符,檢索的是除1002和1003之外的所有供應商制造的產品。
為了進行更強的過濾控制,MySQL允許給出多個 WHERE 子句。這些子句可以同過 AND 或 OR 來組合使用。SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price < 10;語句檢索供應商1003制造的價格小于10的所有產品。當AND 和OR操作符同時出現在一個查詢子句中,AND比OR的優先級更高,可以用括號來顯示的指定執行的次序。
where子句也支持通配符 LIKE 過濾,通配符包括%(匹配任意字符任意次數)和(匹配任意單個字符)。SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';將檢索產品名以jet起頭的產品。*SELECT prod_id, prod_name FROM products WHERE prod_name LIKE ' ton anvil';*將檢索產品名稱1 ton anvil和2 ton anvil。注意LIKE '%'不能匹配NULL值。
where子句支持正則表達式 REGEXP 過濾?;镜恼Z法格式類似為SELECT prod_name FROM products WHERE prod_name REGEXP '1000 | 2000';將匹配產品名字中含有1000或2000的記錄。正則表達式的語法不在本文中詳述。
-
分組數據
分組允許把數據分為多個邏輯組,再對每個組進行聚集運算、檢索等操作,這主要使用 GROUP BY 子句和 HAVING 子句。
SELECT vend_id, COUNT( * ) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT( * ) >= 2;語句檢索出了具有2個以上、價格為10以上的產品的供應商。
-
子查詢
sql允許創建子查詢,即嵌套在其它查詢中的查詢。SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2');
-
組合查詢
sql允許通過 UNION 操作符將多條SELECT語句組合成一個結果集。
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默認清除了重復的行,使用UNION ALL可以保留重復的行。
4.聯結表
聯結的創建很簡單,規定要聯結的所有表以及他們如何關聯(通過外鍵)即可。SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;語句中WHERE子句的聯結條件非常重要,如果沒有聯結條件,將返回笛卡爾積,檢索出的行數為第一個表中的行數乘以第二個表中的行數。
-
內部聯結
SELECT customers.cust_id, orders.order_num FROM customers INNER JOIN orders ON customers.cust_id = orders.cust_id;
-
外部聯結
SELECT customers.cust_id, orders.order_num FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
內部聯結又稱等值聯結,和上面所用的where子句效果相同。而外部聯結分為左聯結和右聯結,它還包括沒有關聯的行。
5.mysql聚合函數
-
拼接字段(Concat)
SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title FROM vendors ORDER BY vend_name;
-
文本處理函數
SELECT vend_name, Upper(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;
-
數字處理函數
-
時間和日期處理函數
SELECT cust_id, order_num FROM orders WHERE Data(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
-
聚合函數
我們經常需要匯總分析數據而不用實際把它們檢索出來,比如找出表列的最大值、最小值、平均值等。
SELECT AVG(prod_price) AS avg_price FROM products;
聚合函數可以指定DISTINCT來只包含不同的值,默認對所有的行執行計算。
6.插入、更新、刪除數據
-
插入數據
INSERT INTO customers(cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) VALUES ('Pep E. LaPew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA'), ('M.Martian', '42 Galaxy Way', 'New York', 'NY', '11213', 'USA');
INSERT除了可以直接插入一個指定的行,還可以通過所謂的INSERT SELECT將一條SELECT語句的結果插入表中。
INSERT INTO customers(cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) SELECT cust_id, cust_contact, cust_emial, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country FROM custnew;
-
更新數據
UPDATE customers SET cust_email = 'elmer@fudd.com' WHERE cust_id = 10005;
-
刪除數據
DELETTE FROM customers WHERE cust_id = 10006;
若沒有WHERE子句,UPDATE和DELETE語句都將更新或刪除整個表記錄。
DELETE不會刪除表,只會刪除表記錄,可以使用TRUNCATE TABLE語句完成相同的工作,且速度更快。
7.視圖
視圖不包含表中任何列和數據,它包含的是一個SQL查詢,用于重用SQL語句,簡化復雜的SQL操作,保護數據。
1.CREATE VIEW #創建視圖
2.SHOW CREATE VIEW viewname #查看創建視圖的語句
3.DROP VIEW viewname #刪除視圖
CREATE VIEW productcustomers AS SELECT cust_name, cust_contact, prod_id FORM customers, orders, orderitems WHERE custmoer.cust_id = order.cust_id AND orderitems.order_num = orders.order_num; ##創建productcustomers視圖
SELECT cust_name, cust_contact FROM productcustomers WHERE prod_id = 'TNT2'; ##使用productcustomers視圖
8.存儲過程
簡單來說,存儲過程是一條或多條mysql語句的集合。通過封裝在容易使用的單元中,簡化復雜的操作,同時保證了數據的完整性,而且提高了性能(使用存儲過程比使用單獨的sql語句要快)。
-
創建存儲過程
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;
-
執行存儲過程
CALL productpricing(@pricelow, @pricehigh, @priceaverage);
-
刪除存儲過程
DROP PROCEDURE productpricing;
9.游標
游標可以對檢索出來的行進行批處理,主要用于交互式應用,比如用戶需要滾動屏幕上的數據,對數據進行瀏覽或更改。游標在Mysql中只能用于存儲過程。
-
創建游標
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END;
-
打開和關閉游標
- OPEN ordernumbers; #打開游標
- CLOSE ordernumbers; #關閉游標
-
使用游標數據
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
FETCH ordernumbers INTO o;
CALL ordertotal(o, 1, t);
INSERT INTO ordertotals(order_num, total)
VALUES(o, t);
UNTIL done END REPEAT;
-- Close the cursor
CLOSE ordernumbers;
END;
10.觸發器
當想要某條語句在事件發生時自動執行,可以使用觸發器。
創建觸發器時,需要給出4條信息:
1.唯一的觸發器名;
2.觸發器關聯的表;
3.觸發器應該響應的活動(DELETE、INSERT或UPDATE);
4.觸發器何時執行(處理之前或之后);
CREATE TRIGGER newproduct AFTER INSERT ON products
FOR EACH ROW SELECT 'Product added';
使用語句 DROP TRIGGER newproduct; 刪除觸發器。
11.事物處理
事物處理可以用來維護數據庫的完整性,它保證成批的MySQL操作要么完全執行,要么完全不執行。
-
使用commit
在事物塊處理中,提交不會隱含的進行,為了明確的提交,使用COMMIT語句:
START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;
-
使用rollback
MySQL的ROLLBACK命令用來回退MySQL語句:
SELECT * FROM ordertotals;
START TRANSACTION;
DELETE FROM ordertotals;
SELECT * FROM ordertotals;
ROLLBACK;
SELECT * FROM ordertotals;
-
使用保留點
ROLLBACK回退整個事物,對復雜的事物可能需要部分回退,這個時候需要在事物塊中放置占位符,以便回退到這個占位符,也稱為保留點。
SAVEPOINT delete1; #創建保留點
ROLLBACK TO delete1; #回退到保留點
12.數據庫維護
-
備份數據
1.使用命令行實用程序mysqldump轉儲所有數據庫內容到某個外部文件;
2.使用命令行實用程序mysqlhotcopy從一個數據庫賦值所有數據(并非所有數據庫引擎都支持這個使用程序);
3.使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE轉儲所有數據到某個外部文件。
-
查看日志文件
MySQL維護管理員依賴的一系列日志文件主要有以下幾種:
日志類型 | 備注 |
---|---|
錯誤日志 | 包含啟動和關閉問題以及任意關鍵錯誤的細節,通常名為hostname.err |
查詢日志 | 記錄所有的MySQL活動,通常名為hostname.log |
二進制日志 | 記錄更新過數據的所有語句,通常名為hostname-bin |
緩慢查詢日志 | 記錄執行緩慢的任何查詢,通常名為hostname-slow.log |
13.改善性能
- MySQL具有特定的硬件建議,關鍵的生產DBMS應該運行在自己的專用服務器上。
- MySQL使用一系列的默認設置預先配置的,這些設置開始通常是很好的。但過一段時間后你可能需要調整內存分配、緩沖區大小等。
- MySQL是一個多用戶多線程的DBMS,它經常執行多個任務。如果這些任務中的某一個執行緩慢,則所有請求都會執行緩慢。如果遇到顯著的性能不良,可使用 SHOW PROCESSLIST 顯示所有活動進程,用KILL命令終止某個特定的進程。
- 總有不止一種方法編寫同一條SELECT語句,應該試驗聯結、并、子查詢等,找出最佳的方法。
- 使用EXPLAIN語句讓MySQL解釋它將如何執行一條SELECT語句。
- 一般來說,存儲過程執行的比一條一條的執行其中的各條MySQL語句塊。
- 絕不要檢索比需求還要多的數據。
- 必須索引數據庫表以改善數據檢索的性能。
- 你的SELECT語句有一系列復雜的OR條件嗎?通過使用多條SELECT語句和連接他們的UNION語句,你能看到極大的性能改善。
- 索引改善數據檢索的性能,但損害數據插入、刪除和更新的性能。
- LIKE很慢,一遍來說最好是使用FULLTEXT而不是LIKE。
- 位于http://dev.mysql.com/doc/的MySQL文檔有許多提示和技巧(甚至有用戶提供的評論和反饋),一定要查看這些有價值的資料。