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);
要不要使用子查询?
- mysql数据库默认关闭了缓存,所以每个子查询都是相关子查询.
- 相关子查询就是要循环执行多次的子查询.
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';