Mysql视图,

把 /etc/passwd的数据导入db7的user表里

一mysql 视图

    2.1  视图介绍(什么是视图)

 是一张虚拟表,内容与真实的表相似,有字段的记录 ,视图并不在数据库中以存储的数据存在

    2.2  为什么要使用视图 (视图的优点)

简单 --用户不需要关心视图中的数据如何查询获得,视图中的数据已经是过滤好符合条件的集合

安全---用户只能看到视图中的数据

数据独立--视图的结构一旦确定,可以 屏蔽表结构对用户的影响

    2.3 视图使用规则(创建视图时,要满足规则要求)

         create view db9.v1 as select name,uid from db9.user;

   2.4 视图管理

                        2.4.1 创建视图

create  view   视图名  sql 命令

mysql> create view db9.v1  as select name,uid from user;
 

create view 视图名(字段名)  sql 命令

mysql> create view db9.v2(a,b,c)  as select name,uid,shell from  db9.user;
mysql>  show tables;
mysql>  desc db9.v2;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| a     | char(50) | YES  |     | NULL    |       |
| b     | int(11)  | YES  |     | NULL    |       |
| c     | char(50) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
 

                      2.4.2 验证视图特点

[root@host50 ~]# mysql  -h192.168.4.55  -uyaya10 -p123qqq...A;

mysql>    show grants;
mysql>  对数据做操作验证特点

             更新视图的数据,就是更新基表的数据

               更新基表的数据,视图的数据也会跟着改变

                      2.4.3 查看视图

  mysql> show table status where comment="view"\G;   # 查看哪些是视图表
mysql>  show create view v2\G;   #  查看该视图的基表
 

                       2.4.4 删除视图

                      drop view 表名

mysql> drop view v1;

                     2.4.5 限制对视图的制作

2.5视图进阶

   2.5.1创建视图时,定义字段别名

mysql> create table t2 select  name,uid,shell from user limit 3;
mysql> create table t3 select name,uid,password,homedir from  user limit 5;
mysql> select * from t2,t3  where t2.uid=t3.uid;
mysql> select * from  t2 left join t3 on t2.uid=t3.uid;
 

mysql> create view v4 
    -> as
    -> select a.name x1,a.uid x2,a.shell x3,
    -> b.name x4,b.uid x5,b.password x6,
    -> b.homedir x7
    -> from 
    -> t2 a left join t3 b on a.uid=b.uid;
Query OK, 0 rows affected (0.04 sec)
             

mysql> select * from  t2 left join t3 on t2.uid=t3.uid;
+--------+------+---------------+--------+------+----------+---------+
| name   | uid  | shell         | name   | uid  | password | homedir |
+--------+------+---------------+--------+------+----------+---------+
| root   |    0 | /bin/bash     | root   |    0 | x        | /root   |
| bin    |    1 | /sbin/nologin | bin    |    1 | x        | /bin    |
| daemon |    2 | /sbin/nologin | daemon |    2 | x        | /sbin   |
 

mysql>  create view v5 as select * from t2 left join t3 on t2.uid=t3.uid;    #  会报错,所以需要重新定义字端别名
ERROR 1060 (42S21): Duplicate column name 'name'

2.5.2   覆盖创建新视图  or replace

mysql> create view v4 as select uid,gid,name from user;
ERROR 1050 (42S01): Table 'v4' already exists   # 已经存在
 

mysql>   create or replace view v4  as select uid,gid,name from user;
mysql>  select  * from v4;
 

2.5.3 算法(algorithm)  访问视图时,mysql 服务的处理方式

merage 替换方式

temptable,具体化方式   # 指的是要先在基表里面执行sql 命令 红色字体,create view db9.v2(a,b,c)  as select name,uid,shell from  db9.user;,最后执行 select * from v4

undefined,  未定义  =merage    #直接执行select * from v4

mysql> create algorithm=temptable view v5 as select uid,gid,name from user;
 

2.5.4  with  check option 限制对视图的操作

            1 LOCAL 对视图操作时,必须满足视图自身的限制

          2. CASCADED  对视图操作时,既要满足视图对自身的限制,又要满足基表的限制

    1 LOCAL 对视图操作时,必须满足视图自身的限制

