【SQL从一点一滴分析系列文章】为实际开发中的点点滴滴的总结,从最最简单的SQL 查询 到 综合分析查询 在分析 SQL 时,也会同时分析 mybatis 、Hibernate 中的相关操做 点击查看详情sql
本节讲述 在数据库中删除表中的数据,以及 having 与 where 的分析数据库
实际开发中,咱们有时须要删除一个表中的全部的数据,咱们可使用 delete 命令来操做mybatis
delete from t_user
复制代码
删除表中指定数据或者说是知足某些条件的数据,咱们可使用 where 子句,例如删除表中 年龄小于 18 岁的用户,咱们能够这样写函数
delete from t_user where user_age <18
复制代码
这里使用到的是知足条件的记录,若是要删除单个记录,那么在指定的判断条件通常使用 主关键字或其余惟一的关键字来做为判别条件,例如咱们这样写spa
delete from t_user where user_id =118
复制代码
在这里使用到的 user_id 就是用户表中用户的惟一关键标识,因此这里只是删除了其中一条数据。.net
例如,某些用户员工被分配到了一个不存在的部门中,要将这些员工删除,那么咱们可使用 not exists 和子查询来判断删除code
delete from t_emp e
where not exists (
select * from t_dep d where d.did = e.did
)
复制代码
也可使用 not in 来查询cdn
delete from t_emp e
where e.did not in (select d.did from t_dep d)
复制代码
t_emp 表用来保存被分配部门的用户信息数据 t_dep 表用来保存部门信息blog
例如在表 t_dup 中有这样的数据 图片
delete from t_dup
where id not in (select min(id) from t_dup group by name)
复制代码
在 MySQL 中,使用上述写法会有异常
Error : You can't specify target table 't_dup' for update in FROM clause
复制代码
不能先select出同一表中的某些值,再update这个表(在同一语句中),因此在 MySQL 中能够这样写
delete from t_dup
where name in (
select t.name from
(
select name from t_dup group by name HAVING count(1) > 1
) t
)
复制代码
要删除重复记录,首先要明肯定义这个重复的概念,也就是说你要删除什么样的重复数据,而在上述的操做中,定义的是 name 是重复的
从一个表中删除被另外一个表中引用的记录,例以下面的表中记录来了来透支经费的部门,每行记录了透支发生的部门与透支金额以及事由
delete from t_emp
where dep_id in(select acc_dep_id from t_acc group by acc_dep_id having count(*) >=3)
复制代码
上述sql 操做中,子查询
select acc_dep_id from t_acc group by acc_dep_id having count(*) >=3)
复制代码
这里用来查询那些发生过三次以上的透支申请的部门,而后 delete 命令将删除由子查询返回的部门。
HAVING 子句可让咱们筛选分组后的各组数据,也就是说HAVING语句一般与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。
例如 SUM, COUNT, MAX, AVG等这些函数和其它函数的根本区别就是它们通常做用在多条记录上
select sum(acc_count) from t_acc
复制代码
如上 经过 sum 函数来统计 全部部门的透支金额 经过使用 GROUP BY 子句,可让SUM 和 COUNT 这些函数对属于一组的数据起做用
select region, sum(population), sum(area)
from t_user_city group by region
复制代码
先以region把返回记录分红多个组,这就是GROUP BY的字面含义,分完组后,而后用聚合函数 sum 对每组中的不一样字段(一或多条记录)做运算。
而后咱们在上述的查询结果再进一步筛选,显示每一个地区的总人口数和总面积,但人口数量超过1000000的地区,咱们能够这样来写
select region, sum(population), sum(area)
from t_user_city group by region
having sum(population)>1000000
复制代码
在这里使用到了 having 来筛选了数据,没有使用 where 关键字,where关键字有个区别是where是group by以前进行条件筛选,而having是group by以后进行条件筛选,咱们上述的需求,是须要在分组以后筛选,还有一点就是where后的条件表达式里不容许使用聚合函数,而having能够。