【相關(guān)學(xué)習(xí)推薦:mysql教程(視頻)】
DCL
DCL 比較簡單,主要用于授予或收回訪問數(shù)據(jù)庫的權(quán)限,以及數(shù)據(jù)庫事務(wù)的提交和回滾。
授予/收回權(quán)限
以授予權(quán)限為例,我們新建一個(gè)數(shù)據(jù)庫后,想要授予特定用戶該數(shù)據(jù)庫的訪問和操作權(quán)限(一般在生產(chǎn)環(huán)境為了安全起見,不會(huì)通過 root 用戶操作數(shù)據(jù)庫),為此我們先要?jiǎng)?chuàng)建一個(gè)特定用戶,比如 test,DCL 這種控制級(jí)的 SQL 語句一般在命令行執(zhí)行,我們進(jìn)入 MySQL docker 容器,連接到數(shù)據(jù)庫,通過 CREATE USER 語句新建一個(gè) test 用戶,同時(shí)將密碼設(shè)置為 test:
創(chuàng)建完成后,就可以在 mysql.user 數(shù)據(jù)表中看到這個(gè)用戶了:
Host 字段為 % 表示 test 用戶可以從任何主機(jī)連接到 MySQL 服務(wù)器。
或者通過命令行查看(這里用到了 SQL 查詢語句):
然后我們就可以運(yùn)行 GRANT 語句授予 test 用戶對(duì) test 數(shù)據(jù)庫的所有操作權(quán)限了:
授權(quán)后,需要運(yùn)行 flush privileges; 刷新權(quán)限,這樣就可以在 test 數(shù)據(jù)庫的權(quán)限列表中看到這個(gè)用戶了:
如果我們退出當(dāng)前登錄狀態(tài),以 test 用戶登錄,就只能看到 test 數(shù)據(jù)庫,因?yàn)樗鼘?duì)其他數(shù)據(jù)庫沒有操作權(quán)限:
要撤回權(quán)限,需要以 root 身份進(jìn)行,在權(quán)限列表刪除這個(gè)用戶,或者在命令行通過 REVOKE 語句完成:
revoke all privideges on test.* from 'test'@'%'; flush privileges;
這里操作的都是所有權(quán)限,也可以指定特定的權(quán)限:
// 授予權(quán)限 grant select on test.* to 'user1'@'localhost'; /*給予查詢權(quán)限*/ grant insert on test.* to 'user1'@'localhost'; /*添加插入權(quán)限*/ grant delete on test.* to 'user1'@'localhost'; /*添加刪除權(quán)限*/ grant update on test.* to 'user1'@'localhost'; /*添加權(quán)限*/ // 收回權(quán)限 revoke select on test.* from 'jack'@'localhost'; revoke insert on test.* from 'jack'@'localhost'; revoke delete on test.* from 'jack'@'localhost'; revoke update on test.* from 'jack'@'localhost';
事務(wù)提交/回滾
數(shù)據(jù)庫事務(wù)(database Transaction)是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作(對(duì)數(shù)據(jù)庫的相關(guān)增刪改查的操作,包含一條或多條 SQL 語句),要么完全地執(zhí)行,要么完全地不執(zhí)行。
對(duì)于單條 SQL 語句,數(shù)據(jù)庫系統(tǒng)自動(dòng)將其作為一個(gè)事務(wù)執(zhí)行,這種事務(wù)被稱為隱式事務(wù)。
要手動(dòng)把多條 SQL 語句作為一個(gè)事務(wù)執(zhí)行,可以使用 BEGIN 開啟一個(gè)事務(wù),使用 COMMIT 提交一個(gè)事務(wù),這種事務(wù)被稱為顯式事務(wù),如果事務(wù)執(zhí)行過程中出現(xiàn)錯(cuò)誤或異常,可以通過 ROLLBACK 語句回滾事務(wù)。
我們在命令行中簡單演示下數(shù)據(jù)庫事務(wù)的操作:
我們通過 BEGIN 語句開啟事務(wù),但是在執(zhí)行多條語句后,沒有通過 COMMIT 提交事務(wù),測試執(zhí)行這幾條 SQL 語句,進(jìn)入「瀏覽」面板查看,發(fā)現(xiàn)并沒有插入新的記錄:
如果在上述 SQL 序列后加上 ROLLBACK 回滾事務(wù),效果也是一樣的:
BEGIN; INSERT intO post (`title`, `content, `created_at`) VALUES ('這是一篇測試文章2', '測試內(nèi)容哈哈哈', '2020-05-26 13:00:00'); INSERT INTO post (`title`, `content, `created_at`) VALUES ('這是一篇測試文章3', '測試內(nèi)容哈哈哈', '2020-05-26 13:30:00'); ROLLBACK;
而如果在最后加上 COMMIT 語句,則可以順利提交修改:
關(guān)于常見的 SQL 語句和 phpMyAdmin 中的可視化演示,就簡單介紹到這里,更多細(xì)節(jié),需要大家結(jié)合網(wǎng)上的 SQL 教程自己去探索,這不是本系列教程的重點(diǎn),這里就不詳細(xì)展開了。
聚合函數(shù)
除了常見的 SQL 查詢和操作語句之外,SQL 還內(nèi)置了一些聚合函數(shù),方便在數(shù)據(jù)查詢時(shí)對(duì)結(jié)果進(jìn)行簡單便捷的統(tǒng)計(jì)。這里我們介紹幾個(gè)常見的函數(shù):count、sum、avg、max 和 min。
COUNT
count 函數(shù)可用于統(tǒng)計(jì)查詢結(jié)果總共有多少條,通常在進(jìn)行分頁查詢時(shí)需要用到這個(gè)函數(shù)。為了方便直接看到結(jié)果,我們在命令行中進(jìn)行演示:
在查詢字段時(shí)為了提高可讀性,可以通過 as 指定字段別名,這里 post 表總共有三條記錄,所以查詢結(jié)果是 3。
SUM
sum 可用于統(tǒng)計(jì)查詢結(jié)果中某個(gè)字段的求和,因此只能用于數(shù)字類型字段,這里我們?yōu)?post 表新增一個(gè)字段 views,用于存儲(chǔ)對(duì)應(yīng)文章記錄的瀏覽次數(shù)。在 post 表結(jié)構(gòu)中,選擇在 content 字段后新增一個(gè)字段并點(diǎn)擊「執(zhí)行」:
將字段名設(shè)置為 views,并將其類型設(shè)置為 UNSIGNED INT,表示非負(fù)整數(shù),同時(shí)設(shè)置默認(rèn)值為 0,對(duì)應(yīng)的 SQL 語句可以通過預(yù)覽功能查看:
點(diǎn)擊「保存」創(chuàng)建這個(gè)字段,就可以在表結(jié)構(gòu)中看到它了:
由于 views 有默認(rèn)值,所以目前所有記錄的 views 值都是 0:
可以通過「編輯」功能將其設(shè)置為對(duì)應(yīng)的模擬值:
接下來,我們就可以通過 sum 函數(shù)對(duì)結(jié)果進(jìn)行求和統(tǒng)計(jì)了:
AVG
avg 可用于統(tǒng)計(jì)查詢結(jié)果中某個(gè)字段的平均值,和 sum 一樣,也是作用于數(shù)字類型字段,比如我們可以通過它來統(tǒng)計(jì)所有文章的平均瀏覽數(shù):
如果是一個(gè)不能被整除的數(shù)字,平均數(shù)會(huì)精確到小數(shù)點(diǎn)后四位。
MAX
max 可用于獲取查詢結(jié)果中某個(gè)數(shù)字類型字段的最大值,比如要獲取瀏覽數(shù)最高的文章信息可以這么做:
MySQL 命令行默認(rèn)中文亂碼,我們可以通過 set names utf8mb4; 將編碼類型設(shè)置為 utf8mb4,這樣就可以正常顯示中文和 Emoji 表情符號(hào)了。
另外,這里還用到了子查詢的概念,就是將一個(gè)查詢的結(jié)果作為另一個(gè)查詢的條件,這里我們將最大瀏覽數(shù)作為子查詢的結(jié)果傳遞給父查詢作為查詢條件,獲取對(duì)應(yīng)的文章信息。
MIN
與 max 相對(duì),min 函數(shù)用于獲取查詢結(jié)果中某個(gè)數(shù)字類型字段的最小值,比如要獲取瀏覽數(shù)最低的文章信息可以這么做:
小結(jié)
好了,關(guān)于 MySQL 數(shù)據(jù)庫的基本查詢、操作和統(tǒng)計(jì),我們就簡單介紹到這里,相信你已經(jīng)對(duì) MySQL 及其操作有了基本的認(rèn)知。下篇教程,將給大家介紹如何在 PHP 中連接 MySQL 數(shù)據(jù)庫并執(zhí)行增刪改查操作,關(guān)于一些更復(fù)雜的操作,比如分頁、分組、連接查詢、關(guān)聯(lián)關(guān)系、索引設(shè)置和應(yīng)用,我們將在后續(xù)教程中結(jié)合具體實(shí)例進(jìn)行演示。
本文來自于https://xueyuanjun.com/post/21656
想了解更多相關(guān)文章,敬請關(guān)注php mysql欄目!