MySQL必知必會筆記

文章目錄


檢索

檢索不同的行: DISTINCT

  • 使用: SELECT DISTINCT vend_id FROM products;
  • 此關鍵字指定MySQL只返回不同的值
  • 必須直接放在列名的前面
  • 不能部分使用DISTINCT, 會作用到所有的列

限制結果: LIMIT

  • 使用: SELECT prod_name FROM products LIMIT 5;
  • LIMIT 5指定MySQL返回不多於5行
  • 可以有兩個參數, 如: LIMIT 5, 5指示MySQL返回從行5(包括)開始的5行, 第一個數爲開始位置, 第二個數爲要檢索的行數
  • MySQL的行從0開始
  • LIMIT 5 OFFSET 5等同於 LIMIT 5, 5

排序

ORDER BY

  • 使用: SELECT prod_name FROM products ORDER BY prod_name;
  • 可以是多個列, 逗號隔開

排序方向

  • 默認爲升序 ASC
  • DESC 降序
  • 可以對多個列指定不同的排序方向: ORDER BY prod_price DESC, prod_name;
  • LIMIT 1結合可以找出一個列中最高或最低的值, ORDER BY prod_price LIMIT 1;
  • 在字典排序中, A被視爲與a相同, 這是MySQL的默認行爲, 可以設置

過濾數據

使用WHERE子句

  • 使用: SELECT * from products WHERE prod_price = 2.50;
  • 返回符合WHERE子句條件的數據
  • ORDER BY需要放在WHERE之後

操作符

  • 所有操作符: =等於, <>or!=不等於, <小於, <=小於等於, >大於, >=大於等於, BETWEEN在指定的兩個值之間(包括兩個值)
  • 範圍值檢查, BETWEEN用法如下: SELECT prod_price FROM products WHERE BETWEEN 5 AND 10;
  • 空值檢查: SELECT prod_name FROM products WHERE prod_price IS NULL;

組合WHERE子句

  • 操作符: 用來聯結或改變WHERE子句中的關鍵字, 也成爲邏輯操作符
  • AND操作符:
    • 檢索滿足所有給定條件的行
    • 使用`WHERE vend_id = 1003 AND prod_price <= 10;
  • OR操作符:
    • 檢索匹配任一條件的行
    • 使用同AND
  • 計算次序: 優先處理AND和圓括號

IN操作符

  • WHERE vend_id IN (1002, 1003)
  • WHERE vend_id = 1002 OR vend_id = 1003
  • 更簡潔直觀, 執行比OR更快

NOT操作符

  • 否定它之後所跟的任何條件
  • WHERE vend_id NOT IN (1002, 1003)

用通配符進行過濾

LIKE操作符

  • 通配符
    • 用來匹配值的一部分的特殊字符, 要使用通配符必須使用LIKE
    • %:
      • 任何字符出現任意次數(除了NULL)
      • WHERE prod_name LIKE 'jet%';
    • _:
      • 任何字符出現一次

技巧

  • 少用
  • 效率低, 如果可以, 使用其它方式代替
  • 放在搜索模式的開始處是最慢的

用正則表達式進行搜索

  • LIKE的區別: 除非LIKE中使用通配符, 否則是完全匹配, 正則中則是包含
  • 使用: WHERE prod_name REGEXP '1000', 匹配所有包含1000的值
  • 默認不區分大小寫, 可使用BINARY關鍵字: WHERE prod_name REGEXP BINARY 'Jet'
  • 測試是否匹配: SELECT 'hello' REGEXP '[0-9]';, 返回0(沒有匹配), 若匹配則返回1
  • |: OR匹配, [多個字符]: 匹配其中之一, [0-9]: 匹配範圍, 等同於[0123456789], \\: 轉義, ^表達式$: 開始和結束, 完全匹配, 還有, 不一一列舉了

創建計算字段

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

拼接

  • SELECT Concat(vend_name), ' (', vend_country. ')') AS vend_title FROM vendors;
  • Concat: 拼接串, 需要一個或多個指定的串, 各個串之間用逗號分隔
  • AS: 使用vend_title作爲字段別名, 同樣可以用來重命名字段

執行算術計算

  • SELECT quantity*item_price AS expanded_price FROM orderitems;
  • 算術操作符: + - * /
  • 測試用: SELECT 3*2; => 返回6, 省略了FROM

使用數據處理函數

函數沒有SQL的可移植性強, 但可以提高編碼效率, 使用函數需做好代碼註釋

函數類型

  • 用於處理文本串的文本函數
  • 用於在數值數據上進行算術操作的數值函數
  • 用於處理日期和時間並從這些值中提取特定成分的日期和時間函數
  • 返回DBMS正使用的特殊信息的系統函數

下面列出常用的函數

文本處理函數

  • Left(): 返回串左邊的字符
  • Length(): 返回串的長度
  • Locate(): 找出串的一個子串
  • Lower(): 將串轉換爲小寫
  • LTrim(): 去掉串左邊的空格
  • Right(): 返回串右邊的字符
  • RTrim(): 去掉串右邊的空格
  • Soundex(): 返回串的SOUNDEX值(同音值)
  • SubString(): 返回子串的字符
  • Upper(): 將串轉換爲大寫

日期和時間處理函數

  • 無論什麼時候指定一個日期, 不管是插入或更新表值還是用WHERE子句進行過濾, 日期必須爲格式yyyy-mm-dd
  • WHERE Date(order_data) = '2005-09-01';
  • 檢索2005年9月下的所有訂單: `SELECT cust_id, order_num FROM orders WHERE orders WHERE Year(order_date) = 2005 AND Month(order_date) = 9;

