MySQL学习笔记六

本文是关于MySQL的学习笔记,重点介绍了CASE WHEN语句用于根据成绩划分等级并计数,AS用于数据持久化创建新表,以及触发器的使用,包括在插入、删除和更新订单时自动调整商品库存的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、case when

        case when的用为:从原有数据新增出新的数据

        利用旧数据,形成新的数据进行输出(如:形成新的分类进行输出)

需求:根据成绩分等级,成绩<60的为C等,成绩在[60,80]为B等,成绩>80为A等

        这里的等级用case来设置输出,case when ... then... when...then...else...end

select sid,(case 
            when score<60 then 'C'
            when score>=60 and score<=80 then 'B'
            else 'A'
            end) as level
from sc;

        上面是用case when来根据成绩输出等级,那么如何一步到位对等级进行计数呢,可以利用sum/count + case when,每一个等级利用一次case when及聚合函数,三个等级利用三次

需求:根据成绩划分等级并根据等级计数

        记得每个case要有一个end做结尾

select sum(case when score<60 then 1 else 0 end) as C,
       sum(case when score>=60 and score<=80 then 1 else 0 end) as B
       count(case when score>80 then 1 else null end) as A
from sc;

二、保存结果表-as/like

        数据的持久化:as是直接复制,like是复制表结构

1.as-直接复制

        create table tablename as ...    这里...是一个表结果输出,不能是一个表

drop table if exists `re1`;
create table re1 as
    select sum(case when score<60 then 1 else 0 end) as C,
       sum(case when score>=60 and score<=80 then 1 else 0 end) as B
       count(case when score>80 then 1 else null end) as A
    from sc;

drop table if exists `sc2`;
create table sc2 as 
    select * from sc;

2.like-复制表结构

        create table tablename like  tablename    这里tablename是一个实体表,不能是一个结果

drop table if exists commodity;
create table commoditytype like ishop1.commoditytype;

三、触发器

        监控表,当被监控的表的数据发生变化时自动执行某SQL语句,此时用到了触发器。

        触发器的应用场景:①每当增加一个顾客到某个数据表时,需要检查他的电话号码格式是否正确;②每当增加一个订单时,从库存中减去相应的数量;③无论何时删除一行,都在某个数据表中保留一个副本。

        即上述的例子都是需要在某个表发生更改时自动处理。

        delete、insert、update语句支持触发器,自动执行一条SQL语句,其他语句不支持触发器。

        创建触发器要素:唯一的触发器名称、触发器关联的表(被监控的表)、触发器响应的活动(insert、delete、update)、触发器何时执行(after、before);

1.语法

        创建:CREATE TRIGGER tri_name AFTER|BEFORE insert|delete|update ON table_name FOR EACH ROW SQL(begin sql; end$)

        删除:DROP TRIGGER tri_name;

2.修改命令结束标识符

        使用触发器需要修改命令结束标识符,并且创建过后要把命令结束标识符更改回来    

delimiter $
delimiter ;

3.查看触发器

#所有触发器
show triggers \G;

#在triggers表中查看触发器信息
SELECT * FROM information_schema.triggers WHERE trigger_name='trigger_name' \G;
SELECT * FROM information_schema.triggers WHERE trigger_name='tri_2' \G;

4.示例

 需求:在新增订单时,即order表新增数据(insert),商品表相应的商品库存应减去相应数量商品

sql把insert里的数据抽象为new对象,把delete里的数据抽象为old对象

        监控的表--order  新增订单--insert (into)  触发器修改的表--commodity 触发器的操作--update

delimiter $
create trigger tri_1 
after insert on `order`
for each row
begin
update commodity set c_num=c_num-new.o_num where c_id=new.o_cid;
end$
delimiter ;

select c_id,c_name,c_num from commodity where c_id=19;
select * from `order`;
insert into `order` (o_cuid,o_cid,o_num) values (1,19,4); select * from `order`;
select c_id,c_name,c_num from commodity where c_id=19;
select c_id,c_name,c_num from commodity where c_id=19;
+------+------------------+-------+
| c_id | c_name           | c_num |
+------+------------------+-------+
|   19 | hellokitty手机链 |    40 |
+------+------------------+-------+

 select * from `order`;
+------+--------+-------+-------+
| o_id | o_cuid | o_cid | o_num |
+------+--------+-------+-------+
|    1 |      1 |    12 |     3 |
|    2 |      1 |    23 |     4 |
|    3 |      2 |     5 |     5 |
|    4 |      2 |    15 |     2 |
|    6 |      3 |    41 |     5 |
|    7 |      4 |    41 |    10 |
|    8 |      4 |    22 |    10 |
+------+--------+-------+-------+

delimiter $
create trigger tri_1 
after insert on `order`
for each row
begin
update commodity set c_num=c_num-new.o_num where c_id=new.o_cid;
end$

delimiter ;
insert into `order` (o_cuid,o_cid,o_num) values (1,19,4); select * from `order`;
+------+--------+-------+-------+
| o_id | o_cuid | o_cid | o_num |
+------+--------+-------+-------+
|    1 |      1 |    12 |     3 |
|    2 |      1 |    23 |     4 |
|    3 |      2 |     5 |     5 |
|    4 |      2 |    15 |     2 |
|    6 |      3 |    41 |     5 |
|    7 |      4 |    41 |    10 |
|    8 |      4 |    22 |    10 |
|   13 |      1 |    19 |     4 |
+------+--------+-------+-------+
8 rows in set (0.00 sec)