mysql>  create table  t5  select name,uid,gid,shell from user where gid >=20 and gid <=1000;
mysql>   select  * from  t5;
 

mysql>  create view v7 as select * from  t5 where gid<=500 with local check option;
Query OK, 0 rows affected (0.04 sec)
 

mysql> select * from v7;
 

mysql> update v7 set gid=501 where name="games";   # 在视图v7不能把gid修改为大于500,  因为with local check option;   gid限制了小于等于500
ERROR 1369 (HY000): CHECK OPTION failed 'db9.v7'

 2. CASCADED  对视图操作时,既要满足视图对自身的限制,又要满足基表的限制

mysql> create view v8 as  select * from v7 where gid>=100 with cascaded check option;
Query OK, 0 rows affected (0.04 sec)

mysql>   select  * from v8;
+-------+------+------+---------------+
| name  | uid  | gid  | shell         |
+-------+------+------+---------------+
| games |   12 |  501 | /sbin/nologin |
+-------+------+------+---------------+
1 row in set (0.01 sec)

使不同的用户访问不同的数据

二mysql 存储过程:

  2.1 存储过程介绍 : 是mysql 服务里面的脚本

       指的是数据库中保存的一系列SQL命令的结合

      可以在存储过程中使用变量,流程控制,条件判断

2.2 存储过程的优点

        提高性能

       可减轻网络负担

       可以防止对表的直接访问

       避免重复编写sql操作

2.3使用存储过程

     2.3.1 基本使用

              1 创建存储过程

delimited //        修改命令结束的符号,不能是;分号

 create procedure  库名.名称

begin

       功能代码

         select * from 库名。表名;

end

//

delimited ;  修改回;为结束命令

             2.执行

          call  库名.名称();

           3 查看

                 3.1 查看服务器上已有的存储过程

show procedure status;

mysql>    desc mysql.proc\G;

                       库名  名称           存储                             类型               
mysql> select  db,name from mysql.proc where type="procedure";
 

                 3.2 查看存储过程代码

mysql> select  db,name,body from mysql.proc where type="procedure" and name="ps_setup_save"\G;    #  body里面含有代码
 

              4删除 

             drop  procedure  库名.名称;

  2.3.2 进阶

         1.变量(变量类型)

                 会话变量:用户在连接之后产生的变量,,,,断开后就会消失

show session variables;

show session variables like "sort_buffer_size";

set 

                  全局变量:

show global variables;

selete   @@变量   #查看全局变量

                  用户变量:      

mysql> set @x=99;
Query OK, 0 rows affected (0.00 sec)

mysql> set @name="bob";
Query OK, 0 rows affected (0.00 sec)

mysql> select @x,@name;
+------+-------+
| @x   | @name |
+------+-------+
|   99 | bob   |
+------+-------+

 

                 局部变量 :在存储过程里定义

                              declare      变量名 类型;  只能放在begin 和end 之间

mysql> delimiter //
mysql> create procedure db9.p2()
    -> begin
    -> declare x int;
    -> declare y int;
    -> set x = 99;
    -> set y = 11;
    -> select x,y;
    -> end
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> call db9.p2();
+------+------+
| x    | y    |
+------+------+
|   99 |   11 |
+------+------+
1 row in set (0.00 sec)

使用查询结果给变量复值

          mysql>  select count(name) into 变量名  from  db9.user;

          mysql> select count(name)  into @x   from  db9.user;


         mysql>  select  @x;
 

mysql>  delimiter //
mysql> create procedure db9.p3()
    -> begin 
    -> declare x int;
    -> declare y int;
    -> select count(name) into x from   db9.user where gid <= 1000;
    -> select count(name) into y from   db9.user where gid > 1000;
    -> select  x,y;
    -> end
    -> //
 

mysql>  delimiter ;
mysql> call db9.p3();
+------+------+
| x    | y    |
+------+------+
|   40 |    1 |
+------+------+
1 row in set (0.00 sec)
 

           2.存储过程的参数()参数类型)

