# ExpressãoSeleção

A ExpressãoSeleção é a construção básica SELECT-FROM-WHERE utilizada para construir um valor tabela baseado na filtragem e projeção de valores de outras tabelas.

#### Sintaxe

    SELECT [ DISTINCT | ALL ] ItemSeleção [ , ItemSeleção ]*
    Cláusula FROM
    [ Cláusula WHERE ]
    [ Cláusula GROUP BY ]
    [ Cláusula HAVING ]

ItemSeleção:

    {
        * |
        { nome-da-tabela | nome-da-correlação } .* |
        Expressão [AS nome-de-coluna-simples ]
    }

A cláusula SELECT contém uma lista de expressões e um quantificador opcional que é aplicado aos resultados da Cláusula FROM e da Cláusula WHERE. Se for especificado DISTINCT, somente será incluída no resultado uma cópia de qualquer valor linha. Os nulos são considerados duplicados entre si para as finalidades do DISTINCT. Se não for especificado um quantificador, ou se for especificado ALL, nenhuma linha será removida do resultado na aplicação da cláusula SELECT (ALL é o padrão).

O ItemSeleção projeta um ou mais valores coluna de resultado na tabela resultado sendo construída na ExpressãoSeleção.

O resultado da Cláusula FROM é o produto cruzado dos itens do FROM. A Cláusula WHERE pode qualificar ainda mais este resultado.

A cláusula WHERE faz com que as linhas do resultado sejam filtradas com base em expressões booleanas. Somente as linhas para as quais a expressão booleana é avaliada como verdade são retornadas no resultado.

A cláusula GROUP BY agrupa as linhas do resultado em subconjuntos que possuem valores correspondentes em uma ou mais colunas. As cláusulas GROUP BY são utilizadas normalmente com agregações.

Caso haja uma cláusula GROUP BY, a cláusula SELECT deverá conter apenas agregações ou colunas de agrupamento. Se for desejado incluir uma coluna não agrupada na cláusula SELECT, esta coluna deverá ser incluída em uma expressão de agregação. Por exemplo:

    -- Listar o chefe de cada departamento,
    -- o número do departamento (DEP_TRAB),
    -- e o salário médio do departamento (SALÁRIO)
    -- para todos os departamentos na tabela EMPREGADOS.
    -- Organizar a tabela de resultado na ordem ascendente
    -- do salário médio do departamento
    SELECT DEP_TRAB, AVG(SALÁRIO)
    FROM EMPREGADOS
    GROUP BY DEP_TRAB
    ORDER BY 2;

Se não houver uma cláusula GROUP BY, mas ItemSeleção contiver uma agregação que não esteja em uma subconsulta, a consulta será agrupada implicitamente. Toda a tabela se torna um único grupo.

A cláusula HAVING restringe a tabela agrupada, especificando uma condição de procura (muito semelhante à cláusula WHERE) que pode fazer referência apenas às colunas de agrupamento ou agregações do escopo corrente. A cláusula HAVING é aplicada a cada grupo da tabela agrupada. Se a cláusula HAVING for avaliada como TRUE, a linha será retida para processamento adicional. Se a cláusula HAVING for avaliada como FALSE ou NULL, a linha será desprezada. Se houver uma cláusula HAVING mas não houver GROUP BY, a tabela será agrupada implicitamente em um grupo para toda a tabela.

O Derby processa a ExpressãoSeleção na seguinte ordem:

- Cláusula FROM
- Cláusula WHERE
- GROUP BY (ou GROUP BY implícito)
- Cláusula HAVING
- Cláusula SELECT

O resultado da ExpressãoSeleção é sempre uma tabela.

Quando a consulta não possui uma cláusula FROM (quando está sendo construído um valor, e não obtendo dados de uma tabela), é utilizada a instrução VALUES, e não a ExpressãoSeleção. Por exemplo:

    VALUES CURRENT_TIMESTAMP

Consulte Expressão VALUES.

#### O curinga *

O * é expandido como todas as colunas presentes nas tabelas da cláusula FROM associada.

nome-da-tabela.* e nome-da-correlação.* são expandidos como todas as colunas da tabela identificada. Esta tabela deve estar listada na cláusula FROM associada.

#### Atribuir nomes às colunas

Pode ser atribuído um nome a uma coluna do ItemSeleção utilizando a cláusula AS. Quando a ExpressãoSeleção aparece no operador UNION, INTERSECT ou EXCEPT, os nomes da primeira ExpressãoSeleção são usados como os nomes das colunas no resultado da operação. Se uma coluna do ItemSeleção não for uma expressão simples de ReferênciaColuna, ou não for dado um nome através da cláusula AS, será atribuído para a mesma um nome único gerado.

Estes nomes de colunas são úteis em vários casos:

- São tornados disponíveis no ResultSetMetaData do JDBC.
- São utilizados como nomes das colunas na tabela resultante, quando a ExpressãoSeleção é utilizada como subconsulta de tabela na cláusula FROM.
- São utilizados na cláusula ORDER BY como nomes de coluna disponíveis para classificação.

    -- este exemplo mostra SELECT-FROM-WHERE
    -- com uma cláusula ORDER BY
    -- e nome-da-correlação para as tabelas
    SELECT CONSTRAINTNAME, COLUMNNAME
    FROM SYS.SYSTABLES t, SYS.SYSCOLUMNS col,
    SYS.SYSCONSTRAINTS cons, SYS.SYSCHECKS checks
    WHERE t.TABLENAME = 'VÔOS'
    AND t.TABLEID = col.REFERENCEID
    AND t.TABLEID = cons.TABLEID
    AND cons.CONSTRAINTID = checks.CONSTRAINTID
    ORDER BY CONSTRAINTNAME;

    -- Este exemplo mostra a utilização da cláusula DISTINCT
    SELECT DISTINCT NUM_ATIV
    FROM ATIV_EMP;

    -- Este exemplo mostra como mudar o nome de uma expressão.
    -- Utilizando a tabela EMPREGADOS,
    -- listar o número do departamento (DEP_TRAB) e
    -- o maior salário do departamento (SALÁRIO) com nome mudado para BOSS
    -- para todos os departamentos cujo salário máximo seja menor que o
    -- salário médio de todos os outros departamentos.
    SELECT DEP_TRAB AS DPT, MAX(SALÁRIO) AS BOSS
    FROM EMPREGADOS EMP_COR
    GROUP BY DEP_TRAB
    HAVING MAX(SALÁRIO) < (SELECT AVG(SALÁRIO)
                              FROM EMPREGADOS
                              WHERE NOT DEP_TRAB = EMP_COR.DEP_TRAB)
    ORDER BY BOSS;

Tópico pai: Instruções
Conceitos relacionados
Interação com o sistema de dependências
Instruções CREATE
Instruções DROP
Instruções RENAME
Instruções SET
Referências relacionadas
Instrução ALTER TABLE
CALL (PROCEDIMENTO)
Cláusula CONSTRAINT
Instrução DECLARE GLOBAL TEMPORARY TABLE
Instrução DELETE
Cláusula FOR UPDATE
Cláusula FROM
Cláusula GROUP BY
Cláusula HAVING
INNER JOIN
Instrução INSERT
Operação JOIN
LEFT OUTER JOIN
Instrução LOCK TABLE
Cláusula ORDER BY
Consulta
RIGHT OUTER JOIN
SubconsultaEscalar
Instrução SELECT
ExpressãoTabela
SubconsultaTabela
Instrução UPDATE
VALUES Expressão
Cláusula WHERE
Cláusula WHERE CURRENT OF