文章目錄
檢索
檢索不同的行: 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(列名)忽略NULLMAX()
: 返回某列的最大值, 忽略列值爲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
在數據分組後進行過濾- 同時使用
WHERE
和HAVING
: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 視圖名;
- 更新視圖:
- 先用
DROP
再用CREATE
CREATE OR REPLACE VIEW
視圖的用途
- 簡化複雜的聯結
- 重新格式化檢索出的數據
- 過濾不想要的數據
- 使用計算字段
更新視圖
- 同樣可以使用
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目錄中
改善性能
- 在前面有提到一些技巧
- 更多的技巧瀏覽文檔: http://dev.mysql.com/doc/