數值處理函數

  • Abs(): 返回一個數的絕對值
  • Cos(): 返回一個角度的餘弦
  • Exp(): 返回一個數的指數值
  • Mod(): 返回除操作的餘數
  • Pi(): 返回圓周率
  • Rand(): 返回一個隨機數
  • Sin(): 返回一個角度的正弦
  • Sqrt(): 返回一個數的平方根
  • Tan(): 返回一個角度的正切

彙總數據

聚集函數

運行在行組上, 計算和返回單個值的函數(高效)
利用標準的算術操作符, 所有聚集函數都可用來執行多個列上的計算

  • AVG(): 返回某列的平均值, 忽略列值爲NULL的行
  • COUNT(): 返回某列的行數, COUNT(*)對錶中所有行(包含NULL)計數, COUNT(列名)忽略NULL
  • MAX(): 返回某列的最大值, 忽略列值爲NULL的行, 用於文本數據時, 如果數據按相應的列排序則返回最後一行
  • MIN(): 返回某列的最小值, 忽略列值爲NULL的行, 用於文本數據時, 如果數據按相應的列排序則返回最前面的行
  • SUM(): 返回某列值之和, 也可以用於合計計算值, 如: SUM(item_price*quantity)

聚集不同值

  • ALL: 默認
  • DISTINCT:
    • 只考慮不同的值
    • 使用: AVG(DISTINCT prod_price)

分組數據

創建分組: GROUP BY

  • SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id [WITH ROLLUP];
  • 上面的例子按vend_id分組並計算每個分組的行數
  • []代表可選
  • 使用WITH ROLLUP可以得到每個分組一集每個分組彙總級別的值

過濾分組: HAVING

  • 使用: SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;
  • HAVING支持所有WHERE操作符: 通配符等
  • WHERE在數據分組前進行過濾, HAVING在數據分組後進行過濾
  • 同時使用WHEREHAVING: SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2;

分組和排序

  • 區別
    ORDER BY | GROUP BY
    —|---
    排序產生的輸出 | 分組行, 但輸出可能不是分組的順序
    任意列都可以使用 | 只可能使用選擇列或表達式列, 而且必須使用每個選擇列表達式
    不一定需要 | 如果與聚集函數一起使用列(或表達式), 則必須使用
  • ORDER BY子句加在後面進行排序

SELECT子句順序

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

使用子查詢

子查詢最常用的使用是在WHERE子句和IN操作符中, 以及用來填充計算列

