Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2362595
  • 博文数量: 609
  • 博客积分: 10061
  • 博客等级: 上将
  • 技术积分: 5920
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-25 08:30
文章分类

全部博文(609)

文章存档

2010年(13)

2009年(39)

2008年(558)

我的朋友

分类: Mysql/postgreSQL

2008-09-01 10:43:57

Mysql入门系列:MySQL教程(10)



  如果以这种方法对值计数, GROUP BY 子句是必须的;它告诉MySQL在对值计数之前怎样进行聚集。如果将其省去,则要出错。COUNT(*) 与GROUP BY 一起用来对值进行计数比分别对每个不同的列值进行计数有更多的优点,这些优点是:

  ■ 不必事先知道要汇总的列中有些什么值。

  ■ 不用编写多个查询,只需编写单个查询即可。

  ■ 用单一查询就可以得出所有结果,因此可以对结果进行排序。

  前两个优点对于更方便地表示查询很重要。第三个优点也较为重要,因为它提供了显示

  结果的灵活性。在使用GROUP BY 子句时,其结果是在要分组的列上进行排序的,但是可以

  使用ORDER BY 来按不同的次序进行排序。例如,如果想得到各州产生的总统人数,并按产

  生人数最多的州优先排出,可以如下使用ORDER BY 子句:



  如果希望进行排序的列是从计算得出的,则可以给该列一个别名,并在ORDER BY 子句中引用这个别名。前面的查询说明了这一点; COUNT(*) 列的别名为count。引用这样的列的另一种方法是引用它在输出结果中的位置。前面的查询可编写如下:


  我不认为按位置引用列易读。如果增加、删除或重新排序输出列,必须注意检查ORDER BY子句,并且如果列号改变后还得记住它。别名就不存在这种问题。如果想与计算出来的列一道使用GROUP BY,正如ORDER BY 一样,应该利用别名或列位置来引用它。下面的查询确定在一年的每个月中出生的总统人数:



  如果不想用LIMIT 子句来限制查询输出,而是利用查找特定的COUNT( ) 值来达到这个目的,可使用HAVING 子句。下面的查询给出了产生两个以上总统的州:


   从更为普遍的意义上说,这是一种在要查找的列中重复值时执行的查询类型。HAVING 类似于WHERE,但它是在查询结果已经选出后才应用的,用来缩减服务器实际送到客户机的结果。除了COUNT( ) 外还有许多汇总函数。MIN( )、MAX( )、SUM( ) 和AVG( ) 函数在确定列的最大、最小、总数和平均值时都非常有用,甚至可以同时使用它们。下面的查询得出给定的测试和测验的各种数字特性。它还给出有多少学分参与了每个值的计算(有的学生可能缺旷或未计入)。


  当然,如果您知道这些信息是来自测验的还是测试的,则它们就会更有意义。但是,为了产生那样的信息,还需要参考event 表;我们将在下一节“从多个表中检索信息”讨论这个查询。汇总信息是很有意思的,因为它们是那么有用,但不太好控制,容易走样。请看下列查询:

   此查询选择已经去世的总统,按出生地对他们进行分组,并计算出他们逝世时的年龄,计算出平均年龄(每个州的),然后按平均年龄进行排序。换句话说,此查询按所出生地确定已故总统的平均寿命。但这说明了什么呢?它仅仅说明您可写该查询,当然并不说明此查询是否值得写。并不是用一个数据库可以做的所有事情都同样有意义;但是,人们有时在发现可以利用自己的数据库进行查询时感到很开心。这可能说明关于转播运动会的不断增加的深奥的(空洞的)统计数据在过去几年里正在不断增多的原因。运动统计者可以使用他们的数据库来计算出某个队的历史纪录,而这些数字你可能感兴趣,也可能毫无兴致。

  9. 从多个表中检索信息

   到目前为止,我们所编写的查询都是从单个表中得到数据的。现在,我们将进行一件更为有趣的工作。以前笔者曾经提到过,关系DBMS 的强大功能在于它能够将一样东西与另一样东西相关联,因为这样使得能够结合多个表中的信息来解答单个表不能解答的问题。本节介绍怎样编写这种查询。在从多个表中选择信息时,需要执行一种称为连接( j o i n)的操作。这是因为需要将一个表中的信息与其他表中的信息相连接来得出查询结果。即通过协调各表中的值来完成这项工作。

   我们来研究一个例子。在前面的“学分保存方案”小节中,给出了一个检索特定日期的测验或测试学分的查询,但没有解释。现在可以进行解释了。这个查询实际涉及到三种连接方法,因此我们分两步进行研究。第一步,我们构造一个对特定日期的学分进行选择的查询,如下所示:


阅读(864) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~