一、視圖
視圖:VIEW,虛表,保存有實表的查詢結果,在視圖插入的內容都會存入表中。
創建方法:
CREATE VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
查看視圖定義:SHOW CREATE VIEW view_name
刪除視圖:
DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE]
視圖中的數據事實上存儲於“基表”中,因此,其修改操作也會針對基表實現;其修改操作受基表限制
(1) 創建一個視圖:
create view v_students as select stuid,name,age from students; 創建一個新的視圖,起名為v_students
create view v_old_students as select stuid,name,age from students where age > 50; 將視圖大於50歲以上的名字進行顯示。
inster v_old_students values(27,'li',20);此時可以在視圖中添加一個20歲的內容,實際添加到表里邊,而視圖中不會顯示。
二、函數
1、函數:系統函數和自定義函數
系統函數:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
2、自定義函數 (user-defined function UDF)
保存在mysql.proc表中 創建UDF CREATE [AGGREGATE] FUNCTION function_name(parameter_name type,[parameter_name type,...]) RETURNS {STRING|INTEGER|REAL} runtime_body
說明:參數可以有多個,也可以沒有參數必須有且只有一個返回值
創建函數
示例:無參UDF
CREATE FUNCTION simpleFun() RETURNS VARCHAR(20) RETURN "Hello World!”; 查看函數列表: SHOW FUNCTION STATUS; 查看函數定義 SHOW CREATE FUNCTION function_name 刪除UDF: DROP FUNCTION function_name 調用自定義函數語法: SELECT function_name(parameter_value,...)
示例:有參數UDF
DELIMITER // CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) RETURNS VARCHAR(20) BEGIN DELETE FROM students WHERE stuid = uid; RETURN (SELECT COUNT(stuid) FROM students); END// DELIMITER ;
自定義函數中定義局部變量語法
DECLARE 變量1[,變量2,... ]變量類型 [DEFAULT 默認值]
說明:局部變量的作用范圍是在BEGIN...END程序中,而且定義局部變量語句必須在BEGIN...END的第一行定義
示例:
DELIMITER // CREATE FUNCTION addTwoNumber(x SMALLINT UNSIGNED, Y SMALLINT UNSIGNED) RETURNS SMALLINT BEGIN DECLARE a, b SMALLINT UNSIGNED; SET a = x, b = y; RETURN a+b; END// DELIMITER ;
為變量賦值語法
SET parameter_name = value[,parameter_name = value...
SELECT INTO parameter_name
示例:
... DECLARE x int; SELECT COUNT(id) FROM tdb_name INTO x; RETURN x; END//
三、存儲過程
存儲過程優勢
存儲過程把經常使用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,當需要時從數據庫中直接調用,省去了編譯的過程提高了運行速度,同時降低網絡數據傳輸量 存儲過程與自定義函數的區別 存儲過程實現的過程要復雜一些,而函數的針對性較強 存儲過程可以有多個返回值,而自定義函數只有一個返回值 存儲過程一般獨立的來執行,而函數往往是作為其他SQL語句的一部分來使用
存儲過程:存儲過程保存在mysql.proc表中
創建存儲過程
CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) routime_body proc_parameter : [IN|OUT|INOUT] parameter_name type
其中IN表示輸入參數,OUT表示輸出參數,INOUT表示既可以輸入也可以輸出;param_name表示參數名稱;type表示參數的類型
查看存儲過程列表
SHOW PROCEDURE STATUS;
查看存儲過程定義
SHOW CREATE PROCEDURE sp_name
調用存儲過程
CALL sp_name ([ proc_parameter [,proc_parameter ...]]) CALL sp_name
說明:當無參時,可以省略"()",當有參數時,不可省略"()”
存儲過程修改
ALTER語句修改存儲過程只能修改存儲過程的注釋等無關緊要的東西,不能修改 存儲過程體,所以要修改存儲過程,方法就是刪除重建
刪除存儲過程
DROP PROCEDURE [IF EXISTS] sp_name
存儲過程示例:
創建無參存儲過程
delimiter // CREATE PROCEDURE showTime() BEGIN SELECT now(); END// delimiter ; CALL showTime;
創建含參存儲過程:只有一個IN參數
delimiter // CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED) BEGIN SELECT * FROM students WHERE stuid = uid; END// delimiter ; call selectById(2);
示例:
delimiter // CREATE PROCEDURE dorepeat(n INT) BEGIN SET @i = 0; SET @sum = 0; REPEAT SET @sum = @sum+@i; SET @i = @i + 1; UNTIL @i > n END REPEAT; END// delimiter ; CALL dorepeat(100); SELECT @sum;
創建含參存儲過程:包含IN參數和OUT參數:
delimiter // CREATE PROCEDURE deleteById(IN uid SMALLINT UNSIGNED, OUT num SMALLINT UNSIGNED) BEGIN DELETE FROM students WHERE stuid >= uid; SELECT row_count() into num; END// delimiter ; call deleteById(2,@Line); SELECT @Line;
說明:創建存儲過程deleteById,包含一個IN參數和一個OUT參數.調用時,傳入刪除的ID和保存被修改的行數值的用戶變量@Line,select @Line;輸出被影響行數。
四、觸發器
觸發器的執行不是由程序調用,也不是由手工啟動,而是由事件來觸發、激活從而實現執行
創建觸發器
CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body
說明:
trigger_name:觸發器的名稱 trigger_time:{ BEFORE | AFTER },表示在事件之前或之后觸發 trigger_event::{ INSERT |UPDATE | DELETE },觸發的具體事件 tbl_name:該觸發器作用在表名
示例:
CREATE TABLE student_info ( stu_id INT(11) NOT NULL AUTO_INCREMENT, stu_name VARCHAR(255) DEFAULT NULL, PRIMARY KEY (stu_id) ); CREATE TABLE student_count ( student_count INT(11) DEFAULT 0 ); INSERT INTO student_count VALUES(0);
示例:創建觸發器,在向學生表INSERT數據時,學生數增加,DELETE學生時,學生數減少
CREATE TRIGGER trigger_student_count_insert AFTER INSERT ON student_info FOR EACH ROW UPDATE student_count SET student_count=student_count+1; CREATE TRIGGER trigger_student_count_delete AFTER DELETE ON student_info FOR EACH ROW UPDATE student_count SET student_count=student_count-1;
查看觸發器
SHOW TRIGGERS
查詢系統表information_schema.triggers的方式指定查詢條件,查看指定的觸發器信息。
mysql> USE information_schema; Database changed mysql> SELECT * FROM triggers WHERE trigger_name='trigger_student_count_insert';
刪除觸發器
DROP TRIGGER trigger_name;
五、MySQL用戶和權限管理
1、元數據數據庫:mysql
系統授權表:
db, host, user columns_priv, tables_priv, procs_priv, proxies_priv
用戶賬號:
'USERNAME'@'HOST' 允許用戶通過哪些主機遠程連接mysqld 服務 @'HOST': 主機名 IP地址或Network 通配符: % _ 示例:172.16.%.%
2、用戶管理
創建用戶:CREATE USER
示例:
create user test@'192.168.34.%' identified by 'centos';添加test賬號在192.168.34這個網段,可以輸centos密碼連接 select user,host from user; 在創建新數據庫上查詢哪些host主機登陸了當前的mysql數據庫。
默認權限:USAGE
用戶重命名:RENAME USER
RENAME USER old_user_name TO new_user_name;
刪除用戶:
DROP USER 'USERNAME'@'HOST‘
示例:
drop user ''@'localhost'; 刪除空的匿名用戶 drop user ''@'centos7-1'; 空值部分要加單引號。
示例:刪除默認的空用戶
DROP USER ''@'localhost';
(1)創建用戶:
create user test@'192.168.34.%' identified by 'centos';
(2)在另一台主機上登陸mysql數據庫:
mysql -utest -pcentos -h192.168.34.102;(IP地址是要遠程連接到主機的IP地址)
(3)查詢當前登陸到mysql的賬號信息:
select user,host from user;
(4)刪除空的匿名用戶賬號:
drop user ''@'localhost'; 刪除空的匿名用戶
drop user ''@'centos7-1'; 空值部分要加單引號。
修改密碼:
SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
示例:
1、set password for test@'192.168.34.%'=password('biubiu'); 此方法立即生效 2、UPDATE mysql.user SET password=PASSWORD('password') WHERE clause; 此方法需要執行下面指令才能生效: FLUSH PRIVILEGES;
#mysqladmin -u root -poldpass password ‘newpass’ 也可以改口令。
忘記管理員密碼的解決辦法:
1、啟動mysqld進程時,為其使用如下選項: skip-grant-tables 忽略授權表,取消數據庫的授權 skip-networking 數據庫沒有網絡功能,避免其他用戶連接不輸入口令連接。 2、使用UPDATE命令修改管理員密碼 3、關閉mysqld進程,移除上述兩個選項,重啟mysqld
破解數據庫步驟:
(1)vim /etc/my.cnf 將mysql數據庫配置文件打開
vim /etc/my.cnf [mysqld] skip-grant-tables skip-networking
(2)重啟mysql服務
systemctl restart mariadb
(3)更新數據庫密碼:
update mysql.user set password=password('magedu') where user='root';
(4)再將之前寫入Mysql配置文件內容注釋掉:
[root@centos7~]#vim /etc/my.cnf [mysqld] #skip-grant-tables
(5)重啟Mysql服務
systemctl restart mariadb
(6)用修改后的密碼就可以登錄了
mysql -pmagedu
3、權限類別:
管理類
程序類
數據庫級別
表級別
字段級別
1、管理類:
CREATE TEMPORARY TABLES CREATE USER FILE SUPER SHOW DATABASES RELOAD SHUTDOWN REPLICATION SLAVE REPLICATION CLIENT LOCK TABLES PROCESS
2、程序類: FUNCTION、PROCEDURE、TRIGGER
CREATE ALTER DROP EXCUTE
3、庫和表級別:DATABASE、TABLE
ALTER CREATE CREATE VIEW DROP INDEX SHOW VIEW GRANT OPTION:能將自己獲得的權限轉贈給其他用戶
4、數據操作
SELECT INSERT DELETE UPDATE
5、字段級別
SELECT(col1,col2,...) UPDATE(col1,col2,...) INSERT(col1,col2,...)
6、所有權限
ALL PRIVILEGES 或 ALL
4、授權和回收授權
授權:
參考:https://dev.mysql.com/doc/refman/5.7/en/grant.html
GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION]; 授權並創建賬
(1) priv_type: ALL [PRIVILEGES] 授權類型: insert增,delete刪 , update改,select查,all所有權限 (2) db_name.tb_name: 對哪個數據庫的哪個表授權: *.*: 所有庫的所有表 db_name.*: 指定庫的所有表 db_name.tb_name: 指定庫的指定表 db_name.routine_name :指定庫的存儲過程和函數、觸發器
示例:
grant all on hellodb.* to test2@'192.168.34.%' identified by 'centos'; 創建test2用戶,允許其在所有主機通過centos密碼登錄,對hellodb庫的所有表有所有權限 grant select(name,age) on hellodb.students to test3@'192.168.34.%' identified by 'centos'; 創建test3用戶,允許其在所有主機通過centos密碼登錄,對hellodb庫的name和age有查看權限。 show grants for test2@'192.168.34.%' \G 可以查看當前用戶的授權情況,\G換行顯示
回收授權:
REVOKE priv_type, ... ON db_name.tb_name FROM 'user'@'host 示例: revoke select on *.* from test3@'192.168.34.%'; 收回test3的select 權限 revoke delete on *.* from test3@'192.168.34.%'; 收回test3 的delete 權限
查看指定用戶獲得的授權
Help SHOW GRANTS SHOW GRANTS FOR 'user'@'host'; SHOW GRANTS FOR CURRENT_USER[()];
注意:
① MariaDB 服務進程啟動時會讀取mysql 庫中所有授權表至內存
② GRANT 或REVOKE 等執行權限操作會保存於系統表中,MariaDB 的服務進程通常會自動重讀授權表,使之生效
③ 對於不能夠或不能及時重讀授權表的命令,可手動讓MariaDB 的服務進程重讀授權表:
mysql> FLUSH PRIVILEGES;