把 /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"; # 查看服务器存储过程的代码