利用子查詢進行過濾

  • SELECT cust_id FROM orders WHERE order_num IN (子查詢語句);
  • 在SELECT語句中, 子查詢總是從內向外處理
  • 列必須匹配

作爲計算字段使用子查詢

  • SELECT cust_name, cust_state, (相關子查詢) AS orders FROM customers ORDER BY cust_name;
  • 相關子查詢: 涉及外部查詢的子查詢
  • 列名可能有多義性就必須使用完全限定列名: 表名.列名

聯結表

聯結

  • 主鍵: 可以是ID或任何其他唯一值
  • 外鍵: 爲某個表中的一列, 它包含另一個表的主鍵值, 定義了兩個表之間的關係
  • 維護引用完整性: 僅在關係列中插入合法的數據
  • 使用聯結表的好處:
    • 信息不重複, 不浪費時間和空間
    • 如果信息改動, 可以只更新單個記錄, 相關表中的數據不用改動
    • 處理數據更簡單

創建聯結

WHERE子句的重要性

  • 例子: SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;
  • vend_name 和另外兩個列在不同的表中, 使用正確的WHERE子句聯結了兩個表

內部聯結

  • 使用INNER JOIN
  • 例子: SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;
  • 效果同使用WHERE子句聯結
  • ANSI SQL規範首選INNER JOIN語法

聯結多個表

  • SQL對一條SELECT語句中可以聯結的表的數目沒有限制
  • 聯結的表越多性能越差

創建高級聯結

使用表別名:

  • 縮短SQL語句
  • 允許在單條SELECT語句中多次使用相同的表

自聯結

  • 在單條SELECT語句中多次使用相同的表
  • 使用子查詢實現
  • 使用表別名實現: WHERE p1.vend_id = p2.vend_id;

外部聯結

  • 使用LEFT OUTER JOIN
  • 聯結包含了那些在相關表中沒有關聯行的行
  • 必須使用RIGHT或LEFT關鍵字指定包括其所有行的表, OUTER JOIN左邊或右邊的表

組合查詢

  • 將多個查詢(可以是不同的表查詢)的結果作爲單個查詢結果集返回
  • 使用UNION關鍵字聯結兩個以上的查詢
  • UNION規則:
    • 必須由兩條或兩條以上的SELECT語句組成
    • 每個查詢必須包含相同的列、表達式或聚集函數, 次序可以不同
    • 列數據類型必須兼容
  • 默認返回的結果取消了重複的行, 使用UNION ALL包含重複的行
  • 對組合查詢結果排序: 只能在最後一個查詢使用一條ORDER BY子句

全文本搜索

啓用全文本搜索支持

  • 在CREATE語句中使用FULLTEXT子句: FULLTEXT(note_text)
  • 定義之後, MySQL自動維護該索引, 在操作行時索引隨之自動更新
  • 不要在導入數據時使用FULLTEXT, 太花時間

進行全文本搜索

  • 使用Match()和Against()執行全文本搜索, Match()指定被搜索的列, Against()指定要使用的搜索表達式
  • 例子: SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');
  • Match(): 傳遞的值必須與FULLTEXT()定義中的相同, 可指定多個列, 次序要正確
  • 搜索不區分大小寫
  • 對結果進行了排序, 具有較高等級的行先返回
  • 排序多個搜索項, 包含多個匹配詞則等級高
  • 由於數據是索引的, 全文本搜索相當快

使用查詢擴展

  • 使用: Against('anvils' WITH QUERY EXPANSION)
  • 查詢過程: 找出與搜索條件匹配的行 -> 選擇匹配行中所有有用的詞 -> 再次進行全文本搜索
  • 能找出可能相關的結果
  • 行越多返回的結果越好

布爾文本搜索

  • 即使沒有FULLTEXT索引也可以使用, 但是操作非常緩慢
  • 細節:
    • 要匹配的詞
    • 要排斥的詞
    • 排列提示(指定某些詞比其他詞等級更高)
    • 表達式分組
  • 包含heavy但不包含任意以rope開始的詞的行: Against('heavy -rope*' IN BOOLEAN MODE);
  • 支持的所有布爾操作符:
