前言導(dǎo)讀
在日常開(kāi)發(fā)中,存儲(chǔ)數(shù)據(jù)的最常用的方式便是數(shù)據(jù)庫(kù)了,其中最為著名的便是
MySQL數(shù)據(jù)庫(kù),因他簡(jiǎn)便易于上手而且可擴(kuò)展性強(qiáng)大,跨平臺(tái)使得它廣為使用,今天我們就來(lái)具體聊聊。
1.安裝
2.數(shù)據(jù)類(lèi)型
3.庫(kù) 表常見(jiàn)操作
4.索引
5.視圖
6.函數(shù)
7.游標(biāo)
8.觸發(fā)器
9.存儲(chǔ)過(guò)程
10.事務(wù)
11.備份與還原
12.用戶(hù)賬號(hào)
13.其他
一、安裝過(guò)程
我們所使用的是MySQL 5.7版本,這個(gè)版本算是挺不錯(cuò)的。下面我們來(lái)介紹下這個(gè)版本的具體安裝過(guò)程吧。
1.解壓安裝
因?yàn)楣倬W(wǎng)目前下載不了,為了大家安裝過(guò)程中方便,我們下載一個(gè)免安裝版mysql,
地址:
https://590m.com/file/7715018-442009503,下載好后將這個(gè)壓縮包文件解壓到指定的磁盤(pán)下,比如我想解壓到E盤(pán)的mysql文件夾中。如圖:
為了讓mysql 可以在任意目錄運(yùn)行,我們可以將mysql的bin目錄添加到環(huán)境變量,如圖:
3.修改配置文件
在mysql目錄下創(chuàng)建一個(gè)my.ini配置文件,修改配置:
[mysql]# 設(shè)置mysql客戶(hù)端默認(rèn)字符集default-character-set=utf8[mysqld]#設(shè)置3306端口port = 3306# 設(shè)置mysql的安裝目錄basedir='E:\mysql\mysql-5.7.11-winx64'# 設(shè)置mysql數(shù)據(jù)庫(kù)的數(shù)據(jù)的存放目錄datadir='E:\mysql\mysql-5.7.11-winx64\data'# 允許最大連接數(shù)max_connections=200# 服務(wù)端使用的字符集默認(rèn)為8比特編碼的latin1字符集character-set-server=utf8# 創(chuàng)建新表時(shí)將使用的默認(rèn)存儲(chǔ)引擎default-storage-engine=INNODB
4.安裝mysql
以管理員身份運(yùn)行命令提示符,輸入mysqld install命令(注意是mysqld而不是mysql)回車(chē),即可安裝MySQL,提示:Service successfully installed,則表示安裝成功,如下圖所示:
移除服務(wù):mysqld remove
5.啟動(dòng)mysql服務(wù)
在命令提示符下執(zhí)行命令,
啟動(dòng)mysql:net start mysql
停止:net stop mysql
發(fā)現(xiàn)啟動(dòng)不了,如圖:
這是怎么回事了,哦~原來(lái)是因?yàn)檫€沒(méi)有初始化,那么我們現(xiàn)在來(lái)進(jìn)行初始化,
執(zhí)行指令:mysqld --initialize-insecure --user=mysql,
mysqld --initialize-insecure:自動(dòng)生成無(wú)密碼的root用戶(hù),
mysqld --initialize:自動(dòng)生成帶隨機(jī)密碼的root用戶(hù),
mysqld --initialize --user=mysql --console:生成隨機(jī)密碼并顯示在控制臺(tái)窗口,
data文件夾不為空是不能執(zhí)行這個(gè)命令的(刪掉data文件即可),
執(zhí)行mysqld --initialize-insecure --user=mysql命令會(huì)自動(dòng)新建data文件夾。執(zhí)行結(jié)果如圖:
可以看到執(zhí)行成功了,再次啟動(dòng)mysql服務(wù),啟動(dòng)成功。如圖:
6.進(jìn)入mysql,修改登陸密碼確保安全
第一次進(jìn)入mysql 是沒(méi)有密碼就可以登陸了,我們可以設(shè)置登陸密碼,
更改root密碼,輸入:
update mysql.user set password=password('123321') where user = 'root';
因?yàn)樾掳鎚ysql數(shù)據(jù)庫(kù)下沒(méi)有password字段,所以需要使用如下命令:
update mysql.user set authentication_string=password('123321') where user='root';
刷新權(quán)限:flush privileges;
這是必須的,不然操作沒(méi)有效果。
也可以這樣修改密碼:
set password = password('123456');
這樣就將root用戶(hù)的密碼設(shè)置為了 123456了,下面我們退出mysql再重新進(jìn)去,順帶說(shuō)下退出命令:
退出mysql:quit;
接下來(lái)在進(jìn)入mysql,如圖:
這樣root用戶(hù)就有了密碼,他的密碼就是123321.
整個(gè)安裝過(guò)程就完成了,是不是很簡(jiǎn)單了。
另外,為了提高交互效果,我們還可以一個(gè)軟件-------sqlyong,他可以和mysql建立鏈接,
下載地址:
https://590m.com/file/7715018-442029096,
然后輸入壓縮包內(nèi)自帶的注冊(cè)碼破解就可以免費(fèi)使用了。
2.mysql 數(shù)據(jù)類(lèi)型
1.數(shù)值類(lèi)型
MySQL支持所有標(biāo)準(zhǔn)SQL數(shù)值數(shù)據(jù)類(lèi)型。
這些類(lèi)型包括嚴(yán)格數(shù)值數(shù)據(jù)類(lèi)型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數(shù)值數(shù)據(jù)類(lèi)型(FLOAT、REAL和DOUBLE PRECISION)。
關(guān)鍵字INT是INTEGER的同義詞,關(guān)鍵字DEC是DECIMAL的同義詞。
BIT數(shù)據(jù)類(lèi)型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作為SQL標(biāo)準(zhǔn)的擴(kuò)展,MySQL也支持整數(shù)類(lèi)型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個(gè)整數(shù)類(lèi)型的存儲(chǔ)和范圍。
類(lèi)型 大小 范圍(有符號(hào)) 范圍(無(wú)符號(hào)) 用途 TINYINT 1 字節(jié) (-128,127) (0,255) 小整數(shù)值 SMALLINT 2 字節(jié) (-32 768,32 767) (0,65 535) 大整數(shù)值 MEDIUMINT 3 字節(jié) (-8 388 608,8 388 607) (0,16 777 215) 大整數(shù)值 INT或INTEGER 4 字節(jié) (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數(shù)值 BIGINT 8 字節(jié) (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 極大整數(shù)值 FLOAT 4 字節(jié) (-3.402 823 466 E 38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E 38) 0,(1.175 494 351 E-38,3.402 823 466 E 38) 單精度 浮點(diǎn)數(shù)值 DOUBLE 8 字節(jié) (-1.797 693 134 862 315 7 E 308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E 308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E 308) 雙精度 浮點(diǎn)數(shù)值 DECIMAL 對(duì)DECIMAL(M,D) ,如果M>D,為M 2否則為D 2 依賴(lài)于M和D的值 依賴(lài)于M和D的值 小數(shù)值
2.日期和時(shí)間類(lèi)型
表示時(shí)間值的日期和時(shí)間類(lèi)型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每個(gè)時(shí)間類(lèi)型有一個(gè)有效值范圍和一個(gè)'零'值,當(dāng)指定不合法的MySQL不能表示的值時(shí)使用'零'值。
TIMESTAMP類(lèi)型有專(zhuān)有的自動(dòng)更新特性,將在后面描述。
類(lèi)型 大小 (*字節(jié))** 范圍 格式 用途 DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 時(shí)間值或持續(xù)時(shí)間 YEAR 1 1901/2155 YYYY 年份值 DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時(shí)間值 TIMESTAMP 4 1970-01-01 00:00:00/2037 年某時(shí) YYYYMMDD HHMMSS 混合日期和時(shí)間值,時(shí)間戳
3.字符串類(lèi)型
字符串類(lèi)型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節(jié)描述了這些類(lèi)型如何工作以及如何在查詢(xún)中使用這些類(lèi)型。
類(lèi)型 大小 用途 CHAR 0-255字節(jié) 定長(zhǎng)字符串 VARCHAR 0-65535 字節(jié) 變長(zhǎng)字符串 TINYBLOB 0-255字節(jié) 不超過(guò) 255 個(gè)字符的二進(jìn)制字符串 TINYTEXT 0-255字節(jié) 短文本字符串 BLOB 0-65 535字節(jié) 二進(jìn)制形式的長(zhǎng)文本數(shù)據(jù) TEXT 0-65 535字節(jié) 長(zhǎng)文本數(shù)據(jù) MEDIUMBLOB 0-16 777 215字節(jié) 二進(jìn)制形式的中等長(zhǎng)度文本數(shù)據(jù) MEDIUMTEXT 0-16 777 215字節(jié) 中等長(zhǎng)度文本數(shù)據(jù) LONGBLOB 0-4 294 967 295字節(jié) 二進(jìn)制形式的極大文本數(shù)據(jù) LONGTEXT 0-4 294 967 295字節(jié) 極大文本數(shù)據(jù)
CHAR和VARCHAR類(lèi)型類(lèi)似,但它們保存和檢索的方式不同。它們的最大長(zhǎng)度和是否尾部空格被保留等方面也不同。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫(xiě)轉(zhuǎn)換。
BINARY和VARBINARY類(lèi)類(lèi)似于CHAR和VARCHAR,不同的是它們包含二進(jìn)制字符串而不要非二進(jìn)制字符串。也就是說(shuō),它們包含字節(jié)字符串而不是字符字符串。這說(shuō)明它們沒(méi)有字符集,并且排序和比較基于列值字節(jié)的數(shù)值值。
BLOB是一個(gè)二進(jìn)制大對(duì)象,可以容納可變數(shù)量的數(shù)據(jù)。有4種BLOB類(lèi)型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長(zhǎng)度不同。
有4種TEXT類(lèi)型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對(duì)應(yīng)4種BLOB類(lèi)型,有相同的最大長(zhǎng)度和存儲(chǔ)需求。
Enum('fds','fsa','fasf') :枚舉類(lèi)型
set(val1,val2,val3):集合類(lèi)型
3.庫(kù)表操作
1、MySQL觸發(fā)器的創(chuàng)建語(yǔ)法:CREATE[DEFINER = { 'user' | CURRENT_USER }]TRIGGER trigger_nametrigger_time trigger_eventON table_nameFOR EACH ROW[trigger_order]trigger_body2、MySQL創(chuàng)建語(yǔ)法中的關(guān)鍵詞解釋?zhuān)鹤侄? 含義 可能的值DEFINER= 可選參數(shù),指定創(chuàng)建者, DEFINER='root@%' 默認(rèn)為當(dāng)前登錄用戶(hù)(CURRENT_USER); 該觸發(fā)器將以此參數(shù)指定的用戶(hù)執(zhí)行, DEFINER=CURRENT_USER 所以需要考慮權(quán)限問(wèn)題;?trigger_name 觸發(fā)器名稱(chēng),最好由表名 觸發(fā)事件關(guān)鍵詞 觸發(fā)時(shí)間關(guān)鍵詞組成; trigger_time 觸發(fā)時(shí)間,在某個(gè)事件之前還是之后; BEFORE、AFTER? INSERT:插入操作觸發(fā)器,INSERT、LOAD DATA、REPLACE時(shí)觸發(fā); UPDATE:更新操作觸發(fā)器,UPDATE操作時(shí)觸發(fā);trigger_event 觸發(fā)事件,如插入時(shí)觸發(fā)、刪除時(shí)觸發(fā); DELETE:刪除操作觸發(fā)器,DELETE、REPLACE操作時(shí)觸發(fā); INSERT、UPDATE、DELETEtable_name 觸發(fā)操作時(shí)間的表名; 可選參數(shù),如果定義了多個(gè)具有相同觸發(fā)事件和觸法時(shí)間的觸發(fā)器時(shí)( 如:BEFORE UPDATE),默認(rèn)觸發(fā)順序與觸發(fā)器的創(chuàng)建順序一致,可以trigger_order 使用此參數(shù)來(lái)改變它們觸發(fā)順序。mysql 5.7.2起開(kāi)始支持此參數(shù)。 FOLLOWS:當(dāng)前創(chuàng)建觸發(fā)器在現(xiàn)有觸發(fā)器之后激活; FOLLOWS、PRECEDES PRECEDES:當(dāng)前創(chuàng)建觸發(fā)器在現(xiàn)有觸發(fā)器之前激活; trigger_body 觸發(fā)執(zhí)行的SQL語(yǔ)句內(nèi)容,一般以begin開(kāi)頭,end結(jié)尾 BEGIN .. END 觸發(fā)執(zhí)行語(yǔ)句內(nèi)容(trigger_body)中的OLD,NEW觸發(fā)執(zhí)行語(yǔ)句內(nèi)容(trigger_body)中的OLD,NEW:在trigger_body中,我們可以使用NEW表示將要插入的新行(相當(dāng)于MS SQL的INSERTED),OLD表示將要?jiǎng)h除的舊行(相當(dāng)于MS SQL的DELETED)。通過(guò)OLD,NEW中獲取它們的字段內(nèi)容,方便在觸發(fā)操作中使用,下面是對(duì)應(yīng)事件是否支持OLD、NEW的對(duì)應(yīng)關(guān)系:事件 OLD NEWINSERT × √DELETE √ ×UPDATE √ √?由于UPDATE相當(dāng)于刪除舊行(OLD),然后插入新行(NEW),所以UPDATE同時(shí)支持OLD、NEW;DELIMITER $... --觸發(fā)器創(chuàng)建語(yǔ)句;$ --提交創(chuàng)建語(yǔ)句;DELIMITER ;??select * FROM information_schema.triggers;SHOW TRIGGERS; #查看觸發(fā)器-- 通過(guò)information_schema.triggers表查看觸發(fā)器:select * FROM information_schema.triggers;-- mysql 查看當(dāng)前數(shù)據(jù)庫(kù)的觸發(fā)器SHOW TRIGGERS;-- mysql 查看指定數(shù)據(jù)庫(kù)'people'的觸發(fā)器SHOW TRIGGERS FROM people;?創(chuàng)建測(cè)試表DROP TABLE IF EXISTS tb;CREATE TABLE IF NOT EXISTS tb(id INT,username CHAR(10),pass VARCHAR(20),ct INT);CREATE TABLE IF NOT EXISTS bt(fid INT,username CHAR(10),pass VARCHAR(20),ct INT);創(chuàng)建觸發(fā)器DELIMITER $#drop trigger if exists df_names$ 刪除前先判斷觸發(fā)器是否存在CREATE DEFINER =CURRENT_USERTRIGGER df_namesBEFORE INSERT ON tbAFTER UPDATE ON btFOR EACH ROWBEGIN #set new.ct=new.id*5; #SET @ct=12; 變量 #SET @pass='hjfd'; IF old.type=1 THEN UPDATE bt SET ct=old.ct WHERE fid=old.id; ELSE IF old.type=2 THEN UPDATE bt SET pass=old.pass WHERE fid=old.id;END$DELIMITER;?測(cè)試INSERT INTO tb(id) VALUES(4);SELECT *FROM tb;?
4.索引
SET AUTOCOMMIT=off ;禁用或啟用事務(wù)的自動(dòng)提交模式 off ONSET SESSION AUTOCOMMIT = OFF; 禁用或啟用事務(wù)的session自動(dòng)提交模式 off ONSHOW VARIABLES LIKE '%auto%'; -- 查看變量狀態(tài)?執(zhí)行DML語(yǔ)句是其實(shí)就是開(kāi)啟一個(gè)事務(wù)只能回滾insert、delete和update語(yǔ)句對(duì)于create、drop、alter這些無(wú)法回滾事務(wù)只對(duì)DML有效果rollback,或者commit后事務(wù)就結(jié)束了自動(dòng)提交模式用于決定新事務(wù)如何及何時(shí)啟動(dòng)START TRANSACTION; 啟用自動(dòng)提交模式下顯式地啟動(dòng)事務(wù)COMMIT和ROLLBACK; 禁用自動(dòng)提交模式顯式地提交或回滾-- 事務(wù) transaction 指一組sql語(yǔ)句-- 回退 rollback 指撤銷(xiāo)指定sql語(yǔ)句的過(guò)程-- 提交 commit 指將未存儲(chǔ)的sql語(yǔ)句結(jié)果寫(xiě)入數(shù)據(jù)庫(kù)表-- 保留點(diǎn) savepoint 指事務(wù)處理中設(shè)置的臨時(shí)占位符,可以對(duì)它發(fā)布回退(與回退整個(gè)事務(wù)處理不同)?-- 控制事務(wù)處理# 開(kāi)始事務(wù)及回退 SELECT * FROM ordertotals; # 查看ordertotals表顯示不為空START TRANSACTION; # 開(kāi)始事務(wù)處理 DELETE FROM ordertotals; # 刪除ordertotals表中所有行SELECT * FROM ordertotals; # 查看ordertotals表顯示 為空ROLLBACK; # rollback語(yǔ)句回退 SELECT * FROM ordertotals; # rollback后,再次查看ordertotals表顯示不為空?# commit 提交 START TRANSACTION;DELETE FROM orderitems WHERE order_num = 20010;DELETE FROM orders WHERE order_num = 20010;COMMIT; # 僅在上述兩條語(yǔ)句不出錯(cuò)時(shí)寫(xiě)出更改 ?# savepoint 保留點(diǎn) # 創(chuàng)建保留點(diǎn)SAVEPOINT delete1;# 回退到保留點(diǎn) ROLLBACK TO delete1;# 釋放保留點(diǎn) RELEASE SAVEPOINT delete1;?-- 更改默認(rèn)的提交行為 SET autocommit = 0; # 設(shè)置autocommit為0(假)指示MySQL不自動(dòng)提交更改
5.視圖
1、MySQL觸發(fā)器的創(chuàng)建語(yǔ)法:CREATE[DEFINER = { 'user' | CURRENT_USER }]TRIGGER trigger_nametrigger_time trigger_eventON table_nameFOR EACH ROW[trigger_order]trigger_body2、MySQL創(chuàng)建語(yǔ)法中的關(guān)鍵詞解釋?zhuān)鹤侄? 含義 可能的值DEFINER= 可選參數(shù),指定創(chuàng)建者, DEFINER='root@%' 默認(rèn)為當(dāng)前登錄用戶(hù)(CURRENT_USER); 該觸發(fā)器將以此參數(shù)指定的用戶(hù)執(zhí)行, DEFINER=CURRENT_USER 所以需要考慮權(quán)限問(wèn)題;?trigger_name 觸發(fā)器名稱(chēng),最好由表名 觸發(fā)事件關(guān)鍵詞 觸發(fā)時(shí)間關(guān)鍵詞組成; trigger_time 觸發(fā)時(shí)間,在某個(gè)事件之前還是之后; BEFORE、AFTER? INSERT:插入操作觸發(fā)器,INSERT、LOAD DATA、REPLACE時(shí)觸發(fā); UPDATE:更新操作觸發(fā)器,UPDATE操作時(shí)觸發(fā);trigger_event 觸發(fā)事件,如插入時(shí)觸發(fā)、刪除時(shí)觸發(fā); DELETE:刪除操作觸發(fā)器,DELETE、REPLACE操作時(shí)觸發(fā); INSERT、UPDATE、DELETEtable_name 觸發(fā)操作時(shí)間的表名; 可選參數(shù),如果定義了多個(gè)具有相同觸發(fā)事件和觸法時(shí)間的觸發(fā)器時(shí)( 如:BEFORE UPDATE),默認(rèn)觸發(fā)順序與觸發(fā)器的創(chuàng)建順序一致,可以trigger_order 使用此參數(shù)來(lái)改變它們觸發(fā)順序。mysql 5.7.2起開(kāi)始支持此參數(shù)。 FOLLOWS:當(dāng)前創(chuàng)建觸發(fā)器在現(xiàn)有觸發(fā)器之后激活; FOLLOWS、PRECEDES PRECEDES:當(dāng)前創(chuàng)建觸發(fā)器在現(xiàn)有觸發(fā)器之前激活; trigger_body 觸發(fā)執(zhí)行的SQL語(yǔ)句內(nèi)容,一般以begin開(kāi)頭,end結(jié)尾 BEGIN .. END 觸發(fā)執(zhí)行語(yǔ)句內(nèi)容(trigger_body)中的OLD,NEW觸發(fā)執(zhí)行語(yǔ)句內(nèi)容(trigger_body)中的OLD,NEW:在trigger_body中,我們可以使用NEW表示將要插入的新行(相當(dāng)于MS SQL的INSERTED),OLD表示將要?jiǎng)h除的舊行(相當(dāng)于MS SQL的DELETED)。通過(guò)OLD,NEW中獲取它們的字段內(nèi)容,方便在觸發(fā)操作中使用,下面是對(duì)應(yīng)事件是否支持OLD、NEW的對(duì)應(yīng)關(guān)系:事件 OLD NEWINSERT × √DELETE √ ×UPDATE √ √?由于UPDATE相當(dāng)于刪除舊行(OLD),然后插入新行(NEW),所以UPDATE同時(shí)支持OLD、NEW;DELIMITER $... --觸發(fā)器創(chuàng)建語(yǔ)句;$ --提交創(chuàng)建語(yǔ)句;DELIMITER ;??select * FROM information_schema.triggers;SHOW TRIGGERS; #查看觸發(fā)器-- 通過(guò)information_schema.triggers表查看觸發(fā)器:select * FROM information_schema.triggers;-- mysql 查看當(dāng)前數(shù)據(jù)庫(kù)的觸發(fā)器SHOW TRIGGERS;-- mysql 查看指定數(shù)據(jù)庫(kù)'people'的觸發(fā)器SHOW TRIGGERS FROM people;?創(chuàng)建測(cè)試表DROP TABLE IF EXISTS tb;CREATE TABLE IF NOT EXISTS tb(id INT,username CHAR(10),pass VARCHAR(20),ct INT);CREATE TABLE IF NOT EXISTS bt(fid INT,username CHAR(10),pass VARCHAR(20),ct INT);創(chuàng)建觸發(fā)器DELIMITER $#drop trigger if exists df_names$ 刪除前先判斷觸發(fā)器是否存在CREATE DEFINER =CURRENT_USERTRIGGER df_namesBEFORE INSERT ON tbAFTER UPDATE ON btFOR EACH ROWBEGIN #set new.ct=new.id*5; #SET @ct=12; 變量 #SET @pass='hjfd'; IF old.type=1 THEN UPDATE bt SET ct=old.ct WHERE fid=old.id; ELSE IF old.type=2 THEN UPDATE bt SET pass=old.pass WHERE fid=old.id;END$DELIMITER;?測(cè)試INSERT INTO tb(id) VALUES(4);SELECT *FROM tb;?
6.函數(shù)
SET AUTOCOMMIT=off ;禁用或啟用事務(wù)的自動(dòng)提交模式 off ONSET SESSION AUTOCOMMIT = OFF; 禁用或啟用事務(wù)的session自動(dòng)提交模式 off ONSHOW VARIABLES LIKE '%auto%'; -- 查看變量狀態(tài)?執(zhí)行DML語(yǔ)句是其實(shí)就是開(kāi)啟一個(gè)事務(wù)只能回滾insert、delete和update語(yǔ)句對(duì)于create、drop、alter這些無(wú)法回滾事務(wù)只對(duì)DML有效果rollback,或者commit后事務(wù)就結(jié)束了自動(dòng)提交模式用于決定新事務(wù)如何及何時(shí)啟動(dòng)START TRANSACTION; 啟用自動(dòng)提交模式下顯式地啟動(dòng)事務(wù)COMMIT和ROLLBACK; 禁用自動(dòng)提交模式顯式地提交或回滾-- 事務(wù) transaction 指一組sql語(yǔ)句-- 回退 rollback 指撤銷(xiāo)指定sql語(yǔ)句的過(guò)程-- 提交 commit 指將未存儲(chǔ)的sql語(yǔ)句結(jié)果寫(xiě)入數(shù)據(jù)庫(kù)表-- 保留點(diǎn) savepoint 指事務(wù)處理中設(shè)置的臨時(shí)占位符,可以對(duì)它發(fā)布回退(與回退整個(gè)事務(wù)處理不同)?-- 控制事務(wù)處理# 開(kāi)始事務(wù)及回退 SELECT * FROM ordertotals; # 查看ordertotals表顯示不為空START TRANSACTION; # 開(kāi)始事務(wù)處理 DELETE FROM ordertotals; # 刪除ordertotals表中所有行SELECT * FROM ordertotals; # 查看ordertotals表顯示 為空ROLLBACK; # rollback語(yǔ)句回退 SELECT * FROM ordertotals; # rollback后,再次查看ordertotals表顯示不為空?# commit 提交 START TRANSACTION;DELETE FROM orderitems WHERE order_num = 20010;DELETE FROM orders WHERE order_num = 20010;COMMIT; # 僅在上述兩條語(yǔ)句不出錯(cuò)時(shí)寫(xiě)出更改 ?# savepoint 保留點(diǎn) # 創(chuàng)建保留點(diǎn)SAVEPOINT delete1;# 回退到保留點(diǎn) ROLLBACK TO delete1;# 釋放保留點(diǎn) RELEASE SAVEPOINT delete1;?-- 更改默認(rèn)的提交行為 SET autocommit = 0; # 設(shè)置autocommit為0(假)指示MySQL不自動(dòng)提交更改
7.游標(biāo)
創(chuàng)建、打開(kāi)、關(guān)閉游標(biāo) # 定義名為ordernumbers的游標(biāo),檢索所有訂單DELIMITER //CREATE PROCEDURE processorders()BEGIN -- decalre the cursor 聲明游標(biāo) declare ordernumbers CURSOR FOR SELECT order_num FROM orders; -- open the cursor 打開(kāi)游標(biāo) open ordernumbers; -- close the cursor 關(guān)閉游標(biāo) close ordernumbers;END //DELIMITER ;?-- 使用游標(biāo)數(shù)據(jù) # 例1:檢索 當(dāng)前行 的order_num列,對(duì)數(shù)據(jù)不做實(shí)際處理DELIMITER //CREATE PROCEDURE processorders()BEGIN? -- declare local variables 聲明局部變量 DECLARE o INT; -- decalre the cursor 聲明游標(biāo) declare ordernumbers CURSOR FOR SELECT order_num FROM orders; -- open the cursor 打開(kāi)游標(biāo) open ordernumbers; -- get order number 獲得訂單號(hào) FETCH ordernumbers INTO o; /*fetch檢索 當(dāng)前行 的order_num列(將自動(dòng)從第一行開(kāi)始)到一個(gè)名為o的局部聲明變量中。 對(duì)檢索出的數(shù)據(jù)不做任何處理。*/ -- close the cursor 關(guān)閉游標(biāo) close ordernumbers;?END //DELIMITER ;?# 例2:循環(huán)檢索數(shù)據(jù),從第一行到最后一行,對(duì)數(shù)據(jù)不做實(shí)際處理DELIMITER //CREATE PROCEDURE processorders()BEGIN -- declare local variables 聲明局部變量 DECLARE done BOOLEAN DEFAULT 0; DECLARE o INT; -- decalre the cursor 聲明游標(biāo) declare ordernumbers CURSOR FOR SELECT order_num FROM orders; -- declare continue handler DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done =1; -- SQLSTATE '02000'是一個(gè)未找到條件,當(dāng)REPEAT由于沒(méi)有更多的行供循環(huán)而不能繼續(xù)時(shí),出現(xiàn)這個(gè)條件。 -- open the cursor 打開(kāi)游標(biāo) open ordernumbers; -- loop through all rows 遍歷所有行 REPEAT -- get order number 獲得訂單號(hào) FETCH ordernumbers INTO o; -- FETCH在REPEAT內(nèi),因此它反復(fù)執(zhí)行直到done為真 -- end of loop UNTIL done END REPEAT; -- close the cursor 關(guān)閉游標(biāo) close ordernumbers;?END //DELIMITER ;??# 例3:循環(huán)檢索數(shù)據(jù),從第一行到最后一行,對(duì)取出的數(shù)據(jù)進(jìn)行某種實(shí)際的處理DELIMITER //CREATE PROCEDURE processorders()BEGIN -- declare local variables 聲明局部變量 DECLARE done BOOLEAN DEFAULT 0; DECLARE o INT; DECLARE t DECIMAL(8,2); -- declare the cursor 聲明游標(biāo) 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 新建表以保存數(shù)據(jù) CREATE TABLE IF NOT EXISTS ordertotals (order_num INT,total DECIMAL(8,2)); -- open the cursor 打開(kāi)游標(biāo) OPEN ordernumbers; -- loop through all rows 遍歷所有行 REPEAT -- get order number 獲取訂單號(hào) FETCH ordernumbers INTO o; -- get the total for this order 計(jì)算訂單金額 CALL ordertotal(o,1,t); # 參見(jiàn)23章代碼,已創(chuàng)建可使用 -- insert order and total into ordertotals 將訂單號(hào)、金額插入表ordertotals內(nèi) INSERT INTO ordertotals(order_num,total) VALUES(o,t); -- end of loop UNTIL done END REPEAT; -- close the cursor 關(guān)閉游標(biāo) close ordernumbers;?END // DELIMITER ;# 調(diào)用存儲(chǔ)過(guò)程 precessorders()CALL processorders();# 輸出結(jié)果SELECT * FROM ordertotals;?
8.觸發(fā)器
1、MySQL觸發(fā)器的創(chuàng)建語(yǔ)法:CREATE[DEFINER = { 'user' | CURRENT_USER }]TRIGGER trigger_nametrigger_time trigger_eventON table_nameFOR EACH ROW[trigger_order]trigger_body2、MySQL創(chuàng)建語(yǔ)法中的關(guān)鍵詞解釋?zhuān)鹤侄? 含義 可能的值DEFINER= 可選參數(shù),指定創(chuàng)建者, DEFINER='root@%' 默認(rèn)為當(dāng)前登錄用戶(hù)(CURRENT_USER); 該觸發(fā)器將以此參數(shù)指定的用戶(hù)執(zhí)行, DEFINER=CURRENT_USER 所以需要考慮權(quán)限問(wèn)題;?trigger_name 觸發(fā)器名稱(chēng),最好由表名 觸發(fā)事件關(guān)鍵詞 觸發(fā)時(shí)間關(guān)鍵詞組成; trigger_time 觸發(fā)時(shí)間,在某個(gè)事件之前還是之后; BEFORE、AFTER? INSERT:插入操作觸發(fā)器,INSERT、LOAD DATA、REPLACE時(shí)觸發(fā); UPDATE:更新操作觸發(fā)器,UPDATE操作時(shí)觸發(fā);trigger_event 觸發(fā)事件,如插入時(shí)觸發(fā)、刪除時(shí)觸發(fā); DELETE:刪除操作觸發(fā)器,DELETE、REPLACE操作時(shí)觸發(fā); INSERT、UPDATE、DELETEtable_name 觸發(fā)操作時(shí)間的表名; 可選參數(shù),如果定義了多個(gè)具有相同觸發(fā)事件和觸法時(shí)間的觸發(fā)器時(shí)( 如:BEFORE UPDATE),默認(rèn)觸發(fā)順序與觸發(fā)器的創(chuàng)建順序一致,可以trigger_order 使用此參數(shù)來(lái)改變它們觸發(fā)順序。mysql 5.7.2起開(kāi)始支持此參數(shù)。 FOLLOWS:當(dāng)前創(chuàng)建觸發(fā)器在現(xiàn)有觸發(fā)器之后激活; FOLLOWS、PRECEDES PRECEDES:當(dāng)前創(chuàng)建觸發(fā)器在現(xiàn)有觸發(fā)器之前激活; trigger_body 觸發(fā)執(zhí)行的SQL語(yǔ)句內(nèi)容,一般以begin開(kāi)頭,end結(jié)尾 BEGIN .. END 觸發(fā)執(zhí)行語(yǔ)句內(nèi)容(trigger_body)中的OLD,NEW觸發(fā)執(zhí)行語(yǔ)句內(nèi)容(trigger_body)中的OLD,NEW:在trigger_body中,我們可以使用NEW表示將要插入的新行(相當(dāng)于MS SQL的INSERTED),OLD表示將要?jiǎng)h除的舊行(相當(dāng)于MS SQL的DELETED)。通過(guò)OLD,NEW中獲取它們的字段內(nèi)容,方便在觸發(fā)操作中使用,下面是對(duì)應(yīng)事件是否支持OLD、NEW的對(duì)應(yīng)關(guān)系:事件 OLD NEWINSERT × √DELETE √ ×UPDATE √ √?由于UPDATE相當(dāng)于刪除舊行(OLD),然后插入新行(NEW),所以UPDATE同時(shí)支持OLD、NEW;DELIMITER $... --觸發(fā)器創(chuàng)建語(yǔ)句;$ --提交創(chuàng)建語(yǔ)句;DELIMITER ;??select * FROM information_schema.triggers;SHOW TRIGGERS; #查看觸發(fā)器-- 通過(guò)information_schema.triggers表查看觸發(fā)器:select * FROM information_schema.triggers;-- mysql 查看當(dāng)前數(shù)據(jù)庫(kù)的觸發(fā)器SHOW TRIGGERS;-- mysql 查看指定數(shù)據(jù)庫(kù)'people'的觸發(fā)器SHOW TRIGGERS FROM people;?創(chuàng)建測(cè)試表DROP TABLE IF EXISTS tb;CREATE TABLE IF NOT EXISTS tb(id INT,username CHAR(10),pass VARCHAR(20),ct INT);CREATE TABLE IF NOT EXISTS bt(fid INT,username CHAR(10),pass VARCHAR(20),ct INT);創(chuàng)建觸發(fā)器DELIMITER $#drop trigger if exists df_names$ 刪除前先判斷觸發(fā)器是否存在CREATE DEFINER =CURRENT_USERTRIGGER df_namesBEFORE INSERT ON tbAFTER UPDATE ON btFOR EACH ROWBEGIN #set new.ct=new.id*5; #SET @ct=12; 變量 #SET @pass='hjfd'; IF old.type=1 THEN UPDATE bt SET ct=old.ct WHERE fid=old.id; ELSE IF old.type=2 THEN UPDATE bt SET pass=old.pass WHERE fid=old.id;END$DELIMITER;?測(cè)試INSERT INTO tb(id) VALUES(4);SELECT *FROM tb;?
9.存儲(chǔ)過(guò)程
SET AUTOCOMMIT=off ;禁用或啟用事務(wù)的自動(dòng)提交模式 off ONSET SESSION AUTOCOMMIT = OFF; 禁用或啟用事務(wù)的session自動(dòng)提交模式 off ONSHOW VARIABLES LIKE '%auto%'; -- 查看變量狀態(tài)?執(zhí)行DML語(yǔ)句是其實(shí)就是開(kāi)啟一個(gè)事務(wù)只能回滾insert、delete和update語(yǔ)句對(duì)于create、drop、alter這些無(wú)法回滾事務(wù)只對(duì)DML有效果rollback,或者commit后事務(wù)就結(jié)束了自動(dòng)提交模式用于決定新事務(wù)如何及何時(shí)啟動(dòng)START TRANSACTION; 啟用自動(dòng)提交模式下顯式地啟動(dòng)事務(wù)COMMIT和ROLLBACK; 禁用自動(dòng)提交模式顯式地提交或回滾-- 事務(wù) transaction 指一組sql語(yǔ)句-- 回退 rollback 指撤銷(xiāo)指定sql語(yǔ)句的過(guò)程-- 提交 commit 指將未存儲(chǔ)的sql語(yǔ)句結(jié)果寫(xiě)入數(shù)據(jù)庫(kù)表-- 保留點(diǎn) savepoint 指事務(wù)處理中設(shè)置的臨時(shí)占位符,可以對(duì)它發(fā)布回退(與回退整個(gè)事務(wù)處理不同)?-- 控制事務(wù)處理# 開(kāi)始事務(wù)及回退 SELECT * FROM ordertotals; # 查看ordertotals表顯示不為空START TRANSACTION; # 開(kāi)始事務(wù)處理 DELETE FROM ordertotals; # 刪除ordertotals表中所有行SELECT * FROM ordertotals; # 查看ordertotals表顯示 為空ROLLBACK; # rollback語(yǔ)句回退 SELECT * FROM ordertotals; # rollback后,再次查看ordertotals表顯示不為空?# commit 提交 START TRANSACTION;DELETE FROM orderitems WHERE order_num = 20010;DELETE FROM orders WHERE order_num = 20010;COMMIT; # 僅在上述兩條語(yǔ)句不出錯(cuò)時(shí)寫(xiě)出更改 ?# savepoint 保留點(diǎn) # 創(chuàng)建保留點(diǎn)SAVEPOINT delete1;# 回退到保留點(diǎn) ROLLBACK TO delete1;# 釋放保留點(diǎn) RELEASE SAVEPOINT delete1;?-- 更改默認(rèn)的提交行為 SET autocommit = 0; # 設(shè)置autocommit為0(假)指示MySQL不自動(dòng)提交更改
10.事務(wù)
SET AUTOCOMMIT=off ;禁用或啟用事務(wù)的自動(dòng)提交模式 off ONSET SESSION AUTOCOMMIT = OFF; 禁用或啟用事務(wù)的session自動(dòng)提交模式 off ONSHOW VARIABLES LIKE '%auto%'; -- 查看變量狀態(tài)?執(zhí)行DML語(yǔ)句是其實(shí)就是開(kāi)啟一個(gè)事務(wù)只能回滾insert、delete和update語(yǔ)句對(duì)于create、drop、alter這些無(wú)法回滾事務(wù)只對(duì)DML有效果rollback,或者commit后事務(wù)就結(jié)束了自動(dòng)提交模式用于決定新事務(wù)如何及何時(shí)啟動(dòng)START TRANSACTION; 啟用自動(dòng)提交模式下顯式地啟動(dòng)事務(wù)COMMIT和ROLLBACK; 禁用自動(dòng)提交模式顯式地提交或回滾-- 事務(wù) transaction 指一組sql語(yǔ)句-- 回退 rollback 指撤銷(xiāo)指定sql語(yǔ)句的過(guò)程-- 提交 commit 指將未存儲(chǔ)的sql語(yǔ)句結(jié)果寫(xiě)入數(shù)據(jù)庫(kù)表-- 保留點(diǎn) savepoint 指事務(wù)處理中設(shè)置的臨時(shí)占位符,可以對(duì)它發(fā)布回退(與回退整個(gè)事務(wù)處理不同)?-- 控制事務(wù)處理# 開(kāi)始事務(wù)及回退 SELECT * FROM ordertotals; # 查看ordertotals表顯示不為空START TRANSACTION; # 開(kāi)始事務(wù)處理 DELETE FROM ordertotals; # 刪除ordertotals表中所有行SELECT * FROM ordertotals; # 查看ordertotals表顯示 為空ROLLBACK; # rollback語(yǔ)句回退 SELECT * FROM ordertotals; # rollback后,再次查看ordertotals表顯示不為空?# commit 提交 START TRANSACTION;DELETE FROM orderitems WHERE order_num = 20010;DELETE FROM orders WHERE order_num = 20010;COMMIT; # 僅在上述兩條語(yǔ)句不出錯(cuò)時(shí)寫(xiě)出更改 ?# savepoint 保留點(diǎn) # 創(chuàng)建保留點(diǎn)SAVEPOINT delete1;# 回退到保留點(diǎn) ROLLBACK TO delete1;# 釋放保留點(diǎn) RELEASE SAVEPOINT delete1;?-- 更改默認(rèn)的提交行為 SET autocommit = 0; # 設(shè)置autocommit為0(假)指示MySQL不自動(dòng)提交更改
11.備份與還原
備份一個(gè)數(shù)據(jù)庫(kù):mysqldump -u root -p --opt people> df.txt #--opt優(yōu)化執(zhí)行速度備份兩個(gè)數(shù)據(jù)庫(kù):mysqldump -u root -p --opt --databases people hw > all.txt備份全部數(shù)據(jù)庫(kù):mysqldump -u root -p --opt --all-DATABASES > all.txt恢復(fù)數(shù)據(jù)庫(kù):mysqldump -u root -p --opt --databases people hw < all.txt1. 導(dǎo)出一張表mysqldump -u用戶(hù)名 -p密碼 庫(kù)名 表名 > 文件名(D:/a.sql)2. 導(dǎo)出多張表mysqldump -u用戶(hù)名 -p密碼 庫(kù)名 表1 表2 表3 > 文件名(D:/a.sql)3. 導(dǎo)出所有表mysqldump -u用戶(hù)名 -p密碼 庫(kù)名 > 文件名(D:/a.sql)4. 導(dǎo)出一個(gè)庫(kù)mysqldump -u用戶(hù)名 -p密碼 --lock-ALL-TABLES --database 庫(kù)名 > 文件名(D:/a.sql)可以-w攜帶WHERE條件
12.用戶(hù)賬號(hào)
創(chuàng)建賬戶(hù):CREATE USER IF NOT EXISTS 'hw'@'localhost' IDENTIFIED BY '5201314'; #創(chuàng)建用戶(hù)hw,密碼5201314?給該用戶(hù)授予所有權(quán)限并可授權(quán)給其他用戶(hù):GRANT ALL PRIVILEGES ON people.df TO 'hw'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;?重命名用戶(hù)名: RENAME USER 'hw' TO 'gh'; 必須將localhost改為%如果希望該用戶(hù)能夠在任何機(jī)器上登陸mysql,則將localhost改為 '%' 授權(quán)給其他用戶(hù) WITH GRANT OPTION privileges包括: alter:修改數(shù)據(jù)庫(kù)的表 create:創(chuàng)建新的數(shù)據(jù)庫(kù)或表 delete:刪除表數(shù)據(jù) drop:刪除數(shù)據(jù)庫(kù)/表 index:創(chuàng)建/刪除索引 insert:添加表數(shù)據(jù) select:查詢(xún)表數(shù)據(jù) update:更新表數(shù)據(jù) all:允許任何操作 usage:只允許登錄?刷新權(quán)限,使新創(chuàng)建的用戶(hù)能夠使用: FLUSH PRIVILEGES; 收回用戶(hù)權(quán)限: REVOKE ALL PRIVILEGES ON people.df FROM 'root'@'localhost'; 刪除用戶(hù): DROP USER IF EXISTS 'hw'@'localhost';?設(shè)置指定用戶(hù)的密碼:SET PASSWORD FOR'hw'@'localhost' = PASSWORD('123321'); UPDATE USER SET PASSWORD = PASSWORD('123321') WHERE USER = 'hw';? 設(shè)置密碼: SET PASSWORD = PASSWORD('123321');
13.其他
SHOW STATUS;顯示廣泛的服務(wù)器狀態(tài)信息SHOW PROCEDURE STATUS;SHOW GRANTS;顯示授予用戶(hù)的安全權(quán)限SHOW ERRORS;顯示服務(wù)器的錯(cuò)誤信息SHOW WARNINGS;顯示服務(wù)器的警告信息SHOW PROCESSLIST;顯示哪些線程正在運(yùn)行SHOW VARIABLES;顯示系統(tǒng)變量信息SELECT DATABASE(); 查看當(dāng)前數(shù)據(jù)庫(kù)SELECT NOW(), USER(), VERSION():顯示當(dāng)前時(shí)間、用戶(hù)名、數(shù)據(jù)庫(kù)版本SHOW ENGINES 引擎名 {LOGS|STATUS}:顯示存儲(chǔ)引擎的日志和狀態(tài)信息SHOW VARIABLES LIKE 'character%'; SHOW VARIABLES LIKE 'collation%'; 確定所用系統(tǒng)的字符集和校對(duì)SHOW VARIABLES LIKE 'character_set_client%'; 客戶(hù)端向服務(wù)器發(fā)送數(shù)據(jù)時(shí)使用的編碼SHOW VARIABLES LIKE 'character_set_results%'; 服務(wù)器端將結(jié)果返回給客戶(hù)端所使用的編碼SHOW VARIABLES LIKE 'character_set_connection%'; 連接層編碼SHOW CHARACTER SET;查看所支持的字符集完整列表SHOW COLLATION;查看所支持校對(duì)的完整列表,以及它們適用的字符集?SET character_set_client = gbk; SET character_set_results = gbk;SET character_set_connection = gbk;SET NAMES GBK; -- 相當(dāng)于完成以上三個(gè)設(shè)置?創(chuàng)建window服務(wù):sc CREATE mysql binPath= mysqld_bin_path數(shù)據(jù)文件目錄:DATA DIRECTORY='目錄'索引文件目錄:INDEX DIRECTORY = '目錄'
希望能幫到大家,謝謝?。?!
聯(lián)系客服