CRUD复杂操作

CRUD复杂操作

批量插入数据,因为一条记录的问题,全部数据都写入失败

insert into depar(id, name)

values
(1,'j'),
(2,'m');


如上,如果id(id为主键)为1的depar表中已经存在,那么id为2的同样会因为主键重复而无法插入.此时需要多一种语法(ignore);这样的话id为2的记录可以插入.

insert ingore into depar(id, name)
values
(1,'j'),
(2,'m');


如果不存在就插入,存在就更新

insert into depar(id,name)
values
(1,'j'),
(2,'m');

假设已经存在一条记录为(1,‘ly’)的记录,那么上述语句在插入的时候就会报错.

此时可以采用以下语句

insert into depar(id,name)
values
(1,'j'),
(2,'m')
on duplicate key update name=values(name);

要不要使用子查询?

  1. mysql数据库默认关闭了缓存,所以每个子查询都是相关子查询.
  2. 相关子查询就是要循环执行多次的子查询.
select id , name 
from depar 
where avg_sal>(
select sal 
from depar 
where id=1
);

where 语句每过滤一条数据,子查询就会执行一次.

注意: mybatis等持久层框架开启了缓存的功能,一级缓存就会保存子查询的结果,所以可以放心使用子查询.


如何替代子查询?

如下:

select id , name 
from depar 
join (select sal 
from depar 
where id=1) tmp_depar 
on depar.sal>tmp_depar.sal;

外连接的join条件

内连接里,查询条件写在on子句或者where子句,效果相同.

select id ,name 
from depar
join emp on depar.id=emp.id and emp.id=1;
select id ,name 
from depar
join emp on depar.id=emp.id
where  emp.id=1;

外连接,查询条件写在on子句或者where 子句,效果不同

select id ,name 
from depar
left join emp on depar.id=emp.id and emp.id=1;

由于是左表的连接,就说明,左表有,而右表没有的都会用null来显示,这也就是说总的记录数=左表记录数*右表记录数

select id ,name 
from depar
left join emp on depar.id=emp.id 
where emp.id=1;

这里使用where 子句,也就是说从总的记录数中筛选出了emp.id=1的记录.并不是总的记录数

表连接修改

update depar
join emp
on depar.id=emp.id and d.name='ly'
set e.sal=10000,d.name='ccsym';

上面同时修改了两个表.

表链接删除

 delete depar,emp
 from depar join emp
 on depar.id=emp.id and d.name='ly';
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值