布爾操作符 說明
+ 包含, 詞必須存在
- 排除, 詞必須不出現
> 包含, 而且增加等級制
< 包含, 且減少等級值
() 把詞組成子表達式(允許這些子表達式作爲一個組被包含、排除、排列等)
~ 取消一個詞的排序值
* 詞尾的通配符
“” 定義一個短語(與單個詞的列表不一樣, 它匹配整個短語以便包含或排除這個短語)

全文本搜索的使用說明

  • 在索引全文本數據時, 具有3個或3個一下字符的詞(可更改)被忽略
  • MySQL帶有一個內建的非用詞表(可覆蓋), 索引時被忽略
  • 一個詞出現在50%以上的行中, 則將它作爲一個非用詞忽略, 不用於IN BOOLEAN MODE
  • 如果表中的行數少於3行, 則不返回結果
  • 忽略詞中的單引號: don’t => dont
  • 不具有詞分隔符的語言不能恰當的返回全文本搜索結果
  • 目前沒有臨近操作符
  • 僅在MyISAM數據庫引擎中支持全文本搜索

插入數據

插入行

  • INSERT INTO 表名(列名[, 列名]) VALUES(列值[, 列值]);
  • 允許NULL值或有默認值的列可以省略
  • 提高整體性能: 使用INSERT LOW_PRIORITY INTO降低INSERT語句的優先級, 同樣適用於UPDATE和DELETE語句

插入多個行

  • 可以用多條INSERT語句
  • 如果列名和次序相同: VALUE(列值集合), (列值集合)
  • 用一條INSERT語句插入比用多條性能高

插入檢索出的數據

  • INSERT INTO 表名1(a, b) SELECT (a, b) FROM 表名2;
  • INSERT SELECT中的列名: 列名可以不一樣, 按列的位置導入數據

更新和刪除數據

更新數據

  • UPDATE 表名 SET 列名 = 新列值 [, 列名 = 新列值] WHERE子句;
  • 可以使用子查詢
  • IGNORE關鍵字: 在UPDATE後面使用, 即使發生錯誤也繼續進行更新

刪除數據

  • DELETE FROM 表名 WHERE子句;
  • 省略WHERE子句將影響所有行
  • 刪除所有行使用TRUNCATE TABLE效率更高

創建和操縱表

在進行下列操作前最好先備份

創建表

創建

  • CREATE TABLE 表名(列名 數據類型 NULL [, ...]) ENGINE=引擎類型;
  • IF NOT EXISTS: 在表名之後使用, 當表名不存在時創建

使用NULL值

  • 有NULL和NOT NULL
  • NULL != ‘’

主鍵

  • PRIMARY KEY(列名 [, ...])
  • 使用單個列名時該列唯一, 多個列名時多個列的組合唯一
  • 主鍵不允許使用NULL值的列

自增

  • 列名 數據類型 NOT NULL AUTO_INCREAMENT
  • 自增列的值唯一
  • 每個表只能有一個自增列, 而且必須被索引(如主鍵)
  • 設置爲自增列後仍然可以插入
  • 使用SELECT last_insert_id()獲取最後一個自增值

默認值

  • 列名 數據類型 NOT NULL DEFAULT 列值
  • 不允許使用函數

引擎類型

  • ENGINE=引擎類型
  • 可以忽略, 將使用默認引擎
  • 關聯的表不能使用不同的引擎
  • 需要知道的:
    • InnoDB: 事務處理引擎, 不支持全文本搜索, 高併發下性能更好
    • MEMORY: 功能等同於MyISAM, 數據保存在內存中
    • MyISAM: 性能極高, 支持全文本搜索, 不支持事務處理

更新表

添加列

  • ALTER TABLE 表名 ADD 列名 數據類型;

刪除列

  • ALTER TABLE 表名 DROP COLUMN 列名;

添加外鍵

  • ALTER TABLE 表1 ADD CONSTRAINT 外鍵名 FOREIGN KEY (外鍵列) REFERENCES 表2 (主鍵列);
  • 可以在一條語句中對單個表進行多個更改, 每個更改用逗號分隔

