书本 漏洞

0311lc.com说:

书本用mysql5.5  好多 都语句不支持   比如 check 完整性

现在 只有  MySQL 8.0.16 开始支持 check 完整性

书本mysql5.5  不支持

 

MySQL从5.7一跃直接到8.0,本次的版本更新,在功能上主要有以下6点:

  账户与安全

  优化器索引

  通用表表达式

  窗口函数

  InnoDB 增强

  JSON 增强

 

  账户与安全

  优化器索引

  通用表表达式

  窗口函数

  InnoDB 增强

  JSON 增强

 

一、账户与安全

复制代码
1.用户的创建与授权

  在MySQL5.7的版本:

  > grant all privileges on *.* to '用户名'@'主机' identified by '密码';

  在MySQL8.0需要分开执行:

  >create user '用户名'@'主机' identified by '密码';

  >grant all privileges on *.* to '用户名'@'主机';

  用以前的一条命令在8.0里面创建用户,会出现sql语法错误
复制代码
复制代码
2.认证插件更新

  MySQL5.7默认身份插件是mysql_native_password

  MySQL8.0默认的身份插件是caching_sha2_password
  查看身份认证插件命令:show variables like 'default_authentication_plugin%';
  身份认证插件可以通过以下2中方式改变:
  
  1)系统变量default_authentication_plugin去改变,在my.ini文件的[mysqld]下面设置default_authentication_plugin=mysql_native_password即可
  2)如果希望只是某一个用户通过mysql_native_password的方式认证,可以修改数据库mysql下面的user表的字段,执行以下命令:

  >alter user '用户名'@'主机' identified width mysql_native_password by '密码';
复制代码
复制代码
3.密码管理

  MySQL8.0的密码管理策略有3个变量

  password_history 修改密码不允许与最近几次使用或的密码重复,默认是0,即不限制
  
  password_reuse_interval 修改密码不允许与最近多少天的使用过的密码重复,默认是0,即不限制
  password_require_current 修改密码是否需要提供当前的登录密码,默认是OFF,即不需要;如果需要,则设置成ON

  查询当前MySQL密码管理策略相关变量,使用以下命令:
  
  >show variables like 'password%';


  1)设置全局的密码管理策略,在my.ini配置文件中,设置以上3个变量的值这种设置方式,需要重启mysql服务器;某些生产环境不允许重启,MySQL8.0提供了关键字persist,持久化,执行以下命令:

  >set persist password_history=6;

  这条命令会在数据目录下生成新的配置文件(/var/lib/mysql/mysqld-auto.cnf),下次服务器重启的时候除了读取全局配置文件,还会读取这个配置文件,这条配置就会被读入从而达到持久化的目的
  2)针对某一个用户单独设置密码管理策略

  >alter user '用户名'@'主机' password history 5;

  这样,这个用户的password_history 就被设置成了5,查看一下:

  >show user,host,Password_reuse_history from user;
  
  查看某一张的字段的所有字段,使用以下命令:

  >desc 表名;
复制代码

 

复制代码
4.角色管理
  
  角色:一组权限的集合
  
  一组权限赋予某个角色,再把某个角色赋予某个用户,那用户就拥有角色对应的权限
  
  1)创建一个角色
  >create role '角色1';
  
  2)为这个角色赋予相应权限
  >grant insert,update on *.* to '角色1';
  
  3)创建一个用户
  >create user '用户1' identified by '用户1的密码';
  
  4)为这个用户赋予角色的权限
  >grant '角色1' on *.* to '用户1';

  执行完上面4步,用户1就拥有了插入与更新的权限
  
  5)再创建1个用户
  >create user '用户2' identified by '用户2的密码';
  
  6)为这个用户赋予同样的角色
  >grant '角色1' on *.* to '用户2';
  
  执行完上面2步,用户2也用了角色1的权限,即插入与更新

  查看用户权限,执行以下命令:
  >show grants for '用户名';

  7)启用角色,设置了角色,如果不启用,用户登录的时候,依旧没有该角色的权限
  >set default role '角色名' to '用户名';

  8)如果一个用户有多个角色,使用以下命令
  >set default role all to '用户名';

  MySQL中与用户角色相关的表:mysql.default_roles、mysql.role_edges,有兴趣的朋友可以进去查看下。

  9)撤销权限
  >revoke insert,update on *.* from '角色名';
复制代码

 

二、优化器索引

