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)