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[]
会被转换为 INTEGER
。STRUCT(a INTEGER, b INTEGER)
会被转换为 a INTEGER, b INTEGER
。unnest 函数可以用于将嵌套类型转换为常规的标量类型,这使得它们更容易操作。