mysql進階

 

一.視圖

視圖是一個虛擬的表,不存儲任何數據,存儲的是一條select語句,視圖是對若干個表的引用,是根據咱們須要只顯示指定數據的一個虛擬的表mysql

視圖的做用:

  1. MySQL用戶綁定後,使用戶方便取得須要的數據,而用戶也只能對視圖指定的數據進行操做,增長了安全性
  2. 將複雜的問題簡化,在實際使用時咱們可能會常常查詢某些數據,而這些數據的查詢語句十分複雜,咱們很難在每次須要時都現場編寫select語句,經過視圖咱們能夠將這些複雜的select語句進行存儲,再次使用時咱們只需調用視圖便可

 

建立視圖

格式: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用戶與權限

 

1.用戶

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]

 

修改密碼

格式:

  1. set password for [username@host]=password(‘[password]’);
  2. update mysql.user set password=password(「[password]」) where host=‘[host]’;

   flush privileges;//從新讀取用戶數據或者重啓mysql也能夠生效

第一種方法是經過mysql的命令修改密碼,第二種方法是經過直接修改用戶的數據來修改密碼,但第二種方法在改過密碼後須要從新讀取用戶數據才能生效

 

2.權限

個用戶對指定的數據庫都有特定的權限,咱們能夠對一個用戶設置權限讓他只能夠訪問某些數據庫或者對數據庫只有添加,查詢的操做

 

給用戶受權

格式: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)
相關文章
相關標籤/搜索