select c_id,c_name,c_num from commodity where c_id=19;
+------+------------------+-------+
| c_id | c_name           | c_num |
+------+------------------+-------+
|   19 | hellokitty手机链 |    36 |
+------+------------------+-------+
1 row in set (0.00 sec)

 需求:顾客删除订单

        监控的表--order  删除订单--delete(from)  触发器修改的表--commodity 触发器的操作--update

delimiter $
create trigger tri_2
after delete on `order`
for each row
begin
update commodity set c_num=c_num+old.o_num where c_id=old.o_cid;
end $
delimiter ;

select * from `order`;
select c_id,c_name,c_num from commodity where c_id=19;
delete from `order` where o_id=13;
select * from `order`;
select c_id,c_name,c_num from commodity where c_id=19;
mysql> delimiter $
mysql> create trigger tri_2
    -> after delete on `order`
    -> for each row
    -> begin
    -> update commodity set c_num=c_num+old.o_num where c_id=old.o_cid;
    -> end $
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;
mysql> select * from `order`;
+------+--------+-------+-------+
| o_id | o_cuid | o_cid | o_num |
+------+--------+-------+-------+
|    1 |      1 |    12 |     3 |
|    2 |      1 |    23 |     4 |
|    3 |      2 |     5 |     5 |
|    4 |      2 |    15 |     2 |
|    6 |      3 |    41 |     5 |
|    7 |      4 |    41 |    10 |
|    8 |      4 |    22 |    10 |
|   13 |      1 |    19 |     4 |
+------+--------+-------+-------+
8 rows in set (0.01 sec)

mysql> select c_id,c_name,c_num from commodity where c_id=19;
+------+------------------+-------+
| c_id | c_name           | c_num |
+------+------------------+-------+
|   19 | hellokitty手机链 |    36 |
+------+------------------+-------+
1 row in set (0.00 sec)

mysql> delete from `order` where o_id=13;
Query OK, 1 row affected (0.01 sec)

mysql> select c_id,c_name,c_num from commodity where c_id=19;
+------+------------------+-------+
| c_id | c_name           | c_num |
+------+------------------+-------+
|   19 | hellokitty手机链 |    40 |
+------+------------------+-------+
1 row in set (0.00 sec)

 需求:用户修改订单数据 同时也修改相应的商品库存

order表的更新可以想象成,先删旧的 old,再加新的 new

则对于commodity,等于把 old的加上恢复成原始数据,再把更新后的库存new减掉

delimiter $
create trigger tri_3
after update on `order`
for each row
begin
update commodity set c_num=c_num+old.o_num-new.o_num where c_id=new.o_cid;
end $
delimiter ;

select c_id,c_name,c_num from commodity where c_id=19;
select * from `order`;
insert into `order` (o_cuid,o_cid,o_num) values (1,19,10);
select * from `order` where o_id=14;
select c_id,c_name,c_num from commodity where c_id=19;

update `order` set o_num=5 where o_id=14;
select * from `order` where o_id=14;
select c_id,c_name,c_num from commodity where c_id=19;
delimiter $
create trigger tri_3
after update on `order`
for each row
begin
update commodity set c_num=c_num+old.o_num-new.o_num where c_id=new.o_cid;
end $
delimiter ;

select c_id,c_name,c_num from commodity where c_id=19;
+------+------------------+-------+
| c_id | c_name           | c_num |
+------+------------------+-------+
|   19 | hellokitty手机链 |    40 |
+------+------------------+-------+
1 row in set (0.00 sec)

select * from `order`;
+------+--------+-------+-------+
| o_id | o_cuid | o_cid | o_num |
+------+--------+-------+-------+
|    1 |      1 |    12 |     3 |
|    2 |      1 |    23 |     4 |
|    3 |      2 |     5 |     5 |
|    4 |      2 |    15 |     2 |
|    6 |      3 |    41 |     5 |
|    7 |      4 |    41 |    10 |
|    8 |      4 |    22 |    10 |
+------+--------+-------+-------+
7 rows in set (0.01 sec)

insert into `order` (o_cuid,o_cid,o_num) values (1,19,10);
select * from `order` ;
+------+--------+-------+-------+
| o_id | o_cuid | o_cid | o_num |
+------+--------+-------+-------+
|    1 |      1 |    12 |     3 |
|    2 |      1 |    23 |     4 |
|    3 |      2 |     5 |     5 |
|    4 |      2 |    15 |     2 |
|    6 |      3 |    41 |     5 |
|    7 |      4 |    41 |    10 |
|    8 |      4 |    22 |    10 |
|   14 |      1 |    19 |    10 |
+------+--------+-------+-------+
8 rows in set (0.00 sec)

select * from `order` where o_id=14;
+------+--------+-------+-------+
| o_id | o_cuid | o_cid | o_num |
+------+--------+-------+-------+
|   14 |      1 |    19 |    10 |
+------+--------+-------+-------+
1 row in set (0.00 sec)

select c_id,c_name,c_num from commodity where c_id=19;
+------+------------------+-------+
| c_id | c_name           | c_num |
+------+------------------+-------+
|   19 | hellokitty手机链 |    30 |
+------+------------------+-------+
1 row in set (0.00 sec)

update `order` set o_num=5 where o_id=14;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

select * from `order` where o_id=14;
+------+--------+-------+-------+
| o_id | o_cuid | o_cid | o_num |
+------+--------+-------+-------+
|   14 |      1 |    19 |     5 |
+------+--------+-------+-------+
1 row in set (0.00 sec)

select c_id,c_name,c_num from commodity where c_id=19;
+------+------------------+-------+
| c_id | c_name           | c_num |
+------+------------------+-------+
|   19 | hellokitty手机链 |    35 |
+------+------------------+-------+
1 row in set (0.00 sec)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值