复制代码
1.隐藏索引(invisible index)

  隐藏索引不会被优化器使用,但仍需要维护

  应用场景:

  1)软删除

    删除索引,在线上,如果删除错了索引,只能通过创建索引的方式将其添加回来,对于一些大的数据库而言,是比较耗性能的;为了避免删错,可以先将其设置为不可见,优化器这时候就不会使用它,但是后台仍然在维护,确定后,再删除。

  2)灰度发布

    与软删除差不多,如果想要测试一些索引的功能或者随后可能会使用到这个索引,可以先将其设置为隐藏索引,对于现有的查询不会产生影响,测试后,确定需要该索引,可以将其设置成可见索引。

  创建隐藏索引,执行如下命令(如果是不隐藏,则不需要后面的invisible关键字):

  >create index 索引名称 on 表名(字段名) invisible;

  查询某一张表的索引,执行如下命令:

  >show index from 表名;

  使用explain语句查看查询优化器对索引的使用情况

  >explain select * from 表名 where 条件;

  查询优化器有很多开关,有一个是use_invisible_indexes(是否使用隐藏索引),默认是off(不适用),将其设置成on,即可使用隐藏索引。查看当前查询优化器的所有开关变脸,执行如下命令:

  >select @@optimizer_switch;

  设置已经存在的索引为可见或者隐藏,执行如下命令:

  >alter table 表名 alter index 索引名 visible;

  >alter table 表名 alter index 索引名 invisible;
  主键不可以设置为隐藏所以。
复制代码
2.降序索引(descending index)

  MySQL8.0开始真正支持降序索引,只有InnoDB引擎支持降序所以,且必须是BTREE降序索引,MySQL8.0不在对group by操作进行隐式排序。
复制代码
3.函数索引

  索引中使用函数表达式
  
  支持JSON数据节点的索引

  函数索引是基于虚拟列的功能实现的

假设用户表(tb_user)的的用户登录账号(username)不需要区分大小写,则可以创建一个函数索引

>create index username_upper_index on tb_user((upper(username)));
这样在查询的时候 SELECT * FROM tb_user WHERE upper(username) = 'ABD123DSJ'; 就会使用索引。

上面的函数索引,也可以通过MySQL5.7已有的虚拟计算列来模拟,为用户表(tb_user)创建新的一列(new_column),这一列是计算列,不需要赋值,它的值就是username的大写。

>alter tbale tb_user add column new_column varchar(10) generated always as (upper(username));

然后给new_column创建一个索引,可以达到模拟MySQL8.0中的函数索引的效果。
复制代码

 

三、通用表表达式

复制代码
1.非递归 CTE

  派生表:select * from (select 1) as dt;

  通用表表达式:with cte as (select 1) select * from cte;
  
         with cte1(id) as (select 1),cte2 as (select id+1 from cte1) select * from cte1 join cte2;

复制代码
2.递归 CTE

 

四、窗口函数

五、InnoDB增强

1.集成数据字段
复制代码
2.原子ddl操作

  MySQL5.7执行drop命令 drop table t1,t2; 如果t1存在,t2不存在,会提示t2表不存在,但是t1表仍然会被删除。

  MySQL8.0执行同样的drop命令,会提示t2表不存在,而且t1表不会被删除,保证了原子性。

  ddl操作(针对表)的原子性前提是该表使用的存储引擎是InnoDB
复制代码
复制代码
3.自增列持久化

  解决了之前的版本,主键重复的问题。

  MySQL5.7及其以前的版本,MySQL服务器重启,会重新扫描表的主键最大值,如果之前已经删除过id=100的数据,但是表中当前记录的最大值如果是99,那么经过扫描,下一条记录的id是100,而不是101。
  
  MySQL8.0则是每次在变化的时候,都会将自增计数器的最大值写入redo log,同时在每次检查点将其写入引擎私有的系统表。则不会出现自增主键重复的问题。
复制代码
4.死锁检查控制
5.锁定语句选项

 

六、JSON增强

 

复制代码
1.内联路径操作符 
  
column->>path

等价于之前的:

JSON_UNQUOTE(column -> path)

JSON_UNQUOTE(JSON_EXTRACT(column,path))
复制代码
复制代码
2.JSON聚合函数

MySQL8.0和MySQL5.7.22增加了2个聚合函数

  1)JSON_ARRAYAGG(),将多行数据组合成json数组

  示例:select o_id,json_arrayagg(attribute) as attributes from t group by o_id;

     2)JSON_OBJECTAGG(),用于生成json对象

