本节书摘来自异步社区出版社《七周七数据库》一书中的第2章,第2.3节,作者: 【美】Eric Redmond,更多章节内容可以访问云栖社区“异步社区”公众号查看。
七周七数据库昨天,我们看到了如何定义数据库表,然后插入数据,更新和删除行,以及读数据。今天我们将更深入探讨PostgreSQL查询数据的各种方法。
我们将看到如何对相似的值归类,在服务器端执行代码,并使用视图(view)和规则(rule)创建自定义接口。在这一天的最后,我们将利用PostgreSQL的一个扩展包翻转表头。
聚合查询按照一些共同的标准将多行的结果分组。它可以简单到统计一张表的行数,或计算某些数值列的平均值。它们是强大的SQL工具,也很有趣。
我们来尝试一些聚合函数,但在此之前我们需要在数据库中有更多的数据。在countries表中加入你自己的国家,在cities表中加入你自己的城市,并以自己的地址作为场地(这里称为My Place),然后添加一些记录到events表中。
下面是一个简单的SQL技巧:在子查询里通过更加可读的title来获得venue_id,而不用直接给出venue_id。如果Moby(白鲸)正在Crystal Ballroom上演,可以这样设置venue_id:
INSERT INTO events (title, starts, ends, venue_id) VALUES ('Moby', '2012-02-06 21:00', '2012-02-06 23:00', ( SELECT venue_id FROM venues WHERE name = 'Crystal Ballroom' ) );用以下数据填入events表(要在PostgreSQL里输入Valentine's Day,可以用双撇号转义,如Heaven"s Gate)。
title | starts | ends | venue ---------------------+---------------------+---------------------+----------------- Wedding | 2012-02-26 21:00:00 | 2012-02-26 23:00:00 | Voodoo Donuts Dinner with Mom | 2012-02-26 18:00:00 | 2012-02-26 20:30:00 | My Place Valentine’s Day | 2012-02-14 00:00:00 | 2012-02-14 23:59:00 |设置好数据后,我们尝试一些聚合查询。最简单的聚合函数是count(),它的意思不言自明。下面统计所有包含Day关键字的标题(注:%是LIKE搜索中的通配符),可以得到结果为3。
SELECT count(title) FROM events WHERE title LIKE '