刪除表

  • DROP TABLE 表名;

重命名錶

  • `RENAME TABLE 表名 TO 新表名;
  • 可以在一條語句中對多個表進行更改, 每個更改用逗號分隔

視圖

視圖爲虛擬的表, 包含的不是數據而是根據需要檢索數據的查詢
視圖提供了一種MySQL的SELECT語句鞥次的封裝, 可用來簡化數據處理以及重新格式化基礎數據或保護基礎數據

規則和限制

  • 視圖名須唯一
  • 沒有數量限制
  • 需要有足夠的訪問權限
  • 視圖可以嵌套
  • ORDER BY可以用在視圖中, 但會覆蓋視圖檢索中的ORDER BY
  • 視圖不能索引
  • 視圖可以和表一起使用

使用視圖

  • 創建視圖: CREATE VIEW 視圖名 AS SELECT子句;
  • 查看創建視圖的語句: SHOW CREATE VIEW 視圖名;
  • 刪除視圖: DROP VIEW 視圖名;
  • 更新視圖:
  1. 先用DROP再用CREATE
  2. CREATE OR REPLACE VIEW

視圖的用途

  1. 簡化複雜的聯結
  2. 重新格式化檢索出的數據
  3. 過濾不想要的數據
  4. 使用計算字段

更新視圖

  • 同樣可以使用SELECT INSERT UPDATE DELETE
  • 更新視圖將更新其基表
  • 視圖檢索中如果有以下操作將不能進行視圖的更新:
    • 分組
    • 聯結
    • 子查詢
    • 聚集函數
    • DISTINCT
    • 導出(計算)列

存儲過程

爲以後的使用而保存的一條或多條MySQL語句的集合
可以將其視爲批文件或函數
簡單、安全、高性能(比使用單獨的SQL語句快)

使用

執行存儲過程

  • CALL 存儲過程名();
  • 括號中可以加參數

創建存儲過程

  • CREATE PROCEDURE 存儲過程名() BEGIN 存儲過程體 END;
  • 同樣可以在括號中加參數
  • BEGIN和END語句用來限定存儲過程體
  • 在MySQL命令行客戶機中: 使用DELIMITER //修改分隔符爲//, 之後編寫存儲過程代碼, 結束後使用DELIMITER ;恢復, 分隔符可以爲\外的任何字符

刪除存儲過程

  • DROP PROCEDURE 存儲過程名;
  • 僅當存在時刪除: DROP PROCEDURE IF EXISTS 存儲過程名;

使用參數

  • 例子:
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 ;
  • 變量: 內存中一個特定的位置, 用來臨時存儲數據, 以@開始
  • OUT: 指出相應的參數用來從存儲過程傳出一個值(返回給調用者)
  • IN: 傳遞給存儲過程
  • INOUT: 傳入和傳出
  • 參數的數據類型跟表中使用的相同
  • 調用: CALL ordertotal(20005, @total);
  • 顯示: SELECT @total;

建立智能存儲過程

  • 使用註釋: 前置–
  • 在存儲過程體中定義局部變量: DECLARE total DECIMAL(8,2);
  • 使用流控制語句, 如IF
  • COMMENT: 非必須, 如果給出, 將在SHOW PROCEDURE STATUS的結果中顯示

檢查存儲過程

  • 查看創建語句: SHOW CREATE PROCEDURE 存儲過程名;
  • 查看存儲過程列表: SHOW PROCEDURE STATUS

遊標

說明

  • 遊標是一個存儲在MySQL服務器上的數據庫查詢, 它不是一條SELECT語句, 而是被該語句檢索出來的結果集
  • MySQL遊標只能用於存儲過程
  • 存儲了遊標之後, 應用程序可以根據需要滾動或瀏覽其中的數據
  • 主要用於交互式應用

使用遊標

創建遊標

  • DECLARE 遊標名 CURSOR FOR SELECT子句 END;

打開和關閉有白哦

  • 打開: OPEN 遊標;
  • 關閉: CLOSE 遊標;, 如果沒有關閉遊標則在到達END語句時自動關閉

使用遊標數據

  • 使用FETCH語句:
    • FETCH 列名 INTO 變量;
    • 訪問遊標的每一行, 自動從第一行開始,
    • 檢索後向前移動遊標中的內部行指針, 使下一條FETCH語句檢索下一行
  • 反覆執行直到條件爲真: REPEAT 執行代碼 UNTIL 條件 END REPEAT;
  • DECLARE語句的次序: 局部變量 > 遊標 > 句柄

觸發器

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

創建觸發器

  • 條件:
    • 唯一的觸發器名
    • 觸發器關聯的表
    • 觸發器應該響應的活動
    • 觸發器何時執行(處理之前或之後)
  • 例子: CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';
  • 該例子在INSERT操作後執行代碼
  • 只有表才支持觸發器, 視圖和臨時表都不支持
  • 每個表的每個事件每次只允許一個觸發器
  • 單一觸發器不能與多個事件或多個表關聯
  • 如果BEFORE觸發器失敗, 則MySQL將不執行請求的操作
  • 觸發器中不支持CALL調用存儲過程
  • (非必須)使用BEGIN和END語句標記觸發器體

刪除觸發器

  • DROP TRIGGER 觸發器名;
  • 觸發器不能更新或覆蓋, 要修改必須先刪除再重新創建

使用觸發器

INSERT觸發器

  • 在INSERT觸發器代碼內, 可引用一個名爲NEW的虛擬表, 訪問被插入的行
  • 在BEFORE INSERT觸發器中, NEW中的值也可以被更新
  • 對於自增列, NEW在INSERT執行之前包含0, 執行之後包含新的自動生成值
  • BEFORE通常用於數據驗證和淨化

DELETE觸發器

  • 在DELETE觸發器代碼內, 可引用一個名爲OLD的虛擬表, 訪問被刪除的行
  • OLD中的值都是隻讀的
  • 可用於將刪除的值存到另一個表中

UPDATE觸發器

  • 在UPDATE觸發器代碼內, 可引用一個名爲OLD的虛擬表訪問執行UPDATE語句之前的值, 引用一個名爲NEW的虛擬表訪問更新的值
  • NEW虛擬表中的值可以被更新
  • OLD中的值都是隻讀的

管理事務處理

事務處理用來維護數據庫的完整性, 它保證成批的MySQL操作要麼完全執行, 要麼完全不執行

事務處理術語

  • 事務(transaction): 指一組SQL語句
  • 回退(rollback): 指撤銷指定SQL語句的過程
  • 提交(commit): 指將未存儲的SQL語句結果寫入數據庫表
  • 保留點(savepoint): 指事務處理中設置的臨時佔位符, 可以對它發佈回退

控制事務處理

使用ROLLBACK

  • 回退(撤銷)MySQL語句
  • ROLLBACK只能在一個事務處理內使用(在執行一條START TRANSACTION命令之後)
  • 可以回退的語句: INSERT、UPDATE、DELETE

使用COMMIT

  • 一般的MySQL語句是自動進行提交的, 事務處理塊中不會自動提交, 需要使用COMMIT語句進行明確的提交
  • 當COMMIT或ROLLBACK語句執行後, 事務會自動關閉

使用保留點

  • 用於部分提交或回退
  • 創建佔位符: SAVEPOINT 保留點名;
  • 回退到保留點: ROLLBACK TO 保留點名;
  • 釋放保留點: 保留點在事務處理完成後自動釋放, 也可以用RELEASE SAVEPOINT 保留點名;釋放

更改默認的提交行爲

  • 默認的MySQL行爲自動提交所有修改
  • 指示MySQL不自動提交更改: SET autocommit=0;
  • autocommit爲真時自動提交
  • autocommit標誌是針對每個連接而不是服務器的

全球化和本地化

  • 查看支持的字符集完整列表: SHOW CHARACTER SET;
  • 查看支持校對的完整列表: SHOW COLLATION;
  • 查看所使用的字符集: SHOW VARIABLES LIKE 'character%';
  • 查看所使用的校對: SHOW VARIABLES LIKE 'collation%';
  • 爲表和表的列指定字符集和校對:
CREATE TABLE a
(
    column1 VARCHAR(10) CHARACTER SET latin1 COLLATE
        latin1_general_ci
) DEFAULT CHARACTER SET hebrew
  COLLATE hebrew_general_ci;
  • 如果只指定了CHRACTER SET則使用此字符集及其默認的校對
  • 如果沒有指定則使用數據庫默認
  • 校對在對用ORDER BY子句檢索出來的數據排序時起重要作用
  • COLLATE子句也可以在一下子句中使用: ORDER BY、GROUP BY、HAVING、聚集函數、別名等

安全管理

管理用戶

所有用戶賬號列表存在mysql和user數據庫中

創建用戶賬號

  • CREATE USER 用戶名 IDENTIFIED BY '密碼';
  • 使用GRANT也可以創建用戶賬號, 但CREATE USER比較簡單清楚
  • 也可以直接插入行到user表來增加用戶(不安全)
  • 重命名用戶賬戶: RENAME USER 用戶名 TO 新用戶名;, 也可以直接更新user表

刪除用戶賬號

  • DROP USER 用戶名;

設置訪問權限

  • 查看用戶賬號的權限: SHOW GRANTS FOR 用戶名;
  • 使用GRANT語句設置權限: GRANT 權限 ON 目標 TO 用戶名;
  • 使用REVOKE語句撤銷權限: REBOKE 權限 ON 目標 FROM 用戶名;
  • GRANT和REVOKE可在以下層次上控制訪問權限:
    • 整個服務器, 使用GRANT ALL和REVOKE ALL
    • 整個數據庫, 使用ON database.*
    • 特定的表, 使用ON database.table
    • 特定的列
    • 特定的存儲過程
  • 可以授予或撤銷的權限太多這裏不列出
  • 多個權限可用逗號分隔
  • 即使刪除數據庫或表, 已有權限仍然存在

更改口令

  • SET PASSWORD FOR 用戶名 = Password('新口令');
  • 設置自己的口令: SET PASSWORD = Password('新口令');

數據庫維護

備份數據

  • 使用命令行實用程序mysqldump轉儲所有數據庫內容到某個外部文件
  • 使用命令行實用程序mysqlhotcopy從一個數據庫複製所有數據(並非所有數據庫引擎都支持)
  • 使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE轉儲所有數據到某個外部文件, 數據用RESTORE TABLE復原
  • 爲了保證所有數據被寫到磁盤(包括索引數據), 需要在進行備份錢使用FLUSH TABLES語句

進行數據庫維護

  • 檢查表鍵是否正確: ANALYZE TABLE 表名;
  • CHECK TABLE用來針對許多問題對標進行檢查:
    • 發現和修復問題: CHECK TABLE 表名;
    • 檢查自最後一次檢查以來改動過的表: CHANGED
    • 執行最徹底的檢查: EXTENDED
    • 只檢查未正常關閉的表: FAST
    • 檢查所有被刪除的鏈接並進行鍵檢驗: MEDIUM
    • 進行快速掃描: QUICK
    • 在MyISAM表上還對索引進行檢查
  • 如果MyISAM表訪問產生不正確和不一致的結果, 用REPAIR TABLE修復(不應該經常使用)
  • 刪除大量數據後, 使用OPTIMIZE TABLE回收所用的空間

診斷啓動問題

  • 在命令行執行mysqld啓動數據庫
  • mysqld命令行選項:
    • –help顯示幫助
    • –safe-mode裝載減去某些最佳配置的服務器
    • –verbose顯示全文本消息
    • –version顯示版本信息

查看日誌文件

  • 錯誤日誌hostname.err, 包含啓動和關閉問題以及任意關鍵錯誤的細節
  • 查詢日誌hostname.log, 記錄所有MySQL活動
  • 二進制日誌hostname-bin, 記錄更新過數據的所有語句
  • 緩慢查詢日誌hostname-slow.log, 記錄執行緩慢的任何查詢
  • 日誌文件位於data目錄中

改善性能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章