函数 存储过程 触发器

mysql函数
    聚合函数:可以对一组值进行计算,并返回单个值
        count()\sum()\avg()\max()\min()
    日期函数:
        系统当前日期: curdate()
        系统当前时间: curtime()
        系统当前日期时间: now()
        计算两个日期相隔的天数:datediff(日期1,日期2)
        计算指定日期加上几天之后的日期 : adddate(日期,天数)
use 1910b_day04

create table emp(
    eid int primary key auto_increment,
    ename varchar(20),
    birthday datetime
)

#向表中插入数据,生日为系统当前时间
insert into emp(ename,birthday) values('刘洋',now())
insert into emp(ename,birthday) values('刘三5','2021-09-09 12:12:12')

select * from emp
#修改刘三的生日时当前时间:
update emp set birthday=now() where ename = '刘三'

查询出生超过500天的学生信息
查询当前日期之前的500天的具体日期,然后筛选
select * from emp where birthday < adddate(now(),-500)
查询每位学生出生的天数
select *,datediff(now(),birthday) from emp where datediff(now(),birthday)>500


#查询员工信息,展示学生名的长度
select *,char_length(ename) from emp


存储过程:
select * from emp limit 3,3;

create procedure pageQuery(in startIndex int,in pageSize int)
begin 
    select * from emp limit startIndex,pageSize;
end;
 
查询前3条:
call pageQuery(0,3)
每页展示3条,查询第3页:
call pageQuery(6,3)

#定义局部变量
create procedure cp01()
begin 
    #定义局部变量 语法: declare 变量名 数据类型 [default 默认值]
    declare count int default 10;
    #查看变量
    select count;
    #重新赋值
    set count = 20;
    #查看变量
    select count;
end;

call cp01()


查看所有存储过程: SHOW PROCEDURE STATUS


#定义用户变量 set @变量名=默认值
set @name = 'rose';


select @name;


测试in、out、inout区别
drop procedure cp02;
create procedure cp02(inout score int)
begin 
    #查看参数
    select score;
    #重新赋值
    set score=10;
    #查看参数
    select score;
end;

#定义用户变量
set @count = 1;
select @count;
call cp02(@count)


show tables;
触发器:
create table t_clazz(
    cid int primary key auto_increment,
    cname varchar(20)
);
insert into t_clazz(cname) values('A班'),('B班'),('C班')

create table t_student(
    sid int primary key auto_increment,
    sname varchar(20),
    cid int,
    foreign key(cid) references  t_clazz(cid)
);

insert into t_student values(0,'rose',1);
insert into t_student values(0,'rose2',2);
insert into t_student values(0,'rose3',2);
insert into t_student values(0,'rose4',2);
insert into t_student values(0,'rose5',1);
insert into t_student values(0,'rose6',3);
insert into t_student values(0,'rose7',3);
insert into t_student values(0,'rose8',3);
insert into t_student values(0,'rose9',1);
insert into t_student values(0,'rose10',1);


select * from t_clazz;
select * from t_student;
删除C班 班级:
delete from t_clazz where cid=3
因为有外键约束,也就是说这个班下有学生,不然删除,需要先操作下,保证该班没有学生
update  t_student set cid = null where cid = 3
再删该班数据: delete from t_clazz where cid=3


使用触发器完成删除班级数据,自动清理该班下学生
触发器语法: 
create trigger 触发器名 before|after 更新操作(insert|update|delete) on 表名  for each row 
begin 
    #指定执行的语句
end;

四要素:
监视地点: 表名  t_clazz
监视事件: 更新操作 (insert|update|delete) delete 
触发时间: before|after   删除班级表之前先清理学生信息before
触发事件: 监视的表中数据更改了    删除班级表语句

create trigger deleteClazzTrigger before delete on t_clazz  for each row 
begin 
    #指定执行的语句 old.字段名 获取该字段的值
    update  t_student set cid = null where cid = old.cid;
end;


触发器不需要调用,只需要根据监视的情况执行语句: 
delete from t_clazz where cid = 2;


定义触发器:添加一条学生信息后,向日志表中添加一条信息。
    日志内容content为:学生姓名 ,记录时间log_time:为当前时间(10分)

#创建日志表
create table log(
    id int primary key auto_increment,
    content varchar(20),
    log_time datetime
)

创建触发器
create trigger insertStudentTrigger after insert on t_student for each row 
begin 
    insert into log values(0,new.sname,now());  #old.字段 获取表中已有的字段的值 ,new.字段名,获取即将向表中插入或者修改的新的值
end;

select * from log;
#向学生表插入数据,会自动调用触发器,向日志表插入数据
insert into t_student values(0,'jack2',1);

表中数据发生更改时自动触发的特殊的存储过程

use 1910b_day04;
create table account(
    id int primary key auto_increment,    
    accountNo varchar(25)not null,
    balance decimal(11,2) not null
);

insert into account values(0,'张三',30000.99);
insert into account values(0,'李四',29000.88);
insert into account values(0,'王五',31000.99);


实现张三给李四转账:
#开启手动事务
begin;
#张三减1000 : 
update account set balance=balance-1000 where accountNo='张三';
#李四+1000:
update account set balance=balance+1000 where accountNo='李四';
#正常提交
commit;
#或者异常回滚
rollback;

select * from account;

事务是为保障数据操作可靠而独立执行的逻辑单元
事务四个特性:原子性、一致性、隔离性、持久性
    
查看事务的状态: show variables like 'autocommit'  # on 打开状态
关闭自动提交: set autocommit='off'
打开自动提交: set autocommit=1

#张三减1000 : 
update account set balance=balance-1000 where accountNo='张三';
#李四+1000:

update account set balance=balance+1000 where accountNo='李四';

#正常提交
commit;
#异常回滚
rollback;

select * from account;

##################################################
视图( view )是简化查询过程,提高数据库安全性的虚拟表
创建视图语法: 
create view 视图名 as
select 语句

创建视图view_account,实现通过视图view_account查询表account中的所有数据:

create view view_account as
select * from account

调用: select * from view_account
show tables;
创建视图 view_student,实现通过视图查询学生信息和班级名
create view view_student as
select t_student.*,cname from t_student left join t_clazz on t_student.cid=t_clazz.cid

调用: select * from view_student where sname='rose'

删除视图: drop view view_student

查看视图的结构: desc view_account

修改视图: alter view view_account as select id from account
有就修改,没有就创建:create or replace view view_student as select t_student.*,cname from t_student left join t_clazz on t_student.cid=t_clazz.cid

索引:提高数据检索效率的数据库对象
    分类:普通索引、唯一索引、全文索引、多列索引
创建表时设置索引
create table 表名(
    字段名 数据类型,
    index 约束名 (字段名) #普通索引
    ,unique index 约束名 (字段名) #唯一索引
    ,fulltext index 约束名 (字段名) # 全文索引,存储引擎为innodb的不支持,myisan支持 ,只能描述字符串类型的
    ,index 约束名(字段1,字段2)
)


create table table01(
    id int,
    name varchar(23),
    age int,
    content varchar(200),
    index index01 (id),
    unique index index02 (name),
    fulltext index index03 (content,name)
)engine=myisam


删除索引: DROP  INDEX  索引名字    ON   表名;   
    drop index index03 on table01;

desc table01
创建索引: CREATE  [unique|fulltext] INDEX  索引名 ON   表名   (属性名1  [(长度)]  );  
        create unique index index02 on table01(name)
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值