示例:select o_id json_objectagg(attribute,value) as attributes from t group by o_id;

注意:json的聚合函数针对重复key,会使用最后的覆盖前面已有的值,如果下面的o_id=3,它的color有2个值,一个green,一个yellow,使用生成json的聚合函数的时候,前面的green会被覆盖掉。

 

 

 

复制代码
复制代码
3.JSON实用函数

  1)JSON_PRETTY()  输出json数据的时候,格式化。

  select json_object('id',3,'name','Barney');

  select json_pretty(json_object('id',3,'name','Barney'));

  2)JSON_STORAGE_SIZE() json数据所占用的存储空间(单位:字节)

  3)JSON_STORAGE_FREE() json数据更新后所释放的空间(单位:字节)
复制代码
复制代码
4.JSON合并函数

MySQL8.0废弃了JSON_MERGE()函数,推荐使用以下两个函数合并JSON数据

  1)JSON_MERGE_PATCH()

  2)JSON_MERGE_PRESERV()

上面两个函数都是JSON数据合并,最大的区别就是前者遇到相同key的时候会用后面的覆盖前面的,后者会都保留,看下面的截图:

复制代码
5.JSON表函数
  
  MySQL8.0新增了JSON_TABLE()函数,将JSON数据转换成关系表,可以将该函数的返回结果当做一个普通的临时表进行sql查询。

 


表、约束、索引、触发器、事件、存储过程函数、权限

0311lc.com说:

 

 

 PHP

连接  mysql_connect 域名:端口 用户 密码  or  die               或 mysql_errno  mysql_eror  mysql_pconnect
mysql_select_db 数据库 连接  or  die
mysql_query   set names 'utf8'  或 gbk 根据页面定
mysql_query  sql 连接

mysql_fetch_array  rs   MYSQL_BOTH      多时候 可while $row
mysql_fetch_assoc  rs

mysql_num_rows  rs

mysql_data_seek  rs  id

mysql_close

 

用户权限

select user from mysql.user; //查询账号

 select password ('111111'); // 111111的散列值

//创建用户
create user 'luxilang'@'localhost' identified by '111111',
'luxilang_ps'@'localhost' identified by password 
'*FD571203974BA9AFE270FE62151AE967ECA5E0AA'

drop user luxilang@localhost ; //删除用户

 rename user luxilang_ps@localhost to luxilang1@localhost; //重命名

select password('888888')
//修改密码
set password for 'luxilang1'@'localhost'
='*DA28842831B3C40F4BC1D3C76CF9AD8CBFDAE1CB';  

show grants for 'luxilang1'@'localhost'; //查看权限 grants 后面有s
//权限授予  grant  权限 on 表  to 用户和域  identified by  '密码' 
//用户存在时候
grant select(age)  on  db_school.stuinfo1  to 'luxilang1'@'localhost';
//用户 luxilang1登陆 SELECT * FROM stuinfo1 时错的没权限只能age字段
grant select,update on    db_school.stuinfo1  
 to 'luxilang2'@'localhost'  identified by '111111';

grant all on    db_school.stuinfo1  
 to 'luxilang3'@'localhost'  identified by '111111'; //所有权限luxilang3

grant create user on *.*  to 'luxilang2'@'localhost' ; //授予权限给luxilang2
//用户不存在 用下面
grant select,update on stuinfo1
 to  'luxilang3'@'localhost'  identified by '111111'
with grant option; //创建 并 授权权限

grant delete on stuinfo1 to  'luxilang8'@'localhost'
with max_queries_prer_hour 1  // 每小时只能处理删除一条delete 数据

//撤销 revoke  权限 on 表 from 用户和域       是 from
revoke update  on stuinfo1   from 'luxilang2'@'localhost'; //权限撤销

备份和恢复

show variables like '%secure%'; //查看 secure_file_priv  
//secure_file_priv =目录            指定目录,
//secure_file_priv=Null             关闭,
//secure_file_priv=                 开启
然后 my.ini  里面 设置 为 secure_file_priv =    才能用
secure_file_priv =''

注意  set names 'GBK';
//双反斜杠 确定没有目录下没文件 有就删除它
//导出 数据
select * from stuinfo1
into outfile 'd:\\1.txt'    
fields terminated  by ','
optionally enclosed by '"'
lines terminated by "?\n";

