PostgreSQL之高级数据选择
1、聚合函数:
聚集函数 描述
count(*) 提供行的计数
count(列名) 提供指定字段中值不是 NULL 的行的计数
min(列名) 返回指定列中的最小值
max(列名) 返回指定列中的最大值
sum(列名) 返回指定列的值的合计总数
avg(列名) 返回指定列的值的平均数
2、存在子查询(Existence Subqueries)
在 WHERE 中使用 EXISTS 关键字来检查是否存在,而不需要知道数据的内容。在我们需要执行查询但不需要返回结果集的地方,我们只要简单地在列名所在的位置使用 1 代替。这意味着如果找到任何数据,将返回 1,这是一种简单有效的表达真值的方法。
bpsimple=# SELECT 1 FROM customer WHERE town = 'Bingham';
?column?
147
----------
1
1
1
(3 rows)
bpsimple=#
bpsimple=# SELECT fname, lname FROM customer c
bpsimple-# WHERE EXISTS (SELECT 1 FROM orderinfo oi
bpsimple(# WHERE oi.customer_id = c.customer_id);
fname | lname
-------+---------
Alex | Matthew
Ann | Stones
Laura | Hardy
David | Hudson
(4 rows)
bpsimple=#
EXISTS 从句通常比其他类型的关联或者 IN 条件更高效。因此,在你选择怎么写一个子查询的时候,通常值得优先
使用它而不是其他类型的连接。
3、使用 UNION 连接
PostgreSQL 从两个表中获取城镇的列表并结合它们到一个单独的列表。但是请注意,它消除了所有重复数据。如果我们想得到所有的城镇的列表,包括重复的,我们需要使用 UNION ALL,而不是 UNION。UNION 连接的使用有一些限制。你要连接的两个从两个表中查找列表的列必须有相同列数,而且选择的每个列必须都有相兼容的类型。
bpsimple=# SELECT title FROM customer
bpsimple-# UNION
bpsimple-# SELECT town FROM tcust;
title
----------
Keynes
Lincoln
Miss
Mr
Mrs
Welltown
(6 rows)
4、外连接
一个复杂点的例子:
bpsimple=# SELECT i.item_id, i.cost_price, s.quantity FROM item i
bpsimple-# LEFT OUTER JOIN stock s
bpsimple-# ON i.item_id = s.item_id AND s.quantity > 2
bpsimple-# WHERE i.cost_price > cast(5.0 AS numeric(7,2));
item_id | cost_price | quantity
---------+------------+----------
1 | 15.23 | 12
2 | 7.45 |
5 | 7.54 | 3
6 | 9.23 |
7 | 13.36 | 8
11 | 19.73 |
(6 rows)
PostgreSQL中left join中的on关键字后面是可以有多个条件的,比如例子中就有2个条件,这一点和Oracle不同