SELECT 列表
SELECT 列表指定希望查询返回的列、函数和表达式。列表表示查询的输出。
有关 SQL 函数的更多信息,请参阅 SQL 函数参考。有关表达式的更多信息,请参阅条件表达式。
语法
SELECT [ TOP number ] [ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]
参数
- TOP number
-
TOP 将正整数用作其参数,用于定义返回到客户端的行数。使用 TOP 子句的行为与使用 LIMIT 子句的行为相同。返回的行数是固定的,但行集不固定。要返回一致的行集,请将 TOP 或 LIMIT 与 ORDER BY 子句结合使用。
- ALL
-
一个冗余关键字,定义未指定 DISTINCT 的情况下的默认行为。
SELECT ALL *
与SELECT *
的含义相同(选择所有列的所有行并保留重复条目)。 - DISTINCT
-
一个选项,用于根据一个或多个列中的匹配值消除结果集中的重复行。
注意
如果您的应用程序允许无效的外键或主键,则会导致查询返回错误的结果。例如,如果主键列不包含所有唯一值,则 SELECT DISTINCT 查询可能会返回重复的行。有关更多信息,请参阅定义表约束。
- *(星号)
-
返回表的完整内容(所有列和所有行)。
- expression
-
由查询引用的表中存在的一个或多个列构成的表达式。表达式可包含 SQL 函数。例如:
avg(datediff(day, listtime, saletime))
- AS column_alias
-
在最终结果集中使用的列的临时名称。AS 关键字是可选的。例如:
avg(datediff(day, listtime, saletime)) as avgwait
如果您没有为不是简单列名的表达式指定别名,则结果集将对该列应用默认名称。
注意
在目标列表中定义别名后,它将立即被识别。您可以在其他表达式中使用在同一目标列表中晚于该别名定义的某个别名。以下示例对此进行了说明。
select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;
横向别名引用的好处是,当在同一目标列表中构建更复杂的表达式时,不需要重复已指定别名的表达式。当 Amazon Redshift 分析这种类型的引用时,它只会内联之前定义的别名。如果在
FROM
子句中定义了一个与之前指定了别名的表达式同名的列,FROM
子句中定义的列将优先。例如,在上述查询中,如果表 raw_data 中有一个名为“probability”的列,那么目标列表中的第二个表达式中的“probability”引用该列而不是别名“probability”。
使用说明
TOP 是一个 SQL 扩展;它提供 LIMIT 行为的替代。不能在同一个查询中使用 TOP 和 LIMIT。
示例
以下示例从 SALES 表中返回 10 行。尽管查询使用 TOP 子句,但它仍然返回一组不可预测的行,因为没有指定 ORDERBY 子句,
select top 10 * from sales;
以下查询具有相同的功能,但使用的是 LIMIT 子句而非 TOP 子句:
select * from sales limit 10;
以下示例使用 TOP 子句返回 SALES 表的前 10 行,按 QTYSOLD 列降序排序。
select top 10 qtysold, sellerid from sales order by qtysold desc, sellerid; qtysold | sellerid --------+---------- 8 | 518 8 | 520 8 | 574 8 | 718 8 | 868 8 | 2663 8 | 3396 8 | 3726 8 | 5250 8 | 6216 (10 rows)
以下示例返回 SALES 表中的前两个 QTYSOLD 和 SELLERID 值(按 QTYSOLD 列排序):
select top 2 qtysold, sellerid from sales order by qtysold desc, sellerid; qtysold | sellerid --------+---------- 8 | 518 8 | 520 (2 rows)
以下示例显示 CATEGORY 表中不同类别组的列表:
select distinct catgroup from category order by 1; catgroup ---------- Concerts Shows Sports (3 rows) --the same query, run without distinct select catgroup from category order by 1; catgroup ---------- Concerts Concerts Concerts Shows Shows Shows Sports Sports Sports Sports Sports (11 rows)
以下示例返回 2008 年 12 月的一组不同的周编号。如果没有 DISTINCT 子句,该语句将返回 31 行,或对于月份的每一天返回 1 行。
select distinct week, month, year from date where month='DEC' and year=2008 order by 1, 2, 3; week | month | year -----+-------+------ 49 | DEC | 2008 50 | DEC | 2008 51 | DEC | 2008 52 | DEC | 2008 53 | DEC | 2008 (5 rows)