Mysql必知必會筆記

網絡圖片

1.簡介

mysql是一個快速的、多線程的、多用戶的、支持健壯SQL的數據庫管理系統(DBMS)。mysql可以應用在關鍵任務、高并發的系統上,也可以用來部署大規模軟件。mysql最新版本5.7用戶手冊官網: mysql5.7用戶手冊

2.連接mysql

要使用mysql數據庫,需要用mysql客戶端連接到mysql服務器。服務器可以是你自己創建的,也可以是他人提供的主機,客戶端有三種:mysql命令行工具、mysql administrator和mysql query browser。

連接mysql可以在shell中輸入如下命令:
mysq連接

連接上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子句操作符

此外,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 子句。這些子句可以同過 ANDOR 來組合使用。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;

sql聚合函數

聚合函數可以指定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;
  • 打開和關閉游標

  1. OPEN ordernumbers; #打開游標
  2. 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.改善性能

  1. MySQL具有特定的硬件建議,關鍵的生產DBMS應該運行在自己的專用服務器上。
  2. MySQL使用一系列的默認設置預先配置的,這些設置開始通常是很好的。但過一段時間后你可能需要調整內存分配、緩沖區大小等。
  3. MySQL是一個多用戶多線程的DBMS,它經常執行多個任務。如果這些任務中的某一個執行緩慢,則所有請求都會執行緩慢。如果遇到顯著的性能不良,可使用 SHOW PROCESSLIST 顯示所有活動進程,用KILL命令終止某個特定的進程。
  4. 總有不止一種方法編寫同一條SELECT語句,應該試驗聯結、并、子查詢等,找出最佳的方法。
  5. 使用EXPLAIN語句讓MySQL解釋它將如何執行一條SELECT語句。
  6. 一般來說,存儲過程執行的比一條一條的執行其中的各條MySQL語句塊。
  7. 絕不要檢索比需求還要多的數據。
  8. 必須索引數據庫表以改善數據檢索的性能。
  9. 你的SELECT語句有一系列復雜的OR條件嗎?通過使用多條SELECT語句和連接他們的UNION語句,你能看到極大的性能改善。
  10. 索引改善數據檢索的性能,但損害數據插入、刪除和更新的性能。
  11. LIKE很慢,一遍來說最好是使用FULLTEXT而不是LIKE。
  12. 位于http://dev.mysql.com/doc/的MySQL文檔有許多提示和技巧(甚至有用戶提供的評論和反饋),一定要查看這些有價值的資料。

ENDING!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容

  • 前言 一、基礎知識1.了解數據庫數據庫(database):保存有組織的數據的容器表(table):某種特定類型數...
    流水混帳閱讀 519評論 0 1
  • 1.表中的任何列都可以作為主鍵, 只要它滿足以下條件:任意兩行都不具有相同的主鍵值;每一行都必須具有一個主鍵值( ...
    Cherryjs閱讀 683評論 0 0
  • (一)幾個數據庫相關的概念 1.數據庫 數據庫: 保存有組織數據的容器。 數據的所有存儲、檢索、管理和處理實際上是...
    快樂的小飛熊閱讀 536評論 0 1
  • 一、SQL速成 結構查詢語言(SQL)是用于查詢關系數據庫的標準語言,它包括若干關鍵字和一致的語法,便于數據庫元件...
    shadow雨軒閱讀 519評論 0 3
  • 5章 排序檢索數據 排序數據子句的概念(clause) SQL語句由子句夠成, 有些子句是必需的(from子句...
    步履不停的Suunny閱讀 278評論 0 0