domingo, 22 de dezembro de 2019

SQL - Agrupamento GROUP BY


GROUP BY - Agrupamentos 

As funções de grupo operam sobre grupos de tuplas(linhas). Retornam resultados baseados em grupos de tuplas em vez de resultados de funções por tupla individual. 

A claúsula "group by" do comando "select" é utilizada para dividir tuplas em grupos menores. 

A cláusula "GROUP BY" pode ser usada para dividir as tuplas de uma tabela em grupos menores. As funções de grupo devolvem uma informação sumarizada para cada grupo. 

16) Apresente a média de salário pagos por departamento. 

Resp: SELECT DUPNUME, AVG(EMPSALA) FROM EMP GROUP BY DEPNUME; 

Observação: Qualquer coluna ou expressão na lista de seleção, que não for uma função agregada, deverá constar da claúsula "group by". Portanto é errado tentar impor uma "restrição" do tipo agregada na cláusula Where. Having 

A cláusula "HAVING" pode ser utilizada para especificar quais grupos deverão ser exibidos, portanto restringindo-os. 

17) Retome o problema anterior, porém apresente resposta apenas para departamentos com mais de 10 empregados. 

Resp: SELECT DEPNUME, AVG(EMPSALA) FROM EMP GROUP BY DEPNUME HAVING COUNT(*) > 3; 

Observação.: A claúsula "group by" deve ser colocada antes da "having", pois os grupos são formados e as funções de grupos são calculadas antes de se resolver a cláusula "having". 

A cláusula "where" não pode ser utilizada para restringir grupos que deverão ser exibidos. 

Exemplificando ERRO típico - Restringindo Média Maior que 1000: 

SELECT DEPNUME, AVG(EMPSALA) FROM EMP WHERE AVG(SALARIO) > 1000 GROUP BY DEPNUME; 
( Esta seleção está ERRADA! ) 

SELECT DEPNUME, AVG(EMPSALA) FROM EMP GROUP BY DEPNUME HAVING AVG(EMPSALA) > 1000; 
( Seleção Adequada ) 

Seqüência no comando "Select": 

SELECT coluna(s) FROM tabela(s) WHERE condições das tuplas GROUP BY condições dos grupos de tuplas HAVING condições dos grupos de tuplas ORDER BY colunas; 

O "sql" fará a seguinte avaliação: 

a) WHERE, para estabelecer tuplas individuais candidatas (não pode conter funções de grupo) 

b) GROUP BY, para fixar grupos. 

c) HAVING, para selecionar grupos para exibição. 

Equi-Junção (junção por igualdade) - O relacionamento existente entre tabelas é chamado de equi-junção, pois os valores de colunas das duas tabelas são iguais. 

A Equi-junção é possível apenas quando tivermos definido de forma adequada a chave estrangeira de uma tabela e sua referência a chave primária da tabela precedente. 

Apesar de admitir-se em alguns casos, a equi-junção de tabelas, sem a correspondência Chave Primária-Chave Estrangeira, recomendamos fortemente não utilizar este tipo de construção, pois certamente em nenhum momento nos exemplos propostos em nossa disciplina SQL ou nas disciplinas de Análise e Projeto de Sistemas, serão necessárias tais junções. 

18) Listar Nomes de Empregados, Cargos e Nome do Departamento onde o empregado trabalha. 

Resp: Observemos que dois dos três dados solicitados estão na Tabela Emp, enquanto o outro dado está na Tabela Dept. 

Deveremos então acessar os dados restringindo convenientemente as relações existentes entre as tabelas.  De fato sabemos que DEPNUME é chave primária da tabela de Departamentos e também é chave estrangeira da Tabela de Empregados. Portanto, este campo será o responsável pela equi-junção. 

SELECT A.EMPNOME, A.EMPSERV, B.DEPNOME FROM EMP A, DEPT B WHERE A.DEPNUME = B.DEPNUME; 

Observação: 

Note que as tabelas quando contém colunas com o mesmo nome, usa-se um apelido "alias" para substituir o nome da tabela associado a coluna. 

Imagine que alguém tivesse definido NOME para ser o Nome do Empregado na Tabela de Empregados e também NOME para ser o Nome do Departamento na Tabela de Departamentos. 

Tudo funcionaria de forma adequada, pois o aliás se encarregaria de evitar que uma ambiqüidade fosse verificada. 

Embora o SQL resolva de forma muito elegante o problema da nomenclatura idêntica para campos de tabelas, recomendamos que o estudante fortemente evite tal forma de nomear os campos. 

O SQL nunca confundirá um A.NOME com um B.NOME, porém podemos afirmar o mesmo de nós mesmos? 

19) Liste os Códigos do Cada Funcionário, seus Nomes, seus Cargos e o nome do Gerente ao qual este se relaciona. 

Resp: Precisamos criar um auto-relacionamento, ou seja, juntar uma tabela a ela própria. É possível juntarmos uma tabela a ela mesma com a utilização de apelidos, permitindo juntar tuplas da tabela a outra tuplas da mesma tabela. 

SELECT A.EMPNUME, A.EMPNOME, A.EMPSERV, B.EMPNOME FROM EMP A, EMP B WHERE A.EMPGERE = B.EMPNUME; 

As Sub-Consultas Uma sub-consulta é um comando "select" que é aninhado dentro de outro "select" e que devolve resultados intermediários. 

20) Relacione todos os nomes de funcionários e seus respectivos cargos, desde que o orçamento do departamento seja igual a 300000. 

Resp: SELECT EMPNOME, EMPSERV FROM EMP A WHERE 300000 IN (SELECT DEPORCA FROM DEPT WHERE DEPT.DEPNUME = A.DEPNUME ); 

Nota: Observe que a cláusula IN torna-se verdadeira quando o atributo indicado está presente no conjunto obtido através da subconsulta. 

21) Relacione todos os departamentos que possuem empregados com remuneração maior que 3500. 

Resp: SELECT DEPNOME FROM DEPT A WHERE EXISTS (SELECT * FROM EMP WHERE EMPSALA > 3500 AND EMP.DEPNUME = A.DEPNUME'); 

Nota: Observe que a cláusula EXISTS indica se o resultado de uma pesquisa contém ou não tuplas. Observe também que poderemos verficar a não existência (NOT EXISTS) caso esta alternativa seja mais conveniente.

Nenhum comentário: