MySQL--進(jìn)階

MySQL.png

數(shù)據(jù)庫設(shè)計(jì)

需求分析

  • 需求設(shè)計(jì)
  • 概要設(shè)計(jì)
  • 抽取實(shí)體:業(yè)務(wù)模型->實(shí)體模型(類)
  • 數(shù)據(jù)庫設(shè)計(jì):業(yè)務(wù)模型/實(shí)體模型->數(shù)據(jù)模型()硬盤

詳細(xì)設(shè)計(jì)

類詳細(xì),屬性,方法

三大范式
  • 設(shè)計(jì)原則:設(shè)計(jì)的表盡量遵守三大范式
  • 第一范式:表中每個(gè)字段必須是不可分割的獨(dú)立單元
  • 第二范式:在第一范式的基礎(chǔ)上,非主屬性完全函數(shù)依賴于任何一個(gè)候選碼
  • 第三范式:在第二范式的基礎(chǔ)上,非主屬性既不傳遞依賴于碼,也不函數(shù)依賴于碼

MySQL存儲(chǔ)過程

  • 執(zhí)行效率快,在服務(wù)端執(zhí)行

  • 移植性差

  • 創(chuàng)建存儲(chǔ)過程

DELIMITER $    聲明結(jié)束符
CREATE PROCEDURE proname()
BEGIN
SELECT * FROM table_name;
...
END $

執(zhí)行存儲(chǔ)過程

CALL proname();

參數(shù)
IN 輸入?yún)?shù),可以攜帶數(shù)據(jù)到存儲(chǔ)過程中
OUT 輸出參數(shù),可以從存儲(chǔ)過程中返回結(jié)果
INOUT 輸入輸出參數(shù),既有輸入功能,也有輸出功能
帶有存儲(chǔ)輸入?yún)?shù)的存儲(chǔ)過程

DELIMITER $
CREATE PROCEDURE proin(IN col  type)
BEGIN
SELECT * FROM table_name WHERE column=col;
END $

CALL proin(col);

帶有輸出參數(shù)的存儲(chǔ)過程

DELIMITER $
CREATE PROCEDURE proout(OUT col type)
BEGIN
SET col = 'Hello MySQL!';
END $

刪除存儲(chǔ)過程

DROP PROCEDURE proout;

MySQL變量

  • 全局變量(內(nèi)置變量)
SHOW varibales; 查看所有全局變量
select @@變量名;查看某個(gè)全局變量
set 變量名=新值; 修改全局變量
character_set_client:mysql服務(wù)器的接收數(shù)據(jù)的編碼
character_set_results:mysql服務(wù)器輸出數(shù)據(jù)的編碼
  • 會(huì)話變量:只存在于當(dāng)前客戶端與數(shù)據(jù)庫服務(wù)端的依次連接中,如果連接斷開,那么會(huì)話變量全部丟失
    SET @var='value';

  • 局部變量:在存儲(chǔ)過程中使用的變量

1)定義一個(gè)會(huì)話變量name

2)使用name會(huì)話變量接受存儲(chǔ)過程的返回值

CALL proout(@name);
SELECT @name;

帶有輸入輸出參數(shù)的存儲(chǔ)過程

DELIMITER $
CREATE PROCEDURE proinout(INOUT var type)
BEGIN
SELECT var;
SET var = value;
END $
SET @var=value;
CALL proinout(@var)

帶有條件判斷的存儲(chǔ)過程

輸入整數(shù),返回對(duì)應(yīng)星期天

DELIMITER $
CREATE PROCEDURE proif(IN num INT, OUT str VARCHAR(20))
BEGIN
IF num=1 THEN
SET str='星期一';
IF num=2 THEN
SET str='星期二';
IF num=3 THEN
SET str='星期三';
ELSE
SET str='輸入錯(cuò)誤';
END IF;
END $
CALL proif(1,@str);
SELECT @str;

帶有循環(huán)功能的存儲(chǔ)過程

輸入數(shù)值,求從一到該數(shù)值的累加和

DELIMITER $
CREATE PROCEDURE prowhile(IN num INT, OUT result INT)
BEGIN
定義一個(gè)局部變量
DECLARE i INT DEFAULT 1;
DECLARE vsum INT DEFAULT 0;
WHILE i<=num DO
SET vsum=vsum+i;
SET i=i+1;
END WHILE;
SET result=vsum;
END $
CALL prowhile(122, @result)
SELECT @result;

MySQL觸發(fā)器

當(dāng)操作某張表時(shí),同時(shí)觸發(fā)一些動(dòng)作

插入數(shù)據(jù)后,同時(shí)向日志表中插入

  • 創(chuàng)建觸發(fā)器(插入)
CREATE TRIGGER triname AFTER INSERT ON table_name FOR EACH ROW
INSERT INTO log_table_name(clomn,...) VALUES('INSERT');
  • 創(chuàng)建觸發(fā)器(修改)
CREATE TRIGGER triname AFTER UPDATE ON table_name FOR EACH ROW
INSERT INTO log_table_name(clomn,...) VALUES('update');
  • 創(chuàng)建觸發(fā)器(刪除)
CREATE TRIGGER triname AFTER DELETEON table_name FOR EACH ROW
INSERT INTO log_table_name(clomn,...) VALUES('delete');

MySQL權(quán)限

  • 修改密碼
UPDATE USER SET PASSWORD=PASSWORD('new_passwd') WHERE USERN='USErname';
  • 分配權(quán)限
GRANT SELECT ON DATABASE.table TO 'USEr'@'accounttype' IDENTIFIED BY 'password';
GRANT DELETE ON DATABASE.table TO 'USEr'@'accounttype' IDENTIFIED BY 'password';

MySQL備份和還原

  • 不需要登錄
MYSQLDUMP -u USErname -p DATABASE > path
MYSQL -u USErname -p DATABASE < path
  • 復(fù)制表
CREATE TABLE table_name LIKE tablename;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容