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 "\n";
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 status\G;
方法二:
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 |
+----+----------+----------+------+------+---------+---------+---------------+
- mysql 视图 触发器 存储过程 函数事务 索引
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
- 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器
@ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...
- mysql视图和存储过程定义者修改脚本(懒人专用)
前言: 在实际工作中mysql数据库的迁移.备份恢复.数据库重命名等一系列涉及到视图和存储过程定义者问题都会需要修改,每次都要从基础表获取数据,然后手工整理做脚本,十分麻烦,所以简单写了个过程,以后可 ...
- mysql 视图,存储过程,游标,触发器,用户管理简单应用
mysql视图——是一个虚拟的表,只包含使用时动态查询的数据 优点:重用sql语句,简化复杂的SQL操作,保护数据,可以给用户看到表的部分字段而不是全部,更改数据格式和表现形式 规则: 名称唯一,必须 ...
- MySql视图、存储过程、函数、索引
一.视图 视图是查询命令结果构成的一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集合,并可以当作表来查询使用. 1创建视图 - ...
- MySQL视图 索引 存储过程 触发器 函数
视图: 也就是一个虚拟表(不是真实存在的),它的本质就是根据SQL语句获取动态的数据集,并为其命名.用户使用时只需要使用命名的视图即可获取结果集,并可以当做表来使用.它的作用就是方便查询操作,减 ...
- 八、mysql视图、存储过程、函数以及时间调度器
.create or replace view emp_view as select * from t4 ;给t4表创建一个名为emp_view的视图 .drop view emp_view 删除视图 ...
- Mysql 视图,触发器,存储过程,函数,事务
视图 视图虚拟表,是一个我们真实查询结果表,我们希望将某次查询出来的结果作为单独的一个表,就叫视图,无法对图字段内容进行增删改. --格式: CREATE VIEW 视图名字 AS 操作; --比如: ...
- mysql视图、存储过程等
视图: 需求: 创建的临时表(select * from tb1)被反复使用,这时可以为该临时表创建视图.视图相当于为某个查询创建了别名. 1.创建视图 create view v1 as selec ...
随机推荐
- vue导入css,js和放置html代码
使用场景:我是从网上找的html前端页面模板,导入找的模板中的css和js到vue中使用. 1.在main.js中全局导入css和js import '@/assets/css/main.css' i ...
- Hystrix 用法及注解用法
一.hystrix参数使用方法 通过注解@HystrixCommand的commandProperties去配置,如下就是hystrix命令超时时间命令执行超时时间,为1000ms和执行是不启用超时 ...
- idea for mac 快捷键整理
⌘O 查找类文件 ⌘⌥O 前往指定的变量 / 方法 ⌘⇧O 查找所有类型文件.打开文件.打开目录,打开目录需要在输入的内容前面或后面加一个反斜杠/ ⌘⌥← / ⌘⌥→ 退回 / 前进到上一个操作的地方 ...
- Thread.interrupt()源码跟踪
1 JDK源码跟踪 // java.lang.Thread public void interrupt() { if (this != Thread.currentThread()) checkAcc ...
- 从零开始搭建一个简单的基于webpack的vue开发环境
原文地址:https://segmentfault.com/a/1190000012789253?utm_source=tag-newest 从零开始搭建一个简单的基于webpack的react开发环 ...
- SqlServer2008 / SqlServer2012 禁用windows登录,sa忘记密码或密码过期如何登陆
以管理员身份运行cmd 1.cmd 下 停止SqlServer服务,net stop mssqlserver: 2.新建windows账号test,加入administrators组里,授予管理员权 ...
- R_数据视觉化处理_初阶_02
通过数据创建一幅简单的图像, #Crate a easy photopdf("mygraph.pdf") attach(mtcars) plot(wt,mpg) abline(lm ...
- 用D3js的区域生成器实现简单波浪图
最近做控件遇到含有波浪图的图表,一开始用Echarts虽然很快完成了,但Echarts的波浪图与其他图表的响应式不同步,于是学习了D3js,D3js写起来确实复杂一些,但能够实现的效果也更丰富,做的时 ...
- jupyter修改默认目录
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10841241.html 一.修改 win10 ...
- iOS CALayer总结——图层几何
最近看了一下关于图层和动画的内容,所以写了一份总结,算是对这些内容的汇总吧,都是一些简单的基础知识,不知道大家都了不了解. 除了和用户的交互之外,图层的很多属性和视图基本上都是一样的,今天就先从CAL ...