1. 程式人生 > 其它 >MYSQL使用三部曲(二)--MYSQL語句、索引、檢視、儲存過程、觸發器

MYSQL使用三部曲(二)--MYSQL語句、索引、檢視、儲存過程、觸發器

一、初識資料庫

1. 概念

資料庫

按照資料結構來組織、儲存和管理資料的倉庫;是一個長期儲存在計算機內的、有組織的、可共享的、統一管理的大量資料的集合

OLTP

OLTP(online transaction processing)翻譯為聯機事務處理;主要對資料庫增刪改查;

OLTP主要用來記錄某類業務事件的發生;資料會以增刪改的方式在資料庫中進行資料的更新處理 操作,要求實時性高、穩定性強、確保資料及時更新成功;

OLAP

OLAP(On-Line Analytical Processing)翻譯為聯機分析處理;主要對資料庫查詢;

當資料積累到一定的程度,我們需要對過去發生的事情做一個總結分析時,就需要把過去一段時間 內產生的資料拿出來進行統計分析,從中獲取我們想要的資訊,為公司做決策提供支援,這時候就 是在做OLAP了;

SQL命令

結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的程式語言,是一種數 據庫查詢和程式設計語言,用於存取資料以及查詢、更新和管理關係資料庫系統。SQL是關係資料 庫系統的標準語言。

關係型資料庫包括:MySQL, SQL Server, Oracle, Sybase, postgreSQL 以及 MS Access等;

SQL命令包括:DQL、DML、DDL、DCL以及TCL;

DQL

Data Query Language-資料查詢語句;

select:從一個或者多個表中檢索特定的記錄

DML

Data Manipulate Language-資料操作語言;

insert:插入記錄

update:更新記錄

delete:刪除記錄

DDL

Data Define Language-資料定義語言

create:建立一個新的表、表的檢視、或者在資料庫中的物件

alter:修改現有的資料庫物件,例如修改表的屬性或者欄位

drop:刪除表、資料庫物件或者檢視

DCL

Data Control Language-資料控制語言

grant:授予使用者許可權

revoke:收回使用者許可權

TCL

Transaction Control Language-事務控制語言

commit:事務提交

rollback:事務回滾

資料庫術語

資料庫:資料庫是一些關聯表的集合

資料表:表是資料的矩陣

列:一列包含相同型別的資料

行:或者稱為記錄,是一組相關的資料

主鍵:主鍵是唯一的;一個數據表只能包含一個主鍵

外來鍵:外來鍵用來關聯兩個表,來保證參照完整性;MyISAM儲存引擎本身並不支援外來鍵,只能起到註釋作用;而InnoDB完整支援外來鍵

複合鍵:或稱組合鍵,將多個列作為一個索引鍵

索引:用於快速訪問資料表的資料,索引是對錶中的一列或者多列的值進行排序的一種結構

2. MySQL體系結構

 

MySQL由這幾部分組成:連線池元件、管理服務和工具元件、SQL介面元件、查詢分析器元件、優化器元件、緩衝元件、外掛式儲存引擎、物理檔案。

連線者

不同語言的程式碼程式和mysql的互動(SQL互動)

連線池

管理緩衝使用者連線、使用者名稱、密碼、許可權校驗、執行緒處理等需要快取的需求;

網路處理流程:主程式接收連線,接收連線交由連線池處理

主要處理方式:IO多路複用select+阻塞的IO

 

 

MySQL命令處理是併發處理的,且MySQL是操作磁碟資料的重IO操作,所以使用阻塞的IO。

MySQL有最大連線數限制,可以使用下面語句檢視

show variables like '%max_connections%';

管理服務和工具元件

系統管理和控制工具,例如備份恢復、MySQL複製、叢集等

SQL介面

將SQL語句解析生成相應物件;DML,DDL,儲存過程,檢視,觸發器等

查詢解析器

將SQL物件 交由解析器驗證和解析,並生成語法樹

查詢優化器

SQL語句執行前使用查詢優化器進行優化

緩衝元件

是一塊記憶體取餘,用來你不磁碟速度較慢對資料庫效能的影響;在資料庫進行讀頁操作,首先將從磁碟讀到的頁存放在快取池重,下一次再讀取相同的頁時,首先判斷該頁是否在緩衝池中,若在緩衝池命中,直接讀取;否則讀取磁碟中的頁,說明該頁被LRU淘汰了;緩衝池中LRU採用最近最少使用演算法來進行管理;