CREATE TABLE `stu100` (
  `stu_no` INT(10) NOT NULL AUTO_INCREMENT,
  `stu_name` VARCHAR(10) DEFAULT NULL,
  `class_no` INT(4) NOT NULL,
  `sex` TINYINT(1) DEFAULT '1',
  `age` INT(4) DEFAULT '0',
  PRIMARY KEY (`stu_no`)
) ENGINE=INNODB  
//做一个拷贝 导入数据
load  data infile 'd:\\1.txt'  
into  table stu100
fields terminated  by ','
optionally enclosed by '"'
lines terminated by "?\n";


//用mysqldump 表的 导出sql 包含结构 
mysqldump -h localhost -u root -proot db_school stuinfo1 > d:\\stuinfo1.sql
mysqldump  -u root -proot db_school > "d:\db_school.sql" //数据库备份
mysqldump  -u root -proot --events --ignore-table=mysql.events --all-databases > "d:\alldatabases.sql"  //需要--events --ignore-table=mysql.events
mysqldump  -u root -proot db_school --tab="d:\back" //建立目录back在备份

//创建db_school1
CREATE DATABASE `db_school1`CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
//备份 数据库  db_school stuinfo1 表  d:\stuinfo1.sql
mysqldump -u root -proot  db_school stuinfo1 >d:\stuinfo1.sql
//恢复表d:\stuinfo1.sql  到  db_school1 stuinfo1
mysql -u root -proot db_school1 <d:\stuinfo1.sql

存储过程和存储函数

//存储过程  call调用 有返回值
delimiter $$
create procedure sp_update_age(IN s_age int(10))
begin
 update stuinfo1 set age=s_age  where stu_no =10;
end $$
delimiter  ;

create  trigger age_update after update
ON stuinfo1 for  each row
insert into operate values(null,'update age stuinfo1',now());

call sp_update_age(20) ; 

delimiter  $$
create function  fn_search(sno int(10))
returns varchar(10)
begin 
declare ssex int(4);
select  sex into ssex from  stuinfo1 where  stu_no = sno;
if ssex is null then
   return (select 'no stu');
else 
  if ssex = 1  then
   return (select 'nv');
   else 
   return (select 'nan');
  end if;
end if;
end $$
delimiter  ;

select fn_search(10);  // nv
select fn_search(11); // no data

drop  function fn_search

触发器

=========触发器===mysql5.0======
show triggers; //查看trigger

//触发事件-增加的
create trigger  stuinfo1_triggers  after  insert 
on  stuinfo1 for each row  set @str = New.stu_no;

insert into stuinfo1(stu_name,class_no,sex,age) values ('nihao1','1','1',21);

select @str;

//触发事件-删除
create trigger  stuinfo1_del_trigger  after delete
on stuinfo1  for each row set @str_del = 'del one';
select @str_del
//触发事件-更新  只能用 before update
select age from stuinfo1 where  stu_no =10; //老的20
 create trigger stuinfo1_update_trigger  before update
 on stuinfo1 for each row set NEW.age=OLD.age+1;

update stuinfo1 set stu_name='up_nihao' where stu_no=10;
select age from stuinfo1 where  stu_no =10; //新变的21
//删除trigger
drop trigger stuinfo1_trigger;
触发器
 create table product(
 id int(10) not null  unique primary key,
 pro_name varchar(10) not null,
 pro_fun varchar(50),
 company varchar(20) not null,
 address varchar(50)
 ) engine = innodb;

create table operate
(
 op_id int(10) not null unique primary key  auto_increment,
 op_name varchar(20) not null,
op_time time not null
) engine = innodb;

create trigger  product_inster  before insert
on product for each row
insert into operate values(null,'insert product',now());

 create trigger product_update after update
 on product for each row
 insert into operate values(null,'update product',now());

 insert into product values(1,'kangtai','china-bj-bj','china-bj-bj-cp');
 select * from operate
 update product set address='china-sjz-ca' where id =1;
 select * from operate

show triggers \G;
drop trigger

事件调度器

=========事件调度器===mysql5.1======
查看 
SELECT `EVENT_NAME` FROM `INFORMATION_SCHEMA`.`EVENTS` WHERE `EVENT_SCHEMA` = 'db_school' ORDER BY EVENT_NAME;
//if exists

