ExpressãoSeleção Expressão de seleção DISTINCT clauseparte da ExpressãoSeleção * como curinga no SQL SELECT

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 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 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;