【SQL从一点一滴分析系列文章】为实际开发中的点点滴滴的总结,从最最简单的SQL 查询 到 综合分析查询
在分析 SQL 时,也会同时分析 mybatis 、Hibernate 中的相关操作
点击查看详情

本节讲述 在数据库中删除表中的数据,以及 having 与 where 的分析

1 删除表中所有的记录

实际开发中,我们有时需要删除一个表中的所有的数据,我们可以使用 delete 命令来操作

delete from t_user
2 删除表中指定的记录

删除表中指定数据或者说是满足某些条件的数据,我们可以使用 where 子句,例如删除表中 年龄小于 18 岁的用户,我们可以这样写

delete from t_user where user_age <18

这里使用到的是满足条件的记录,如果要删除单个记录,那么在指定的判断条件一般使用 主关键字或其他唯一的关键字来作为判别条件,例如我们这样写

delete from t_user where user_id =118

在这里使用到的 user_id 就是用户表中用户的唯一关键标识,所以这里只是删除了其中一条数据。

3 删除违反参照完整性的记录

例如,某些用户员工被分配到了一个不存在的部门中,要将这些员工删除,那么我们可以使用 not exists 和子查询来判断删除

delete from t_emp ewhere not  exists (select * from t_dep d where  d.did = e.did
)

也可以使用 not in 来查询

delete from t_emp  e
where  e.did not in (select d.did from t_dep d)

t_emp 表用来保存被分配部门的用户信息数据
t_dep 表用来保存部门信息

4 删除表中的重复记录

例如在表 t_dup 中有这样的数据

我们想保留一个 name 为张三的记录,其他 name 为张三的记录,不需要关心 id 是多少,最终表中只有一条有关张三的记录,我们可以这样写

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_dupwhere name in (select t.name from(select name from t_dup group by name HAVING count(1) > 1) t)

要删除重复记录,首先要明确定义这个重复的概念,也就是说你要删除什么样的重复数据,而在上述的操作中,定义的是 name 是重复的

5 删除从其他表引用的记录

从一个表中删除被另一个表中引用的记录,例如下面的表中记录来了来透支经费的部门,每行记录了透支发生的部门与透支金额以及事由


例如在这里我们需要删除所在部门已经发生了三次以上的透支申请的所有部门的记录,在这里我们可以这样来写

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 命令将删除由子查询返回的部门。

6 HAVING 关键字一谈

HAVING 子句可以让我们筛选分组后的各组数据,也就是说HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。

6.1 SQL语言中中的聚合函数

例如 SUM, COUNT, MAX, AVG等这些函数和其它函数的根本区别就是它们一般作用在多条记录上

select sum(acc_count) from t_acc

如上 通过 sum 函数来统计 所有部门的透支金额
通过使用 GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用

6.2 显示每个地区的总人口数和总面积
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 regionhaving sum(population)>1000000

在这里使用到了 having 来筛选了数据,没有使用 where 关键字,where关键字有个区别是where是group by之前进行条件筛选,而having是group by之后进行条件筛选,我们上述的需求,是需要在分组之后筛选,还有一点就是where后的条件表达式里不允许使用聚合函数,而having可以。

SQL点滴系列之删除数据(五)相关推荐

  1. SQL点滴系列之插入数据(四)

    [SQL从一点一滴分析系列文章]为实际开发中的点点滴滴的总结,从最最简单的SQL 查询 到 综合分析查询 在分析 SQL 时,也会同时分析 mybatis .Hibernate 中的相关操作 点击查看 ...

  2. sql还原mysql_sql数据库删除数据如何恢复

    SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可.但是,这个恢复需要有两个前提条件: sql数据库数据恢复的方法: 1.至少有一个误删除之前的数据库完全备份. 2. 数据库的恢 ...

  3. mysql批量删除数据sql语句_mysql批量删除数据sql语句详解

    1.like与 in批量删除指定记录 like语法 like主要是用来模糊查询了 sql = "delete from A where field like '%ABC%'" 这个 ...

  4. Truncate 删除数据

    引用:http://baike.baidu.com/view/1230585.htm Truncate是SQL中的一个删除数据表内容的语句,用法是: 语法 TRUNCATE TABLE name 参数 ...

  5. Oracle中批量删除数据

    在一个ORACLE数据库运行过程中,有时候会遇到要批量删除数据的情况,如一个保存历史数据的表中有大量的数据已经不需要保留,要将这部分数据删除.以下就这种情况可以采取的方法进行讨论.   1.使用TRU ...

  6. 如何在Oracle中批量删除数据

    在一个ORACLE数据库运行过程中,有时候会遇到要批量删除数据的情况,如一个保存历史数据的表中有大量的数据已经不需要保留,要将这部分数据删除. 以下就这种情况可以采取的方法进行讨论. 1.使用TRUN ...

  7. vs2010 mysql linq to sql 系列_LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据...

    LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列. 本文使用的测试环境是VS 2010,和sql server 2005数据库. ...

  8. LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据

    LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列. 本文使用的测试环境是VS 2010,和sql server 2005数据库. ...

  9. 什么?还在用delete删除数据《死磕MySQL系列 九》

    别再用delete删除数据 系列文章 一.表空间 二.数据删除流程 三.实践全表删除表文件大小不改变 四.如何正确的减少磁盘文件 五.实践是检验认识是否具有真理性的唯一标准 六.开发建议 七.总结 系 ...

最新文章

  1. 谈谈 Tomcat 请求处理流程
  2. 网易严选的wkwebview测试之路
  3. 会签 数据库表设计_关于数据库表设计和实体类设计的思考
  4. java开发一款模拟写字板系统
  5. 如何使用TensorFlow构建简单的图像识别系统(第2部分)
  6. 英语作文谈谈你对计算机的看法,英语作文:谈谈你对网络语言的看法
  7. 整合vue_直指核心,7天成为Vue高手
  8. Python入门--函数的返回值
  9. Java堆描述正确的是_Java面试题 每日一练(4.9)
  10. 医疗管理系统HIS源码
  11. excel 公式 单引号 concat_Excel制作倒计时、抽签器你见过没?
  12. 英文名为什么最好不用joe?JOE英文名的寓意是什么?
  13. Enterprise Architect综合建模平台
  14. 2021年中国兽医热疗室市场趋势报告、技术动态创新及2027年市场预测
  15. Quoted-printable1(BUCTF在线评测)
  16. 用户可利用自己的计算机通过因特网采用,2013年春季江苏省高校计算机一级B考试理论题(附答案)_-_副本...
  17. Blender新手入门试水作品:Low poly版敲击兽
  18. matlab bsxfun memory,matlab – BSXFUN关于关系操作的内存效率
  19. 群体遗传分析—LD连锁不平衡
  20. 【学术相关】国家自然科学基金申请——函评等级与上会

热门文章

  1. 目标检测二十年间的那些事儿——从传统方法到深度学习
  2. 干货 | 局部特征图像配准用于缺陷检测
  3. 收藏 | 一文看尽2020AI论文
  4. CVPR2019 Oral!伯克利、麻省理工GAN图像合成最新成果(附开源代码)!
  5. C++ Primer 第五版 第6章 6.1——函数及函数定义及调用阅读笔记
  6. 面向小姐姐的编程——java面相对象之抽象
  7. ArcGIS(A column was specified that does not exist)
  8. android6要多大运存,内存多大手机才能不卡? 现在终于有了答案
  9. python的编程环境都不会搭建_9102年你还不会搭建Python环境
  10. promise 中的异常捕获_promise 中的错误处理