//   参数作用:

       参数类型:

                 in类型    给存储过程传值

                                   in   变量名   数据类型

                 out 类型: 接收存储过程中的处理结果

                                  out  变量名   数据类型

                inout 类型 :  两者的结合

                               inout  变量名  数据类型

        in类型    给存储过程传值

mysql> delimiter //
mysql> create procedure db9.p9(in username char(10))
    -> begin
    -> select  * from  db9.user where name=username;
    -> end
    -> //

mysql>  delimiter ;
mysql>  call  p9("root");       #必须是user表里面的有的内容

+----+------+----------+------+------+---------+---------+-----------+
| id | name | password | uid  | gid  | comment | homedir | shell     |
+----+------+----------+------+------+---------+---------+-----------+
|  1 | root | x        |    0 |    0 | root    | /root   | /bin/bash |
+----+------+----------+------+------+---------+---------+-----------+
1 row in set (0.00 sec)

mysql>  call  p9("bob");         #  user 表里面没有bob  所以不能查找出来
Empty set (0.00 sec)


   out 类型: 接收存储过程中的处理结果

mysql> delimiter //
mysql> create procedure p10(in x int,in y int,out z int)
    -> begin
    -> set z = x + y;
    -> select z;
    -> end
    -> //
mysql> mysql> call p10(10,7,@i);
+------+
| z    |
+------+
|   17 |
+------+
1 row in set (0.00 sec)
 

mysql>  select @i;
+------+
| @i   |
+------+
|   17 |
+------+

mysql> delimiter //
mysql> create procedure p11(in uid_num int,in shell_name char(50),out x int)
    -> begin
    -> declare i int;
    -> declare j int;
    -> select count(shell) into j from  user where shell = shell_name;
    -> select count(uid) into i from  user where uid = uid_num;
    -> set x = i + j;
    -> select x;
    -> end
    -> //
 

mysql>    delimiter ;
mysql>    call p11(6,"abc",@w);
+------+
| x    |
+------+
|    1 |
+------+
 

mysql>    call p11(11,"/bin/bash",@w);
+------+
| x    |
+------+
|    3 |
+------+
 

mysql> delimiter //
mysql> create procedure p12(inout x char(30))
    -> begin
    -> select name from user where name=x;
    -> select count(*) into x from  user;
    -> select x;
    -> end 
    -> //
 

mysql> delimiter ;
mysql> set @i="root";
mysql> call p12(@i);

+------+
| name |
+------+
| root |
+------+
1 row in set (0.00 sec)

+------+
| x    |
+------+
| 41   |

        3.四则计算   + - * /   DIV  %

mysql> delimiter //
mysql> create procedure db9.p4()
    -> begin
    -> declare x int;
    -> declare y int;
    -> declare z int;
    -> select count(name) into x from  db9.user where gid=1000;
    -> select count(name) into z from db9.user where gid >1000;
    -> set z = x + y;
    -> select x,y,z;
    -> end
    -> //
 

mysql>  call db9.p4();
    -> //
+------+------+------+
| x    | y    | z    |
+------+------+------+
|    1 | NULL | NULL |
+------+------+------+
1 row in set (0.00 sec)
 

mysql> delimiter ;

         4.条件判断(是给流程控制使用)

                数值比较符号   字符比较符号   空  非空

                 范围内比较    逻辑比较    正则匹配   模糊匹配

        5. 流程控制(控制代码的执行顺序)

        1. if 选择结构(根据条件判断执行操作)

                    格式1:

                             if  条件测试  then

                                 代码。。。。

                               end if  ;

                格式2:

                        if  条件测试  then

                              代码一

                          else

                                代码2

                        end if;        

       mysql> delimiter //
mysql> create procedure db9.p13(in line_num int)
    -> begin
    -> if line_num > 10 then
    -> select * from  user where id >= line_num;
    -> else
    -> select * from user where id <= line_num;
    -> end if;
    -> end
    -> //


  mysql> delimiter ;
    

mysql> call p13(2);
    -> //
