mysql高级之编程优化
★编程优化
一、字符编码(mysql控制台乱码输出解决:character_set_results='gbk')
表/列编码设置
列:alter table 表名 change 列名 列名 数据类型 character set 字符集名
表:alter table 表名 character set utf8
服务器编码设置
多表结构设置
二、视图
①简介
·什么是视图?视图是由查询结果形成的一张虚拟表。视图的主要作用就是查询。
·什么时候用到视图?如果某个查询结果出现的非常频繁,也就是,要经常拿这个查询结果来做子查询。
·使用视图的好处:简化查询语句,可以进行权限控制,大数据表分表的时候
·视图与表的关系:视图是表的查询结果,自然表的数据变了,会影响视图的结果。
·能否对视图进行增删改查的操作?
1>视图的增删改也会影响表;2>但视图并不总是能增删改的;视图与表的数据一一对应时可以修改,对于视图的insert还应注意;视图必须包含表中没有默认值的列。
②创建
create [or replace] [algorithm={undefined|merge|temptable}]
view view_name[(colum_list)]
as select_statement
[with[cascaded|local] check option]
③管理
·视图的存放位置
select * from iinformation_schema.views; 查询视图的存放位置;show tables;也可以查看
·查看视图的定义:show table status from 视图名称 like '视图名称'\G
·删除视图,只能删除视图的定义,不能删除数据,必须有drop权限
drop view if exists 视图名称
·update 视图名称 set salary=1500 where emp_no=1001;更新视图中emp_no=1001的工资;
·某些视图是可更新的,也就是说,可以在诸如update、delete或insert等语句中使用他们,以更新基表的内容,对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系;包含以下的视图都是不可更新的
1>聚合函数sum() min() max() count()
2>distinct
3>group by
4>having
5>union或union all
6>位于选择列表中的子查询
7>join
8>from子句中的不可更新视图
9>algorithm=temptable(使用临时表总会使视图成为不可更新的)
·关于with check option的理解与应用?
通过视图进行的修改,必须也能通过该视图看到修改的后的结果。
三、变量与流程控制
·局部变量:局部变量在存储过程中被定义,那么局部变量只有在存储过程中才有效,其他范围无效。
use companys;
delimiter $$;
create procedure p_vartest()
begin
declare a varchar(20) default 'abc';
select a
end
$$
delimiter;
call p_vartest
·会话变量:客户端与服务器端相关联的时候,你设置的变量,就是客户端所拥有的变量,这些变量就是会话变量。
查看所有会话变量show session variables;
show session variables like 'auto%';
当A客户端和B客户端同时操作mysql数据库,各自设置的变量只对自己起作用,互不干扰,等下次在操作mysql的时候,mysql会把自己的一些变量作用于客户端。
修改session会话变量方法:
set @@session.autocommit='off';
set 变量名=‘某个值’;
·全局变量:不管是sessionA还是sessionB,只要你针对MySQL全局变量做了修改,A访问和B访问都是访问相同的变量值,
查看所有全局变量
show global variables;
查看某一个全局变量
show global variables like 'auto%';
设置全局变量
set @@global.变量名=某个值
·选择语句
use companys;
delimiter $$;
create procedure p_showage(in age int)
begin
if age>=18 then
select '成年人';
else
select '未成年人';
end if;
end
$$