mysql有没有不重复的属性_查询重复或不重复记录SQL语句

1.如何用SQL语句把一个表里面某字段内有相同的记录查询出来

现在有一个表 有三列 分别是tel,name,addr

我现在要查询name一样的

具体T-SQL语句要怎么写 求助

就是name这个列有很多记录在数据库里面 这些人有很多哈 就是如何把这些同名同姓的记录找出来

只显示name

select name from tb group by name having count(*) > 1

显示所有数据

select * from name in (select name from tb group by name having count(*) > 1)

2.T1表有F1,F2,F3字段 T2表有F1,F4字段 查出T1表里所有有重复的记录,如下

select * from T1 where F1 in(select F1 from T1 group by F1,F2,F3 having count(*)>1)

3.怎样用SQL语句在一个表里找出具有两个相同属性的记录?

悬赏分:5 – 解决时间:2008-12-15 17:11

比如说这个表里有属性:姓名,学号,专业,籍贯等。那我现在要找出专业和籍贯都相同的学生记录。如何用SQL语句实现?

假设相同的专业名为A,籍贯名为B,表名为TAB

问题补充:不好意思,忘了说一个条件。

就是事先不知道有哪些记录里的专业和籍贯是相同的,A和B是未知的,即有可能A和B有多种取值情况,而现在要全部把它们查找出来。

不是专业=籍贯,而是不同的记录中专业相同AND籍贯相同的,比如说专业都是计算机的,籍贯都是福建福州的;或者专业都是数学的,籍贯都是福建厦门的。

答案:

select 专业,籍贯 , count(*) from tab

group by 专业,籍贯

是专业,籍贯相同的学生记录数

select 专业,籍贯 , count(*) from tab

group by 专业,籍贯 having count(*)>1

是专业,籍贯相同的学生记录数>1条的

select 姓名,学号 , 专业,籍贯 from tab

order by 专业,籍贯

就是明细

若你想查某个专业 如 A 和籍贯 如 B的话,

select * from TAB where 专业=’A'and 籍贯=’B’

例如有如下表结构和值

table

fid   name sex

1     a      男

2     b      男

3     c      女

4     d      女

5     a      男

6     b      男

方案一:distinct

select distinct name from table

得到结果:

name

a

b

c

d

实现效果,那如果要同时打开其它记录呢?再试试

select distinct name,id from table

测试没什么效果,查下得知,这样实际是要name和id字段都重复才被筛选。继续查找可得如下方法:

方案二:group by

select *, count(distinct name) from table group by name

Oracle下测试失败,据说MYSQL下通过,不管,继续思考….

select *, count(distinct name) from table group by name 在MYSQL测试失败

翻翻书,试试

select min(fid),name,sex from table group by name

成功,现实如下结果:

fid   name sex

1     a      男

2     b      男

3     c      女

4     d      女

MYSQL测试,没有效果

继续思考,如果要打开所有记录,不指定字段用(*),貌似这方法就不行了!

select * from table where fid in(Select min(fid) FROM table group by name)

测试成功

fid   name sex

1     a      男

2     b      男

3     c      女

4     d      女

方案三:

本来已经完了,突然想起前几天在网上查了查询数据中所有某字段重复的记录

select   *   from   table   where   name in(select   name   from   table   group   by   name     having   count(name)=2)

得到如下结果:

fid   name sex

1     a      男

2     b      男

5     a      男

6     b      男

以此类推:

select   *   from   table   where   name in(select   name   from   table   group   by   name     having   count(name)=1)

按道理说没问题,大家试试~~

再多的字段都全部现实。哎,原来如此简单!回顾网上方法distinct,Inner   Join等等,麻烦,而且有很大局限性.

总结如下:

select distinct name from table打开重复记录的单个字段

select * from table where fid in(Select min(fid) FROM table group by name)打开重复记录的所有字段值

select   *   from   table   where   name in(select   name   from   table   group   by   name     having   count(name)=1)打开重复任意次数的所有记录

4.

Sql Server里面如果没有设定主键而删除重复数据很麻烦:

一:保留重复记录中的一条记录,其他全部删除。

–1:建立临时表,把不重复的数据转存

select distinct * into #Tmp from 表名;

–2:删除原表数据

truncate table 表名;

–3:将数据导回

insert into 表名 select * from #Tmp;

–4:删除临时表

drop table #Tmp;

******************

如果是oracle的话,把 rowid 查出来,按照rowid删除就可以了。

select rowid,表名.* from 表名;

delete from 表名 where rowid != ‘刚才查询出的某个值’

commit;

******************

select post_content,post_title from wp_posts group by post_content,post_title having count(*)>1

先看看有多少重复的

假设你表中还有id的一个字段

select min(id),post_content,post_title from wp_posts group by post_content,post_title

这些选出来后你看看这些是否可以不删除

然后

delete from wp_posts where id not in (select min(id) from wp_posts group by post_content,post_title)

Tags: 数据库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值