緩衝池快取的資料型別有:索引頁、資料頁、以及與儲存引擎快取相關的資料(比如InnoDB引擎:undo頁、插入緩衝、自適應hash索引、InnoDB相關鎖資訊、資料字典資訊等)

外掛式儲存引擎

引擎是表級的,及每個不同的表可以指定不同的引擎。比較常用的引擎有MyISAM和InnoDB。MyISAM使用的是表鎖,InnoDB使用行鎖。

3. 資料庫設計三正規化

為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這 種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫, 必須滿足一定的正規化。

正規化一

確保每列保持原子性;資料庫表中的所有欄位都是不可分割的原子值

正規化二

確保表中的每列都和主鍵相關,而不能只與主鍵的某一部分相關(組合索引)

正規化三

確保每列都和主鍵直接相關,而不是間接相關;減少資料冗餘

反正規化

正規化可以避免資料冗餘,減少資料庫的空間,減小維護資料完整性的麻煩;但是採用資料庫正規化化 設計,可能導致資料庫業務涉及的表變多,並且造成更多的聯表查詢,將導致整個系統的效能降 低;因此處於效能考慮,可能需要進行反正規化設計

二、SQL語句簡述

1. 資料型別

具體資料型別可參考:https://www.runoob.com/mysql/mysql-data-types.html

例:定義無符號整數型別 INT UNSIGNED

資料型別 INT(11),表示資料型別為INT,括號內的11只有與關鍵字ZEROFILL配合使用才有效果,表示最小字元顯示寬度

2. CRUD

執行過程

建立資料庫

CREATE DATABASE `資料庫名` DEFAULT CHARACTER SET utf8;

刪除資料庫

DROP DATABASE `資料庫名`;

選擇資料庫

USE `資料庫名`;

建立表

CREATE TABLE `table_name` (column_name column_type);

