MySql中常见的三种业务子查询

原创
2017/07/12 22:56
阅读数 47

在实际开发中,我们会遇到如下几种情况:

  1. 查询数据库表中某些字段值相等的记录
  2. 删除数据库表中某些字段值相等的记录,不做保留
  3. 删除数据库表中某些字段值相等的记录,保留最新的一条记录

下面看一个数据库表

 

第一种情况:老板说把工资相等的部门查出来

首先我们先根据工资相等这个条件筛选出那几个工资相等

select salary from test GROUP BY salary having COUNT(salary)>1

查出工资为6500的不止一个部门,根据这个6500作为条件,查出该条记录

select * from test where salary  in (select salary from test GROUP BY salary having COUNT(salary)>1)

 

第二种情况:老板说把工资相等的都删了

首先我们先根据工资相等这个条件筛选出那几个工资相等

select salary from test group by salary HAVING count(salary)>1

根据工资相等这个条件,删除所有记录

create table temp as select salary from test group by salary HAVING count(salary)>1
delete from test WHERE salary  in(select salary from temp2);
drop table temp

由于在mysql中不支持一条语句动态更新一个表的记录,所以我们创建一个临时表来保存删除的条件,实际开发中,考虑到效率问题,提倡建立第三张中间表来操作

 

第三张情况:老板说把部门信息重复的记录删除了,保存最近一次的更新记录

首先我们查找出部门相等的值和最早一次插入的值

select dept,min(id) as 'minId' from test group by dept HAVING COUNT(dept)>1

我们商务和测试都是重复记录存在的,保留最近一次插入的记录,由于我们的ID是自动增长的,这里得到的是最早插入的,所以我们在部门相等的情况下删除最小的id即可

create table temp as select dept,min(id) as 'minId' from test group by dept HAVING COUNT(dept)>1 
DELETE from test where id  in (select minId from temp)

DROP table temp

这样,上面三种常遇见的三种操作都实现了

 

 

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部