本文列举一些工作中常用的SQL,以提升工作效率。

1 日期格式化

使用 DATE_FORMAT(get_date, '%Y-%m-%d') 函数进行格式化。其中:get_date 是需要被格式化的字段,'%Y-%m-%d' 是格式化后的日期格式。例如:

select date_format('1997-10-04 22:23:00','%y %M %b %D %W %a %Y-%m-%d %H:%i:%s %r %T');
结果:97 October Oct 4th Saturday Sat 1997-10-04 22:23:00 10:23:00 PM 22:23:00 SELECT count(*) FROM house Where get_date like '2006%-07%';

2 查询指定字段是否有重复记录

重复记录有两种解释,一是完全重复的记录,也即所有字段均重复的记录,二是部分字段重复的记录,比如姓名name字段重复,而其它字段不一定重复。下面先在MySQL数据库中准备测试数据。

DROP TABLE IF EXISTS test1;

CREATE TABLE `test1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
`course` varchar(20) DEFAULT NULL COMMENT '课程',
`score` int(4) DEFAULT NULL COMMENT '分数',
create_time datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; -- 测试数据 insert into test1(name,course,score,create_time)
values
('Tom','英语',98,NOW()),
('Tom','语文',96,NOW()),
('Tom','数学',69,NOW()),
('张三','语文',80,NOW()),
('李四','语文',90,NOW()),
('王五','语文',93,NOW()),
('张三','数学',77,NOW()),
('李四','数学',68,NOW()),
('王五','数学',99,NOW()),
('张三','英语',90,NOW()),
('李四','英语',50,NOW()),
('王五','英语',89,NOW());

2.1 完全重复

这一类的数据比较容易查询,使用如下SQL就可以得到无重复记录的结果集。

select
distinct * from
tableName;

如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除:

l  创建表结构一致的临时表tmp;

l  使用distinct关键字查询tableName中的所有数据,并复制到tmp;

l  清空tableName表;

l  从tmp把数据复制回来;

l  删除临时表tmp。

下面处理第二种场景的数据。

2.2 某个字段重复

   查询重复字段重复次数信息

SELECT `name`,count(id) sumCount
FROM test1
GROUP BY `name` HAVING sumCount > 1;

结果集如下图所示:

说明:先用GROUP BY 对 name 进行分组,同时使用COUNT(id)进行统计,再用HAVING来过滤大于1的,这样查找出来的就是重复的记录了。查询包含重复字段的完整记录

SELECT T.* FROM test1 T WHERE `name` in (
SELECT `name` FROM test1
GROUP BY `name` HAVING count(id) > 1
)

结果集如下图所示:

     查询包含重复字段的完整记录,并且,排除id最小的记录

SELECT * from test1 where
id not in (select id from (select min(id) as id from test1 group by `name`) b);

结果集如下图所示:

从结果集可知,已经排除姓名重复时,id最小的记录。删除表中多余的重复记录,重复记录是根据单个字段(name)来判断,只保留id最小的记录。

delete from test1 where
id not in (select id from (select min(id) as id from test1 group by `name`) b);

执行后,查询表中结果集如下,可以看到,name列已经不存在重复数据。结果集如下图所示:

如果删除脚本如下书写,则会抛异常,提示【[Err] 1093 - You can't specify target table 'test1' for update in FROM clause】。

delete from test1 where
id not in (select min(id) from test1 group by `name`);

在MySQL中,不允许先select一张表,再在同一个SQL语句中按此条件进行更新和删除同一张表的记录。解决办法就是将select得到的结果,再通过中间表select一遍,这样就规避了MySQL的限制。这个问题只出现于MySQL,ms sql和oracle不会出现此问题。

3 查找多个字段是否有重复记录

更新张三的数学成绩为80,使得和语文成绩一样。现在查询姓名和成绩都相同的记录,SQL如下:

select * from test1 a
where (a.`name`,a.score) in ( select `name`,score from test1
group by `name`,score having count(*) > 1 );

执行后,结果集如下图所示:

查找表中多个字段重复的记录,但不包含id最小的记录

select * FROM test1 a
where (a.`name`,a.score) in ( select `name`,score FROM test1
group by `name`,score having count(*) > 1 )
AND a.id not in (
select min(id) FROM test1
group by `name`,score having count(*) > 1
);

删除表中多个字段重复的记录,并且包含id最小的记录

DELETE FROM test1
where (`name`,score) in ( select `name`,score FROM
(SELECT `name`,score FROM test1
group by `name`,score having count(*) > 1 ) b)
AND id not in ( SELECT id FROM
(select min(id) as id FROM test1
group by `name`,score having count(*) > 1
)c);

select * from test1 a

where (a.`name`,a.score) in ( select `name`,score from test1

group by `name`,score having count(*) > 1 );

常用SQL之日期格式化和查询重复数据的更多相关文章

  1. 常用SQL Server日期格式化

    Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46 Select CONVERT(varchar(100), GETDATE(), 24): 10 ...

  2. 不一样的 SQL Server 日期格式化

    不一样的 SQL Server 日期格式化 Intro 最近统计一些数据,需要按天/按小时/按分钟来统计,涉及到一些日期的格式化,网上看了一些文章大部分都是使用 CONVERT 来转换的,SQL Se ...

  3. SQL查询语句,怎样查询重复数据

    SQL查询语句,怎样查询重复数据 2012-02-22 14:50神奇的马骁勇 | 浏览 0 次 有表A, 中有字段id, name, memo现在有很多id重复的数据,怎么把这些重复的都查出来?gr ...

  4. MySQL数据库根据一个或多个字段查询重复数据

    系统在开发测试过程中出现bug,比如并发操作没有处理好,数据库中往往会插入重复数据,这些脏数据经常会导致各种问题.bug可以修改,但是数据往往也要处理,处理SQL如下: 1.根据一个字段查找重复数据 ...

  5. orcl数据库查询重复数据及删除重复数据方法

    工作中,发现数据库表中有许多重复的数据,而这个时候老板需要统计表中有多少条数据时(不包含重复数据),只想说一句MMP,库中好几十万数据,肿么办,无奈只能自己在网上找语句,最终成功解救,下面是我一个实验 ...

  6. 查询重复数据group by menu_id having count(menu_id)>1

    select * from sys_power_menu WHERE menu_id in ( select menu_id from  sys_power_menu group by menu_id ...

  7. Sql Server 日期格式化函数

    Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONVE ...

  8. SQL GETDATE()日期格式化函数

    Sql Server 中一个非常强大的日期格式化函数 Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONV ...

  9. sql 查询重复数据,删除重复数据,过滤重复数据

    select * from (SELECT titleid,count(titleid) c FROM [DragonGuoShi].[dbo].[ArticleInfo] group by titl ...

随机推荐

  1. 轻松搭建CAS 5.x系列(8)-在CAS Server增加双因素认证(DUO版)

    概述说明 为了让系统更加安全,很多登录会加入双因素认证.何为双因素,如果把登陆作为开一扇门的话,那就是在原来的锁上再加一把锁,第二锁用新的钥匙,这样安全系数就更加高了. CAS是通过账号名和密码来认证 ...

  2. Html5+Mui前端框架,开发记录(二):提交不了数据?

    1.Mui 请求Webapi接口,返回所需要的数据(get,post) mui.ajax({ url: getAddress() + '/api/Qiliu/get?jsoncallback=?', ...

  3. [书籍翻译] 《JavaScript并发编程》第三章 使用Promises实现同步

    本文是我翻译<JavaScript Concurrency>书籍的第三章 使用Promises实现同步,该书主要以Promises.Generator.Web workers等技术来讲解J ...

  4. css3flex布局实现商品列表

    首先看图 手机商场经常会有商品列表功能,这样其实可以用flex布局实现 注意两个地方: 1.商品列表平衡间距(flex布局的换行加两端对齐) 2.中间文字行数不一样,会出现下方留下空白,如何解决(fl ...

  5. Apache Log View 5.37破解笔记

    i春秋作家:Sp4ce 之前说过要分享这个日志分析工具[记一次简单的攻击日志分析]的破解版,在破解的路上踩了几个坑,记录分享下. 0×00程序概述 原程序 大小: 2283672 字节文件版本: 5. ...

  6. Framework7 - 入门教程(安装、配置、创建一个H5应用)

    1,Framework7介绍 (1)Framework7 是一个开源免费的框架.可以用来开发混合移动应用(原生和 HTML 混合)或者开发 iOS & Android 风格的 WEB APP. ...

  7. c#开启线程池超出索引

    这样写会超出索引,foreach好像不会超出,原因可能是开启线程池需要时间,成功开启之后,一次循环已经结束,这个没有验证. 以下这个做法是不对的,我也是看网上的贴这样写,结果是少执行了一个.推荐大家还 ...

  8. KVM之virsh管理虚拟机CPU

    查看虚拟机CPU数量配置 [root@ubuntu ~]# virsh vcpucount centos_server01 maximum config 2 maximum live 2 curren ...

  9. 2.Buffer 缓冲区

    /*缓冲区(Buffer)*/ Buffer 就像一个数组,可以保存多个相同类型的数据.根据数据类型不同(boolean 除外),有以下Buffer常用子类: /*ByteBuffer*/(常用) . ...

  10. 微服务、SOA、ESB比较

    很多时候会听到微服务.SOA.ESB之间有着联系也有着区别,有时候了解了一下,过段时间有混肴模糊了今天看了一篇文章写的很好,特地记录一下. 原文地址:https://mp.weixin.qq.com/ ...