澳门二十一点游戏赌场 澳门二十一点游戏赌场
    您现在的位置:首页 >> 软件应用 >> SQL教程 >> 内容

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

    时间:2012/7/23 20:02:29 点击:

      核心提示:在CSDN上回贴时,我总是苦口婆心地劝告楼上楼下的朋友们多用联接。可响应甚微。往往一个简单的功能,也一定要写成子查询或游标,弄得非常复杂冗长。的确,这样写对于初学者来说,费力不费脑,思路比较好理解。所...
    在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表中的数据很多时,用前面的方法直接生成正确的数据集效率很低|<< << < 1 2 > >> >>|

    Tags:SQ QL LS ST 
    作者:佚名 来源:不详

    共有评论 0相关评论
    发表我的评论
    • 大名:
    • 内容:
  • 澳门二十一点游戏赌场(www.0769online.com) © 2019 版权所有 All Rights Reserved. 邮箱:103150@qq.com 业务QQ:103150 手机:13549753683

    Power By Laoy8 SQL 3.0SP1 粤ICP备10098668号
  •