mysql基础
触发器:6个
例:
create trigger tri_stu before insert on t_student
for each row begin update t_class set t_count=t_count+1 where t_id=new.t_classid; end;
触发器中不一定必须有new或者old
如:
t_stu2这张表做新增,删除,修改,t_record表中记录下来
create trigger tri_stu
before insert on t_stu2
for each row
begin
insert into t_record(t_event,t_creatTime) values('student-insert',now());
end;
before insert/update/delete
after insert/update/delete
- new:表示t_student表即将要插入的那条记录
- new.t_classId : 该学生的班级编号
- t_class表中,该学生所属的班的人数需要加1 ,where t_id = new.t_classId;
- old:即将要删除的t_student表的那一整条记录
- old.t_classId: 要删除的学生的班级编号
- where t_id = old.t_classId ,限制条件,限定就必须是要删的这个学生所在的班级,人数-1
insert新增没有old,只有new ,
update 更新 既有old,也有new .
delete 删除只有old,没有new.
如果查看创建的触发器
information_schema数据库下的 triggers表下
use information_schema;
select * from triggers\G;
or select * from information_schema.triggers;
查看呢触发器
show triggers\G;
删除触发器
drop trigger tri_stuInsert;
表复制
只复制表结构(不会复制主键类型和自增方式,没有数据)---create table studentNew select * from t_student where 1=2(不满足的条件即可);
复制表结构及表数据(没有复制主键和自增方式)----create table studentNew select * from t_student;
create table studentNew select * from t_student where 1=1(满足的条件);
只复制表数据 (新表必须先创建好)
insert into studentNew5 select * from t_student;
变量 分类
1.局部变量: java方法中的局部变量一样,作用范围最小的
只在定义变量的函数体内,语句块内,存储过程中有效,超出作用域不可见
2.用户变量
:在整个连接期间有效,退出重新登录,失效了
以 "@"开头
3.会话变量
单次连接期间有效 324个
查看当前的会话变量
show session variables \G;
show variables\G;
3.全局变量
313个
在服务启动期间有效 ,即使退出登录,再重新登录,全局变量的设置仍旧有效
除非停止mysqL服务,重新开启服务,全局变量就失效了
查看所有的全局变量
show global variables \G;
注意:有一部分全局变量和会话变量重名,但是作用域不同的。
存储过程
dos命令下
1.在存储过程pro_test1中,声明3个局部变量,自带默认值的,可以用set/select给赋值。
1.局部变量: java方法中的局部变量一样,作用范围最小的
只在定义变量的函数体内,语句块内,存储过程中有效,超出作用域不可见
delimiter && create procedure pro_test1() begin declare num1 int default 10; declare num2 int; declare num3 int; set num2=30; select 30 into num3; select num1,num2,num3; end &&
delimiter ;
调用存储过程
call pro_test1();
2.存储过程传入的参数 ,需要指定类型 ,参数同样是局部变量 create procedure
存储过程名(in 输入的参数, out 输出的参数, inout 参数可以输入也可以输出)
2.用户变量
:在整个连接期间有效,退出重新登录,失效了
以 "@"开头
in---输入
out---输出
delimiter &&
create procedure pro_test2(in num1 int,in num2 int)
begin
set num1=20;
select 30 into num2;
select num1,num2;
end &&
delimiter ;
调用存储过程
set @a=1;
set @b=2
call pro_test2(@a,@b)
3.局部变量可以用sql语句的查询结果赋值 ,也可以将局部变量用到 insert select ,update及delete语句中
创建存储过程命名为add ,接收输入2个参数 ,在begin-end代码块内部声明变量c ,默认值为0 ,用于存储2个参数的和,并返回两个参数的和
delimiter &&
create procedure pro_add(in num1 int,in num2 int,out result int)
begin
declare c int default 0;
set c = num1+num2;
set result = c;
end &&
delimiter ;
调用
set @a=15,@b=13,@c=0;
call pro_add(@a,@b,@c);
select @c;
分支结构&循环结构
接收一个考试分数,如果分数>90分,输出优秀,>80分,输出良好,>70,输出中等,>60,输出及格,其他情况输出再接再厉。
---------------------1--------------------------------- delimiter && create procedure pro_ceshi6(in num1 int) begin declare result varchar(10) default ''; if num1>=90 then set result='优秀'; elseif num1>=80 then set result='良好'; elseif num1>=70 then set result='及格'; else set result='再接再厉'; end if; select result; end && delimiter ; --------------------------2------------------------------ delimiter && create procedure pro_ceshi(in num1 int) begin declare result varchar(10) default ' '; case truncate(num1/10,0) when 10 then set result='优秀'; when 9 then set result='优秀'; when 8 then set result='良好'; else set result='再接再厉'; end case ; select result; end && delimiter ; ----------计算0-num之和 ,num你输入 while , repeat,loop--------- leave :退出循环 ,break iterate:结束本次循环,继续下一次循环,continue mark:自定义的循环标签名,可以任意取名,也可以省略 ---while--- delimiter && create procedure pro_ceshi(in num int) begin declare sum int default 0l; declare i int default 0; mark:while i<=num do set sum=sum+i; set i=i+1; end while mark; select sum; end && delimiter ; ---loop--- delimiter && create procedure pro_ceshi(in num int) begin declare sum int default 0; declare i int default 0; mark:loop set sum=sum+i; set i=i+1; if i>sum then leave mark; end if ; end loop.mark; select sum; end && delimiter ; ----repeat--- delimiter && create procedure pro_ceshi(in num int) begin declare sum int default 0; declare i int default 0; mark:repeat set sum=sum+i; set i=i+1; until i>num end repeat mark; select sum; end && delimiter ;
索引
索引是建在 列上 ,对于数据量大的表来说,设置了索引的列,查询速度会提高。
更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。在没有索引的情况下,数据库会遍历全部数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项
索引的分类:
- 单列索引
- A.普通索引
- B.唯一索引
- C.主键索引
-
以上设置主键索引的3种写法,primary key,不能换成primary index
普通索引中的key 可以换成index
唯一索引中的key 可以换成index
- 组合索引
- index multi_idx(t_personId,t_personName,t_age)
- or key multi_idx(t_personId,t_personName,t_age)
- 查询时是否带了组合索引里的第1列 t_personId
-
遵循最左前缀的时候,字段的顺序可以调整的,但是一定要包含组合索引里的第1列
- index multi_idx(t_personId,t_personName,t_age)
- 全文索引
- 只有MyIsAM引擎支持全文索引,其他的存储引擎都不支持。
- fulltext index fullTxt_info(t_personInfo)
- or key index fullTxt_info(t_personInfo)
- 空间索引
- 存储引擎(表类型)必须是MyIsAM ,设置空间索引的列的类型只能选用geometry
- spatial index spat_Idx(t_personId) or spatial key spat_Idx(t_personId)
- 存储引擎(表类型)必须是MyIsAM ,设置空间索引的列的类型只能选用geometry
查询是否使用了索引 explain
explain select * from t_person3 where t_age=10\G;