select @@event_scheduler;  //撕扯度乐 注意 @@后面紧贴 如果off 就开开
set global event_scheduler = 1;
select @@event_scheduler;  //为 on 
//hour 小时 minute 分 second 秒 day  week  month  year QUARTER季度

SELECT NOW();
//在 2019-09-18 18:52:00 时刻 更新
CREATE EVENT  event_insert_stuinfo1
ON SCHEDULE   AT '2019-09-18 18:52:00'
DO
 UPDATE stuinfo1 SET age=39 WHERE stu_no=10;
//每分钟都更新
CREATE EVENT  event_insert_stuinfo1
ON SCHEDULE   EVERY  1 MINUTE 
DO
 UPDATE stuinfo1 SET age=age+1 WHERE stu_no=10;

//关闭
alter event event_insert_stuinfo1 disable
//启动
alter  event event_insert_stuinfo1 enable
//改名
alter event event_insert_stuinfo1 rename to  e_stuinfo1
//删除
drop event e_stuinfo1

索引

show  index  from stuinfo1; //查看索引

//create table  创建索引
//create table 创建普通索引
create table tb_stu9
(
  stu_no int(10) not  null ,
 stu_name  char(15) not null,
index (stu_name)) engine = innodb;
show index from tb_stu9;  // Non_unique  1  普通的

//create table 创建唯一索引
create table  tb_stu10
(
 stu_no int(4) not null unique,
 stu_name varchar(8) not null
) engine = innodb;
show index from tb_stu10;  //  Non_unique  0 唯一 

//创建两个表外键主键  自动 生成索引
create  table tb_stu11
(
  stu_no int(4),
  class_no int(4)
) engine = innodb;
//注意  foreign key  后面 是要括号的
 create table tb_stu13
 (
   stu_no  int(4),
   class_no  int(4),
   score float,
 constraint PK_stu primary key (stu_no, class_no),
 constraint FK_stu_no  foreign key (stu_no) references stuinfo1(stu_no),
 constraint FK_class_no foreign key (class_no)  references  tb_class(class_no)
 ) engine = innodb;
show index from tb_stu13; 
//create  index  索引名 on  表名( 字段名(长度) desc/asc)
//建立空索引表
create  table  tb_stu14 (
  stu_no int(4),
   class_no int(4),
  stu_name varchar(20),
 score float
) engine = innodb;
show index from tb_stu14; 

//普通索引 index
create index index_stu_class on tb_stu14(class_no);
//字段值前缀字符的索引
create index  index_stu_name3str on tb_stu14(stu_name(3) DESC);
//组合索引
create index  index_no_nane on tb_stu14(stu_no,stu_name DESC);
//alter table 表名 add index  索引名(字段名) 
alter table tb_stu14 add index idx_class_no(class_no);
//删除索引  drop index  索引 on 表   或 alter table 表 drop index 索引
drop  index  idx_class_no on tb_stu14;
alter table tb_stu14 drop index  index_stu_class;
show index  from  tb_stu14;

主键、候选键、外键

//create table 建主键外键
create table tb_student2 ( stu_no int(10) not  null auto_increment, stu_name varchar(20) not null, primary key (stu_no) )ENGINE = INNODB;  //表级完整性约束 定义主键
drop table student2 ;

create table tb_student2 ( stu_no int(10) not  null auto_increment, stu_name varchar(20) not null,constraint PK_stu primary key (stu_no) ) engine = innodb;  //表级完整性约束 定义主键 并命名

drop table student2 ;

create table tb_student2 ( stu_no int(10) not  null auto_increment primary key, stu_name varchar(20) not null ) engine = innodb; //列级完整约束 定义主键

drop table student2 ;

create table tb_student2 ( stu_no int(10) not  null   auto_increment primary key, stu_name varchar(20) not null,stu_class char(10)  unique  ) engine = innodb; //建立候选键  

create table tb_student2 ( stu_no int(10) not  null   auto_increment primary key, stu_name varchar(20) not null,stu_class char(10),constraint UQ_class unique (stu_class)  ) engine = innodb;//建立候选主键 表级建立并命名

 create  table stuinfo1(stu_no int(10) not null auto_increment, stu_name varchar(10),class_no int(10),
constraint PK_stu primary key (stu_no),
constraint FK_stu foreign key (class_no) references tb_class(class_no) 
) engine = innodb; //只能表级建立 -- 完整外键  foreign key  references

alter table stuinfo1 drop foreign key FK_stu; //删除外键约束 foreign key

