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.
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.
-- 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 resultado da Express??oSele????o ?? sempre uma tabela.
VALUES CURRENT_TIMESTAMP
Consulte Express??o VALUES.
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.
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.
-- 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;