SQL中重复数据的查询与删除
- 格式:docx
- 大小:29.85 KB
- 文档页数:16
图5-54 编辑数据表图5-55 查看数据内容
(3)再右击dbo.SmallClass数据表,并执行【编写表脚本为】|【SELECT到】|【新查询编辑器窗口】命令,如图5-56所示。
图5-56 创建【新查询编辑器】窗口
(4)在弹出【连接到数据库引擎】对话框中,单击【连接】按钮,并连接数据库,如图5-57所示。
(5)在窗口的右侧将打开一个新的【查询编辑器】窗口,并显示该数据表查询的一些查询语句。
然后,在【可用数据库】下拉列表框中,选择
数据库,如图5-58所示。
图5-57 连接数据库图5-58 选择数据库
(6)在【查询编辑器】窗口中,输入“select COUNT(*) from SmallClass where BigClass='小说'”查询语句,如图5-59所示。
(7)单击【执行】按钮,开始运行查询语句,并在【结果】窗口中显示统计的结果,如图5-60所示。
)单击【标准】工具栏中的【数据库引擎查询】按钮
图5-62 单击【数据库引擎查询】按钮图5-63 连接到数据库引擎(3)在【可用数据库】下拉框中,选择BookDateBase数据库,如图5-64所示。
(4)在【查询编辑器】窗口中,输入“select BigClass from SmallClass group by BigClass having count(*)=1 or count(*)>1”语句,如图5-65所示。
图5-64 选择数据库图5-65 输入查询语句
(5)单击【SQL编辑器】工具栏中的【执行】按钮,即可在【结果】窗口中,显示出BigClass字段列内容,并且各记录不重复,如图5-66所示。
图5-66 显示不重复记录。
删除一个表中的重复数据同时保留第一次插入那一条以及sql优化业务:一个表中有很多数据(id为自增主键),在这些数据中有个别数据出现了重复的数据。
目标:需要把这些重复数据删除同时保留第一次插入的那一条数据,还要保持其它的数据不受影响。
解题过程:?1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829第一步:查出所有要保留的下来的数据的id(save_id)[sql]SELECT id as save_idFROM yujing.alarm_event_info_snapshot aeiswhere aeis.event_id in(SELECT ae.idFROM yujing.alarm_event aewhere ae.event_uuid like 'yuanwtj_%')group by (aeis.event_id)优化后:[sql]SELECT aeis.id as save_idFROM yujing.alarm_event aeright join yujing.alarm_event_info_snapshot aeison aeis.event_id = ae.idwhere ae.event_uuid like 'yuanwtj_%'group by (aeis.event_id)第二步:获取所有相关数据的id(all_id)[sql]SELECT aeis.id as all_idFROM yujing.alarm_event_info_snapshot aeiswhere aeis.event_id in(SELECT ae.idFROM yujing.alarm_event aewhere ae.event_uuid like 'yuanwtj_%')order by aeis.event_id优化后:[sql]3031323334353637383940414243444546474849505152535455565758596061626364656667 SELECT aeis.id as all_idFROM yujing.alarm_event aeright join yujing.alarm_event_info_snapshot aeison aeis.event_id = ae.idwhere ae.event_uuid like 'yuanwtj_%'第三步:获取要删除的数据的id(del_id)[sql]select ad.all_id as del_idfrom (SELECT aeis.id as all_idFROM yujing.alarm_event_info_snapshot aeiswhere aeis.event_id in(SELECT ae.idFROM yujing.alarm_event aewhere ae.event_uuid like 'yuanwtj_%')) as adwhere ad.all_id not in (SELECT id as save_idFROM yujing.alarm_event_info_snapshot aeis where aeis.event_id in(SELECT ae.idFROM yujing.alarm_event aewhere ae.event_uuid like 'yuanwtj_%') group by (aeis.event_id))优化后:[sql]select ad.all_id as del_idfrom (SELECT aeis.id as all_idFROM yujing.alarm_event aeright join yujing.alarm_event_info_snapshot aeison aeis.event_id = ae.idwhere ae.event_uuid like 'yuanwtj_%') as adleft join (SELECT aeis.id as save_idFROM yujing.alarm_event aeright join yujing.alarm_event_info_snapshot aeison aeis.event_id = ae.idwhere ae.event_uuid like 'yuanwtj_%'group by (aeis.event_id)) as sdon ad.all_id = sd.save_idwhere sd.save_id is null第四步:根据id删除所有节点,注意mysql中如果有大量数据时需要批量删除,我最后使用了ETL工具进行的批量删除总结:在mysql数据库中,sql语句中最好不要在in或not in关键字的查询里动态获取匹配的值,数据量大的情况下使用它们效率很低,可以使用左右连接来代替in操作,这样效率会提高很多倍,大数据量下尤为明显。
SQL数据库基本操作命令SQL是一种用于管理和操作关系型数据库的语言,具有丰富的操作命令。
以下是SQL数据库的基本操作命令,包括创建数据库、创建表、插入数据、查询数据、更新数据和删除数据等。
1.创建数据库命令CREATE DATABASE database_name; -- 创建一个新的数据库USE database_name; -- 使用指定的数据库2.创建表命令CREATE TABLE table_namecolumn1 datatype constraint,column2 datatype constraint,...;--创建一个新的表3.插入数据命令INSERT INTO table_name (column1, column2, ...)VALUES (value1, value2, ...); -- 向表中插入一条记录4.查询数据命令SELECT column1, column2, ...FROM table_name; -- 查询表中的所有记录SELECT column1, column2, ...FROM table_nameWHERE condition; -- 查询满足条件的记录SELECT DISTINCT column1, column2, ...FROM table_name; -- 查询不重复的记录SELECT column_name(s)FROM table1INNER JOIN table2 ON table1.column_name = table2.column_name; -- 连接两个表并查询指定列SELECT column_name(s)FROM table_nameORDER BY column_name ASC,DESC; -- 按列的升序或降序对查询结果进行排序5.更新数据命令UPDATE table_nameSET column1 = value1, column2 = value2, ...WHERE condition; -- 更新表中满足条件的记录6.删除数据命令DELETE FROM table_nameWHERE condition; -- 删除表中满足条件的记录TRUNCATE TABLE table_name; -- 删除表中的所有记录DROP TABLE table_name; -- 删除表7.其他操作命令ALTER TABLE table_nameADD column_name datatype; -- 向表中添加新的列ALTER TABLE table_nameDROP COLUMN column_name; -- 从表中删除指定的列ALTER TABLE table_nameMODIFY COLUMN column_name datatype; -- 修改表中指定列的数据类型ALTER TABLE table_nameRENAME TO new_table_name; -- 修改表名以上是SQL数据库的基本操作命令,通过这些命令可以管理与操作关系型数据库。
sql语句去除重复记录(多表连接的查询)--处理表重复记录(查询和删除)/******************************************************************************************************************************************************1、Num、Name相同的重复值记录,没有⼤⼩关系只保留⼀条2、Name相同,ID有⼤⼩关系时,保留⼤或⼩其中⼀个记录******************************************************************************************************************************************************/--1、⽤于查询重复处理记录(如果列没有⼤⼩关系时2000⽤⽣成⾃增列和临时表处理,SQL2005⽤row_number函数处理)--> --> ⽣成測試數據if not object_id('Tempdb..#T') is nulldrop table#TGoCreate table#T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))Insert#Tselect1,N'A',N'A1'union allselect2,N'A',N'A2'union allselect3,N'A',N'A3'union allselect4,N'B',N'B1'union allselect5,N'B',N'B2'Go--I、Name相同ID最⼩的记录(推荐⽤1,2,3),⽅法3在SQl05时,效率⾼于1、2⽅法1:Select* from#T a where not exists(select1 from#T where Name= and ID<a.ID)⽅法2:select a.* from#T a join(select min(ID)ID,Name from#T group by Name) b on = and a.ID=b.ID⽅法3:select* from#T a where ID=(select min(ID) from#T where Name=)⽅法4:select a.* from#T a join#T b on = and a.ID>=b.ID group by a.ID,,a.Memo having count(1)=1⽅法5:select* from#T a group by ID,Name,Memo having ID=(select min(ID)from#T where Name=)⽅法6:select* from#T a where(select count(1) from#T where Name= and ID<a.ID)=0⽅法7:select* from#T a where ID=(select top1 ID from#T where Name= order by ID)⽅法8:select* from#T a where ID!>all(select ID from#T where Name=)⽅法9(注:ID为唯⼀时可⽤):select* from#T a where ID in(select min(ID) from#T group by Name)--SQL2005:⽅法10:select ID,Name,Memo from(select*,min(ID)over(partition by Name) as MinID from#T a)T where ID=MinID⽅法11:select ID,Name,Memo from(select*,row_number()over(partition by Name order by ID) as MinID from#T a)T where MinID=1⽣成结果:/*ID Name Memo----------- ---- ----1 A A14 B B1(2 ⾏受影响)*/--II、Name相同ID最⼤的记录,与min相反:⽅法1:Select* from#T a where not exists(select1 from#T where Name= and ID>a.ID)⽅法2:select a.* from#T a join(select max(ID)ID,Name from#T group by Name) b on = and a.ID=b.ID order by ID⽅法3:select* from#T a where ID=(select max(ID) from#T where Name=) order by ID⽅法4:select a.* from#T a join#T b on = and a.ID<=b.ID group by a.ID,,a.Memo having count(1)=1⽅法5:select* from#T a group by ID,Name,Memo having ID=(select max(ID)from#T where Name=)⽅法6:select* from#T a where(select count(1) from#T where Name= and ID>a.ID)=0⽅法7:select* from#T a where ID=(select top1 ID from#T where Name= order by ID desc)⽅法8:select* from#T a where ID!<all(select ID from#T where Name=)⽅法9(注:ID为唯⼀时可⽤):select* from#T a where ID in(select max(ID) from#T group by Name)--SQL2005:⽅法10:select ID,Name,Memo from(select*,max(ID)over(partition by Name) as MinID from#T a)T where ID=MinID⽅法11:select ID,Name,Memo from(select*,row_number()over(partition by Name order by ID desc) as MinID from#T a)T where MinID=1⽣成结果2:/*ID Name Memo----------- ---- ----3 A A35 B B2(2 ⾏受影响)*/--2、删除重复记录有⼤⼩关系时,保留⼤或⼩其中⼀个记录--> --> ⽣成測試數據if not object_id('Tempdb..#T') is nulldrop table#TGoCreate table#T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))Insert#Tselect1,N'A',N'A1'union allselect2,N'A',N'A2'union allselect3,N'A',N'A3'union allselect4,N'B',N'B1'union allselect5,N'B',N'B2'Go--I、Name相同ID最⼩的记录(推荐⽤1,2,3),保留最⼩⼀条⽅法1:delete a from#T a where exists(select1 from#T where Name= and ID<a.ID)⽅法2:delete a from#T a left join(select min(ID)ID,Name from#T group by Name) b on = and a.ID=b.ID where b.Id is null⽅法3:delete a from#T a where ID not in(select min(ID) from#T where Name=)⽅法4(注:ID为唯⼀时可⽤):delete a from#T a where ID not in(select min(ID)from#T group by Name)⽅法5:delete a from#T a where(select count(1) from#T where Name= and ID<a.ID)>0⽅法6:delete a from#T a where ID<>(select top1 ID from#T where Name= order by ID)⽅法7:delete a from#T a where ID>any(select ID from#T where Name=)select* from#T⽣成结果:/*ID Name Memo----------- ---- ----1 A A14 B B1(2 ⾏受影响)*/--II、Name相同ID保留最⼤的⼀条记录:⽅法1:delete a from#T a where exists(select1 from#T where Name= and ID>a.ID)⽅法2:delete a from#T a left join(select max(ID)ID,Name from#T group by Name) b on = and a.ID=b.ID where b.Id is null⽅法3:delete a from#T a where ID not in(select max(ID) from#T where Name=)⽅法4(注:ID为唯⼀时可⽤):delete a from#T a where ID not in(select max(ID)from#T group by Name)⽅法5:delete a from#T a where(select count(1) from#T where Name= and ID>a.ID)>0⽅法6:delete a from#T a where ID<>(select top1 ID from#T where Name= order by ID desc)⽅法7:delete a from#T a where ID<any(select ID from#T where Name=)select* from#T/*ID Name Memo----------- ---- ----3 A A35 B B2(2 ⾏受影响)*/--3、删除重复记录没有⼤⼩关系时,处理重复值--> --> ⽣成測試數據if not object_id('Tempdb..#T') is nulldrop table#TGoCreate table#T([Num] int,[Name] nvarchar(1))Insert#Tselect1,N'A'union allselect1,N'A'union allselect1,N'A'union allselect2,N'B'union allselect2,N'B'Go⽅法1:if object_id('Tempdb..#') is not nulldrop table#Select distinct* into# from#T--排除重复记录结果集⽣成临时表#truncate table#T--清空表insert#T select* from# --把临时表#插⼊到表#T中--查看结果select* from#T/*Num Name----------- ----1 A2 B(2 ⾏受影响)*/--重新执⾏测试数据后⽤⽅法2⽅法2:alter table#T add ID int identity--新增标识列godelete a from#T a where exists(select1 from#T where Num=a.Num and Name= and ID>a.ID)--只保留⼀条记录goalter table#T drop column ID--删除标识列--查看结果select* from#T/*Num Name----------- ----1 A2 B(2 ⾏受影响)*/--重新执⾏测试数据后⽤⽅法3⽅法3:declare Roy_Cursor cursor local forselect count(1)-1,Num,Name from#T group by Num,Name having count(1)>1declare@con int,@Num int,@Name nvarchar(1)open Roy_Cursorfetch next from Roy_Cursor into@con,@Num,@Namewhile @@Fetch_status=0beginset rowcount @con;delete#T where Num=@Num and Name=@Nameset rowcount 0;fetch next from Roy_Cursor into@con,@Num,@Nameendclose Roy_Cursordeallocate Roy_Cursor--查看结果select* from#T /*Num Name ----------- ----1 A2 B(2 ⾏受影响)*/。
查询和删除表中重复数据sql语句1、查询表中重复数据。
select * from peoplewhere peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最⼩的记录delete from peoplewhere peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)3、查找表中多余的重复记录(多个字段)select * from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)4、删除表中多余的重复记录(多个字段),只留有rowid最⼩的记录delete from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)5、查找表中多余的重复记录(多个字段),不包含rowid最⼩的记录select * from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)(⼆)⽐⽅说在A表中存在⼀个字段“name”,⽽且不同记录之间的“name”值有可能会相同,现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;Select Name,Count(*) From A Group By Name Having Count(*) > 1如果还查性别也相同⼤则如下:Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1(三)⽅法⼀declare @max integer,@id integerdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1open cur_rowsfetch cur_rows into @id,@maxwhile @@fetch_status=0beginselect @max = @max -1set rowcount @maxdelete from 表名 where 主字段 = @idfetch cur_rows into @id,@maxendclose cur_rowsset rowcount 0⽅法⼆"重复记录"有两个意义上的重复记录,⼀是完全重复的记录,也即所有字段均重复的记录,⼆是部分关键字段重复的记录,⽐如Name字段重复,⽽其他字段不⼀定重复或都重复可以忽略。
sqlserver distinct用法标题:SQL Server DISTINCT 用法详解:从基础到高级应用摘要:本文将详细介绍SQL Server 中DISTINCT 关键字的用法。
从基础的概念开始,逐步深入讨论DISTINCT 在SQL 查询中的应用,包括单列DISTINCT、多列DISTINCT、DISTINCT 搭配聚合函数、DISTINCT 和SELECT 子句等功能。
我们还将讨论DISTINCT 运行效率和最佳实践。
无论您是初学者还是有经验的数据库开发人员,本文都将为您提供宝贵的知识和指导。
目录:1. 引言1.1 SQL Server 简介1.2 DISTINCT 的作用2. 单列DISTINCT2.1 基本语法2.2 示例及解析3. 多列DISTINCT3.1 基本语法3.2 示例及解析4. DISTINCT 搭配聚合函数4.1 基本语法4.2 示例及解析5. DISTINCT 和SELECT 子句5.1 基本语法5.2 示例及解析6. DISTINCT 运行效率与最佳实践6.1 索引的影响6.2 数据量的影响6.3 使用临时表进行优化6.4 如何评估DISTINCT 查询的性能7. 结论7.1 总结7.2 推荐资源1. 引言:1.1 SQL Server 简介SQL Server 是由微软公司开发的一种关系数据库管理系统(RDBMS),广泛应用于企业级应用程序的数据存储和管理。
它支持SQL(结构化查询语言)作为标准查询语言,用于对数据库进行查询、插入、更新和删除等操作。
1.2 DISTINCT 的作用DISTINCT 是SQL 查询语句中的关键字,用于去重查询结果集中的重复行,返回唯一的值。
DISTINCT 用于SELECT 语句,它可以应用于单个列或多个列。
通过消除结果集中的重复值,DISTINCT 可以帮助我们更好地理解和分析数据。
2. 单列DISTINCT:2.1 基本语法:SELECT DISTINCT column_nameFROM table_name;2.2 示例及解析:假设我们有一个名为"Customers" 的表,其中包含名为"Country" 的列,我们想要获取不重复的国家列表。
达梦(DM)数据库是中国自主研发的一种关系型数据库管理系统(RDBMS),广泛应用于各个行业的信息化建设。
在实际的数据库操作中,经常需要进行查找和统计某一列中的唯一值,这就涉及到了distinct的用法。
一、distinct的基本概念在SQL中使用distinct关键字可以去除查询结果中的重复行,只保留一行。
distinct是一个用来消除重复数据的关键字,它可以用在select语句中,也可以用在insert语句中。
distinct通常和count、sum、avg等函数一起使用,通过对某一列进行去重,来对数据进行统计和分析。
二、distinct的语法和用法distinct关键字通常放在select语句的列名后面,用于筛选出该列中的唯一值。
下面是distinct的一般语法:SELECT DISTINCT 列名 FROM 表名;三、distinct的示例场景在实际的数据库查询中,distinct的用法非常广泛。
下面我们结合一些具体的示例来介绍distinct的使用情况。
1.查询某一列的唯一值假设我们有一个用户表,其中有一个列是性别(gender),现在我们想要查询该表中所有不重复的性别。
我们可以使用以下SQL语句:SELECT DISTINCT gender FROM users;这样就可以获取到用户表中所有不重复的性别类型。
2.查询某一列的唯一值并统计数量在一些统计场景中,我们常常需要统计某一列的不重复值并计算数量。
比如我们要统计用户表中不重复的城市数量,可以使用以下SQL语句:SELECT COUNT(DISTINCT city) FROM users;这样就可以获取到用户表中不重复的城市数量。
3.查询多列的唯一组合值有时候我们需要查询多列的唯一组合值,distinct同样可以胜任。
假设我们有一个订单表,其中包含用户ID(user_id)和商品ID(product_id),我们想要获取订单中不重复的用户和商品组合。
常用sql命令SQL是一种结构化查询语言,用于管理和操作关系型数据库。
SQL命令是SQL语言的基本组成部分,用于执行各种数据库操作。
以下是常用的SQL命令:1. SELECT:用于从数据库中选择数据,并返回结果集。
2. INSERT INTO:用于向表中插入新行。
3. UPDATE:用于更新表中现有行的数据。
4. DELETE FROM:用于从表中删除行。
5. CREATE DATABASE:用于创建新数据库。
6. CREATE TABLE:用于创建新表格。
7. ALTER TABLE:用于修改现有表格的结构。
8. DROP TABLE:用于删除现有表格。
9. INDEXES:用于创建索引以提高查询效率。
10. JOIN:将两个或多个表格连接在一起以获取更全面的信息。
11. GROUP BY:将结果集按照指定列进行分组,并对每个组进行聚合计算。
12. ORDER BY:按照指定列对结果集进行排序,可以使用ASC(升序)或DESC(降序)排序方式。
13. DISTINCT:从结果集中选择唯一的值并返回它们。
14. WHERE:筛选满足指定条件的行并返回它们,可以使用AND和OR运算符来组合多个条件。
15. IN:在WHERE子句中使用,选择匹配给定值列表中任何一个值的行并返回它们。
16. LIKE: 在WHERE子句中使用,选择与给定模式匹配的行并返回它们。
17. BETWEEN:在WHERE子句中使用,选择在指定范围内的值的行并返回它们。
18. NULL:在WHERE子句中使用,选择包含NULL值的行并返回它们。
19. COUNT:用于计算结果集中行的数量。
20. AVG:用于计算结果集中数值列的平均值。
21. SUM:用于计算结果集中数值列的总和。
22. MAX:用于计算结果集中数值列的最大值。
23. MIN:用于计算结果集中数值列的最小值。
24. HAVING:与GROUP BY一起使用,筛选满足指定条件的分组并返回它们。
dbeaver删除表数据的sql语句一、使用DELETE语句删除表数据在dbeaver中,可以使用DELETE语句来删除表中的数据。
DELETE 语句用于从表中删除指定的行或所有行。
下面是一些常用的DELETE 语句示例。
1. 删除指定条件的行可以使用WHERE子句指定删除的条件。
下面的示例将删除表名为table_name的表中满足条件的行。
DELETE FROM table_nameWHERE condition;其中,table_name是要删除数据的表名,condition是删除的条件,可以使用比较运算符(如=、<、>等)和逻辑运算符(如AND、OR等)来构建条件。
2. 删除所有行如果不指定WHERE子句,DELETE语句将删除表中的所有行。
下面的示例将删除表名为table_name的表中的所有行。
DELETE FROM table_name;其中,table_name是要删除数据的表名。
3. 删除表中的前N行可以使用LIMIT子句限制删除的行数。
下面的示例将删除表名为table_name的表中的前N行。
DELETE FROM table_nameLIMIT N;其中,table_name是要删除数据的表名,N是要删除的行数。
4. 删除表中的重复行可以使用子查询和临时表来删除表中的重复行。
下面的示例将删除表名为table_name的表中的重复行。
DELETE FROM table_nameWHERE column_name NOT IN (SELECT MIN(column_name)FROM table_nameGROUP BY duplicate_column_name);其中,table_name是要删除数据的表名,column_name是用于判断重复行的列名,duplicate_column_name是包含重复值的列名。
5. 删除表中的重复数据可以使用DISTINCT关键字和临时表来删除表中的重复数据。
distinct的sql用法全文共四篇示例,供读者参考第一篇示例:在SQL中,DISTINCT是一种用法,用于返回结果集中唯一不同值的行。
当我们在查询数据库时,有时候我们只关注结果集中的唯一不同值,而不关心重复出现的值。
这时候我们就可以使用DISTINCT来过滤结果,只保留唯一的值。
在使用DISTINCT时,它会对指定的列进行去重操作,只保留不同的值。
它不会对整行数据进行去重,只会基于指定的列进行去重。
通常我们会将DISTINCT与SELECT语句一起使用,来获取结果集中唯一不同值的列。
我们想获取某个表中某一列的所有不同值,我们可以这样写:```SELECT DISTINCT column_nameFROM table_name;```这样就会返回该列中所有不同的值。
下面我们通过一个具体的例子来演示DISTINCT的用法,假设我们有一个学生表(student),它包含了学生的ID和姓名两列:```学生表(student)ID 姓名1 小明2 小红3 小刚4 小明5 小红```现在我们想获取该表中所有不同的学生姓名,我们可以这样写SQL语句:执行以上SQL语句后,将会返回不同的学生姓名,即"小明"、"小红"、"小刚",去掉重复的"小明"和"小红"。
除了在SELECT语句中使用DISTINCT外,我们还可以在GROUP BY语句中使用DISTINCT。
我们想要根据某一列对表中数据进行分组,并统计每组的数量,但是我们只关心每组的不同值。
这时我们可以先根据该列进行分组,然后使用DISTINCT对该列进行去重。
我们想统计每个班级的学生人数,可以这样写:```SELECT 班级, COUNT(DISTINCT 学生ID) as 人数FROM studentGROUP BY 班级;```在以上例子中,我们先按照班级对学生表进行分组,然后再对学生ID进行去重,最后统计每个班级的学生人数。
⼀次SQL如何查重及去重的实战记录⽬录前⾔1.distinct2.groupby3.row_number窗⼝函数4.删除重复数据第⼀步:找出重复的数据第⼆步:删除重复的数据总结前⾔在使⽤SQL提数的时候,常会遇到表内有重复值的时候,就需要做去重,本⽂归类了常⽤⽅法。
1.distinct题⽬:现在运营需要查看⽤户来⾃于哪些学校,请从⽤户信息表中取出学校的去重数据⽰例:user_profilemysql>SELECT DISTINCT university FROM user_profile;根据⽰例,查询返回以下结果⼩贴⼠:SQL中关键词distinct去重:英语中distinct 代表独⼀⽆⼆的意思,他在SQL表⽰去重的意思:⽐如本题中university这⼀列出现了两次北京⼤学,使⽤distinct进⾏去重查询后,则北京⼤学只出现⼀次。
distinct 通常效率较低distinct 使⽤中,放在 select 后边,对后⾯所有的字段的值统⼀进⾏去重拓展:题⽬:现在运营需要查看⽤户的总数select count(distinct university) from user_profile;2.group by举个栗⼦,现有这样⼀张表 task备注:task_id: 任务id;order_id: 订单id;start_time: 开始时间注意:⼀个任务对应多条订单题⽬:列出任务总数根据⽰例,查询⽅法如下:第1步:列出 task_id 的所有唯⼀值(去重后的记录,null也是值)select task_idfrom Taskgroup by task_id;第⼆步:任务总数select count(task_id) task_numfrom (select task_idfrom Taskgroup by task_id) tmp;3.row_number 窗⼝函数举个栗⼦,现有这样⼀张表 task备注:task_id: 任务id;order_id: 订单id;start_time: 开始时间注意:⼀个任务对应多条订单题⽬:查询整个表重复的数据根据⽰例,查询⽅法如下:– 在⽀持窗⼝函数的 sql 中使⽤select count(case when rn=1 then task_id else null end) task_numfrom (select task_id, row_number() over (partition by task_id order by start_time) rnfrom Task) tmp;⼩贴⼠:MySQL8.0 中可以利⽤ ROW_NUMBER(),DENSE_RANK(),RANK() 三个窗⼝函数来实现排序需要注意的⼀点是 as 后的别名,千万不要与前⾯的函数名重名,否则会报错下⾯给出这三种函数实现排名的案例:–三条语句对于上⾯三种排名select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb;select xuehao,score, DENSE_RANK() OVER(order by score desc) as dense_r from scores_tb;select xuehao,score, RANK() over(order by score desc) as r from scores_tb;– ⼀条语句也可以查询出不同排名SELECT xuehao,score,ROW_NUMBER() OVER w AS ‘row_r',DENSE_RANK() OVER w AS ‘dense_r',RANK() OVER w AS ‘r'FROM scores_tbWINDOW w AS (ORDER BY score desc);4.删除重复数据创建测试数据我们创建⼀个⼈员信息表并在⾥⾯插⼊⼀些重复的数据CREATE TABLE Person(id int auto_increment primary key comment ‘主键',Name VARCHAR(20) NULL,Age INT NULL,Address VARCHAR(20) NULL,Sex CHAR(2) NULL);INSERT INTO Person(ID,Name,Age,Address,Sex)VALUES( 1, ‘张三', 18, ‘北京路18号', ‘男' ),( 2, ‘李四', 19, ‘北京路29号', ‘男' ),( 3, ‘王五', 19, ‘南京路11号', ‘⼥' ),( 4, ‘张三', 18, ‘北京路18号', ‘男' ),( 5, ‘李四', 19, ‘北京路29号', ‘男' ),( 6, ‘张三', 18, ‘北京路18号', ‘男' ),( 7, ‘王五', 19, ‘南京路11号', ‘⼥' ),( 8, ‘马六', 18, ‘南京路19号', ‘⼥' );题⽬:数据库中存在重复记录,删除保留其中⼀条我们发现除了⾃增长ID不同以为,有⼏条其他字段都重复的数据出现第⼀步:找出重复的数据mysql>SELECT MAX(ID) ID,Name,Age,Address,SexFROM PersonGROUP BY Name,Age,Address,SexHAVING COUNT(1)>1⼩贴⼠:HAVING将分组后统计出来的数量⼤于1的数据⾏,就是我们要找的重复数据上⾯⽤Max函数或者Min函数均可,只是为了保证取出来的数据的唯⼀性。
一、简单查询简单的SQL查询只包括选择列表、FROM子句和WHERE子句。
它们分别说明所查询列、查询的表或视图、以及搜索条件等。
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email 字段。
SELECT nickname,emailFROM testtableWHERE name='张三'(一) 选择列表选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。
1、选择所有列例如,下面语句显示testtable表中所有列的数据:SELECT *FROM testtable2、选择部分列并指定它们的显示次序查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
例如:SELECT nickname,emailFROM testtable3、更改列标题在选择列表中,可重新指定列标题。
定义格式为:列标题=列名列名列标题如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:SELECT 昵称=nickname,电子邮件=emailFROM testtable4、删除重复行SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。
使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。
5、限制返回的行数使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。
例如:SELECT TOP 2 *FROM testtableSELECT TOP 20 PERCENT *FROM testtable(二) FROM子句FROM子句指定SELECT语句查询及与查询相关的表或视图。
SQLSQL是结构化查询语言(structured query language)。
可提供以下命令:查询数据在表中插入、修改和删除记录建立、修改和删除数据对象控制对数据和数据对象的存取保证数据库具有一致性和完整性一、select子句(例子数据库为:车队管理数据库)<一> 简单查询:选择列表、from 子句、where子句查询结果排序:order by (asc/desc)注:ntext/text/image不能排序变换列名:新列名=列名;列名as 新列名删除或保留重复行:all/distinct限制返回的行数:top n [precent]:看过正面的截图就会明白的^--^<二> from 子句:对象为表或视图,最多为256个表或视图,以逗号分隔。
变换表名或视图名:表名as 别名;表名别名注:select不仅可以从表或视图中检索数据,还能从其他的查询语言的返回集合中查询数据。
<三> where 子句:主要过滤掉不需要的数据行比较:> < >= <= <> !> !< =范围运算符:between…and , not between…and列表运算符:in(1,2…)not in (1,2…)模式匹配符:like , not like可用于char, varchar, text, ntext, datetime, smalldatetime等。
%百分号任意类型和长度(含0个)的字符。
注:若为中文,则用%% _下划线单个任意字符,[ ]方括号指定一个字符、字符串或范围,必须选择其中之一[^] 不是[ ]中的Like ‘%[ % ]%’:表示查询记录中有%的记录空值判断符:is null, is not null逻辑运算符:not, and , or。
注:优先级降低Union查询二、连接查询(业务数据库)通过连接运算符可以实现多个表查询。
SQL查询语句大全语句功能1、数据操作Select --从数据库表中检索数据行和列Insert --向数据库表添加新数据行Delete --从数据库表中删除数据行Update --更新数据库表中的数据2、数据定义Create TABLE --创建一个数据库表Drop TABLE --从数据库中删除表Alter TABLE --修改数据库表结构Create VIEW --创建一个视图Drop VIEW --从数据库中删除视图Create INDEX --为数据库表创建一个索引Drop INDEX --从数据库中删除索引Create PROCEDURE --创建一个存储过程Drop PROCEDURE --从数据库中删除存储过程Create TRIGGER --创建一个触发器Drop TRIGGER --从数据库中删除触发器Create SCHEMA --向数据库添加一个新模式Drop SCHEMA --从数据库中删除一个模式Create DOMAIN --创建一个数据值域Alter DOMAIN --改变域定义Drop DOMAIN --从数据库中删除一个域3、数据控制GRANT --授予用户访问权限DENY --拒绝用户访问REVOKE --解除用户访问权限4、事务控制COMMIT --结束当前事务ROLLBACK --中止当前事务SET TRANSACTION --定义当前事务数据访问特征5、程序化SQLDECLARE --为查询设定游标EXPLAN --为查询描述数据访问计划OPEN --检索查询结果打开一个游标FETCH --检索一行查询结果CLOSE --关闭游标PREPARE --为动态执行准备SQL 语句EXECUTE --动态地执行SQL 语句DESCRIBE --描述准备好的查询6、局部变量declare @id char(10)--set @id = '10010001'select @id = '10010001'7、全局变量---必须以@@开头8、IF 语句declare @x int @y int @z intselect @x = 1 @y = 2 @z=3if @x > @yprint 'x > y' --打印字符串'x > y'else if @y > @zprint 'y > z'else print 'z > y'9、CASE 语句use panguupdate employeeset e_wage =casewhen job_level = ’1’ then e_wage*1.08 when job_level = ’2’ then e_wage*1.07 when job_level = ’3’ then e_wage*1.06 else e_wage*1.05end10、WHILE CONTINUE BREAK 语句declare @x int @y int @c intselect @x = 1 @y=1while @x < 3beginprint @x --打印变量x 的值while @y < 3beginselect @c =100*@x+ @yprint @c --打印变量c 的值select @y = @y + 1endselect @x = @x + 1select @y = 1end11、WAITFOR语句--例等待1 小时2 分零3 秒后才执行Select 语句waitfor delay ’01:02:03’select * from employee--例等到晚上11 点零8 分后才执行Select 语句waitfor time ’23:08:00’select * from employee12、Select语句select *(列名) from table_name(表名) where column_name operator valueex:(宿主)select * from stock_information where stockid = str(nid)stockname = 'str_name'stockname like '% find this %'stockname like '[a-zA-Z]%' --------- ([]指定值的范围)stockname like '[^F-M]%' --------- (^排除指定范围)--------- 只能在使用like关键字的where子句中使用通配符)or stockpath = 'stock_path'or stocknumber < 1000and stockindex = 24not stocksex = 'man'stocknumber between 20 and 100stocknumber in(10,20,30)order by stockid desc(asc) --------- 排序,desc-降序,asc-升序order by 1,2 --------- by列号stockname = (select stockname from stock_information where stockid = 4)--------- 子查询--------- 除非能确保内层select只返回一个行的值,--------- 否则应在外层where子句中用一个in限定符select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_nameselect stockname , "stocknumber" = count(*) from table_name group by stockname--------- group by 将表按行分组,指定列中有相同的值having count(*) = 2 --------- having选定指定的组select *from table1, table2where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示table1.id =* table2.id -------- 右外部连接select stockname from table1union [all] ----- union合并查询结果集,all-保留重复行select stockname from table213、insert 语句insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")value (select Stockname , Stocknumber from Stock_table2)---value为select语句14、update语句update table_name set Stockname = "xxx" [where Stockid = 3]Stockname = defaultStockname = nullStocknumber = Stockname + 415、delete语句delete from table_name where Stockid = 3truncate table_name ----------- 删除表中所有行,仍保持表的完整性drop table table_name --------------- 完全删除表16、alter table*** --- 修改数据库表结构alter table database.owner.table_name add column_name char(2) null .....sp_help table_name ---- 显示表已有特征create table table_name (name char(20), age smallint, lname varchar(30))insert into table_name select ......... ----- 实现删除列的方法(创建新表)alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束17、常用函数----统计函数----AVG --求平均值COUNT --统计数目MAX --求最大值MIN --求最小值SUM --求和--AVGuse panguselect avg(e_wage) as dept_avgWagefrom employeegroup by dept_id--MAX--求工资最高的员工姓名use panguselect e_namefrom employeewhere e_wage =(select max(e_wage)from employee)--STDEV()--STDEV()函数返回表达式中所有数据的标准差--STDEVP()--STDEVP()函数返回总体标准差--VAR()--VAR()函数返回表达式中所有值的统计变异数--VARP()--VARP()函数返回总体变异数----算术函数----/***三角函数***/SIN(float_expression) --返回以弧度表示的角的正弦COS(float_expression) --返回以弧度表示的角的余弦TAN(float_expression) --返回以弧度表示的角的正切COT(float_expression) --返回以弧度表示的角的余切/***反三角函数***/ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角ATAN2(float_expression1,float_expression2)--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角DEGREES(numeric_expression)--把弧度转换为角度返回与表达式相同的数据类型可为--INTEGER/MONEY/REAL/FLOAT 类型RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为--INTEGER/MONEY/REAL/FLOAT 类型EXP(float_expression) --返回表达式的指数值LOG(float_expression) --返回表达式的自然对数值LOG10(float_expression)--返回表达式的以10 为底的对数值SQRT(float_expression) --返回表达式的平方根/***取近似值函数***/CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT 类型SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型PI() --返回值为π即3.1415926535897936RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数18、字符串函数ASCII() --函数返回字符表达式最左端字符的ASCII 码值CHAR() --函数用于将ASCII 码转换为字符--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值LOWER() --函数把字符串全部转换为小写UPPER() --函数把字符串全部转换为大写STR() --函数把数值型数据转换为字符型数据LTRIM() --函数把字符串头部的空格去掉RTRIM() --函数把字符串尾部的空格去掉LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置SOUNDEX() --函数返回一个四位字符码--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0值DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异 --0 两个SOUNDEX 函数返回值的第一个字符不同--1 两个SOUNDEX 函数返回值的第一个字符相同--2 两个SOUNDEX 函数返回值的第一二个字符相同--3 两个SOUNDEX 函数返回值的第一二三个字符相同--4 两个SOUNDEX 函数返回值完全相同QUOTENAME() --函数返回被特定字符括起来的字符串/*select quotename('abc', '{') quotename('abc')运行结果如下----------------------------------{{abc} [abc]*/REPLICATE() --函数返回一个重复character_expression 指定次数的字符串/*select replicate('abc', 3) replicate( 'abc', -2)运行结果如下----------- -----------abcabcabc NULL*/REVERSE() --函数将指定的字符串的字符排列顺序颠倒REPLACE() --函数返回被替换了指定子串的字符串/*select replace('abc123g', '123', 'def')运行结果如下----------- -----------abcdefg*/SPACE() --函数返回一个有指定长度的空白字符串STUFF() --函数用另一子串替换字符串指定位置长度的子串19、数据类型转换函数----CAST() 函数语法如下CAST() (<expression> AS <data_ type>[ length ])CONVERT() 函数语法如下CONVERT() (<data_ type>[ length ], <expression> [, style])select cast(100+99 as char) convert(varchar(12), getdate())运行结果如下------------------------------ ------------199 Jan 15 200020、日期函数----DAY() --函数返回date_expression 中的日期值MONTH() --函数返回date_expression 中的月份值YEAR() --函数返回date_expression 中的年份值DATEADD(<datepart> ,<number> ,<date>)--函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期DATEDIFF(<datepart> ,<number> ,<date>)--函数返回两个指定日期在datepart 方面的不同之处DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间21、系统函数----APP_NAME() --函数返回当前执行的应用程序的名称COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值COL_LENGTH(<'table_name'>, <'column_name'>) --函数返回表中指定字段的长度值COL_NAME(<table_id>, <column_id>) --函数返回表中指定字段的名称即列名DATALENGTH() --函数返回数据表达式的数据的实际长度DB_ID(['database_name']) --函数返回数据库的编号DB_NAME(database_id) --函数返回数据库的名称HOST_ID() --函数返回服务器端计算机的名称HOST_NAME() --函数返回服务器端计算机的名称IDENTITY(<data_type>[, seed increment]) [AS column_name])--IDENTITY() 函数只在Select INTO 语句中使用用于插入一个identity column列到新表中/*select identity(int, 1, 1) as column_nameinto newtablefrom oldtable*/ISDATE() --函数判断所给定的表达式是否为合理日期ISNULL(<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换ISNUMERIC() --函数判断所给定的表达式是否为合理的数值NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值NULLIF(<expression1>, <expression2>)--NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值22、数学函数1.绝对值S:select abs(-1) valueO:select abs(-1) value from dual2.取整(大)S:select ceiling(-1.001) valueO:select ceil(-1.001) value from dual3.取整(小)S:select floor(-1.001) valueO:select floor(-1.001) value from dual4.取整(截取)S:select cast(-1.002 as int) valueO:select trunc(-1.002) value from dual5.四舍五入S:select round(1.23456,4) value 1.23460O:select round(1.23456,4) value from dual 1.23466.e为底的幂S:select Exp(1) value 2.7182818284590451O:select Exp(1) value from dual 2.718281827.取e为底的对数S:select log(2.7182818284590451) value 1O:select ln(2.7182818284590451) value from dual; 1 8.取10为底对数S:select log10(10) value 1O:select log(10,10) value from dual; 19.取平方S:select SQUARE(4) value 16O:select power(4,2) value from dual 1610.取平方根S:select SQRT(4) value 2O:select SQRT(4) value from dual 211.求任意数为底的幂S:select power(3,4) value 81O:select power(3,4) value from dual 8112.取随机数S:select rand() valueO:select sys.dbms_random.value(0,1) value from dual;13.取符号S:select sign(-8) value -1O:select sign(-8) value from dual -1----------数学函数14.圆周率S:Select PI() value 3.1415926535897931O:不知道15.sin,cos,tan 参数都以弧度为单位例如:select sin(PI()/2) value 得到1(SQLServer)16.Asin,Acos,Atan,Atan2 返回弧度17.弧度角度互换(SQLServer,Oracle不知道) DEGREES:弧度-〉角度RADIANS:角度-〉弧度---------数值间比较18. 求集合最大值S:select max(value) value from(select 1 valueunionselect -2 valueunionselect 4 valueunionselect 3 value)aO:select greatest(1,-2,4,3) value from dual19. 求集合最小值S:select min(value) value from(select 1 valueunionselect -2 valueunionselect 4 valueunionselect 3 value)aO:select least(1,-2,4,3) value from dual20.如何处理null值(F2中的null以10代替)S:select F1,IsNull(F2,10) value from TblO:select F1,nvl(F2,10) value from Tbl--------数值间比较21.求字符序号S:select ascii('a') valueO:select ascii('a') value from dual22.从序号求字符S:select char(97) valueO:select chr(97) value from dual23.连接S:select '11'+'22'+'33' valueO:select CONCAT('11','22')||33 value from dual 23.子串位置 --返回3S:select CHARINDEX('s','sdsq',2) valueO:select INSTR('sdsq','s',2) value from dual23.模糊子串的位置 --返回2,参数去掉中间%则返回7S:select patindex('%d%q%','sdsfasdqe') valueO:oracle没发现,但是instr可以通过第四霾问刂瞥鱿执问?BR>select INSTR('sdsfasdqe','sd',1,2) value from dual 返回624.求子串S:select substring('abcd',2,2) valueO:select substr('abcd',2,2) value from dual25.子串代替返回aijklmnefS:Select STUFF('abcdef', 2, 3, 'ijklmn') valueO:Select Replace('abcdef', 'bcd', 'ijklmn') value from dual26.子串全部替换S:没发现O:select Translate('fasdbfasegas','fa','我' ) value from dual27.长度S:len,datalengthO:length28.大小写转换 lower,upper29.单词首字母大写S:没发现O:select INITCAP('abcd dsaf df') value from dual30.左补空格(LPAD的第一个参数为空格则同space函数)S:select space(10)+'abcd' valueO:select LPAD('abcd',14) value from dual31.右补空格(RPAD的第一个参数为空格则同space函数)S:select 'abcd'+space(10) valueO:select RPAD('abcd',14) value from dual32.删除空格S:ltrim,rtrimO:ltrim,rtrim,trim33. 重复字符串S:select REPLICATE('abcd',2) valueO:没发现34.发音相似性比较(这两个单词返回值一样,发音相同)S:Select SOUNDEX ('Smith'), SOUNDEX ('Smythe')O:Select SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dualSQLServer中用Select DIFFERENCE('Smithers', 'Smythers') 比较soundex的差返回0-4,4为同音,1最高23、日期函数35.系统时间S:select getdate() valueO:select sysdate value from dual36.前后几日直接与整数相加减37.求日期S:select convert(char(10),getdate(),20) valueO:select trunc(sysdate) value from dualselect to_char(sysdate,'yyyy-mm-dd') value from dual 38.求时间S:select convert(char(8),getdate(),108) valueO:select to_char(sysdate,'hh24:mm:ss') value from dual 39.取日期时间的其他部分S:DATEPART 和 DATENAME 函数(第一个参数决定)O:to_char函数第二个参数决定参数---------------------------------下表需要补充year yy, yyyyquarter qq, q (季度)month mm, m (m O无效)dayofyear dy, y (O表星期)day dd, d (d O无效)week wk, ww (wk O无效)weekday dw (O不清楚)Hour hh,hh12,hh24 (hh12,hh24 S无效)minute mi, n (n O无效)second ss, s (s O无效)millisecond ms (O无效)----------------------------------------------40.当月最后一天S:不知道O:select LAST_DAY(sysdate) value from dual41.本星期的某一天(比如星期日)S:不知道O:Select Next_day(sysdate,7) vaule FROM DUAL;42.字符串转时间S:可以直接转或者select cast('2004-09-08'as datetime) valueO:Select To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;43.求两日期某一部分的差(比如秒)S:select datediff(ss,getdate(),getdate()+12.3) valueO:直接用两个日期相减(比如d1-d2=12.3)Select (d1-d2)*24*60*60 vaule FROM DUAL;44.根据差值求新的日期(比如分钟)S:select dateadd(mi,8,getdate()) valueO:Select sysdate+8/60/24 vaule FROM DUAL;45.求不同时区时间S:不知道O:Select New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;-----时区参数,北京在东8区应该是Ydt-------AST ADT 大西洋标准时间BST BDT 白令海标准时间CST CDT 中部标准时间EST EDT 东部标准时间GMT 格林尼治标准时间HST HDT 阿拉斯加—夏威夷标准时间MST MDT 山区标准时间NST 纽芬兰标准时间PST PDT 太平洋标准时间YST YDT YUKON标准时间。
SQL中重复数据的查询与删除========第一篇=========在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句:select data_guid from adam_entity_datas a where a.rowid > (select min(b.rowid) from adam_entity_datas b where b.data_guid = a.data_guid)如果表中有大量数据,但是重复数据比较少,那么可以用下面的语句提高效率select data_guid from adam_entity_datas where data_guid in (select data_guid from adam_entity_datas group by data_guid having count(*) > 1)此方法查询出所有重复记录了,也就是说,只要是重复的就选出来,下面的语句也许更高效select data_guid from adam_entity_datas where rowid in (select rid from (select rowid rid,row_number()over(partition by data_guid order by rowid) m fromadam_entity_datas) where m <> 1)目前只知道这三种比较有效的方法。
第一种方法比较好理解,但是最慢,第二种方法最快,但是选出来的记录是所有重复的记录,而不是一个重复记录的列表,第三种方法,我认为最好。
========第二篇=========select usercode,count(*) from ptype group by usercode having count(*) >1========第三篇=========找出重复记录的ID:select ID from( select ID ,count(*) as Cntfrom 要消除重复的表group by ID) T1where t>1删除数据库中重复数据的几个方法数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……方法一declare @max integer,@id integerdeclare cur_rows cursor local for select 主字段,count(*) from表名 group by 主字段 having count(*) > 1open cur_rowsfetch cur_rows into @id,@maxwhile @@fetch_status=0beginselect @max = @max -1set rowcount @maxdelete from 表名 where 主字段 = @idfetch cur_rows into @id,@maxendclose cur_rowsset rowcount 0方法二有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
1、对于第一种重复,比较容易解决,使用select distinct * from tableName就可以得到无重复记录的结果集。
如果该表需要删除重复的记录,可以按以下方法删除select distinct * into #Tmp from tableNamedrop table tableNameselect * into tableName from #Tmpdrop table #Tmp2、这类重复问题通常要求保留重复记录中的第一条记录,*作方法如下假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集select identity(int,1,1) as autoID, * into #Tmp fromtableNameselect min(autoID) as autoID into #Tmp2 from #Tmp group byName,autoIDselect * from #Tmp where autoID in(select autoID from#tmp2)最后一个select即得到了Name,Address不重复的结果集更改数据库中表的所属用户的两个方法大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了,原因是建表的时候采用了当时的数据库用户……========第四篇=========如何查询数据库中的重复记录?比如说有个表中的数据是这样:---------aaabbc---------查询出的结果是:记录数量a 3b 2c 1怎样写这个SQL语句?-----------------------select distinct(name),count(*) from tabname group by name;-------------------------------------想出来了,这样就可以排序了。
select a1,count(a1) as total from tablename group by a1 order by total desc--------------------------------------select distinct(a1),count(a1) as total from tablename group by a1 order by total desc加个distinct更有效率--------------------------------------------------------------select p.*, m.* from table1 p left join table2 m on p.item1=m.item2 wherep.item3='#$#@%$@' order by p.item3 asc limit 10就类似这么写========第五篇=========如何查找数据库中的重复记录? 能在Access中用的方法----------------------------------------------------------------------select *from 表 A inner join (select 字段1,字段2 from 表 group by 字段1,字段2 having Count(*)>1) B on A.字段1=B.字段1 and A.字段2=B.字段2--------------------------------------------------------问题:根据其中几个字段判断重复,只保留一条记录,但是要显示全部字段,怎么查询,谢谢!!比如字段1 字段2 字段3 字段4a b c 1a b c 1a b d 2a b d 3b b d 2想得到的结果为a b c 1a b d 2(或者3)b b d 2说明,根据字段1,2,3组合不重复,字段4 不考虑,得到了3个记录但是也要显示字段4。
方法一:可以用临时表的方法来解决:CurrentProject.Connection.Execute "drop table temptable"CurrentProject.Connection.Execute "select * into temptable from 表2 where 1=2" CurrentProject.Connection.Execute "insert into temptable(字段1,字段2,字段3) SELECT DISTINCT 表2.字段1, 表2.字段2, 表2.字段3 FROM 表2;"CurrentProject.Connection.Execute "UPDATE temptable INNER JOIN 表2 ON (表2.字段1 = temptable.字段1) AND (表2.字段2 = temptable.字段2) AND (表2.字段3 = temptable.字段3) SET temptable.字段4 = [表2].[字段4];"方法二:可以直接使用一个SELECT查询筛选出需要的数据:可以假定第四字段都选值最小的SELECT [1],[2], [3], Min([4]) AS Min4FROM 表1GROUP BY 表1.[1], 表1.[2], 表1.[3];问题:表2id NAME r1 r21 1 w ee1 1 1 12321 2 123 1231 2 12 4341 2 123 1232 1 123 123ID 为数值,NAME 为字符。
每条记录没有唯一标识。
要求取得 ID 和 NAME 合并后不重复的记录,如有重复保留其中一条即可,但要显示所有记录。
回答:SELECT a.*, (select top 1 r1 from 表2 as a1 where a1.id=a.id and =) AS r1, (select top 1 r2 from 表2 as a2 where a2.id=a.id and =) AS r2FROM [SELECT DISTINCT 表2.id, 表FROM 表2]. AS a;SELECT a.*, dlookup("r1","表2","id=" & a.id & " and name='"& & "'") AS r1, dlookup("r2","表2","id=" & a.id & " and name='"& & "'") AS r2FROM [SELECT DISTINCT 表2.id, 表FROM 表2]. AS a;注意,上述代码中由于没有唯一标识列,因此显示的 R1 R2 的先后次序无从确定,一般是按输入的先后顺序,但是微软没有官方资料说明到底按哪个顺序,请网友注意。