//alter table 建主键外键
alter table stuinfo1 add foreign key (stu_no) references tb_class(class_no) ; //添加没有名的外键    会自动生成名

 show create  table  stuinfo1; //查看表结构 并查 外键为 stuinfo1_ibfk_1
//删除外键
alter table  stuinfo1 drop foreign key stuinfo1_ibfk_1; // 删除该外键

添加主键、候选键、外键

alter table  stuinfo1 add constraint PK_stu primary key (stu_no);
alter  table stuinfo1 add constraint QU_stu unique key (stu_name);
alter  table stuinfo1 add constraint FK_stu1 foreign key (class_no) references tb_class(class_no);

//删除主键
如果是自增 那么就要修改为不自增才能删除主键
alter table  stuinfo1  change column stu_no stu_no int(4) not null ;
alter table stuinfo1 drop primary key;
//删除候选键
alter table  stuinfo1  drop index UQ_stu
//删除外键
alter  table  stuinfo1 drop foreign key FK_stu1

建立数据库、修改表、修改列

SHOW VARIABLES LIKE 'lower_case_table_names';
SET NAMES 'utf8';
SET sql_mode='';
SHOW DATABASES;

drop database db_school;
show databases;
use  db_school;

create database db_school
default  character set utf8mb4
default collate utf8mb4_general_ci;

show databases;
use  db_school;

 create table  tb_student
 (
  studentNo char(10)  not null unique,
  studentName varchar(20)  not  null,
  sex  char(2),
  birthday date,
  native varchar(20),
  nation varchar(10),
  classNo char(10)
 ) engine = innoDB;

 create table  tb_student1
 (
 studentNo int(10) not  null unique  auto_increment,
 studentName varchar(20) not  null
 ) engine =  innodb;


CREATE TABLE tb_student2
(
 studentNo INT(10)  NOT  NULL  UNIQUE  AUTO_INCREMENT,
nation VARCHAR(20) DEFAULT '汉'
 ) ENGINE = INNODB;

show engines
show tables

show columns from tbstudent2;  结构描述
desc tbstudent2;  结构描述
show create table tbstudent2;  所有详细的

alter  table tbstudent2 add column luxilang int(10)  not  null after nation;

alter table tbstudent2  change column   department  depart varchar(30)  default 'nihao';  修改  department   为   depart 和数据类型

alter  table  tbstudent2  alter  column  depart  drop  default; 清除默认值
alter  table  tbstudent2  alter  column  depart  set  default 'j8'; 修改默认值

alter  table tbstudent2  add column  luxilang2 int(8); 添加一个列
alter table  tbstudent2  drop column  luxilang2; 删除一个列

rename table db_school.tbstudent2  to  db_school.tb_student2; 修改表名
 show tables;
alter table tb_student2 rename to tb_student3; 修改表名
 show tables;
drop  table  tb_student3; 删除表

 

 

 


重点复习

0311lc.com说:

 

视图

 

视图就是临时按照自己要求制作的表方便下次直接引用

 

创建视图

CREATE [OR REPLACE]
VIEW view_name[(column_list)]
AS SELECT_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

 

说明:
or replace 表示可选替换同名视图
column_list 表示替换视图内的对应列名称
with check option 用于可更新视图上的修改,cascaded为默认 表示更改会对仍需符合 select_statement的条件,local则只对定义视图进行检查

select_statement本身也存在一些限制:

不能包含含有from的子查询
用户除了create view权限外还需要有select_statement内部的相关权限
不能引用系统变量或用户变量
不能引用预处理语句参数
引用的表或视图必须存在
若select语句引用的不是当前数据库的基础表或源视图,需要加数据库前缀
在由SELECT语句构造的视图定义中,允许使用ORDER BY 子句。但是,如果从特定视BY语句,则视图定义中的ORDER BY子句将被忽略
对于SELECT语句中的其他选项或子句,若所创建的视图中也包含了这些选项,则语句执行效果未定义。例如,如果在视图定义中包含了LIMIT子句,而SELECT语句也使用了自己的LIMIT子句那么MySQL对使用哪-个LIMT语句未做定义。

修改视图

 

ALTER VIEW view_name[(column_list)]
AS SELECT_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

 

就是重新写一遍

删除视图

 

DROP VIEW [IF EXISTS]
view_name[,view_name]

事件

