視圖是一個虛擬的表,不存儲任何數據,存儲的是一條select語句,視圖是對若干個表的引用,是根據咱們須要只顯示指定數據的一個虛擬的表mysql
格式:creat view [view_name] as [select_statement] from [table];sql
其中view_name是咱們要建立的視圖的名稱,select_statement是咱們的查詢語句,table是咱們要查詢的表數據庫
因爲咱們建立的視圖本質上是一個虛擬的表,因此當咱們show tables;時也會被歸入表的列表裏安全
格式:select * from [view_name];ide
咱們的視圖在使用時和普通的表是同樣的,直接用普通的查詢語句便可查詢函數
視圖在本質上是對原表的處理,因此咱們在修改或刪除視圖的數據時原表的數據也會更改。具體操做和普通表的delete和update語句相同,由於視圖只是調用數據,不存儲數據因此某些狀況下沒法修改數據。spa
如下狀況沒法修改視圖的數據:日誌
1.select 子句中包括distinctcode
2.select 子句中包含組函數blog
3.select 子句中包含group by
4.select 子句中包含union
例:
有以下表,建立一個只顯示學生姓名和班級的視圖
MariaDB [hellodb]> select *from students; +-------+----------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+----------------+-----+--------+---------+-----------+ | 1 | Hou Yi | 22 | M | 2 | 3 | | 2 | Ya Se | 22 | M | 1 | 7 | | 3 | An Qila | 53 | F | 2 | 16 | | 4 | Da Ji | 32 | F | 4 | 4 | | 5 | Sun Shangxiang | 26 | F | 3 | 1 | | 6 | Huang Zhong | 46 | M | 5 | NULL | | 7 | Liu Bei | 19 | M | 3 | NULL | | 8 | Guan Yu | 17 | M | 7 | NULL | | 9 | Zhang Fei | 20 | M | 6 | NULL | | 10 | Di Renjie | 39 | M | 3 | NULL | | 11 | Li Yuanfang | 23 | M | 6 | NULL | | 12 | Lan Lingwang | 19 | M | 1 | NULL | | 13 | Wang Zhaojun | 33 | F | 2 | NULL | | 14 | Bai Qi | 17 | M | 3 | NULL | | 15 | A Ke | 19 | F | 4 | NULL | | 16 | Cai Wenji | 21 | F | 1 | NULL | | 17 | Lv Bu | 25 | M | 4 | NULL | | 18 | Diao Chan | 23 | F | 7 | NULL | | 19 | Gong Sunli | 18 | F | 6 | NULL | | 20 | Ming Shiyin | 19 | F | 7 | NULL | | 21 | Dun Shan | 22 | M | 6 | NULL | | 22 | Zhou Yu | 20 | M | 1 | NULL | | 23 | Mi Yue | 0 | F | 4 | NULL | | 24 | Kai | 27 | M | NULL | NULL | | 25 | Sun Wukong | 100 | M | NULL | NULL | +-------+----------------+-----+--------+---------+-----------+ 25 rows in set (0.00 sec) MariaDB [hellodb]> create view view_student_class as select name,classid from students; Query OK, 0 rows affected (0.00 sec) MariaDB [hellodb]> select * from view_student_class; +----------------+---------+ | name | classid | +----------------+---------+ | Hou Yi | 2 | | Ya Se | 1 | | An Qila | 2 | | Da Ji | 4 | | Sun Shangxiang | 3 | | Huang Zhong | 5 | | Liu Bei | 3 | | Guan Yu | 7 | | Zhang Fei | 6 | | Di Renjie | 3 | | Li Yuanfang | 6 | | Lan Lingwang | 1 | | Wang Zhaojun | 2 | | Bai Qi | 3 | | A Ke | 4 | | Cai Wenji | 1 | | Lv Bu | 4 | | Diao Chan | 7 | | Gong Sunli | 6 | | Ming Shiyin | 7 | | Dun Shan | 6 | | Zhou Yu | 1 | | Mi Yue | 4 | | Kai | NULL | | Sun Wukong | NULL | +----------------+---------+ 25 rows in set (0.00 sec)
觸發器(trigger)是個特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,好比當對一個表進行操做( insert,delete, update)時就會激活它執行。觸發器常常用於增強數據的完整性約束和業務規則等。 觸發器能夠從 DBA_TRIGGERS ,USER_TRIGGERS 數據字典中查到。簡單的來講,就是當數據庫發生某種變化時,觸發觸發器並執行觸發器的語句集合。例如咱們建立一個日誌表,每當咱們修改其餘表的數據時,就將此次修改存入日誌表,這就是一個觸發器。
格式:create trigger [trigger_name] [trigger_time] [trigger event] on [table_name] for each row [trigger_body];
其中
trigger_name:爲咱們要建立的觸發器名稱
trigger_time:{ BEFORE | AFTER },表示在事件以前或以後觸發
table_name:表名
trigger event:{ INSERT |UPDATE | DELETE }觸發的具體事件
trigger body:觸發後執行的語句集合
若是觸發的執行語句多餘一條則trigger body中的內容應由begin開始,end結束
格式:show trigger\g;
格式:drop trigger [trigger_name];
例:
//建立一個student_info表 MariaDB [hellodb]> create table student_info( stu_id int(11) primary key auto_increment, stu_name varchar(255) default null); Query OK, 0 rows affected (0.00 sec) //建立一個student_count表 MariaDB [hellodb]> create table student_count( student_count int(11) default 0); Query OK, 0 rows affected (0.00 sec) //在student_count表中添加一行數據0 MariaDB [hellodb]> insert into student_count values (0); Query OK, 1 row affected (0.01 sec) //建立一個觸發器,當student_info表中添加數據後student_count中的值加一 MariaDB [hellodb]> create trigger trigger_student_count_insert after insert on student_info for each row update student_count set student_count=student_count+1; Query OK, 0 rows affected (0.00 sec) //建立一個觸發器,當student_info表中刪除數據後student_count中的值減一 MariaDB [hellodb]> create trigger trigger_student_count_delete after delete on student_info for each row update student_count set student_count=student_count-1; Query OK, 0 rows affected (0.02 sec)
mysql中帳號由兩部分組成,一是用戶名二是主機名,好比本機的root的帳號是「root@localhost」root是用戶名,localhost是主機名。在mysql中默認有一個root用戶,但因爲其權限較大,咱們通常使用一個普通的用戶。mysql中用戶的信息是由mysql.user表來存儲的,咱們能夠經過select user, host, password from mysql.user來查看用戶信息,同時咱們對用戶的操做均可以經過對這個表進行添加,刪除或修改來實現,只不過對這個表進行修改後咱們須要讓數據庫重讀用戶信息。
格式:create user [username] identified by ‘[password]’;
格式:rename user [old_user_name] to [new_user_name];
格式:drop user [username@host]
格式:
flush privileges;//從新讀取用戶數據或者重啓mysql也能夠生效
第一種方法是經過mysql的命令修改密碼,第二種方法是經過直接修改用戶的數據來修改密碼,但第二種方法在改過密碼後須要從新讀取用戶數據才能生效
個用戶對指定的數據庫都有特定的權限,咱們能夠對一個用戶設置權限讓他只能夠訪問某些數據庫或者對數據庫只有添加,查詢的操做
格式:grant [privileges] on [databasename].[tablename] to [username@host];
其中privileges爲用戶的操做權限,可選select,insert,delete等若要授予全部權限則爲all,databasename和tablename可用*,表示全部數據庫或者指定數據庫的全部表。privilege能夠在後面追加字段以表示只受權這些字段。
格式:grant [privileges] on [databasename].[tablename] to [username@host] with grant option;
格式:revoke [privilege] on [databasename].[tablename] from [username@host];
格式:show grants for [username@host];
例:
//建立一個用戶,名爲xiaozhang,密碼爲xuexiao,建立用戶時若是不指定host則默認爲%,即任意host MariaDB [(none)]> create user xiaozhang identified by 'xuexiao'; Query OK, 0 rows affected (0.00 sec) //將用戶xiaozhang@%改成xiaozhang@1.1.1.1 MariaDB [(none)]> rename user xiaozhang to xiaozhang@1.1.1.1; Query OK, 0 rows affected (0.00 sec) //給用戶xiaozhang受權,得到全部xuexiao.student的權限 MariaDB [(none)]> grant all on xuexiao.student to xiaozhang; Query OK, 0 rows affected (0.00 sec) //查看用戶xiaozhang的權限 MariaDB [(none)]> show grants for xiaozhang@1.1.1.1; +----------------------------------------------------------------------------------------------------------------+ | Grants for xiaozhang@1.1.1.1 | +----------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'xiaozhang'@'1.1.1.1' IDENTIFIED BY PASSWORD '*57502EB82B91C6C7D70CC031F3BE79E691B6ABFE' | | GRANT ALL PRIVILEGES ON `xuexiao`.`student` TO 'xiaozhang'@'1.1.1.1' | +----------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)