SQL Story摘录(一)————简单查询初探

在CSDN上回贴时,我总是苦口婆心地劝告楼上楼下的朋友们多用联接。可响应甚微。往往一个简单的功能,也一定要写成子查询或游标,弄得非常复杂冗长。的确,这样写对于初学者来说,费力不费脑,思路比较好理解。所以往往得分的也是这些回贴。可事实上,如果你真正熟悉了SQL的编程风格,你会明白,联接查询才是最直接、最清晰、最有力的方法,而更好的办法就是无招胜有招,一条简单查询结束战斗。下面我举几个例子来证明一下这个观点。
例1-1、重复记录的查询和处理
总有一些朋友在网上问,一个表中,有重复的记录,怎么办?当然,一个设计风格良好的关系型数据库,每个表都应该有主键、有唯一索引,所以压根就不该有重复记录。不过有时还是会出现不该出现的事,比如“七.七事变”,比如“9.11”……咳咳,其实我想说的是,有时会有人根本没有数据库的概念,他就不知道主键是什么,或者随意建了一个自动标识的ID列充数(其实这也没什么,没有人天生会设计数据库,关键是愿不愿承认自己的不足并且改进)。更常见的是我们的数据可能来自一些电子表格或文本文件,导入到数据库中时才发现问题。
这里,我们建立一个表,表示某商店的存货。我有意没有加入任何索引和约束,这样,它会很容易地出问题(就像实验室里的裸鼠)。
CREATE TABLE PRODUCT(
ID INT, PNAME CHAR(20),
PRICE MONEY, NUMBER INT,
PDESCRIPTION VARCHAR(50))
现在,我们可以向其中插入一些数据:
IDPNAMEPRICENUMBERPDESCRIPTION
1Apple 123000

1Apple 123000

2Banana 16.997600

3Olive 25.224500

4Orange 15.995500

4Coco Nut 40.992000

5Pineapple 302500

6Olive 25.223000

这里有一些明显的问题,前两行完全一样,这样的重复数据一点意义都没有,只会添乱。InterBase还好点,在它的IBConsole中可以直接修改它们。可在SQL Server中,系统根本无法区分这两行,当我们试图对其中任一行修改时会收到一个错误信息。事实上,这也是一个关系型数据库应有的反应。那我们应该怎么办呢?
事实上,处理它的方法比找出错误数据还简单,联接查询都用不到。用一条SQL语句
SELECT DISTINCT * FROM PRODUCT
就可以把重复数据压缩掉,生成一个包括正常数据的数据集。结果如下:
IDPNAMEPRICENUMBERPDESCRIPTION
1Apple 123000

2Banana 16.997600

3Olive 25.224500

4Orange 15.995500

4Coco Nut 40.992000

5Pineapple 302500

6Olive 25.223000

对于支持SELECT …… INTO……FROM语句的数据库来说,这样一句
SELECT DISTINCT * INTO NewTable FROM PRODUCT
就可把数据导入到一个新表(NewTable )中。或者可以用INERT INTO …… SELECT DISTINCT * FROM ……把它导入到一个现有的表中。总之有了正确的数据集,再如何处理就好办了。相信大家知道这个合并重复数据的关键字DISTINCT后,再不会用游标来处理重复数据了吧。
这是第一步,有时可能我们不想一下把它们压缩掉,而是想先看看到底谁出了问题。好的,用下面的语句可以找出重复的记录,最右边一列“ROW_COUNT”表示这行数据在表中重复的次数:
SELECT ID, PNAME, PRICE, NUMBER, PDESCRIPTION, COUNT(*) ROW_COUNT
FROM PRODUCT
GROUP BY ID, PNAME, PRICE, NUMBER, PDESCRIPTION
HAVING COUNT(*) > 1
IDPNAMEPRICENUMBERPDESCRIPTIONROW_COUNT
1Apple123000NULL2

 

(所影响的行数为 1 行)
其实就是关键字GROUP BY …… HAVING和统计函数COUNT的一个简单运用,记得在GROUP BY 后面写上完整的字段列表。这表示我们要的是那些完全一致的数据,每个字段都一样。
PRODUCT表中的数据很多时,用前面的方法直接生成正确的数据集效率很低。现在有了这个结果集,我们可以高效率工作了。现在,我们用
SELECT ID, PNAME, PRICE, NUMBER, PDESCRIPTION
FROM PRODUCT
GROUP BY ID, PNAME, PRICE, NUMBER, PDESCRIPTION
HAVING COUNT(*) > 1
把重复的数据生成为一个经过压缩的正确数据集,用前述的方法导出到一个临时表中,然后用
DELETE FROM PRODUCT
WHERE ID IN (
SELECT ID
FROM PRODUCT
GROUP BY ID, PNAME, PRICE, NUMBER, PDESCRIPTION
HAVING COUNT(*) > 1
)
把重复数据从PRODUCT表中删除,再把压缩好的数据插入PRODUCT。现在PRODUCT表中不再有完全重复,不可标识的数据了。

时间: 2024-07-31 05:50:12

