Você está na página 1de 21

BANCO DE DADOS II

SQL AVANADO PARTE 3


Frederico Queiroga fredericoqueiroga@gmail.com https://sites.google.com/site/fredericoqueiroga/

Agrupando Resultados GROUP BY


Sintaxe: SELECT <colunas> FROM <tabelas> GROUP BY <coluna> [HAVING <condio>] GROUP BY
Organiza as linhas de resultado em grupos de acordo com os valores das expresses informadas. Uso com funes agregadas.

HAVING (opcional)
Restringe (filtra) a seleo de acordo com os resultados. S pode ser usado junto com o GROUP BY.

Agrupando Resultados GROUP BY


Exemplo 1: Exibir a quantidade de homens e mulheres da empresa.
SELECT sexo, COUNT(*) AS Quantidade FROM Funcionario GROUP BY sexo

Resultado da consulta:
Sexo F M Quantidade 3 2

Agrupando Resultados GROUP BY


Exemplo 2: Exibir a quantidade de pedidos por vendedor.
Apresente o resultado ordenado pelo nome do vendedor. SELECT F.nome, COUNT(*) AS Quantidade de Pedidos FROM Pedido P, Funcionario F WHERE P.vendedor = F.codigo Observao: Ao usar ORDER BY com GROUP BY, a GROUP BY F.nome lista de colunas do ORDER BY fica limitada s colunas includas na clusula GROUP BY ou aos ORDER BY F.nome
valores agregados.

Resultado da consulta:
Nome Francisco da Silva Joo da Silva Luiza Costa Maria de Souza Quantidade de Pedidos 3 11 5 12

Agrupando Resultados GROUP BY


Exemplo 3: Exibir para cada setor da empresa (sigla e nome), a quantidade de funcionrios e o somatrio dos seus salrios.
SELECT F.Setor, S.Nome, COUNT(*) AS Qtde, SUM(salrio) AS Total FROM Funcionario F, Setor S WHERE F.setor = S.sigla Observao: A clusula SELECT deve conter apenas as colunas que esto no GROUP BY F.Setor, S.Nome GROUP BY e valores agregados. Resultado da consulta:
Setor ADM COV MKT SEG Nome Administrao Compra e Venda Marketing Segurana Qtde 1 2 1 1 Total 950,00 590,00 300,00 390,00

Agrupando Resultados GROUP BY


Exemplo 4: Exibir para cada setor da empresa, a quantidade de funcionrios e o somatrio dos seus salrios, apenas se a soma dos salrios for maior do que R$ 500,00.
SELECT F.Setor, S.Nome, COUNT(*) AS Qtde, SUM(salario) AS Total FROM Funcionario F, Setor S WHERE F.setor = S.sigla GROUP BY F.Setor, S.Nome HAVING SUM(salario) > 500 Resultado da consulta:
Setor ADM COV Nome Administrao Compra e Venda Qtde 1 2 Total (salrio) 950,00 590,00

Agrupando Resultados GROUP BY


Exemplo 5:
o Exibir a quantidade de pedidos por vendedor. o Totalizar apenas os pedidos realizados a partir de 2007. o Apresentar os totais apenas se a quantidade de pedidos por vendedor for maior do que cinco. o Ordene pelo nome do vendedor. SELECT F.nome, COUNT(*) AS Quantidade de Pedidos Observao: FROM Pedido P, Funcionario F Se a condio for baseada em valores de atributos individuais do banco de WHERE P.vendedor = F.codigo AND dados, ento ficar na clusula WHERE. Se a condio for baseada no clculo P.dataPedido >= 01/01/2007 de grupo, executado por uma funo integrada, ento ficar na clusula GROUP BY F.nome HAVING. HAVING COUNT(*) > 5 Nome Quantidade de Pedidos ORDER BY F.nome
Joo da Silva 11 9

Resultado da consulta:

Maria de Souza

Consultas SQL Sub-Consultas


O que ? Uma sub-consulta uma consulta SQL, aninhada dentro de outro comando SQL. Uma sub-consulta deve ser delimitada entre parnteses e avaliada apenas uma vez. O resultado de uma sub-consulta retorna um conjunto de linhas para a consulta principal, ou seja, a consulta principal (mais externa) depende do resultado da sub-consulta.

Consultas SQL Sub-Consultas


Retorno de uma sub-consulta:
Uma sub-consulta de valor nico retorna apenas um valor e pode ser usada no lugar de qualquer expresso, utilizando os operadores de comparao (=, <, >, <>).
o 1 coluna 1 valor o Exemplos: o WHERE A = (SELECT B FROM ....) /* Verdade se A = B */ o WHERE A > (SELECT B FROM ....) /* Verdade se A > B */

Uma sub-consulta de valores mltiplos retorna uma lista de valores e pode ser usada apenas em um WHERE, utilizando as clausulas IN ou NOT IN.
o 1 coluna mltiplos valores o Exemplo: o WHERE A IN (SELECT B FROM ...) /* Se A estiver no conjunto retornado */ o WHERE A NOT IN (SELECT B FROM ...) /* Se A no estiver no conjunto */

Consultas SQL Sub-Consultas


Exemplo 1: Exibir o nome e o valor da gratificao da funo que tm a menor gratificao da empresa. SELECT nome, gratific FROM Funcao WHERE gratific = (SELECT MIN(gratific) FROM Funcao) Resultado da consulta:
Nome Auxiliar de Caixa Gratifc 126.00

Pergunta: a consulta acima poder retornar mais de um registro?


