⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
SELECT Clause

SELECT 子句指定了查询将返回的列列表。虽然它在子句中首先出现,但从逻辑上讲,这里的表达式只在最后执行。SELECT 子句可以包含任意表达式来转换输出,以及聚合和窗口函数。

Examples

Select all columns from the table called table_name:

SELECT * FROM table_name;

对表中的列执行算术运算,并提供别名:

SELECT col1 + col2 AS res, sqrt(col1) AS root FROM table_name;

Select all unique cities from the addresses table:

SELECT DISTINCT city FROM addresses;

返回addresses表中的总行数:

SELECT count(*) FROM addresses;

Select all columns except the city column from the addresses table:

SELECT * EXCLUDE (city) FROM addresses;

Select all columns from the addresses table, but replace city with lower(city):

SELECT * REPLACE (lower(city) AS city) FROM addresses;

从表中选择所有匹配给定正则表达式的列:

SELECT COLUMNS('number\d+') FROM addresses;

在表的所有给定列上计算一个函数:

SELECT min(COLUMNS(*)) FROM addresses;

要选择包含空格或特殊字符的列,请使用双引号("):

SELECT "Some Column Name" FROM tbl;

Syntax

SELECT 列表

SELECT 子句包含一系列表达式,这些表达式指定了查询的结果。选择列表可以引用 FROM 子句中的任何列,并使用表达式将它们组合起来。由于 SQL 查询的输出是一个表——SELECT 子句中的每个表达式也有一个名称。可以使用 AS 子句显式命名表达式(例如,expr AS name)。如果用户没有提供名称,系统会自动为表达式命名。

Column names are case-insensitive. See the Rules for Case Sensitivity for more details.

星号表达式

Select all columns from the table called table_name:

SELECT *
FROM table_name;

从表中选择所有匹配给定正则表达式的列:

SELECT COLUMNS('number\d+')
FROM addresses;

星号表达式是一种特殊的表达式,它根据FROM子句的内容扩展为多个表达式。在最简单的情况下,*扩展为FROM子句中的所有表达式。也可以使用正则表达式或lambda函数选择列。有关更多详细信息,请参阅星号表达式页面

DISTINCT 子句

从地址表中选择所有唯一的城市:

SELECT DISTINCT city
FROM addresses;

DISTINCT 子句可用于返回结果中唯一的行——以便过滤掉任何重复的行。

SELECT DISTINCT开头的查询会运行去重操作,这是一个昂贵的操作。因此,只有在必要时才使用DISTINCT

DISTINCT ON 子句

仅选择每个国家中人口最多的城市:

SELECT DISTINCT ON(country) city, population
FROM cities
ORDER BY population DESC;

DISTINCT ON 子句根据 ON 子句中定义的表达式集合中的每个唯一值返回一行。如果存在 ORDER BY 子句,则返回的行是根据 ORDER BY 标准遇到的第一个行。如果不存在 ORDER BY 子句,则遇到的第一个行是未定义的,可以是表中的任何行。

在查询大数据集时,对所有列使用DISTINCT可能会非常耗费资源。因此,考虑在保证结果足够唯一性的列(或一组列)上使用DISTINCT ON。例如,在表的关键列上使用DISTINCT ON可以保证完全的唯一性。

聚合

返回addresses表中的总行数:

SELECT count(*)
FROM addresses;

返回按城市分组的地址表中的总行数:

SELECT city, count(*)
FROM addresses
GROUP BY city;

聚合函数是将多行组合成单个值的特殊函数。当聚合函数出现在SELECT子句中时,查询将变为聚合查询。在聚合查询中,所有表达式必须是聚合函数的一部分,或者是分组的一部分(由GROUP BY子句指定)。

窗口函数

生成一个包含每行递增标识符的row_number列:

SELECT row_number() OVER ()
FROM sales;

按时间顺序计算当前金额与之前金额之间的差异:

SELECT amount - lag(amount) OVER (ORDER BY time)
FROM sales;

窗口函数是一种特殊函数,允许计算与结果中其他行相关的值。窗口函数通过OVER子句标记,该子句包含窗口规范。窗口规范定义了窗口函数计算时所使用的框架或上下文。更多信息请参见窗口函数页面

unnest 函数

将数组展开一级:

SELECT unnest([1, 2, 3]);

将结构体展开一层:

SELECT unnest({'a': 42, 'b': 84});

unnest 函数是一个特殊函数,可以与 数组列表结构体 一起使用。unnest 函数会从类型中剥离一层嵌套。例如,INTEGER[] 会被转换为 INTEGERSTRUCT(a INTEGER, b INTEGER) 会被转换为 a INTEGER, b INTEGER。unnest 函数可以用于将嵌套类型转换为常规的标量类型,这使得它们更容易操作。