SQL Story摘录(一)————简单查询初探的相关文章

SQL Story摘录(二)————联接查询初探

例1-2.键值重复的信息现在看一下压缩掉重复信息的PRODUCT表ID PNAME PRICE NUMBER PDESCRIPTION 1Apple 123000NULL2Banana 16.997600NULL3Olive 25.224500NULL4Coco Nut 40.992000NULL4Orange 15.995500NULL5Pineapple 302500NULL6Olive 25.223000NULL 这里还有几个有问题的地方.表中Coco Nut和Orange的ID都是4,I

SQL Server简单查询示例汇总_MsSql

前言 本节我们讲讲一些简单查询语句示例以及需要注意的地方,简短的内容,深入的理解. EOMONTH 在SQL Server 2012的教程示例中,对于Sales.Orders表的查询,需要返回每月最后一天的订单.我们普遍的查询如下 USE TSQL2012 GO SELECT orderid, orderdate, custid, empid FROM Sales.Orders WHERE orderdate = DATEADD(MONTH, DATEDIFF(MONTH, '19991231'

Oracle中简单查询、限定查询、数据排序SQL语句范例和详细注解_oracle

一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统.ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言. Oracle数据库之所以发展的很好,主要也是因为Oracle是全世界最早采用SQL语句的数据库产品. SQL功能强大,概括起来,它可以分成以下几组: 复制代码 代码如下: DML(Data Manipulation Language) 数据操作语言,用于

详解SQL Server的简单查询语句_MsSql

前言 对于一些原理性文章园中已有大量的文章尤其是关于索引这一块,我也是花费大量时间去学习,对于了解索引原理对于后续理解查询计划和性能调优有很大的帮助,而我们只是一些内容进行概括和总结,这一节我们开始正式步入学习SQL中简单的查询语句,简短的内容,深入的理解. 简单查询语句 所有复杂的语句都是由简单的语句组成基本都是由SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY等组成,当然还包括一些谓词等等.比如当我们要查询某表中所有数据时我们会像如下进行. SELECT

详解SQL Server的简单查询语句

前言 对于一些原理性文章园中已有大量的文章尤其是关于索引这一块,我也是花费大量时间去学习,对于了解索引原理对于后续理解查询计划和性能调优有很大的帮助,而我们只是一些内容进行概括和总结,这一节我们开始正式步入学习SQL中简单的查询语句,简短的内容,深入的理解. 简单查询语句 所有复杂的语句都是由简单的语句组成基本都是由SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY等组成,当然还包括一些谓词等等.比如当我们要查询某表中所有数据时我们会像如下进行. SELECT

SQL Server简单查询示例汇总

前言 本节我们讲讲一些简单查询语句示例以及需要注意的地方,简短的内容,深入的理解. EOMONTH 在SQL Server 2012的教程示例中,对于Sales.Orders表的查询,需要返回每月最后一天的订单.我们普遍的查询如下 USE TSQL2012 GO SELECT orderid, orderdate, custid, empid FROM Sales.Orders WHERE orderdate = DATEADD(MONTH, DATEDIFF(MONTH, '19991231'

使用Microsoft SQL Server 2000的XML查询

server|xml 由于XML本身的诸多优点,XML技术已被广泛的使用,目前的好多软件技术同XML紧密相关,比如微软的.net 平台对xml提供了强大的支持,提供System.Xml以及其子命名空间下的类型来操作xml.Ado.net通过核心类型DataSet出色的把关系型数据库同xml进行了紧密集成.由于平常许多开发人员使用.net 来操作Sql server的到数据集后再转换成xml,所以往往忽略Transact-SQL查询生成XML数据的强大功能.对于一些项目使用XML查询直接通过SQL

SQL Story摘录(四)————信息挖掘初步

 写这本书的最初想法,来自于在第一个公司工作时,与同事的交流和学习.不过发布这本书的导火索,却在于一次在CSDN上读到一篇关于最新信息的报表问题的贴子.贴子中的问题可以用子查询和联接两种方式完成.由于条件所限,我不能详细解答,由此发贴的朋友不能理解我的本意,让我心生遗憾.所以决定将写书的想法付诸行动,并将这本书贴在CSDN上,与大家一起交流,共同进步.今天正好又见到类似于当日的问题,心生感触,决定在这里把它详细讨论一下.在实际工作中,我们有时会需要建立数据表来存储变动的数据,并由这些数据统计出我

SQL Story摘录(八)————数据抽取

数据 数据抽取 理论上的关系型数据库,数据是以关系的形式存在.通常我们都可以把它们视为一种集合.这样,数据一般是以无序的形式存在的.这种做法的好处自不用多加讨论了,不过我们也得承认,有时这样也会带给我们一些麻烦.我最近就遇到这么一件. 我在网上遇上我的一个老同学,他提出了这样一个问题.有一个表(假设就叫myTable),表中有三个整型字段(假设就叫A11,A12,A13),其上有一个唯一键约束.现在他想要在这个表的数据中取一些样品.他希望从中A13的各个取值中,各取一条记录.然后我问他,对A11