+----+------+----------+------+------+---------+---------+---------------+
| id | name | password | uid  | gid  | comment | homedir | shell         |
+----+------+----------+------+------+---------+---------+---------------+
|  1 | root | x        |    0 |    0 | root    | /root   | /bin/bash     |
|  2 | bin  | x        |    1 |    1 | bin     | /bin    | /sbin/nologin |
               

mysql> call p13(12);
 

          2. 循环结构  ( 需要重复执行的代码放在循环结构里)

              循环结构1  while  

                               while 条件 do  

                                 循环体

                              ....

                          end  while  ;

mysql> delimiter //
mysql> create procedure p15()
    -> begin
    -> declare x int;
    -> set x =1;
    -> while x <= 10  do 
    -> select x;
    -> set x=x+1;
    -> end while;
    -> end
    -> //


mysql> delimiter ;
mysql> call p15();   #  显示从1到10 的数字
 

        循环结构  2 loop                 是一个死循环

           loop

           循环体 

         end loop;

例子:

mysql> create procedure p16()

         begin loop select * from  user limit1;

        end loop;

       end

       //
mysql> call p16();          #会一直执行 begin loop select * from  user limit1;这条命令

        循环结构3  repeat

        repeat 

            循环体          先执行代码     ,,无论条件是否成立,都会先执行代码 

       untl 条件判断             条件成立了就结束循环,如果不成立就重新在执行代码

        end   repeat;

mysql> create procedure p17()

              begin declare x int;

            set x = 10;

            repeat  select x;

           set x = x +1;

           until x >  20

            end  repeat;

           end

           //
mysql>  call p17();   #  输出10 到20 的数字

流程控制函数(控制循环结构执行命令)

leave  结束循环

iterate  结束本次循环,并开始下一次循环

例子:

1   

  mysql> create procedure db9.p19()

              begin

             abc:while 1 = 1 do

                 leave abc;

                select name from user where name="root;

                  endwhile;

                  end

                   //    

 mysql> call p20();    #  输出结果为没有任何值,因为sql 命令

2     mysql> create procedure db9.p20()

              begin

              abc: while 1 = 1 do

              select name from user where name="root";

                leave abc;

                  endwhile;

                  end

                   //      
           mysql> call p20();
    -> //
+------+
| name |
+------+
| root |
+------+
 

3  mysql> delimiter //
mysql> create procedure p21()
    -> begin
    -> declare x int;
    -> set x = 1;
    -> plj:repeat
    -> if x = 3 or x = 5 then
    -> set x = x + 1;

         iterate plj;
    -> else 
    -> select x;
    -> end if;
    -> set x = x + 1;
    -> until x > 10
    -> end repeat;
    -> end
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql>  call p21();    输出除  3  和 5 外的1到10 的数字, 

综合:
mysql> delimiter //
mysql> create procedure p30(in line_num int)
    -> begin
    -> if line_num is not null then
    -> select * from  user  limit line_num;
    -> else
    -> select * from  user limit 1;
    -> end if;
    -> end
    -> //

mysql>  delimiter ;
 

mysql>   call p30(5);   显示前5行的内容


mysql> set @z = null;
Query OK, 0 rows affected (0.00 sec)

mysql> call p30(@z);   # 显示第一行的内容
 

创建存储过程;

mysql> delimiter //
mysql> create procedure db9.p1()    #  一定要存在库里面
    -> begin
    -> select  count(*) from db9.user where shell != "/bin/bash";
    -> select  count(*) from db9.user where shell = "bin/bash";
    -> end
    -> //
mysql>  delimiter ;
mysql>  
mysql>  call db9.p1();         #执行存储代码

+----------+
| count(*) |
+----------+
|       39 |
+----------+
1 row in set (0.00 sec)

+----------+
| count(*) |
+----------+
|        0 |
+----------+
 

mysql> select  db,name from  mysql.proc where name="p1" and type="procedure";  # 查看服务器创建的存储过程
mysql> select  body  from  mysql.proc where name="p1" and type="procedure";       #  查看服务器存储过程的代码


 

猜你喜欢

转载自blog.csdn.net/weixin_43669585/article/details/90262792