SELECT (para recuperar linhas)

Use o comando SELECT para recuperar linhas de uma tabela ou visualização. Ele retorna as linhas que satisfazem os critérios que você especifica, incluindo a condição WHERE. Se você omitir a condição WHERE, o comando SELECT escolherá a partir de todas as linhas.

Observação: Para obter uma descrição de como usar o comando SELECT para iniciar um procedimento armazenado em um host Netezza Performance Server, consulte o comando SELECT no IBM® Netezza® Stored Procedures Developer's Guide.
O sistema forma linhas de saída calculando as expressões de saída de seleção para cada linha selecionada.
  • É possível incluir * na lista de saída como uma forma taquigráfica de indicar todas as colunas de linhas selecionadas. Também é possível indicar <table>.* como taquigrafia para as colunas que vêm de uma tabela específica. Consultar uma tabela descreve as funções que você pode usar em um comando SELECT.
  • É possível usar a palavra-chave distinct para eliminar as linhas duplicadas do resultado. A palavra-chave all (o padrão) retorna todas as linhas candidatas, incluindo duplicatas.

Sintaxe

Sintaxe para usar o comando SELECT para recuperar linhas de uma tabela ou visualização:
SELECT [ DISTINCT | ALL ] [ * | <col> [ AS <output_name> ]
  <expression> [ AS <output_name> ] [,<expression> [ AS <output_name> ]…]
    [ FROM <from_item>[,<from_item>…] ]
    [ WHERE <condition> ]
    [ GROUP BY <expression>[,<expression>…] ]
    [ HAVING <condition>[,<condition>…] ]
    [ { UNION | INTERSECT | EXCEPT | MINUS }[ DISTINCT | ALL ]
SELECT
    [ ORDER BY <expression> [ ASC | DESC | USING <operator>
                          [NULLS {FIRST | LAST}][, …] ]
    [ LIMIT { <count> | ALL } ]
Na qual <from_item> representa:
<table>
     [ [ AS ] <alias> [ ( <column_alias_list> ) ] ] |
     ( <select> ) [ AS ] <alias> [ ( <column_alias_list> ) ] |
      <from_item> [ NATURAL ] <join_type> <from_item>
         [ ON <join_condition> | USING ( <join_column_list> ) ]

Entradas

O comando SELECT usa as entradas a seguir:

Tabela 1. Entradas SELECT
Entrada Descrição
alias Especifica um nome substituto para o nome da tabela anterior. Use um alias para ser breve ou para eliminar ambiguidades para autojunções (em que a mesma tabela é digitalizada várias vezes). Se você gravar um alias, também será possível gravar uma lista de alias de coluna para fornecer nomes substitutos para uma ou mais colunas da tabela.
<col> O nome de uma coluna.
<output_name> O nome da coluna deve ser fornecido na saída. Normalmente se usa esse nome para rotular uma coluna para exibição. Também é possível usá-lo para referir-se ao valor da coluna em cláusulas ORDER BY e GROUP BY.

Não é possível usar esse nome nas cláusulas WHERE ou HAVING; grave a expressão.

<expression> O nome de uma coluna da tabela ou uma expressão.
De A cláusula FROM especifica uma ou mais tabelas de origem para o comando SELECT. Se você especificar várias origens, o resultado será o produto Cartesiano de todas as linhas em todas as origens. No entanto, geralmente você inclui condições de qualificação para restringir as linhas que o sistema retorna para o produto Cartesiano.

É possível inserir parênteses em um comando de subseleção dentro de uma cláusula FROM. O uso de um comando de subseleção é a única maneira de obter vários níveis de agrupamento, agregação ou classificação em uma única consulta.

Deve-se especificar um alias para o comando de subseleção.

Um item FROM pode ser uma cláusula de junção que combina dois itens FROM mais simples. Use parênteses, se necessário, para determinar a ordem de aninhamento.

<from_item> Uma referência de tabela, subseleção ou cláusula de junção.
WHERE Esta cláusula tem a seguinte forma geral:
WHERE boolean_expr
A parte boolean_expr da cláusula pode consistir em qualquer expressão que produz um valor Booleano. Em muitos casos, você utiliza a expressão da seguinte forma:
expr cond_op expr
or 
log_op expr
em que:
  • cond_op pode ser um dos seguintes: =, <, <=, >, >= ou <>, um operador condicional como all, any, in, like ou um operador definido localmente.
  • log_op pode ser um dos seguintes: and, or, not. select ignora todas as linhas para as quais a condição WHERE não retorna true.
AGRUPAR POR Use esta cláusula para dividir uma tabela em grupos de linhas que correspondam a um ou mais valores. A cláusula especifica uma tabela agrupada que é derivada aplicando-se a cláusula:
GROUP BY <expression>[,<expression>…]

A cláusula GROUP BY condensa, em uma única linha, todas as linhas selecionadas que compartilham valores para as colunas agrupadas. O sistema calcula as funções agregadas em todas as linhas que constituem cada grupo, produzindo um valor separado para cada grupo (enquanto sem GROUP BY, uma agregação produz um valor único que é calculado em todas as linhas selecionadas). Quando se inclui a cláusula GROUP BY, a expressão ou expressões de saída do comando SELECT não podem se referir a colunas não agrupadas, exceto dentro de funções agregadas, pois haveria mais de um valor possível para retornar para uma coluna não agrupada.

Um grupo por valor pode ser:
  • Um nome da coluna de entrada.
  • O nome ou número ordinal de uma coluna de saída (expressão select).
  • Uma expressão arbitrária que é formada com valores da coluna de entrada. Se houver ambiguidade, o sistema interpretará um grupo por nome como um nome de coluna de entrada em vez de um nome de coluna de saída.
HAVING A cláusula HAVING opcional tem o formato geral:
HAVING boolean_expr
em que boolean_expr é o mesmo que o especificado para a cláusula where.

A cláusula HAVING especifica uma tabela agrupada que é derivada pela eliminação de linhas que não satisfazem boolean_expr.

A cláusula HAVING é diferente da cláusula WHERE:
  • A cláusula WHERE filtra linhas individuais antes da aplicação do GROUP BY.
  • A cláusula HAVING filtra as linhas do grupo que são criadas por GROUP BY.

Cada coluna que é referenciada em boolean_expr ambígua deve fazer referência de forma não ambígua a uma coluna de agrupamento, a menos que a referência seja exibida dentro de uma função agregada.

Em uma seleção de agrupamento, a cláusula HAVING só pode referenciar expressões que têm valor único em um grupo. Ou seja, só é possível referenciar campos de grupos, agregações ou expressões de valor único que sejam derivados dos campos de grupo ou agregações (o que deve incluir constantes).

Por exemplo, para retornar grp e contagens de grp com mais de quatro membros:
SELECT grp, count(id) AS n FROM emp GROUP BY grp HAVING n > 4

Em uma seleção de não agrupamento em que a seleção é conceitualmente agrupada por campos de grupo zero, só é possível referenciar agregações ou expressões que tenham um único valor.

Por exemplo, para não retornar nenhuma linha se houver quatro ou menos funcionários em emp, ou uma linha com a contagem se houver mais que quatro funcionários em emp:
SELECT count(id) AS n FROM emp HAVING n > 4
<condition> Uma expressão booleana que fornece um resultado de true ou false.
UNIÃO Operador faz com que o sistema calcule a coleção de linhas que são retornadas pelas consultas. Elimina linhas duplicadas, a menos que você especifique a palavra-chave ALL.
table_query UNION [ ALL ] table_query
[ ORDER BY <expression> [ASC|DESC|USING operator] [, …] ]
[ LIMIT { COUNT | ALL } ]
[ OFFSET start ]
em que table_query especifica qualquer expressão de seleção sem uma cláusula ORDER BY, FOR UPDATE ou LIMIT.

Se você colocar uma subexpressão entre parênteses, é possível incluir as cláusulas ORDER BY e LIMIT. Se você não incluir parênteses, as cláusulas serão usadas para aplicação no resultado da junção, e não na expressão de entrada direita.

O operador UNION calcula a coleção (união de conjunto) das linhas que são retornadas pelas consultas envolvidas. As duas seleções que representam os operandos direto da união devem produzir o mesmo número de colunas, e as colunas correspondentes devem ser de tipos de dados compatíveis.

O resultado de UNION não conterá nenhuma linha duplicada, a menos que você especifique a opção ALL. A opção ALL evita eliminação de duplicatas.

Vários operadores UNION no mesmo comando SELECT são avaliados da esquerda para a direita, a menos que você indique o contrário usando parênteses.

INTERSECTAR Combina os resultados de duas consultas em um único resultado que inclui todas as linhas comuns a ambas as consultas. Para obter mais informações, consulte Operação INTERSECT.
EXCEPT ou MINUS Localiza a diferença entre as duas consultas e o resultado contém as linhas que pertencem apenas à primeira consulta. Para obter mais informações, consulte Operação EXCEPT.
SOLICITADO POR Use esta cláusula para classificar as linhas retornadas na ordem que você especificar. Uma cláusula ORDER BY pode ser:
  • O nome ou número ordinal de uma coluna de saída (expressão select). O número ordinal refere-se à posição ordinal (da esquerda para a direita) da coluna de resultados. Esse recurso torna possível definir uma ordenação com base em uma coluna que não tem um nome. Por exemplo:
    SELECT title, date_prod + 1 AS newlen
      FROM films ORDER BY newlen;
  • Uma expressão arbitrária que é formada a partir de valores da coluna de entrada, incluindo campos que não são exibidos na lista de resultados da seleção. Por exemplo:
    SELECT name FROM distributors ORDER BY code;
    Se houver ambiguidade, um nome ORDER BY será interpretado como um nome de coluna de saída.

Uma limitação desse recurso é que uma cláusula ORDER BY que se aplica ao resultado de uma consulta de união pode especificar apenas um nome ou número de coluna de saída, não uma expressão.

Se uma cláusula ORDER BY for um nome simples que corresponde tanto a um nome de coluna de resultados quanto a um nome de coluna de entrada, ORDER BY interpretará isso como o nome da coluna de resultados. Isso é o oposto da opção que a cláusula GROUP BY faz na mesma situação.

É possível especificar uma ordem de classificação crescente ou decrescente:
ASC
Classificar na ordem crescente. Isso é equivalente a usar <. Esse é o padrão
DECR
Classificar em ordem decrescente. Isso é equivalente a usar >.
É possível especificar uma ordem de classificação para dados nulos:
NULLS FIRST
Valores nulos vêm antes de valores não nulos. Para uma classificação crescente, os nulos são exibidos primeiro na saída; para uma classificação decrescente, eles são exibidos por último. Esse é o padrão
NULLS LAST
Valores nulos vêm depois de valores não nulos.
LIMIT Retornar um subconjunto das linhas que são produzidas por sua consulta:
<count>
Retornar no máximo o número especificado de linhas.
TODOS
Retornar todas as linhas. Este é o padrão.

Quando você especificar o parâmetro LIMIT, especifique também o parâmetro ORDER BY. Caso contrário, o subconjunto de linhas retornado será indeterminado.

<join_column_list> Uma lista de colunas de junção. Por exemplo, especificar USING (a,b) é equivalente a especificar ON left_table.a = right_table.a e ON left_table.b = right_table.b.
<join_condition> Uma condição de qualificação. Essa condição é semelhante à condição WHERE, exceto que se aplica apenas às duas from_items sendo unidas nessa cláusula join.
<join_type> Um dos seguintes tipos de junção:
  • [INNER] JOIN
  • LEFT [OUTER] JOIN
  • RIGHT [OUTER] JOIN
  • FULL [OUTER] JOIN
  • CROSS JOIN
Para um tipo de junção interna ou externa, deve-se incluir exatamente uma das seguintes cláusulas:
  • NATURAL
  • ON <join_condition>
  • USING (<join_column_list>)
Não inclua nenhuma destas cláusulas para uma junção cruzada.
<select> Um comando SELECT. Deve-se colocar a subseleção entre parênteses e fornecer um alias para ela.

Quando se inclui uma subseleção na cláusula FROM, a subseleção age como se sua saída fosse criada como uma tabela temporária durante esse comando de seleção única.

<table> Em uma cláusula FROM, o nome de uma tabela ou visualização.
CROSS JOIN e INNER JOIN Produz um produto Cartesiano simples, o mesmo que você obteria se listasse os dois itens no nível superior de FROM.

Os tipos junção cruzada e junção interna (true) são equivalentes; nenhuma linha é removida por qualificação.

Esses tipos de junção são apenas uma conveniência notacional. É possível obter os mesmos resultados usando as cláusulas FROM e WHERE.

JUNÇÃO EXTERNA ESQUERDA Retorna todas as linhas no produto Cartesiano qualificado (ou seja, todas as linhas combinadas aprovadas na condição), mais uma cópia de cada linha na tabela esquerda para a qual não havia uma linha direita aprovada na condição.

O sistema considera apenas a própria condição on ou using da junção para determinar as linhas que têm correspondências. Isso aplica as condições OUTER ON ou WHERE posteriormente.

RIGHT OUTER JOIN Retorna todas as linhas unidas, mais uma linha para cada linha não correspondente à direita (estendida com nulos à esquerda).

Isso é apenas uma conveniência notacional. É possível converter isso em uma junção externa esquerda alternando as entradas esquerda e direita.

FULL OUTER JOIN Retorna todas as linhas unidas, mais uma linha para cada linha correspondente à esquerda (estendida com nulos à direita), mais uma linha para cada linha não correspondente à direita (estendida com nulos à esquerda).
Para todos os tipos de junção, exceto cruzada, deve-se gravar exatamente uma das opções a seguir:
ON <join_condition>
Este é o caso mais geral. É possível gravar qualquer expressão de qualificação que envolve as duas tabelas que você deseja juntar.
USING <join_column_list>
Por exemplo, especificar USING (a,b) é equivalente a especificar ON left_table.a = right_table.a e ON left_table.b = right_table.b. O termo USING implica que somente um de cada par de colunas equivalentes deve ser incluído na saída de junção, não ambos.
NATURAL
Use uma lista USING que mencione todas as colunas nomeadas de forma semelhante nas tabelas.

Saídas

O comando SELECT possui as seguintes saídas:

Tabela 2. Saídas SELECT
Saída Descrição
ROWS Retorna o conjunto completo de linhas que resultam da consulta.
COUNT Retorna o número de linhas que são retornadas pela consulta.

Privilégios

Você deve ser o usuário administrador, proprietário da tabela, proprietário do banco de dados ou esquema em que a tabela está definida, ou sua conta deve ter privilégios Selecionar na tabela ou classe de objeto Tabela. Deve-se ter o privilégio Selecionar para que uma tabela leia seus valores. A partir da Liberação 4.0, para selecionar dados de uma tabela externa, deve-se ter o privilégio Selecionar para a classe Tabela Externa.

Para obter mais informações sobre privilégios de objeto e classes de objeto, consulte o Guia do Administrador do SistemaIBM Netezza.

Uso

A seguir, uso de amostra.
  • Junte a tabela films com a tabela distributors:
    MYDB.SCH1(USER)=> SELECT f.title, f.did, d.name, f.date_prod, f.kind
    FROM distributors d, films f WHERE f.did = d.did;
    
       title                     |did  |name              |date_prod  |kind
       --------------------------+-----+------------------+-----------+-------
       The Third Man             |101  |British Lion      |1949-12-23 |Drama
       The African Queen         |101  |British Lion      |1951-08-11 |Romantic
       Une Femme est une Femme   |102  |Jean Luc Godard   |1961-03-12 |Romantic
       Vertigo                   |103  |Paramount         |1958-11-14 |Action
       Becket                    |103  |Paramount         |1964-02-03 |Drama
       48 Hours                  |103  |Paramount         |1982-10-22 |Action
       War and Peace             |104  |Mosfilm           |1967-02-12 |Drama
       West Side Story           |105  |United Artists    |1961-01-03 |Musical
       Bananas                   |105  |United Artists    |1971-07-13 |Comedy
       Yojimbo                   |106  |Toho              |1961-06-16 |Drama
       There's a Girl in my Soup |107  |Columbia          |1970-06-11 |Comedy
       Taxi Driver               |107  |Columbia          |1975-05-15 |Action
       Absence of Malice         |107  |Columbia          |1981-11-15 |Action
       Storia di una donna       |108  |Westward          |1970-08-15 |Romantic
       The King and I            |109  |20th Century Fox  |1956-08-11 |Musical
       Das Boot                  |110  |Bavaria Atelier   |1981-11-11 |Drama
  • Some a coluna len de todos os filmes e agrupe os resultados por tipo:
    MYDB.SCH1(USER)=> SELECT kind, SUM(len) AS total FROM films GROUP BY
    kind;
       kind     |total
       ---------+-------
       Action   |07:34
       Comedy   |02:58
       Drama    |14:28
       Musical  |06:42
       Romantic |04:38
  • Some a coluna len de todos os filmes, agrupe os resultados por tipo e exiba os totais dos grupos que são inferiores a 5 horas:
    MYDB.SCH1(USER)=> SELECT kind, SUM(len) AS total FROM films GROUP BY
    kind HAVING SUM(len) < INTERVAL '5 HOUR';
       kind     | total
       ---------+------
       Comedy   | 02:58
       Romantic | 04:38
  • Classifique o conteúdo da tabela distributors de acordo com o conteúdo da segunda coluna (name):
    MYDB.SCH1(USER)=> SELECT * FROM distributors ORDER BY name;
    or
    MYDB.SCH1(USER)=> SELECT * FROM distributors ORDER BY 2;
       did   | name
       ------+-----------------
       109   | 20th Century Fox
       110   | Bavaria Atelier
       101   | British Lion
       107   | Columbia
       102   | Jean Luc Godard
       113   | Luso Films
       104   | Mosfilm
       103   | Paramount
       106   | Toho
       105   | United Artists
       111   | Walt Disney
       112   | Warner Bros.
       108   | Westward
  • Obtenha a união das tabelas distributors e actors e restrinja os resultados para aqueles que começam com a letra W:
    MYDB.SCH1(USER)=> SELECT distributors.name
          FROM distributors
          WHERE distributors.name LIKE 'W%';
          UNION
          SELECT actors.name
          FROM actors
          WHERE actors.name LIKE 'W%';
       Walt Disney
       Walter Matthau
       Warner Bros.
       Warren Beatty
       Westward
       Woody Allen

Como apenas linhas distintas são desejadas, a palavra-chave ALL é omitida.