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