Sim, caso duas funes possuam gratificaes iguais e menores!

Consultas SQL Sub-Consultas


Exemplo 2: Exibir o cdigo e o nome de todos os clientes que moram fora de Joo Pessoa. SELECT codigo, nome FROM Cliente WHERE cidade IN ( SELECT codigo FROM Cidade WHERE nome <> Joao Pessoa) ou SELECT C.codigo, C.nome FROM Cliente C, Cidade CI WHERE C.cidade = CI.codigo AND CI.nome <> Joao Pessoa
Observao: O mtodo prefervel (quando possvel) usar a juno para recuperar dados. Isso, no entanto, nem sempre possvel.

Consultas SQL Sub-Consultas


Exemplo 3: Exibir cdigo e nome do funcionrio mais velho. SELECT codigo, nome FROM Funcionario WHERE dataNasc = (SELECT MIN(dataNasc) FROM Funcionario) Resultado da consulta:
Codigo 2 Nome Maria de Souza

Consultas SQL Sub-Consultas


Lista de valores especiais: > ALL: maior do que todos < ALL: menor do que todos <> ALL: diferente de todos (igual ao NOT IN) = ANY: igual a um dos elementos da lista (igual ao IN ) > ANY: maior do que algum dos elementos da lista < ANY: menor do que algum dos elementos da lista <> ANY: diferente de algum dos elementos da lista

Consultas SQL Sub-Consultas


Exemplo 4: Exibir nome, tipo e preo de venda dos produtos que no sejam dos tipos 3, 4 ou 5, e que tenham preo de venda maior que pelo menos o preo de um destes produtos. SELECT nome, tipo, venda FROM Produto WHERE tipo NOT IN (3,4,5) AND venda > ANY (SELECT venda FROM Produto WHERE tipo IN (3,4,5) )

Consultas SQL Clusula UNION


Sintaxe:
SELECT <colunas> FROM <tabelas> UNION SELECT <colunas> FROM <tabelas>

Objetivo:
A clusula UNION utilizada para combinar o resultado de dois (ou mais) comandos SQL. Os dois (ou mais) comandos podem trazer dados de tabelas diferentes, desde que com a mesma quantidade de colunas e tipos de dados compatveis para cada coluna correspondente no SELECT. Na unio dos conjuntos, os elementos repetidos so eliminados (como se usasse a clusula DISTINCT). Para no eliminar os elementos duplicados: usar UNION ALL

Consultas SQL Clusula UNION


Exemplo: Exibir o nome de todos os clientes e todos os funcionrios da loja, identificando o mesmo (cliente ou funcionrio). Exiba a consulta ordenando o resultado pelo nome. SELECT Nome, 'Cliente' AS Identificao FROM Cliente UNION SELECT Nome, 'Funcionrio' FROM Funcionario ORDER BY Nome Pergunta: Poderamos ordenar o resultado pelo campo Identificao? Sim, teramos: ORDER BY Identificao, Nome

Consultas SQL para Criao de Tabelas


Sintaxe: SELECT <colunas> INTO <nova_tabela> FROM <tabelas> A nova tabela pode ser:
Uma tabela fsica que ser criada no banco de dados.
o Exemplo: SELECT codigo INTO Tabela_Fisica FROM Produto

Uma tabela temporria local: usar o caractere # antes do nome.


o Exemplo: SELECT codigo INTO #Tabela_Local FROM Produto

Uma tabela temporria global: usar o caractere ## antes do nome.


o Exemplo: SELECT codigo INTO ##Tabela_Global FROM Produto

Consultas SQL para Criao de Tabelas


Exemplo 1: Usando uma consulta SQL, crie uma nova tabela fsica que contenha o cdigo do pedido, nome e telefone do cliente, dos trs primeiros pedidos realizados. SELECT TOP 3 P.codigo, C.nome, C.fone INTO Teste FROM Pedido P, Cliente C WHERE P.cliente = C.codigo Consultando a nova tabela: SELECT * FROM Teste Resultado:
Cdigo 1 2 3 Nome Joo Paulo Correia LT Comrcio JR Representaes Fone 3245-8999 3256-9981 5841-9871

Consultas SQL para Criao de Tabelas


Exemplo 2: Selecione a quantidade de pedidos agrupados por cliente (nome) para uma nova tabela temporria global. SELECT C.nome, COUNT(*) AS Qtde_Pedidos INTO ##Teste FROM Pedido P, Cliente C WHERE P.cliente = C.codigo GROUP BY C.nome Consultando a nova tabela:
Nome Qtde_Pedidos 2 7 3 2 4 8

SELECT * FROM ##Teste Resultado:

Joo Paulo Correia JR Representaes Larissa Maia LT Comrcio Marcos Andrade Maria Helena Ferreira

Consultas SQL para Criao de Tabelas


Observaes:
Uma tabela temporria local (#) tem visibilidade restrita para a conexo do usurio responsvel pela sua criao. Uma tabela temporria global (##) so visveis para todas as conexes ativas no SGBD. Os dois tipos de tabelas temporrias (locais e globais) s existem enquanto a conexo responsvel pela sua criao estiver ativa, ou seja, so destrudas automaticamente quando a conexo desfeita. Cuidado com a duplicao do nome da tabela temporria durante a sua criao! Se acontecer, teremos uma situao de erro! S utilize tabelas temporrias quando necessrio: utilizao exige gravao em disco baixa performance.

SQL Avanado Parte 3

Fim
Prxima aula: SQL Avanado Prtica 3

Você também pode gostar