内容显示页
 
类别:数据库+SQL | 浏览(370) | 2007-7-22 22:37:52 | 关闭广告

柳永法(yongfa365)'Blog学习SQL已经有5年了,正式使用已经一年多了,使用过程中总感觉:很简单的东西写起来还是得一再查手册,所以感觉很郁闷,总是阻碍进程。所以计划从头学起,才发现,学校学的东西太多是没用的了,连LEFT JOIN都没学过,请教了很多人才知道有这么一个表达式,感觉要学的东西太多了,先认真把这本入门级书看完。

第6章 分组和聚合数据

GROUP BY 子句根据它前面的参数集 分组结果。当处理GROUP BY 子句时,数据库系统首先基于FORM和WHERE子句创建一个临时结果集。也就是说先执行SELECT * FROM TABLE WHERE A=B,然后才GROUP BY

根据SQL规则,不允许 组合 聚合函数 和 非聚合 的列。如:SELECT A,COUNT(B) FROM TABLE ,可以利用GROUP BY 子句改变这种情形,如:SELECT A,COUNT(B) FROM TABLE GROUP BY A

SELECT COUNT(*) FROM TABLE 与 SELECT COUNT(列名) FROM TABLE 的结果是不一样的,COUNT(*)这是统计所有记录的所有列包括NULL的数目,而COUNT(列名),只统计结果集中ID列的非NULL值的数目。永远有这样的关系COUNT(*)>=COUNT(列名)

聚合函数SUM(),AVG(),MAX(),MIN()。其中MAX()与MIN()函数不同与SUM()函数和AVG()函数,MAX()与MIN()可用与除了数值数据类型这外的其他数据类型,例如最早或最近的日期或时间,或字符型的字段基于字母表顺序。

尽管SELECT语句中列举的所有列也都必须出现在GROUP BY子句中,如果不是的话便会出错,但是像MAX()与MIN()等,这样的聚合函数来说并不是这样的,因此它们不用出现在SELECT 语句中。

HAVING 子句允许您指定条件来过滤最终结果中的分组,它紧跟在GROUP BY 语句之后。如:SELECT City FROM Citys GROUP BY City HAVING COUNT(CityNO)>=3

本章小结:
 本章主要介绍如何汇总和聚合数据,而不是获得基于单个记录的结果。这个概念的中心是GROUP BY字句,该子句完成以下功能:
 使得结果基于数据的分组
 当与SQL的聚合函数一起使用时,它允许聚合和汇总这些分组
本章介绍了多个聚合函数,包括以下几个:
 COUNT(),它统计了结果集中记录的数目。
 SUM(),它将结果集中每个记录的指定列或表达式的值累加在一起。SUM()函数公能处理数值数据类型。
 AVG(),它寻找结果集中每个记录的特定列的平均值。它与SUM()函数一样,仅能处理数值数据类型。
 MAX()和MIN(),它们分别寻找结果集中某列的最大值和最小值。MAX()和MIN()能够处理日期、时间、字符和数值数据类型。

最后本章介绍了having了句,它使用各种条件过滤结果的分组,非常类似于FROM语句中的WHERE子句。但WHERE了句过滤的是记录,而HAVING子句过滤的是GROUP BY子句找到的分组。

select 电影类型,MAX(级别) 最高级别,MIN(级别) 最低级别 from 电影库 group by 电影类型


第7章 从不同的表中选择数据

网站会员与各种管理员都可以发布信息到INFO表里,网站会员在USERS表里,管理员在ADMIN表里。
内部联合:查找出所有网站会员发布的信息

SELECT * FROM info INNER JOIN users ON info.username=users.username

外部联合:查找出所有网站会员及各类管理员发布的信息,如果是会员就显示会员信息,如果是管理员发布的信息显示网站信息。

SELECT * FROM info LEFT OUTER JOIN users ON info.username=users.username

这两个的结果不同处在于,外部联合时也会显示所有管理员发布的信息,但没有从USERS表里找出用户信息,所以都为NULL,在程序中可以设定,如果为空就显示网站信息。

在左外部联合中,LEFT OUTER JOIN ,OUTER JOIN语句左边表中的所有记录都被返回在结果中,无论是否在 OUTER JOIN语句右边的表中是否存在一个匹配记录。
左外部联合的语法如下:
SELECT column_list
FROM left_table LEFT OUTER JOIN right_table
ON condition

笔者在使用中出现一个这个现象,left_table中只有3条数据,而结果却显示了10多条,left_table的内容会重复出现。详细观察了一下,原来上面的话是这样理解的:left_table中的所有记录都被返回,如果right_table出现多次与left_table相匹配,那么就多次返回left_table中的内容。

右外部联合,RIGHT OUTER JOIN 与上边说的LEFT OUTER JOIN,思想上是一样的,就不说了

利用UNION运算符组合结果集

有时候可能需要组合两个完全不同查询的结果。两个查询的结果之间可能不存在链接,您只是想将它们都显示在一个结果集中。
可以使用UNION运算符可以将两个或多个SELECT查询的结果联合到一个结果中,但存在一些基本的规则:
1.每个查询必须产生相同数目的列
2.列的数据类型必须相同(不管你是怎么让它们相同的,比如您想用日期型的regdate里的年,可以year(regdate) as regyear就可以了)

默认情况下,UNION 运算符合并了多个查询,但是仅包含唯一的记录。如果需要集中返回所有的记录,不管它们是否唯一,则需要使用ALL语句,如:
SELECT * FROM ip1 UNION ALL SELECT * FROM ip2 ORDER BY id DESC

实例解析:我有两个IP表,一个基本表,是以前的数据,可能过期,IP1。还有一个新IP表是IP2,两个表字段完全一样,
SELECT * FROM ip1 UNION ALL SELECT * FROM ip2

SELECT * FROM ip1 UNION SELECT * FROM ip2
查询结果是不一样的,第一条语句查询出来的要比第二条查询出来的语句多,因为两个表里可能有重复的内容。
但如果我为各表都加上一个自动编号,IP2自动编号起点设的IP1有自动编号最大值大的话,两条语句查询结果就一样了,因为自动编号是不一样的,所以不完全相同,记录不会被合并。

可以通过添加一个 ORDER BY 子句来排序结果。但是,仅可以添加一个 ORDER BY 子句,并且它必须位于 SELECT 语句的最后面。另外,在 ORDER BY 子句中仅可以使用第一个SELECT语句中的列名。

第8章 子查询


引用本页地址:http://www.yongfa365.com/item/Beginning-SQL-Diary-yongfa365.html
 
 
相关链接
 
网友评论:
姓名: 记住我
网址:
邮箱:
内容:
验证码:  验证码图片看不清? 换张图试试
 
   
 
 
文章分类
 
   

Power by :柳永法(yongfa365)'Blog | Model by :hibaidu | CSS by:众网友 | 京ICP备07011491号  QQ:64049027  E-mail:64049027qq.com

本空间赞助商:北京中科兴联信息技术有限公司