文章目錄
- 📕1. 視圖
- ??1.1 視圖的基本概念
- ??1.2 試圖的基本操作
- 🔖1.2.1 創建視圖
- 🔖1.2.2 使用視圖
- 🔖1.2.3 修改數據
- 🔖1.2.4 刪除視圖
- ??1.3 視圖的優點
- 📕2. 用戶與權限管理
- ??2.1 用戶
- 🔖2.1.1 查看用戶
- 🔖2.1.2 創建用戶
- 🔖2.1.3 修改密碼
- 🔖2.1.4 刪除用戶
- ??2.2 權限與授權
- 🔖2.2.1 給用戶授權
- 🔖2.2.2 回收用戶授權
📕1. 視圖
??1.1 視圖的基本概念
視圖是一個虛擬的表,它是基于一個或多個基本表或其他視圖的查詢結果集。視圖本身不存儲數據,而是通過執行查詢來動態生成數據。用戶可以像操作普通表?樣使用視圖進行查詢、更新和管理。視圖本身并不占用物理存儲空間,它僅僅是一個查詢的邏輯表示,物理上它依賴于基礎表中的數據。
??1.2 試圖的基本操作
🔖1.2.1 創建視圖
create view 列名1,列名2,列名3 as select 查詢語句...
view 是視圖的關鍵字
🔖1.2.2 使用視圖
🌰例如:只查詢用戶的姓名和總分(隱藏學號和各科成績)
# 使?真實表進?查詢
select s.name, sum(sc.score) total from student s, score sc
where s.id = sc.student_id
group by sc.student_id order by s.id;-- 缺點:可以隨時在select關鍵字后加上學號和各科成績字段,會暴露學生信息,不安全
# 創建視圖
create view v_student_total_points as
select s.id, s.name, sum(sc.score) total from student s, score sc
where s.id = sc.student_id
group by s.id order by s.id;-- 使用視圖進行查詢
select * from v_student_total_points;
+-----------+-------+
| name | total |
+-----------+-------+
| 唐三藏 | 469 |
| 孫悟空 | 179.5 |
| 豬悟能 | 200 |
| 沙悟凈 | 218 |
| 宋江 | 118 |
| 武松 | 178 |
| 李逹 | 172 |
+-----------+-------+
-- 只能查詢出姓名和總分,進一步保護了學生的個人信息
🌰例如:視圖和真實表進行表連接查詢
select * from v_student_total_points v, student s where v.id = s.id;-- 視圖本質上是一張虛擬的表,所以可以用視圖與真實表進行表連接查詢
🔖1.2.3 修改數據
- 通過真實表修改數據,會影響視圖
# 修改唐三藏的JAVA成績為99分update score set score = 99 where student_id = 1 and course_id = 1;# 查詢視圖,發現唐三藏這條記錄已被修改
select * from v_student_socre;
- 通過視圖修改數據會影響基表
# 更新視圖
update v_student_socre_v1 set score = 99 where score_id = 3;# 是看真實表數據已被修改
select * from score where student_id = 1 and course_id = 5;
注意事項:
1. 修改真實表會影響視圖,修改視圖同樣也會影響真實表
2. 以下視圖不可更新:
-------創建視圖時使用聚合函數的視圖
-------創建視圖時使用 DISTINCT
-------創建視圖時使用 GROUP BY 以及 HAVING子句
-------創建視圖時使用 UNION 或 UNION ALL
-------查詢列表中使用子查詢
-------在FROM子句中引用不可更新視圖
🔖1.2.4 刪除視圖
# 語法
drop view 視圖名;
??1.3 視圖的優點
- 簡單性:視圖可以將復雜的查詢封裝成一個簡單的查詢。例如,針對一個復雜的多表連接查詢,可以創建一個視圖,用戶只需查詢視圖而無需了解底層的復雜邏輯。
- 安全性:通過視圖,可以隱藏表中的敏感數據。例如,?個系統的用戶表中,可以創建一個不包含密碼列的視圖,普通用戶只能訪問這個視圖,而不能訪問原始表,進一步保證了安全問題。
- 邏輯數據獨立性:視圖提供了一種邏輯數據獨立性,即使底層表結構發生變化,只需修改視圖定義,而無需修改依賴視圖的應用程序。確保了應用程序與數據庫的解耦
- 重命名列:視圖允許用戶重命名列名,以增強數據可讀性。
📕2. 用戶與權限管理
數據庫服務安裝成功后默認有一個root用戶,可以新建和操縱數據庫服務中管理的所有數據庫。在真
實的使用過程中,通常每個應用對應著一個數據庫,我們只希望某個用戶只能操縱和管理當前應用對
應的那個數據庫,而不能操縱和管理其他應用的數據庫,這時就可以添加?個用戶并指定用戶的權限
如上圖所示:
root 可以訪問和操縱所有的數據庫:DB1, DB2, DB3, DB4
普通用戶1 只能訪問和操縱數據庫DB1
普通用戶2 只能訪問和操縱數據庫DB3
只讀用戶1 只能訪問數據庫DB3
只讀用戶2 只能訪問數據庫DB4
??2.1 用戶
🔖2.1.1 查看用戶
-- 選擇數據庫
use mysql;-- 查看表結構
desc user;-- 查看用戶表
select * from user;
host: 允許登錄的主機,相當于白名單,如果是localhost,表示只能從本機登陸
user: 用戶名
*_priv: 用戶擁有的權限,Y表示有權限,N表示沒有權限
authentication_string: 加密后的用戶密碼
🔖2.1.2 創建用戶
create user if not exists 'user_name'@'host_name' identified by 'auth_string';
user_name: 用戶名,用單引號包裹,區分大小寫
host_name: 主機或IP(段),?單引號包裹
auth_string: 真實密碼,有些密碼策略不允許使用簡單密碼
例如:創建名為zhuxulong 密碼為123456 的賬戶
create user if not exists 'zhuxulong'@'172.20.109.85' identified by '123456';
注意事項:
- 如果不指定host_name相當于’user_name’@‘%’, %表示所有主機都可以連接到數據庫,強烈建
議不要這樣設置,因為會導致嚴重的安全問題 - user_name和host_name分別用單引號包裹,如果寫成’user_name@host_name’, 相當于’user_name@host_name’@‘%’
- host_name可以通過子網掩碼設置主機范圍
A: 198.0.0.0 : A段網絡中的任意一臺主機
B: 198.51.0.0 B段網絡中的任意一臺主機’
C: 198.51.100.0 C段網絡中的任意一臺主機
D: 198.51.100.1 :只包含特定IP地址的主機
🔖2.1.3 修改密碼
# 為指定??設置密碼 【推薦】
ALTER USER 'user_name'@'host_name' IDENTIFIED BY 'auth_string';# 為指定??設置密碼
SET PASSWORD FOR 'user_name'@'host_name' = 'auth_string';# 為當前登錄??設置密碼
SET PASSWORD = 'auth_string';
🔖2.1.4 刪除用戶
DROP USER [IF EXISTS] 'user_name'@'host_name'[, ...];
??2.2 權限與授權
MySQL內置支持的權限列表
🔖2.2.1 給用戶授權
剛剛創建的用戶沒有任何權限,我們需要手動為新用戶授權.
grant 權限名 on priv_level to 'user_name'@'host_name' [WITH GRANT OPTION]
權限名:根據類型,參考根據列表4.1中的Privilege列
priv_level: * | . | db_name.* | db_name.tbl_name | tbl_name,比如*.*表示所有數據庫下的所有表
‘user_name’@‘host_name’:指定用戶
[WITH GRANT OPTION]:可選,允許用戶將自己的權限授權給其它用戶
示例: 為剛剛創建的zhuxulong用戶授予test數據庫student表的select權限
grant select on test.student to 'zhuxulong'@'172.20.109.85';
🔖2.2.2 回收用戶授權
revoke 權限名 on 數據庫名.表名 from 'user_name'@'host_name';