可以理解为mysql计划任务,根据周期来执行一段sql语句,可精确到每一秒执行一个任务,执行事件前事件调度器必须开启,其默认是关闭的
输入SET GLOBAL event_scheduler = ON;执行即可

创建事件

 

CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;

schedule:
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]

interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

 

名词解释:
event_name:创建的event名字(唯一确定的)。
ON SCHEDULE:计划任务。
schedule: 决定event的执行时间和频率(注意时间一定要是将来的时间,过去的时间会出错),有两种形式 AT和EVERY。
[ON COMPLETION [NOT] PRESERVE]: 可选项,默认是ON COMPLETION NOT PRESERVE 即计划任务执行完毕后自动drop该事件;ON COMPLETION PRESERVE则不会drop掉。
[COMMENT ‘comment’] :可选项,comment 用来描述event;相当注释,最大长度64个字节。
[ENABLE | DISABLE] :设定event的状态,默认ENABLE:表示系统尝试执行这个事件, DISABLE:关闭该事情,可以用alter修改
DO event_body: 需要执行的sql语句(可以是复合语句)。CREATE EVENT在存储过程中使用时合法的。

修改事件

 

ALTER
[DEFINER = { user | CURRENT_USER }]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
[DO event_body]

 

删除事件

 

DROP EVENT [IF EXISTS] event_name

 

触发器

顾名思义,一旦满足什么条件就只执行语句
有点类似于外键on delete 中的cascade restrict等

触发器的四要素

监视地点(table),监视事件(insert/update/delete),触发时间(after/before),触发事件(insert/update/delete)

创建触发器

 

CREATE TRIGGER 触发器名称
after|before(触发时间)
insert|update|delete(触发事件)
on 表名(监视地址)
FOR EACH ROW--此句在MySQL中是写死的,只有行触发器,在oracle中还有表触发器
BEGIN
sql1
...
sqlN
END;

 

语句解释:
触发时间Before|After:表示触发器是在激活语句之前还是之后出发。
– before是先完成触发,再进行数据的增、删、改若希望验证新数据是否满足使用限制,则使用before,
– after是先完成数据的增、删、改,再触发若希望在触发器的语句执行之后完成几个或更多的改变通常使用after选项。
触发事件:
1. INSERT 将新行插入表示激活触发器。
2. UPDATE 更改表中某一行时激活触发器。
3. DELETE 从表中删除某一行时激活触发器。

如何在使用触发器时引用行值

对于insert而言,新增的行用new来表示;行中的每一列的值,用new.列名来表示。
对于delete而言,删除的行用old来表示,行中的每一列的值,用old.列名来表示。
对于update而言,被修改的行,修改前的数据用old来表示,old.列名引用被修改前的行中的值;修改后的数据用new来表示,new.列名引用被修改后的行中的值。

删除触发器

 

DROP TRIGGER [IF EXISTS] [数据库名.]触发器名

 

注意drop trigger需要super权限

储存过程

储存过程是mysql中一组为了完成某特定功能的sql语句集,实质是一段存放在数据库中的代码

将分号;转义
在建立储存过程中常常需要用到DELIMITER来进行;的转义,避免在执行多条语句结束前提前结束

DELIMITER $$

· $$ 是用户自定义的结束符号,可自行定义,但应该避免使用 反斜杠\因为是mysql的转义字符

创建储存过程

 

DELIMITER $$
CREATE
PROCEDURE sp_name([[IN|OUT|INOUT] param_name type][,...]])
//这里类似于function sp_name(a as int,b as int)
BEGIN
SQL1;
SQL2;
...
SQLN;
END $$

 

语句解释:
· 输入参数IN 使得数据可以传递给一个储存过程 输出参数OUT用于储存过程需要返回一个操作结果的情形 输入输出参数INOUT 前面两者的集合

DECLARE声明局部变量

DECLARE var_name[,...]type[DEFAULT value]

 

例如DECLARE sno CHAR(10) DEFAULT ‘3’;
注意点
· 只能在begin end 头部中声明
· 作用域为begin end中
· 为了和mysql区分,可以使用@变量名作为变量

SET语句进行赋值

利用set可以为局部变来给你赋值

SET var_name=expr[,var_name=expr]

 

例如set sno=’10000′

流程判语句

条件判断
if-else
IF condition THEN statement
[ELSEIF condition THEN statement]
[ELSE statement]
END IF

case
CASE case_value
WHEN when_value THEN statement
WHEN when_value THEN statement
END CASE

 

