当前位置: 代码迷 >> 综合 >> PostgreSQL之高级数据选择
  详细解决方案

PostgreSQL之高级数据选择

热度:22   发布时间:2023-09-19 14:51:40.0

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
----------111
(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 | 122 | 7.45 |5 | 7.54 | 36 | 9.23 |7 | 13.36 | 811 | 19.73 |
(6 rows)

PostgreSQL中left join中的on关键字后面是可以有多个条件的,比如例子中就有2个条件,这一点和Oracle不同

  相关解决方案