• 三十七.MySQL视图 MySQL存储过程


    1.视图的基本使用
    把/etc/passwd文件的内容存储到db9库下的user表里
    添加新字段id 存储记录的行号(在所有字段的前边)
    创建视图v1 结构及数据user表的字段、记录一样。
    创建视图v2 只有user表shell是/bin/bash用户信息 。
    分别对视图表和基表执行insert update delete 操作。
    删除视图v1 和 v2
     
    什么是视图:是一种虚拟存在的表
    内容与真实的表相似,包含一系列带有名称的列和行数据。
    视图并不在数据库中以存储的数据的形式存在。
    行和列的数据来自定义视图时查询所引用的基本表,并且在具体引用视图时动态生成。
    更新视图的数据,就是更新基表的数据
    更新基表数据,视图的数据也会跟着改变
     
    1.1 把/etc/passwd文件的内容存储到db9库下的user表里
    mysql> CREATE DATABASE db9;
    mysql> create table db9.user(username char(20),password char(1),uid  
    int(2),gid int(2),comment char(100),homedir char(100),shell char(50));
    //创建存储数据的表结构
    ysql> DESC user;
    +----------+-----------+------+-----+---------+-------+
    | Field    | Type      | Null | Key | Default | Extra |
    +----------+-----------+------+-----+---------+-------+
    | username | char(20)  | YES  |     | NULL    |       |
    | password | char(1)   | YES  |     | NULL    |       |
    | uid      | int(2)    | YES  |     | NULL    |       |
    | gid      | int(2)    | YES  |     | NULL    |       |
    | comment  | char(100) | YES  |     | NULL    |       |
    | homedir  | char(100) | YES  |     | NULL    |       |
    | shell    | char(50)  | YES  |     | NULL    |       |
    +----------+-----------+------+-----+---------+-------+
    mysql> system cp /etc/passwd /var/lib/mysql-files/
    mysql> system ls /var/lib/mysql-files/
    passwd
    mysql> load data infile "/var/lib/mysql-files/passwd" into table db9.user
        -> fields terminated by ":" lines terminated by " ";
     
    1.2 添加新字段id 存储记录的行号(在所有字段的前边)
    mysql> alter table db9.user add id int(2) primary key auto_increment first;
     
    1.3 创建视图v1 结构及数据user表的字段、记录一样
    mysql> create view v1 as select * from user;
    mysql> select * from v1;
     
    1.4 创建视图v2 只有user表shell是/bin/bash用户信息
    mysql> create view v2 as select shell from user where shell="/bin/bash";
    mysql> select * from v2;
     
    1.5 分别对视图表和基表执行insert update delete 操作
    mysql> insert into v1(username,uid) values("jarry",9);   //插入记录
    mysql> update v1 set uid=9 where username="adm";    //更新记录
    mysql> delete from v1 where uid=9;                               //删除记录
     
    1.6 删除视图v1 和 v2
    mysql> drop view v1;
    mysql> drop view v2;
     
    2. 视图进阶操作
    练习OR REPLACE的选项使用
    练习WITH LOCAL CHECK OPTION 选项的使用
    练习WITH CASCADED CHECK OPTION 选项的使用
     
    2.1 创建视图完全格式
    mysql> create table user2 select username,uid,gid from user limit 3;
    //快速建表(user2表)
    mysql> select * from user2;
    +----------+------+------+
    | username | uid  | gid  |
    +----------+------+------+
    | root     |    0 |    0 |
    | bin      |    1 |    1 |
    | daemon   |    2 |    2 |
    +----------+------+------+
     
    mysql> create table info select username,uid,homedir,shell from user limit 5;
    //快速建表(info表)
    mysql> select * from info;
    +----------+------+----------------+---------------+
    | username | uid  | homedir        | shell         |
    +----------+------+----------------+---------------+
    | root     |    0 | /root          | /bin/bash     |
    | bin      |    1 | /bin           | /sbin/nologin |
    | daemon   |    2 | /sbin          | /sbin/nologin |
    | lp       |    4 | /var/spool/lpd | /sbin/nologin |
    | sync     |    5 | /sbin          | /bin/sync     |
    +----------+------+----------------+---------------+
     
    2.2 查询user2.username(3)=info.username(4)的字段
    mysql> select * from user2 left join info on user2.username=info.username;
    +----------+------+------+----------+------+---------+---------------+
    | username | uid  | gid  | username | uid  | homedir | shell         |
    +----------+------+------+----------+------+---------+---------------+
    | root     |    0 |    0 | root     |    0 | /root   | /bin/bash     |
    | bin      |    1 |    1 | bin      |    1 | /bin    | /sbin/nologin |
    | daemon   |    2 |    2 | daemon   |    2 | /sbin   | /sbin/nologin |
    +----------+------+------+----------+------+---------+---------------+
     
    2.3 关联查询建的视图 默认不允许修改视图字段的值
    mysql> create view v4 as select a.username as ausername,b.username as busername,a.uid as auid,b.uid as buid from user2 a left join info b on a.username=b.username;
    mysql> select * from v4;
    +-----------+-----------+------+------+
    | ausername | busername | auid | buid |
    +-----------+-----------+------+------+
    | root      | root      |    0 |    0 |
    | bin       | bin       |    1 |    1 |
    | daemon    | daemon    |    2 |    2 |
    +-----------+-----------+------+------+
     
    2.4 OR REPLACE的选项使用
    创建时,若视图已存在,会替换已有的视图
    语法格式:create or replace view视图名as select 查询; //达到修改已有视图的目的
    mysql> create or replace view v4 as select a.username as ausername,b.username as busername,a.uid as auid,b.uid as buid  from user2 a left join info b on a.username=b.username;
     
    2.5 WITH LOCAL CHECK OPTION
    LOCAL和CASCADED关键字决定检查的范围
    LOCAL 仅检查当前视图的限制
    CASCADED 同时要满足基表的限制(默认值)
    mysql> create table user1 select username,uid,shell from user where uid>=5 and uid <=40;  
    mysql> select * from user1;
    +----------+------+----------------+
    | username | uid  | shell          |
    +----------+------+----------------+
    | sync     |    5 | /bin/sync      |
    | shutdown |    6 | /sbin/shutdown |
    | halt     |    7 | /sbin/halt     |
    | mail     |    8 | /sbin/nologin  |
    | operator |   11 | /sbin/nologin  |
    | games    |   12 | /sbin/nologin  |
    | ftp      |   14 | /sbin/nologin  |
    | rpc      |   32 | /sbin/nologin  |
    | rpcuser  |   29 | /sbin/nologin  |
    | ntp      |   38 | /sbin/nologin  |
    | mysql    |   27 | /bin/false     |
    +----------+------+----------------+
     
    mysql> create view v1 as select username,uid from user1 where uid<=20;
    mysql> select * from v1;
    +----------+------+
    | username | uid  |
    +----------+------+
    | sync     |    5 |
    | shutdown |    6 |
    | halt     |    7 |
    | mail     |    8 |
    | operator |   11 |
    | games    |   12 |
    | ftp      |   14 |
    +----------+------+
     
    mysql> update v1 set uid=21 where  username="sync";     
    //操作超过视图表的条件限制(uid<=20)之后,在视图表里面查看不到,在基表里可以查看到
    也就是说,更新视图表数据会直接更改基表数据;更新视图表数据超出视图限制,会修改成功,但是会被限制在要求之外。
     
    mysql> update user1 set uid=41 where username="ftp";
    //基表在超过条件限制(uid>=5 and uid <=40),在基表里依然可以查看到
    也就是说,基表随便修改都能成功
    mysql> select * from user1;
    +----------+------+----------------+
    | username | uid  | shell          |
    +----------+------+----------------+
    | sync     |    5 | /bin/sync      |
    | shutdown |    6 | /sbin/shutdown |
    | halt     |    7 | /sbin/halt     |
    | mail     |    8 | /sbin/nologin  |
    | operator |   11 | /sbin/nologin  |
    | games    |   12 | /sbin/nologin  |
    | ftp      |   41 | /sbin/nologin  |
    | rpc      |   32 | /sbin/nologin  |
    | rpcuser  |   29 | /sbin/nologin  |
    | ntp      |   38 | /sbin/nologin  |
    | mysql    |   27 | /bin/false     |
    +----------+------+----------------+
    v1里面没有,ftp移除
    也就是说,修改基表数据,会直接影响视图数据,
    进而说明,视图数据是动态生成,数据来源相当于于查询基表数据时产生的动态缓存。
    mysql> select * from v1;
    +----------+------+
    | username | uid  |
    +----------+------+
    | sync     |    5 |
    | shutdown |    6 |
    | halt     |    7 |
    | mail     |    8 |
    | operator |   11 |
    | games    |   12 |
    +----------+------+
     
    mysql> create table a select * from user where uid < 10;
    //快速创建一个新表a
    mysql> select * from a;
    +----+----------+----------+------+------+----------+-----------------+----------------+
    | id | username | password | uid  | gid  | comment  | homedir         | shell          |
    +----+----------+----------+------+------+----------+-----------------+----------------+
    |  1 | root     | x        |    0 |    0 | root     | /root           | /bin/bash      |
    |  2 | bin      | x        |    1 |    1 | bin      | /bin            | /sbin/nologin  |
    |  3 | daemon   | x        |    2 |    2 | daemon   | /sbin           | /sbin/nologin  |
    |  5 | lp       | x        |    4 |    7 | lp       | /var/spool/lpd  | /sbin/nologin  |
    |  6 | sync     | x        |    5 |    0 | sync     | /sbin           | /bin/sync      |
    |  7 | shutdown | x        |    6 |    0 | shutdown | /sbin           | /sbin/shutdown |
    |  8 | halt     | x        |    7 |    0 | halt     | /sbin           | /sbin/halt     |
    |  9 | mail     | x        |    8 |   12 | mail     | /var/spool/mail | /sbin/nologin  |
    +----+----------+----------+------+------+----------+-----------------+----------------+
     
    mysql> create view v3 as select * from a where uid < 10 with check option;
    //不写默认为CASCADED检查自己和a要满足的要求即可
    mysql> select * from v3;
    +----+----------+----------+------+------+----------+-----------------+----------------+
    | id | username | password | uid  | gid  | comment  | homedir         | shell          |
    +----+----------+----------+------+------+----------+-----------------+----------------+
    |  1 | root     | x        |    0 |    0 | root     | /root           | /bin/bash      |
    |  2 | bin      | x        |    1 |    1 | bin      | /bin            | /sbin/nologin  |
    |  3 | daemon   | x        |    2 |    2 | daemon   | /sbin           | /sbin/nologin  |
    |  5 | lp       | x        |    4 |    7 | lp       | /var/spool/lpd  | /sbin/nologin  |
    |  6 | sync     | x        |    5 |    0 | sync     | /sbin           | /bin/sync      |
    |  7 | shutdown | x        |    6 |    0 | shutdown | /sbin           | /sbin/shutdown |
    |  8 | halt     | x        |    7 |    0 | halt     | /sbin           | /sbin/halt     |
    |  9 | mail     | x        |    8 |   12 | mail     | /var/spool/mail | /sbin/nologin  |
    +----+----------+----------+------+------+----------+-----------------+----------------+
     
    mysql> update v3 set uid=9 where username="bin"; //更改成功
    mysql> update v3 set uid=11 where username="bin";
    ERROR 1369 (HY000): CHECK OPTION failed 'db9.v3'
     
    mysql> create view v2 as select * from v1 where uid >= 5 with local check option;
    //满足自身v2的要求
    mysql> select * from v2;
    +----------+------+
    | username | uid  |
    +----------+------+
    | sync     |    5 |
    | shutdown |    6 |
    | halt     |    7 |
    | mail     |    8 |
    | operator |   11 |
    | games    |   12 |
    +----------+------+
     
    mysql> update v2 set uid=9 where username="sync";
    mysql> select * from v2;
    +----------+------+
    | username | uid  |
    +----------+------+
    | sync     |    9 |
    | shutdown |    6 |
    | halt     |    7 |
    | mail     |    8 |
    | operator |   11 |
    | games    |   12 |
    +----------+------+
     
    mysql> select * from v1;
    +----------+------+
    | username | uid  |
    +----------+------+
    | sync     |    9 |
    | shutdown |    6 |
    | halt     |    7 |
    | mail     |    8 |
    | operator |   11 |
    | games    |   12 |
    +----------+------+
     
    mysql> select * from user1;
    +----------+------+----------------+
    | username | uid  | shell          |
    +----------+------+----------------+
    | sync     |    9 | /bin/sync      |
    | shutdown |    6 | /sbin/shutdown |
    ...
     
    2.6 WITH CASCADED CHECK OPTION
    mysql> create view v5 as select * from v1 where uid >= 5 with cascaded check option;
    mysql> select * from v5;
    +----------+------+
    | username | uid  |
    +----------+------+
    | sync     |    9 |
    | shutdown |    6 |
    | halt     |    7 |
    | mail     |    8 |
    | operator |   11 |
    | games    |   12 |
    +----------+------+
     
    3.创建存储过程
    存储过程名称为p1
    功能显示user表中 shell是/bin/bash的用户个数
    调用存储过程p1
     
    3.1 创建存储过程
    mysql> delimiter //     //定义定界符
    mysql> create procedure say()  //say随便写括号一定要有
        -> begin
        -> select * from user where id<=10;
        -> end
         -> //
    mysql> delimiter ;    //把命令的定界符改回来,分号前有空格
    mysql> call say();    //调用存储过程名,在括号里面不写参数时,可以不加括号
    +----+----------+----------+------+------+----------+-----------------+----------------+
    | id | username | password | uid  | gid  | comment  | homedir         | shell          |
    +----+----------+----------+------+------+----------+-----------------+----------------+
    |  1 | root     | x        |    0 |    0 | root     | /root           | /bin/bash      |
    |  2 | bin      | x        |    1 |    1 | bin      | /bin            | /sbin/nologin  |
    |  3 | daemon   | x        |    2 |    2 | daemon   | /sbin           | /sbin/nologin  |
    |  5 | lp       | x        |    4 |    7 | lp       | /var/spool/lpd  | /sbin/nologin  |
    |  6 | sync     | x        |    5 |    0 | sync     | /sbin           | /bin/sync      |
    |  7 | shutdown | x        |    6 |    0 | shutdown | /sbin           | /sbin/shutdown |
    |  8 | halt     | x        |    7 |    0 | halt     | /sbin           | /sbin/halt     |
    |  9 | mail     | x        |    8 |   12 | mail     | /var/spool/mail | /sbin/nologin  |
    | 10 | operator | x        |   11 |    0 | operator | /root           | /sbin/nologin  |
    +----+----------+----------+------+------+----------+-----------------+----------------+
     
    创建存储过程名称为p1
    功能显示user表中 shell是/bin/bash的用户
    调用存储过程p1
    mysql> delimiter  //
    mysql> create procedure p1()
        -> begin
        -> select count(username) from user where shell="/bin/bash";
        -> end
        -> //
    mysql> delimiter ;
    mysql> call p1();
    +-----------------+
    | count(username) |
    +-----------------+
    |               2 |
    +-----------------+
     
    mysql> select username from user where shell="/bin/bash";
    +----------+
    | username |
    +----------+
    | root     |
    | student  |
    +----------+
     
    查看存储过程
    方法一:
    mysql> show procedure statusG;
    方法二:
    mysql> select db,name,type from mysql.proc where name= "say";
    +-----+------+-----------+
    | db  | name | type      |
    +-----+------+-----------+
    | db9 | say  | PROCEDURE |
    +-----+------+-----------+
     
    3.3 删除存储过程
    mysql> drop procedure say;
     
    3.4 查看已有过程
    mysql> select db,name,type from mysql.proc;
     
    4. 存储过程参数的使用
    参数类型
    MySQL存储过程,共有三种参数类型IN,OUT,INOUT
    Create procedure 名称(
    类型 参数名 数据类型,
    类型 参数名 数据类型
    in输入参数 传递值给存储过程,必须在调用存储过程时指定,在存储过程中不能修改该参数的值;默认类型是in
    out输出参数该值可在存储过程内部被改变,并可返回
    inout输入/输出参数调用时指定,并且可被改变和返回
     
    案例1:
    mysql> delimiter  //
    mysql> create procedure say2(in name char(10))
        -> begin
        -> select name;
        -> select * from user where username=name;
        -> end
        -> //
    mysql> delimiter ;
    mysql> call say2("ftp");
    +------+
    | name |
    +------+
    | ftp  |
    +------+
     
    +----+----------+----------+------+------+----------+----------+---------------+
    | id | username | password | uid  | gid  | comment  | homedir  | shell         |
    +----+----------+----------+------+------+----------+----------+---------------+
    | 12 | ftp      | x        |   14 |   50 | FTP User | /var/ftp | /sbin/nologin |
    +----+----------+----------+------+------+----------+----------+---------------+
     
    案例2:
    mysql> delimiter //
    mysql> create procedure p2(out number int)
        -> begin
        -> select count(username) into @number from user where shell!="/bin/bash"; 
        -> select @number;
        -> end
        -> //
    mysql> delimiter ;
    mysql> call p2(@number);
    +---------+
    | @number |
    +---------+
    |      39 |
    +---------+
     
    5.使用循环结构
    5.1 算数运算
    mysql> set @z=1+2;select @z;
    +------+
    | @z   |
    +------+
    |    3 |
    +------+
     
    mysql> set @x=1; set @y=2;set @z=@x*@y; select @z;
    +------+
    | @z   |
    +------+
    |    2 |
    +------+
     
    mysql> set @x=1; set @y=2;set @z=@x/@y; select @z;
    +-------------+
    | @z          |
    +-------------+
    | 0.500000000 |
    +-------------+
     
    declare调用变量不需要@,其他都需要
    调用变量时,有@符号的变量 如@x:调用的是用户自定义变量
    没有@符号的变量 如x:调用的是存储过程的参数变量
    mysql> delimiter //
    mysql> create procedure say5(in bash char(20), in nologin char(25), out x int , out y int)
        -> begin
        -> declare z int ;
        -> set z=0;
        -> select count(username) into @x from user where shell=bash;
        -> select count(username) into @y from user where shell=nologin;
        -> set z=@x+@y;
        -> select z;
        -> end
        ->  //
    mysql> delimiter ;
    mysql> call say5("/bin/bash","/sbin/nologin",@x,@y);
    +------+
    | z    |
    +------+
    |   36 |
    +------+
     
    mysql> delimiter //
    mysql> create procedure say6(in bash char(20),in nologin char(25),out x int ,out y int)
        -> begin
        -> declare z int ;
        -> set z=0;
        -> select count(username) into  @x from user where shell=bash;
        -> select count(username) into  @y from user where shell=nologin;
        -> set z=@x+@y;
        -> select z;
        -> end
        ->  //
    mysql> delimiter ;
    mysql> call say6("/bin/bash","/sbin/nologin",@x,@y);
    +------+
    | z    |
    +------+
    |   36 |
    +------+
     
    5.2 条件判断,数值的比较如图-2所示:
    5.3 逻辑比较、范围、空、非空、模糊、正则,如图-3所示:
    顺序结构(if判断)当“条件成立”时执行命令序列,否则,不执行任何操作
    mysql> delimiter //
    mysql> create procedure say7(in x int(1) )
        -> begin
        -> if x <= 10 then
        -> select * from user where id <=x;
        -> end if;
        -> end
        -> //
    mysql> delimiter ;
    mysql> call say7(1);   //条件判断成立,等于1是否成立
    +----+----------+----------+------+------+---------+---------+-----------+
    | id | username | password | uid  | gid  | comment | homedir | shell     |
    +----+----------+----------+------+------+---------+---------+-----------+
    |  1 | root     | x        |    0 |    0 | root    | /root   | /bin/bash |
    +----+----------+----------+------+------+---------+---------+-----------+
     
    mysql> mysql> call say7(2);
    +----+----------+----------+------+------+---------+---------+---------------+
    | id | username | 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> delimiter //
    mysql> create procedure p3(in  linenum char(10) )
        -> begin
        -> if linenum is null then
        -> set @linenum=1;
        -> select * from user where id=@linenum;
        -> else
        -> select linenum;
        -> select * from user where id=linenum;
        -> end if;
        -> end
        -> //
    mysql> delimiter ;
    mysql> call p3(null);   //不输入查看的行数
    +----+----------+----------+------+------+---------+---------+-----------+
    | id | username | password | uid  | gid  | comment | homedir | shell     |
    +----+----------+----------+------+------+---------+---------+-----------+
    |  1 | root     | x        |    0 |    0 | root    | /root   | /bin/bash |
    +----+----------+----------+------+------+---------+---------+-----------+
     
    mysql> call p3(3);
    +---------+
    | linenum |
    +---------+
    | 3       |
    +---------+
     
    +----+----------+----------+------+------+---------+---------+---------------+
    | id | username | password | uid  | gid  | comment | homedir | shell         |
    +----+----------+----------+------+------+---------+---------+---------------+
    |  3 | daemon   | x        |    2 |    2 | daemon  | /sbin   | /sbin/nologin |
    +----+----------+----------+------+------+---------+---------+---------------+
  • 相关阅读:
    (十三)过滤器Filter(转)
    (十二)会话跟踪技术之servlet通信(forward和include)
    (十一)会话跟踪技术之作用域(request、session、servletContext)
    openjdk源码目录结构
    java socket相关的timeout
    eclipse创建maven web app
    hadoop mapred和mapreduce包
    hadoop shuffle
    bash shell和进程
    bash shell中的特殊用法
  • 原文地址:https://www.cnblogs.com/luwei0915/p/10491799.html
Copyright © 2020-2023  润新知