zoukankan      html  css  js  c++  java
  • 1030.查询-select子句

    在SELECT命令里的表表达式构造了一个中间的虚拟表, 方法可能有组合表、视图、消除行、分组等等。这个表最后被选择列表传递下去处理。

    选择列表判断中间表的哪个列是实际输出。(where是选择哪些行输出,select选择哪些列输出)

    1.1.1  选择列表项

    最简单的选择列表类型是*,它发出表表达式生成的所有列。否则,一个选择列表是一个逗号分隔的值表达式的列表。

    例如,它可能是一个列名的列表:

    SELECT a, b, c FROM ...

    列名字a、b和c要么是在FROM子句里引用的表中列的实际名字或者别名。在选择列表里可用的名字空间和在WHERE子句里的一样, 除非你使用了分组,这时候它和HAVING子句一样。

    如果超过一个表有同样的列名,那么你还必须给出表名字(避免歧义),如:

    SELECT tbl1.a, tbl2.a, tbl1.b FROM ...

    在使用多个表时,要求一个特定表的所有列也是有用的:

    SELECT tbl1.*, tbl2.a FROM ...

    如果将任意值表达式用于选择列表,那么它在概念上向返回的表中增加了一个新的虚拟列。

    值表达式为结果的每一行进行一次计算,对任何列引用替换行的值。

    不过选择列表中的这个表达式并非一定要引用来自FROM子句中表表达式里面的列,例如它也可以是任意常量算术表达式。

    1.1.2  列标签

    选择列表中的项可以被赋予名字,用于进一步的处理。 例如为了在一个ORDER BY子句中使用或者为了客户端应用显示。例如:

    SELECT a AS value, b + c AS sum FROM ...

    如果没有使用AS指定输出列名,那么系统会分配一个缺省的列名。

    对于简单的列引用, 它是被引用列的名字。

    对于函数调用,它是函数的名字。对于复杂表达式,系统会生成一个通用的名字。

    只有在新列无法匹配任何PostgreSQL关键词时,AS关键词是可选的。为了避免一个关键字的意外匹配,你可以使用双引号来修饰列名。

    例如,VALUE是一个关键字,所以下面的语句不会工作:

    SELECT a value, b + c AS sum FROM ...

    但是这个可以:

    SELECT a "value", b + c AS sum FROM ...

    为了防止未来可能的关键词增加,我们推荐总是写AS或者用双引号修饰输出列名

    注意:输出列的命名和在FROM子句里的命名是不一样的。 它实际上允许你对同一个列命名两次,但是在选择列表中分配的名字是要传递下去的名字。

    1.1.3  DISTINCT

    在处理完选择列表之后,结果表可以可选的删除重复行。

    我们可以直接在SELECT后面写上DISTINCT关键字来指定:

    SELECT DISTINCT select_list ...

    (如果不用DISTINCT你可以用ALL关键词来指定获得的所有行的缺省行为)。

    显然,如果两行里至少有一个列有不同的值,那么我们认为它是可区分的空值在这种比较中被认为是相同的。

    另外,我们还可以用任意表达式来判断什么行可以被认为是可区分的:

    SELECT DISTINCT ON (expression [, expression ...]) select_list ...

    这里expression是任意值表达式,它为所有行计算。如果一个行集合里所有表达式的值是一样的, 那么我们认为它们是重复的并且因此只有第一行保留在输出中。

    请注意这里的一个集合的“第一行”是不可预料的, 除非你在足够多的列上对该查询排了序,保证到达DISTINCT过滤器的行的顺序是唯一的(DISTINCT ON处理是发生在ORDER BY排序后面的)

    DISTINCT ON子句不是 SQL 标准的一部分, 有时候有人认为它是一个糟糕的风格,因为它的结果是不可判定的。

    如果有选择的使用GROUP BY和在FROM中的子查询,那么我们可以避免使用这个构造, 但是通常它是更方便的候选方法。

  • 相关阅读:
    【BZOJ-4289】Tax 最短路 + 技巧建图
    【BZOJ-3895】取石子 记忆化搜索 + 博弈
    【BZOJ-4569】萌萌哒 ST表 + 并查集
    【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)
    【BZOJ-4213】贪吃蛇 有上下界的费用流
    【BZOJ-3122】随机数生成器 BSGS
    【BZOJ-2299】向量 裴蜀定理 + 最大公约数
    【BZOJ-1441】Min 裴蜀定理 + 最大公约数
    【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率
    【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分
  • 原文地址:https://www.cnblogs.com/bufuzhou/p/14244199.html
Copyright © 2011-2022 走看看