CREATE TABLE IF NOT EXISTS `0voice_tbl` (
  `id` INT UNSIGNED AUTO_INCREMENT COMMENT '編號',
  `course` VARCHAR(100) NOT NULL COMMENT '課程',
  `teacher` VARCHAR(40) NOT NULL COMMENT '講師',
  `price` DECIMAL(8,2) NOT NULL COMMENT '價格',
  PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT = '課程表';

【】AUTO_INCREMENT是表示該欄位的值自增,https://www.cnblogs.com/unrealCat/p/16042181.html

【】COMMENT是對該欄位的解釋

【】PRIMARY KEY是指定主鍵

刪除表

DROP TABLE IF EXISTS `table_name`;

清空資料庫

TRUNCATE TABLE `table_name`; 
DELETE TABLE `table_name`; 

【】DELETE的無條件語句和TRUNCATE都可以清空資料庫,區別是TRUNCATE會清除AUTO_INCREMENT的值,使從1開始自增。

INSERT INTO `table_name`[(`field1`, `field2`, ..., `fieldn`)] VALUES (value1,value2, ..., valuen);
INSERT INTO `0voice_tbl` (`course`, `teacher`, `price`) VALUES ('C/C++Linux伺服器開發/高階架構師', 'Mark', 7580.0);

DELETE FROM `table_name` [WHERE Clause];

DELETE FROM `0voice_tbl` WHERE id = 3;

【】當使用safe update時,對於delete和update會有一些安全限制,可以通過set global sql_safe_updates=off 來設定(不建議)

UPDATE table_name SET field1=new_value1, field2=new_value2 [,
fieldn=new_valuen]

UPDATE `0voice_tbl` SET `teacher` = 'Mark' WHERE id = 2;
-- 累加
UPDATE `0Voice_tbl` set `age` = `age` + 1 WHERE id = 2;

SELECT field1, field2,...fieldN FROM table_name [WHERE Clause]

3. 高階查詢

查詢資料準備:https://www.cnblogs.com/unrealCat/p/16042252.html

 基礎查詢

-- 全部查詢
SELECT * FROM student;
-- 只查詢部分欄位
SELECT `sname`, `class_id` FROM student;
-- 別名 列名 不要用關鍵字
SELECT `sname` AS '姓名' , `class_id` AS '班級ID' FROM student;
-- 把查詢出來的結果的重複記錄去掉
SELECT distinct `class_id` FROM student;

【】distinct可以去除重複欄位的查詢結果,一般用來查詢不重複記錄的條數

條件查詢

-- 查詢姓名為 鄧洋洋 的學生資訊
SELECT * FROM `student` WHERE `name` = '鄧洋洋';
-- 查詢性別為 男,並且班級為 2 的學生資訊
SELECT * FROM `student` WHERE `gender`="男" AND `class_id`=2;

範圍查詢

-- 查詢班級id 1 到 3 的學生的資訊
SELECT * FROM `student` WHERE `class_id` BETWEEN 1 AND 3;

判空查詢

SELECT * FROM `student` WHERE `class_id` IS NOT NULL; #判斷不為空
SELECT * FROM `student` WHERE `class_id` IS NULL; #判斷為空
SELECT * FROM `student` WHERE `gender` <> ''; #判斷不為空字串
SELECT * FROM `student` WHERE `gender` = ''; #判斷為空字串

【】InnoDB的索引的B+樹,使用 is null判斷會造成索引失效

模糊查詢

-- 使用 like關鍵字,"%"代表任意數量的字元,”_”代表佔位符
-- 查詢名字為 謝 開頭的學生的資訊
SELECT * FROM `teacher` WHERE `tname` LIKE '謝%';
-- 查詢姓名裡第二個字為 小 的學生的資訊
SELECT * FROM `teacher` WHERE `tname` LIKE '_小%';

【】更多模糊查詢可以看正則表示式

分頁查詢

-- 分頁查詢主要用於檢視第N條 到 第M條的資訊,通常和排序查詢一起使用
-- 使用limit關鍵字,第一個引數表示從條記錄開始顯示,第二個引數表示要顯示的數目。表中預設第一條記錄的引數為0。
-- 查詢第二條到第三條內容
SELECT * FROM `student` LIMIT 1,2;

查詢後排序

-- 關鍵字:order by field, asc:升序, desc:降序
SELECT * FROM `score` ORDER BY `num` ASC;
-- 按照多個欄位排序
SELECT * FROM `score` ORDER BY `course_id` DESC, `num` DESC;

聚合查詢

 

SELECT sum(`num`) FROM `score`;
SELECT avg(`num`) FROM `score`;
SELECT max(`num`) FROM `score`;
SELECT min(`num`) FROM `score`;
SELECT count(`num`) FROM `score`;

分組查詢

-- 分組加group_concat
SELECT `gender`, group_concat(`age`) as ages FROM `student` GROUP BY `gender`;
-- 可以把查詢出來的結果根據某個條件來分組顯示
SELECT `gender` FROM `student` GROUP BY `gender`;
-- 分組加聚合
SELECT `gender`, count(*) as num FROM `student` GROUP BY `gender`;
-- 分組加條件
SELECT `gender`, count(*) as num FROM `student` GROUP BY `gender` HAVING num> 6;

【】group_concat()也是聚合函式,用於將多行合併成一行,語法:

  • group_concat( [distinct] `要合併的欄位` [order by `排序欄位` asc/desc ] [separator '分隔符'] )

 【】跟group by配合的條件語句是having

3.2 聯表查詢

 

INNER JOIN

只取兩張表有對應關係的記錄

SELECT
    cid
FROM
    `course`
INNER JOIN `teacher` ON course.teacher_id = teacher.tid;

【】聯表的條件的用on

LEFT JOIN

在內連線的基礎上保留座標沒有對應關係的記錄

SELECT
    course.cid
FROM
    `course`
LEFT JOIN `teacher` ON course.teacher_id = teacher.tid;

RIGHT JOIN

在內連線的基礎上保留右表沒有對應關係的記錄

SELECT
    course.cid
FROM
    `course`
RIGHT JOIN `teacher` ON course.teacher_id = teacher.tid;·

3.3 子查詢/合併查詢

子查詢--單行子查詢

select * from course where teacher_id = 
(select tid from teacher where tname = '謝小二老師')

子查詢--多行子查詢

多行子查詢即返回多行記錄的子查詢

IN關鍵字:運算子可以檢測結果集中是否存在某個特定的值,如果檢測成功就執行外部的查詢

EXISTS關鍵字:內層查詢語句不返回查詢的記錄。而是返回一個真假值。如果內層查詢語句查詢 到滿足條件的記錄,就返回一個真值(true),否則,將返回一個假值(false)。當返回的值為 true時,外層查詢語句將進行查詢;當返回的為false時,外層查詢語句不進行查詢或者查詢不出 任何記錄。

ALL關鍵字:表示滿足所有條件。使用ALL關鍵字時,只有滿足內層查詢語句返回的所有結果,才 可以執行外層查詢語句。ALL運算子必須以比較運算子開頭。

ANY關鍵字:允許建立一個表示式,對子查詢的返回值列表,進行比較,只要滿足內層子查詢中 的,任意一個比較條件,就返回一個結果作為外層查詢條件。

在FROM子句中使用子查詢:子查詢出現在from子句中,這種情況下將子查詢當做一個臨時表使 用。

select * from student where class_id in 
(select cid from course where teacher_id = 2);

select * from student where exists
(select cid from course where cid = 5);

SELECT student_id FROM score WHERE 
num < ALL(SELECT num FROM score WHERE student_id BETWEEN 1 AND 3) SELECT student_id, sname FROM (SELECT * FROM score WHERE course_id = 1 OR course_id = 2) AS A LEFT JOIN student ON A.student_id = student.sid;

3.4 正則表示式

MySQL中使用 REGEXP 操作符來進行正則表示式匹配。

4. 檢視

定義

檢視(view)是一種虛擬存在的表,是一個邏輯表,本身並不包含資料。其內容由查詢定義。

基表:用來建立檢視的表叫做基表;

通過檢視,可以展現基表的部分資料;

檢視資料來自定義檢視的查詢中使用的表,使用檢視動態生成;

優點

簡單:使用檢視的使用者完全不需要關心後面對應的表的結構、關聯條件和篩選條件,對使用者來說已經是過濾好的複合條件的結果集。

安全:使用檢視的使用者只能訪問他們被允許查詢的結果集,對錶的許可權管理並不能限制到某個行某個列,但是通過檢視可以簡單的實現

資料獨立:一旦檢視的結構確定了,可以遮蔽表結構變化對使用者的影響,源表增加列對檢視沒有影響;源表修改列名,則可以通過修改檢視來解決,不會造成對訪問者的影響。

語法

CREATE VIEW <檢視名> AS <SELECT語句>

案例

-- 建立檢視
-- 查詢“c++高階”課程比“音視訊”課程成績高的所有學生的學號;
CREATE VIEW view_test1 AS SELECT
  A.student_id
FROM
  (
    SELECT
      student_id,
      num
    FROM
      score
    WHERE
      course_id = 1
  ) AS A 
LEFT JOIN (
  SELECT
    student_id,
    num
  FROM
    score
  WHERE
    course_id = 2
) AS B 
ON A.student_id = B.student_id
WHERE
  A.num >
IF (isnull(B.num), 0, B.num);

【】IF(condition,value_if_true,value_if_false)

【】isnull(expr),如果expr是null,isnull()函式返回true

【】IFNULL(expression,alt_value),如果expression不會null,返回expression,否則返回alt_value

作用

  • 可複用,減少重複語句書寫;類似程式中函式的作用
  • 重構利器
  • 邏輯更清晰,遮蔽查詢細節,關注資料返回
  • 許可權控制,某些表對使用者遮蔽,但是可以給該使用者通過檢視來對該表操作

拓展

物化檢視和普通檢視的區別

5. 儲存過程

定義

SQL語句需要先編譯然後執行,而儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數(如果該儲存過程帶有引數)來呼叫執行它。

儲存過程是可程式設計的函式,在資料庫中建立並儲存,可以由SQL語句和控制結構組成。當想要在不同的應用程式或平臺上執行相同的函式,或者封裝特定功能時,儲存過程是非常有用的。資料庫中的儲存過程可以看做是對程式設計中面向物件方法的模擬,它允許控制資料的訪問方式。

特點

  • 能完成較複雜的判斷和運算
  • 可程式設計性強,靈活
  • SQL程式設計的程式碼可重複使用
  • 執行的速度相對快一些
  • 減少網路之間的資料傳輸,節省開銷

語法

CREATE PROCEDURE 過程名
([[IN|OUT|INOUT] 引數名 資料型別
[,[IN|OUT|INOUT] 引數名 資料型別…]]) [特性 ...] 過程體

儲存過程根據想要可能會有有輸入、輸出、輸入輸出引數,如果有多個引數要用“,”分隔開。

MySQL儲存過程的引數用在儲存過程中的定義,共有三種引數型別,INOUTINOUT,分別是傳入引數、傳出引數、傳入傳出引數。

過程體的開始與結束使用BEGINEND進行標識

案例

DELIMITER //
    CREATE PROCEDURE proc_test1()
BEGIN
    SELECT current_time();
    SELECT current_date();
END
//
DELIMITER ;
call proc_test1();

【】DELIMITER與儲存過程無關,它的作用是修改分隔符。MySQL的預設分隔符是“;”,當MySQL直譯器檢測到分隔符就會執行SQL語句。但是,有時候,當你輸入一大段內容並且中間包含有分號時,你希望能在全部內容輸入完成後再執行,這時候就需要修改分隔符。DELIMITER //表示將分隔符設定為“//”。

案例--IN

DELIMITER //
CREATE PROCEDURE proc_in_param (IN p_in INT)
BEGIN
    SELECT p_in ;
    SET p_in = 2 ;
    SELECT p_in ;
END ;//
DELIMITER ;

-- 呼叫
SET @p_in = 1;
CALL proc_in_param (@p_in);
-- p_in雖然在儲存過程中被修改,但並不影響@p_id的值
SELECT @p_in;   #=1

【】@是使用者自定義變數,@@是系統變數

案例--OUT

DELIMITER //
CREATE PROCEDURE proc_out_param(OUT p_out int)
BEGIN
  SELECT p_out;
  SET p_out=2;
  SELECT p_out;
END;
//
DELIMITER ;
-- 呼叫
SET @p_out=1;
CALL proc_out_param(@p_out);
SELECT @p_out; -- 2        

【】--也是MySQL的一種註釋方式,注意,在--後要加空格

案例--INOUT

DELIMITER //
CREATE PROCEDURE proc_inout_param(INOUT p_inout int)
BEGIN
    SELECT p_inout;
    SET p_inout=2;
    SELECT p_inout;
END;
//
DELIMITER ;
#呼叫
SET @p_inout=1;
CALL proc_inout_param(@p_inout) ;
SELECT @p_inout; -- 2

6. 流程控制

IF

IF condition THEN
    ...
ELSEIF condition THEN
    ...
ELSE
    ...
END IF;

CASE

CASE value
    WHEN value THEN ...
    WHEN value THEN ...
    ELSE ...
END CASE;

WHILE

WHILE condition DO
    ...
END WHILE;

LEAVE

-- 相當於break
LEAVE label;
-- LEAVE語句退出迴圈或程式塊,只能和BEGIN ... END,LOOP,REPEAT,WHILE語句配合使用

ITERATE

-- 相當於continue
ITERATE label;

LOOP

-- 相當於while(true){...}
LOOP
    ...
END LOOP
-- 可以通過LEAVE語句退出迴圈

REPEAT

-- 相當於do...while(condition)
REPEAT
    ...
    UNTIL condition
END REPEAT;

7. 遊標

遊標是針對行操作的,對從資料庫中select查詢得到的結果集的每一行可以進行分開的獨立的相同或不相同的操作。

對於取出多行資料集,需要針對每行操作;可以使用遊標;遊標常用於儲存過程、函式、觸發器、事件;

遊標相當於行迭代器

定義遊標

DECLARE cursor_name CURSOR FOR select_statement
#select_statement這可以是你查詢出來的任意集合

開啟遊標

OPEN cursor_name;

取遊標資料

FETCH cursor_name INTO var_name[,var_name,.......]

關閉遊標

CLOSE cursor_name;

釋放遊標

DEALLOCATE cursor_name;

設定遊標結束標誌

DECLARE done INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
#當遊標結束時 done 被標記1

【】在使用遊標過程中,可能會用到一些接收遊標值的變數,我們需要定義他們

-- 建立 用於接收遊標值的變數
DECLARE p_id,p_age,p_total INT ;
DECLARE p_sex TINYINT ;
-- 注意:接收遊標值為中文時,需要給變數 指定字符集utf8
DECLARE p_name VARCHAR (32) CHARACTER SET utf8 ; 
-- 接收遊標結束標誌的變數
DECLARE done INT DEFAULT 0 ; 

案例

DELIMITER //
CREATE PROCEDURE proc_while(
    IN age_in INT,
    OUT total_out INT
)
BRGIN
-- 建立用於接收遊標值的變數
DECLARE p_id,p_age,p_total INT;
DECLARE p_sex TINYINT;
DECLARE p_name VARCHAR(32) CHARACTER SET utf8;
DECLARE done INT DEFAULT 0;
DECLARE cur_teacher CURSOR FOR SELECT
    teacher_id,
    teacher_name,
    teacher_sex,
    teacher_age
FROM
    teacher
WHERE
    teacher_age > age_in;
-- 指定遊標迴圈結束時的返回值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 開啟遊標
OPEN cur_teacher;
-- 初始化變數
SET p_total = 0;
-- while迴圈
WHILE done != 1 DO
    FETCH cur_teacher INTO p_id,p_name,p_sex,p_age;
IF done != 1 THEN
    SET p_total = p_total+1;    #遊標讀取到空行,才會設定結束標誌
END IF;
END WHILE;
-- 關閉遊標
CLOSE cur_teacher;
-- 將累計結果複製給輸出引數
SET total_out = p_total;
END //
DELIMITER ;

-- 呼叫
SET @p_age = 20;
CALL proc_while(@p_age, @total);
SELECT @total;

8. 觸發器

觸發器是行級觸發,即一個事務中如果有多個操作會觸發觸發器,則會一條一條地觸發觸發器。慎用觸發器。

定義

觸發器(trigger)是MySQL提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是有程式呼叫的,也不是手工啟動,而是由事件來觸發,比如當對一個表進行DML操作(insert,delete,update)時就會啟用它執行。

四要素

監視物件:table

監視事件:insert、update、delete

觸發時間:before、after

觸發事件:insert、update、delete

語法

CREATE TRIGGER trigger_name trigger_time trigger_event
ON table_name FOR EACH ROW [trigger_order]
trigger_body  -- 此處謝執行語句
-- trigger_name:定義的觸發器名
-- trigger_time:{BEFORE | AFTER}
-- trigger_event:{INSERT | UPDATE | DELETE}
-- trigger_order:{FOLLOWS | PRECEDES} other_trigger_name
# trigger_order提供給程式設計師設定觸發器的觸發順序

NEW和OLD

在INSERT型觸發器中,NEW用來表示將要(BEFORE)或已經(AFTER)插入的新資料

在DELETE型觸發器中,OLD用來表示將要或已經被刪除的原資料

在UPDATE型觸發器中,OLD用來表示將要或已經被修改的原資料,NEW用來表示將要或已經修改為的新資料

NEW.columnName (columnName為相應資料表某一列名)
OLD.columnName

案例

CREATE TABLE `work` (
    `id` INT PRIMARY KEY auto_increment,
    `address` VARCHAR (32)
) DEFAULT charset = utf8 ENGINE = INNODB;

CREATE TABLE `time` (
    `id` INT PRIMARY KEY auto_increment,
    `time` DATETIME
) DEFAULT charset = utf8 ENGINE = INNODB;

CREATE TRIGGER trig_test1 AFTER INSERT
ON `work` FOR EACH ROW
INSERT INTO `time` VALUES(NULL,NOW());

【】now()函式返回現在的系統時間

9. 許可權管理

建立使用者

CREATE USER username@host IDENTIFIED BY yourpassword;

【】host: 指定該使用者在哪個主機上可以登陸,如果是本地使用者可用 localhost ,如果想讓該使用者可 以從任意遠端主機登陸,可以使用萬用字元 % ;

授權

GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

【】privileges :使用者的操作許可權,如 SELECT , INSERT , UPDATE 等,如果要授予所的許可權則使用ALL;

【】databasename.tablename :如果是 *.* 表示任意資料庫以及任意表;

【】WITH GRANT OPTION :這個選項表示該使用者可以將自己擁有的許可權授權給別人。注意:經常有人在 建立操作使用者的時候不指定 WITH GRANT OPTION 選項導致後來該使用者不能使用 GRANT 命令建立 使用者或者給其它使用者授權。 如果不想這個使用者有這個 grant 的許可權,則不要加該 WITH GRANT OPTION 選項;

對檢視授權

GRANT select, SHOW VIEW ON `databasename`.`tablename` to 'username'@'host';

重新整理許可權

-- 修改許可權後需要重新整理許可權
FLUSH PRIVILEGES;

10. 遠端連線

修改檔案配置

註釋mysqld.cnf中的bind-address,修改mysql.user表,然後重啟mysql

-- mysqld.cnf
#bind-address=127.0.0.1
-- 修改user表
select `user`, `host` from `mysql`.`user`;
update user set host='%' where user='root';

一般不推薦直接修改root使用者,建議新建一個可遠端訪問的使用者,並賦予需要的許可權。