agregando dados usando funções de grupo
TRANSCRIPT
Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
55
Agregando Dados Usando Funções de Grupo
Agregando Dados Usando Funções de Grupo
5-2 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
ObjetivosObjetivos
Depois de completar esta lição, você poderá Depois de completar esta lição, você poderá fazer o seguinte:fazer o seguinte:
• Identificar as funções de grupo disponíveis
• Descrever o uso de funções de grupo
• Agrupar dados usando a cláusula GROUP BY
• Incluir ou excluir linhas agrupadas usando a cláusula HAVING
Depois de completar esta lição, você poderá Depois de completar esta lição, você poderá fazer o seguinte:fazer o seguinte:
• Identificar as funções de grupo disponíveis
• Descrever o uso de funções de grupo
• Agrupar dados usando a cláusula GROUP BY
• Incluir ou excluir linhas agrupadas usando a cláusula HAVING
5-3 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
O Que São Funções de Grupo?O Que São Funções de Grupo?As funções de grupo operam em conjuntos de As funções de grupo operam em conjuntos de linhas para fornecer um resultado por grupo.linhas para fornecer um resultado por grupo. As funções de grupo operam em conjuntos de As funções de grupo operam em conjuntos de linhas para fornecer um resultado por grupo.linhas para fornecer um resultado por grupo. EMPEMP
"salário"saláriomáximo namáximo na
tabela EMP"tabela EMP"
DEPTNO SAL--------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250
MAX(SAL)
---------
5000
5-4 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Tipos de Funções de GrupoTipos de Funções de Grupo
• AVG
• COUNT
• MAX
• MIN
• STDDEV
• SUM
• VARIANCE
• AVG
• COUNT
• MAX
• MIN
• STDDEV
• SUM
• VARIANCE
5-5 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando Funções de GrupoUsando Funções de Grupo
SELECT [coluna,] group_function(coluna)FROM tabela[WHERE condição][GROUP BY coluna][ORDER BY coluna];
5-6 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando Funções AVG e SUMUsando Funções AVG e SUM
AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL)-------- --------- --------- --------- 1400 1600 1250 5600
Você pode usar AVG e SUM para dados numéricos.Você pode usar AVG e SUM para dados numéricos.Você pode usar AVG e SUM para dados numéricos.Você pode usar AVG e SUM para dados numéricos.
SQL> SELECT AVG(sal), MAX(sal), 2 MIN(sal), SUM(sal) 3 FROM emp 4 WHERE job LIKE 'SALES%';
5-7 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando Funções MIN e MAXUsando Funções MIN e MAX
Você pode usar MIN e MAX para qualquer tipo Você pode usar MIN e MAX para qualquer tipo de dados.de dados.Você pode usar MIN e MAX para qualquer tipo Você pode usar MIN e MAX para qualquer tipo de dados.de dados.
SQL> SELECT MIN(hiredate), MAX(hiredate) 2 FROM emp;
MIN(HIRED MAX(HIRED--------- ---------17-DEC-80 12-JAN-83
5-8 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando a Função COUNT Usando a Função COUNT
COUNT(*)--------- 6
SQL> SELECT COUNT(*) 2 FROM emp 3 WHERE deptno = 30;
COUNT(*) retorna o número de linhas em uma COUNT(*) retorna o número de linhas em uma tabela. tabela. COUNT(*) retorna o número de linhas em uma COUNT(*) retorna o número de linhas em uma tabela. tabela.
5-9 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando a Função COUNTUsando a Função COUNT
COUNT(COUNT(exprexpr) retorna o número de linhas não ) retorna o número de linhas não nulas.nulas.COUNT(COUNT(exprexpr) retorna o número de linhas não ) retorna o número de linhas não nulas.nulas.
SQL> SELECT COUNT(comm) 2 FROM emp 3 WHERE deptno = 30;
COUNT(COMM)----------- 4
5-10 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Funções de Grupo e Valores NulosFunções de Grupo e Valores Nulos
As funções de grupo ignoram valores nulos As funções de grupo ignoram valores nulos na coluna.na coluna. As funções de grupo ignoram valores nulos As funções de grupo ignoram valores nulos na coluna.na coluna.
SQL> SELECT AVG(comm) 2 FROM emp;
AVG(COMM)--------- 550
5-11 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando a Função NVL com Funções de GrupoUsando a Função NVL com Funções de Grupo
A função NVL força as funções de grupo a A função NVL força as funções de grupo a incluírem valores nulos.incluírem valores nulos. A função NVL força as funções de grupo a A função NVL força as funções de grupo a incluírem valores nulos.incluírem valores nulos.
SQL> SELECT AVG(NVL(comm,0)) 2 FROM emp;
AVG(NVL(COMM,0))---------------- 157.14286
5-12 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Criando Grupos de DadosCriando Grupos de Dados
EMPEMP
"salário"saláriomédiomédio
na tabela na tabela EMP EMP
para cada para cada departamento"departamento"
2916.66672916.6667
21752175
1566.66671566.6667
DEPTNO SAL--------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250
DEPTNO AVG(SAL)
------- ---------
10 2916.6667
20 2175
30 1566.6667
5-13 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Criando Grupos de Dados: Cláusula GROUP BY
Criando Grupos de Dados: Cláusula GROUP BY
SELECT coluna, group_function(coluna)FROM tabela[WHERE condição][GROUP BY group_by_expression][ORDER BY coluna];
Divida linhas de uma tabela em grupos Divida linhas de uma tabela em grupos menores usando a cláusula GROUP BY.menores usando a cláusula GROUP BY.Divida linhas de uma tabela em grupos Divida linhas de uma tabela em grupos menores usando a cláusula GROUP BY.menores usando a cláusula GROUP BY.
5-14 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando a Cláusula GROUP BYUsando a Cláusula GROUP BY
Todas as colunas na lista SELECT que não Todas as colunas na lista SELECT que não estejam em funções de grupo devem estar na estejam em funções de grupo devem estar na cláusula GROUP BY. cláusula GROUP BY.
Todas as colunas na lista SELECT que não Todas as colunas na lista SELECT que não estejam em funções de grupo devem estar na estejam em funções de grupo devem estar na cláusula GROUP BY. cláusula GROUP BY.
SQL> SELECT deptno, AVG(sal) 2 FROM emp 3 GROUP BY deptno;
DEPTNO AVG(SAL)--------- --------- 10 2916.6667 20 2175 30 1566.6667
5-15 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando a Cláusula GROUP BYUsando a Cláusula GROUP BY
A coluna GROUP BY não precisa estar na lista A coluna GROUP BY não precisa estar na lista SELECT.SELECT.A coluna GROUP BY não precisa estar na lista A coluna GROUP BY não precisa estar na lista SELECT.SELECT.
SQL> SELECT AVG(sal) 2 FROM emp 3 GROUP BY deptno;
AVG(SAL)--------- 2916.6667 21751566.6667
5-16 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Agrupando por Mais de Uma Coluna
Agrupando por Mais de Uma Coluna
EMPEMP
"soma de"soma desalários nasalários natabela EMPtabela EMPpara cadapara cada
cargo,cargo,agrupados por agrupados por departamento"departamento"
DEPTNO JOB SAL
--------- --------- ---------
10 MANAGER 2450
10 PRESIDENT 5000
10 CLERK 1300
20 CLERK 800
20 CLERK 1100
20 ANALYST 3000
20 ANALYST 3000
20 MANAGER 2975
30 SALESMAN 1600
30 MANAGER 2850
30 SALESMAN 1250
30 CLERK 950
30 SALESMAN 1500
30 SALESMAN 1250
JOB SUM(SAL)
--------- ---------
CLERK 1300
MANAGER 2450
PRESIDENT 5000
ANALYST 6000
CLERK 1900
MANAGER 2975
CLERK 950
MANAGER 2850
SALESMAN 5600
DEPTNO
--------
10
10
10
20
20
20
30
30
30
5-17 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando a Cláusula GROUP BY em Várias Colunas
Usando a Cláusula GROUP BY em Várias Colunas
SQL> SELECT deptno, job, sum(sal) 2 FROM emp 3 GROUP BY deptno, job;
DEPTNO JOB SUM(SAL)--------- --------- --------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 6000 20 CLERK 1900...9 rows selected.
5-18 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Consultas Ilegais Usando Funções de Grupo
Consultas Ilegais Usando Funções de Grupo
Qualquer coluna ou expressão na lista SELECT Qualquer coluna ou expressão na lista SELECT que não seja uma função agregada deve estar que não seja uma função agregada deve estar na cláusula GROUP BY. na cláusula GROUP BY.
Qualquer coluna ou expressão na lista SELECT Qualquer coluna ou expressão na lista SELECT que não seja uma função agregada deve estar que não seja uma função agregada deve estar na cláusula GROUP BY. na cláusula GROUP BY.
SQL> SELECT deptno, COUNT(ename) 2 FROM emp;
SQL> SELECT deptno, COUNT(ename) 2 FROM emp;
SELECT deptno, COUNT(ename) *ERROR at line 1:ORA-00937: Nenhuma função de grupo de grupo único (Not a single-group group function)
SELECT deptno, COUNT(ename) *ERROR at line 1:ORA-00937: Nenhuma função de grupo de grupo único (Not a single-group group function)
ColunaColuna ausenteausente nana cláusulacláusula GROUP BYGROUP BY
ColunaColuna ausenteausente nana cláusulacláusula GROUP BYGROUP BY
5-19 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Consultas Ilegais Usando Funções de Grupo
Consultas Ilegais Usando Funções de Grupo
• Não é possível usar a cláusula WHERE para restringir grupos.
• Use a cláusula HAVING para restringir grupos.
• Não é possível usar a cláusula WHERE para restringir grupos.
• Use a cláusula HAVING para restringir grupos.
SQL> SELECT deptno, AVG(sal) 2 FROM emp 3 WHERE AVG(sal) > 2000 4 GROUP BY deptno;
SQL> SELECT deptno, AVG(sal) 2 FROM emp 3 WHERE AVG(sal) > 2000 4 GROUP BY deptno;
WHERE AVG(sal) > 2000 *ERROR at line 3:ORA-00934: A função de grupo não é permitida aqui (Group function is not allowed here)
WHERE AVG(sal) > 2000 *ERROR at line 3:ORA-00934: A função de grupo não é permitida aqui (Group function is not allowed here)
NãoNão é possível usar a cláusula
é possível usar a cláusula
WHERE para restringir g
rupos
WHERE para restringir g
rupos
NãoNão é possível usar a cláusula
é possível usar a cláusula
WHERE para restringir g
rupos
WHERE para restringir g
rupos
5-20 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Excluindo Resultados do GrupoExcluindo Resultados do Grupo
"salário"saláriomáximo pormáximo por
departamentodepartamentomaior do quemaior do queUS$ 2.900"US$ 2.900"
EMPEMP
DEPTNO SAL
--------- ---------
10 2450
10 5000
10 1300
20 800
20 1100
20 3000
20 3000
20 2975
30 1600
30 2850
30 1250
30 950
30 1500
30 1250
50005000
30003000
28502850
DEPTNO MAX(SAL)
--------- ---------
10 5000
20 3000
5-21 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Excluindo Resultados do Grupo: Cláusula HAVING
Excluindo Resultados do Grupo: Cláusula HAVING
Use a cláusula HAVING para restringir gruposUse a cláusula HAVING para restringir grupos
• As linhas são agrupadas.
• A função de grupo é aplicada.
• Os grupos que correspondem à cláusula HAVING são exibidos.
Use a cláusula HAVING para restringir gruposUse a cláusula HAVING para restringir grupos
• As linhas são agrupadas.
• A função de grupo é aplicada.
• Os grupos que correspondem à cláusula HAVING são exibidos.
SELECT coluna, group_functionFROM tabela[WHERE condição][GROUP BY group_by_expression][HAVING group_condition][ORDER BY coluna];
5-22 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando a Cláusula HAVINGUsando a Cláusula HAVING
SQL> SELECT deptno, max(sal) 2 FROM emp 3 GROUP BY deptno 4 HAVING max(sal)>2900;
DEPTNO MAX(SAL)--------- --------- 10 5000 20 3000
5-23 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Usando a Cláusula HAVINGUsando a Cláusula HAVING
SQL> SELECT job, SUM(sal) PAYROLL 2 FROM emp 3 WHERE job NOT LIKE 'SALES%' 4 GROUP BY job 6 ORDER BY SUM(sal);
JOB PAYROLL--------- ---------ANALYST 6000MANAGER 8275
5 HAVING SUM(sal)>5000
5-24 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Aninhando Funções de GrupoAninhando Funções de Grupo
SQL> SELECT max(avg(sal)) 2 FROM emp 3 GROUP BY deptno;
MAX(AVG(SAL))------------- 2916.6667
Exiba o salário médio máximo. Exiba o salário médio máximo. Exiba o salário médio máximo. Exiba o salário médio máximo.
5-25 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
SumárioSumário
SELECT coluna, group_function(coluna)FROM tabela[WHERE condição][GROUP BY group_by_expression][HAVING group_condition][ORDER BY coluna];
Ordem de avaliação das cláusulas:Ordem de avaliação das cláusulas:
• cláusula WHERE
• cláusula GROUP BY
• cláusula HAVING
Ordem de avaliação das cláusulas:Ordem de avaliação das cláusulas:
• cláusula WHERE
• cláusula GROUP BY
• cláusula HAVING
5-26 Copyright © Oracle Corporation, 1999. Todos os direitos reservados.
Visão Geral do ExercícioVisão Geral do Exercício
• Mostrando diferentes consultas que usam funções de grupo
• Agrupando por linhas para obter mais de um resultado
• Excluindo grupos usando a cláusula HAVING
• Mostrando diferentes consultas que usam funções de grupo
• Agrupando por linhas para obter mais de um resultado
• Excluindo grupos usando a cláusula HAVING