该种方法是使用case_value和when_value进行比较,若为真才执行

第二种方法

CASE
WHEN condition THEN statement
WHEN condition THEN statement
ELSE statement
END CASE

 

这种方法更加方便

循环语句
WHILE循环
WHILE search_condition DO
statement
END WHILE

REPEAT循环
REPEAT
statement
UNTIL search_condition
END REPEAT

LOOP循环
LOOP
statement
END LOOP

 

这种不太清楚怎么用

游标

游标是一个被SELECT语句检索出来的结果集,储存了游标之后就可以对其数据进行浏览

声明游标
DECLARE cursor_name CURSOR FOR select_statement

 

打开游标
DECLARE cursor_name CURSOR FOR select_statement

 

读取数据

FETCH cursor_name INTO var_name[,...]

 

关闭游标

CLOSE cursor_name

 

调用储存过程

直接像Visual Basic一样call就行
sql CALL sp_name([parameter[,…]])

sql CALL sp_name([parameter[,...]])

 

删除储存过程

 

DROP PROCEDURE FUNCTION[IF EXISTS]sp_name

 

储存函数

区别 储存过程 储存函数
输出参数 需要 不需要,自己有return
调用 要用CALL 直接引用

创建储存函数

 

DELIMITER $$;
CREATE
FUNCTION sp_name([param_name type[,...]])
RETURNS type
BEGIN
sql1;
sql2;
...
sqln;
END $$

 

调用储存函数

 

SELECT sp_name(param)

 

删除储存函数

 

DROP FUNCTION sp_name;

 

用户的创建与权限

创建用户

CREATE USER 'name'@'localhost' [IDENTIFIED BY 'password']

 

权限设置

授予权限GRANT

 

GRANT 权限名
ON 表名
TO name@localhost
[WITH with_statement]

 

注意点:
with后常见
WITH GRANT OPTION

撤销权限REVOKE

 

REVOKE 权限名
ON 表名
FROM name@localhost

 

MySql数据备份与恢复

这个非常重要!以往因为不知道可以直接从mysql备份,总是要到phpmyadmin里面去导出导入,如果利用自带的mysqldump功能就会快很多

mysqldump备份数据

数据表导出

mysqldump -u username -p密码 数据库 数据表 > 导出文件地址文件名.sql

备份数据库系统

mysqldump -u username -p密码 –all-databases > 导出filename.sql

分别备份表结构和数据

mysqldump -u root -p**** –tab=filename.sql
可以分别备份表数据和结构

注意:-p和密码之间没有空格!!!!!!!

mysql恢复数据

注意恢复数据不是“mysqldump了

恢复数据库的结构和数据

mysql -u root -p **** db_database< database.sql

仅恢复数据

mysqlimport -u root -p **** database.sql

PHP与MySql面向过程交互

找到两个非常好的文章!
MySQLi基于面向过程的编程
MySQLi基于面向对象的编程

因为mysql二级考试的题目中几乎是面向过程的,所以必须用面向过程的编程,否则拿不了分
除此之外,因为考级的语句都很早,而且明显一步能完成的非要分成两步,所以一定要注重背下语句

连接数据库

<?php
header("Content-type:text/html;charset=utf-8");
$link = mysqli_connect( 'localhost' , 'root' , '' , 'test' ) or die ('Connect Error:'.mysqli_connect_error());
//这是一般的面向过程的php使用mysqli连接法
$con=mysql_connect("localhost:3306","root","")
or die("数据库服务器连接失败!<br>");
mysql_select_db('test',$con) or die( "数据库选择失败!<br>");
//这是傻不拉几的连接法,考察了选择数据库的语句
?>

 

设定字符集

mysqli_set_charset($link,'UTF8');

 

//mysqli面向过程

mysql_query("set column 'uft8");

 

 

//给某一列设置属性

执行sql语句(插入读取更新删除)
插入数据
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";

if (mysqli_query($conn, $sql)) {
echo "新记录插入成功";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

读取数据
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
// 输出数据
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 结果";
}

 

解释:
mysql_fetch_array(data[,array_type])
array_type类型
1. MYSQL_NUM 数字数组
2. MYSQL_ASSOC 关联数组(键值对)
3. MYSQL_BOTH 默认值,同时产生数字和关联数组
mysql_fetch_row(data) 产生数字数组
mysql_fetch_assoc(data)产生关联数组(键值对)