You are on page 1of 27

BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR CAPITULO 3 PARTE II - SUBCONSULTAS Chamamos subconsultas, ou CONSULTAS ANINHADAS, àquelas

que fornecem resultados para outras consultas, que os utilizam normalmente em uma cláusula WHERE. Esta técnica amplia grandemente o poder da linguagem SQL, já que transfere pesados processamentos para o servidor, e portanto diminui a carga de programação no cliente e o tráfego na rede. A complexidade da construção de subconsultas é apenas aparente, pois na verdade a sua implementação e mais intuitiva do que a criação de muitos comandos SQL. Mesmo quando aninhamos várias subconsultas, a sua criação torna-se simples se nós as construirmos sempre da mais interna para a mais externa, tendo sempre em mente que nessa ordem elas serão executadas pelo SGBD. Para exemplificar, suponhamos que em uma livraria exista a seguinte tabela, com livros disponíveis e seus respectivos autores: LIVROS
AUTOR CONTOS MACHADO DE ASSIS DOM CASMURRO MACHADO DE ASSIS HELENA MACHADO DE ASSIS O OUTRO LADO DA MEIA NOITE SYDNEY SHELDON QUINCAS BORBA MACHADO DE ASSIS SE HOUVER AMANHA SYDNEY SHELDON LIVRO

Caso um comprador solicite um determinado livro, o vendedor poderá desejar uma relação de livros do mesmo autor, com o intuito de oferecê-los ao provável comprador. Como vimos no capítulo anterior, se o cliente perguntou pelo livro QUINCAS BORBA, a consulta que retorna o autor deste livro será: SELECT AUTOR FROM LIVROS WHERE LIVRO="QUINCAS BORBA"
AUTOR MACHADO DE ASSIS

Em seguida, a consulta para relacionar os livros deste autor será a consulta abaixo, que contém a consulta anterior como subconsulta: SELECT LIVRO, AUTOR FROM LIVROS WHERE AUTOR=(SELECT AUTOR FROM LIVROS WHERE LIVRO= “QUINCAS BORBA”)

PAGINA 1

BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR

LIVRO HELENA DOM CASMURRO QUINCAS BORBA CONTOS

AUTOR MACHADO DE ASSIS MACHADO DE ASSIS MACHADO DE ASSIS MACHADO DE ASSIS

Observe os seguintes detalhes : a) A subconsulta SELECT AUTOR FROM LIVROS WHERE LIVRO= “QUINCAS BORBA” é executada primeiro e retorna o valor “MACHADO DE ASSIS”, que é utilizado na cláusula WHERE da consulta principal. b) A subconsulta deve ficar entre parênteses. c) Criamos uma consulta aninhada, que corresponde a seguinte pergunta: “Quais os livros do autor do livro “Quincas Borba”. Expresso em linguagem informal, parece sempre mais complicado do que é na verdade. Como já dissemos, o segredo é ler a consulta “de dentro para fora”. Este é o tipo mais simples de consulta, chamado consulta de identificação. Além dele, outros tipos de subconsulta serão estudados detalhadamente a seguir: 5.1 Subconsultas de Identificação.

As subconsultas de identificação retornam valores para que a consulta principal selecione registros comparando-os com eles.

PAGINA 2

relacione este e os outros do mesmo assunto. AUTOR FROM BIBLIOTECA WHERE ASSUNTO= (SELECT ASSUNTO FROM BIBLIOTECA WHERE TITULO="BANCOS DE DADOS RELACIONAIS") TITULO ASSUNTO ARQUITETURA EM BANCOS DE DADOS BANCO DE DADOS BANCOS DE DADOS RELACIONAIS BANCO DE DADOS ACCESS COMPLETO BANCO DE DADOS AUTOR JOSE JOAO LUCIA PAGINA 3 . a consulta que retorna os livros deste assunto será: SELECT TITULO.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR Exercício resolvido 5. exemplificando com o título “BANCOS DE DADOS RELACIONAIS”.1 Seja o banco de dados de livros de uma biblioteca: BIBLIOTECA TITULO ACCESS COMPLETO ALGORITMOS EM PORTUGOL ARQUITETURA EM BANCOS DE DADOS BANCOS DE DADOS RELACIONAIS LOGICA DE PROGRAMACAO I TECNICAS DE PROGRAMACAO ASSUNTO BANCO DE DADOS PROGRAMACAO BANCO DE DADOS BANCO DE DADOS PROGRAMACAO PROGRAMACAO AUTOR LUCIA JOAO JOSE JOAO LUCIA LUIS Crie uma consulta que. dado o título de um livro. ASSUNTO. Solução: A consulta que retorna o assunto deste livro será: SELECT ASSUNTO FROM BIBLIOTECA WHERE TITULO="BANCOS DE DADOS RELACIONAIS" ASSUNTO BANCO DE DADOS Logo.1.

1. Medicamentos similares são aqueles que possuem o mesmo princípio ativo. MEDICAMENTOS MEDICAMENTO PRINCIPIO TERTISOL BELADONA CARTIROL DIPIRONA ISOTRAN DIPIRONA PARASIL DIPIRONA PARTINON SULFAMIDA RETENIL SULFAMIDA TELADONA BELADONA BESTEIRON BELADONA VICETOL DIPIRONA VIGERON SULFAMIDA Elabore uma consulta que retorne todos os medicamentos SIMILARES ao CARTIROL. PRINCIPIO FROM MEDICAMENTOS WHERE PRINCIPIO= (SELECT PRINCIPIO FROM MEDICAMENTOS WHERE MEDICAMENTO="CARTIROL") MEDICAMENTO PRINCIPIO ISOTRAN DIPIRONA CARTIROL DIPIRONA PARASIL DIPIRONA VICETOL DIPIRONA PAGINA 4 . a consulta que retorna os medicamentos com este princípio será: SELECT MEDICAMENTO. Solução: A consulta que retorna o princípio ativo do CARTIROL será: SELECT PRINCIPIO FROM MEDICAMENTOS WHERE MEDICAMENTO="CARTIROL" PRINCIPIO DIPIRONA Portanto.2 Seja a tabela abaixo. contendo os medicamentos de uma farmácia e seus princípios ativos.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR Exercício resolvido 5.

BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR Exercícios propostos: 5.1.1 Criar uma consulta que retorne os médicos da tabela abaixo cuja especialidade é a do médico “RUI” MEDICOS ESPECIALIDADE RUI PSIQUIATRIA GERALDO PSIQUIATRIA LUIS FERNANDO ORTOPEDIA ANDREA PEDIATRIA CLAUDIO PEDIATRIA GARCIA PSIQUIATRIA MEDICO 5. BAIRROS EMPREGADO BRUNO LIVIO LUIS MARCELO ISABEL BAIRRO COPACABANA IPANEMA LEBLON IPANEMA IPANEMA 5. FILME ATORPRINCIPAL UM TIRA DA PESADA EDDIE MURPHY RAMBO SILVESTER STALLONE PRINCIPE EM N YORK EDDIE MURPHY 24 HORAS EDDIE MURPHY PRINCIPE DAS MARES NICK NOLTE PROFESSOR ALOPRADO EDDIE MURPHY 5.1.1.2 PAGINA 5 .4 Seja a Tabela de países abaixo: PAISES PAIS RENDA POPULACAO PIB Alemanha 356733 82200 2100 Bélgica 30518 10200 248.3 Crie uma consulta para selecionar da tabela de vídeos abaixo todos os filmes cujo ator principal é o ator principal do filme “24 HORAS”.2 Crie uma consulta que retorne os empregados da tabela abaixo que moram no mesmo bairro que “ISABEL”.1.

5 59100 Grécia 131957 10600 Holanda 41526 15800 Hungria 93033 10000 Itália 301302 57300 Iugoslávia 102173 10600 Portugal 91985 9900 Suécia 449964 8900 Suiça 41285 7400 PIB 12. Este tipo de subconsulta é similar ao tipo anterior. SUM. IN e ANY. acompanhadas pelos predicados ALL.2 1400 120. Veremos como são utilizadas as funções AVG.3 9 174.6 a) Criar uma consulta que retorne os países com renda maior que a Itália: b) Criar uma consulta que retorne os países com população maior que a Espanha c) Criar uma consulta que retorne os países com PIB maior que Portugal. MAX E MIN.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR PAIS RENDA POPULACAO Bulgária 110994 8200 Chipre 9251 790 Dinamarca 43093 5300 Espanha 505954 39600 França 543965. COUNT. 5.9 553.7 226.8 1200 9.7 381.8 47.5 263. PAGINA 6 .2 Subconsultas de Identificação com funções de valores agregados.5 106.

1 Criar uma consulta que retorne os funcionários da tabela abaixo que recebem salários acima da média da empresa: SALARIOS NOME SALARIO HILDA 1958 JOAO 698 JOAQUIM 1457 JOSE 312 LIENE 413 LUISA 915 MARY 358 ROBSON 245 SOCORRO 456 TERESA 214 TIAGO 780 Solução: A consulta que retorna a media salarial da empresa será: SELECT AVG(SALARIO) FROM SALARIOS AVG(SALARIO) 709.2.2.64 Portanto.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR Exercício resolvido 5.2 PAGINA 7 . SALARIO FROM SALARIOS WHERE SALARIO>(SELECT AVG(SALARIO) FROM SALARIOS) NOME SALARIO HILDA 1958 JOAQUIM 1457 LUISA 915 TIAGO 780 Exercício resolvido 5. a consulta desejada será: SELECT NOME.

IDADE FROM IDADES WHERE IDADE= (SELECT Max(IDADE) NOME IDADE LUISA 73 HELIO 73 MARCELO 73 LEUDE 73 FROM IDADES) PAGINA 8 .BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR Selecionar as pessoas de maior idade da tabela abaixo: IDADES CODIGO NOME IDADE 1 WILSON 37 2 LIA 23 3 LUISA 73 4 LAURA 24 5 JOYCE 19 6 SANDRA 16 7 HELIO 73 8 VINICIUS 3 9 ULRICH 7 10 JOAQUIM 12 11 LEUDE 54 12 DULCE 56 13 HILDA 65 14 LIVIO 65 15 MARCELO 73 16 TIAGO 67 17 LEUDE 73 18 CAROL 5 Solução: A consulta que retorna a maior idade da tabela é: SELECT Max(IDADE) Max(IDADE) 73 FROM IDADES Então. SELECT NOME. a consulta que retorna os funcionários que tem esta idade será.

2.3 Considere a Tabela abaixo com os anos das copas do mundo e os respectivos campeões. COUNT(CAMPEAO) FROM COPAS GROUP BY(CAMPEAO) HAVING COUNT(CAMPEAO)= (SELECT COUNT(CAMPEAO) FROM COPAS WHERE CAMPEAO="URUGUAI") CAMPEAO COUNT(CAMPEAO) PAGINA 9 . Solução: A consulta que retorna o número de vezes em que o URUGUAI foi campeão é: SELECT COUNT(CAMPEAO) FROM COPAS WHERE CAMPEAO="URUGUAI" COUNT(CAMPEAO) 2 Então. COPAS ANO CAMPEAO 1930 URUGUAI 1934 ITÁLIA 1938 ITÁLIA 1950 URUGUAI 1954 ALEMANHA 1958 BRASIL 1962 BRASIL 1966 INGLATERRA 1970 BRASIL 1974 ALEMANHA 1978 ARGENTINA 1982 ITÁLIA 1986 ARGENTINA 1990 ALEMANHA 1994 BRASIL 1998 FRANÇA 2002 BRASIL Crie uma consulta que selecione os países que foram campeões tantas vezes quanto o “URUGUAI”.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR Exercício resolvido 5. a consulta desejada será: SELECT CAMPEAO.

e não WHERE. Como regra. não podemos utilizar simplesmente a cláusula WHERE= como nos exemplos anteriores. a tabela abaixo contém os CD’S adquiridos pelos clientes em um site: CDS CD CLIENTE CAETANO 3 CALCINHA PRETA 9 CALYPSO 9 CHICO BUARQUE 2 DJAVAN 2 JOSE RIBEIRO 10 MILTON 2 MILTON 3 REGINALDO ROSSI 10 RPM 10 Desejamos elaborar a consulta “Quais os CD’S comprados por quem compra os CD’S de MILTON?”. quando quisermos comparar a igualdade com vários valores utilizaremos o WHERE IN. Entretanto. o verdadeiro potencial da utilização deste predicado fica evidente quando utilizamos subconsultas. para funcionar como recomendação para um cliente que solicitou um CD de Milton Nascimento. temos que selecionar os clientes que compram CD’S de Milton. Como a consulta retorna vários valores. Por exemplo. A subconsulta que localiza os clientes que compram CD’S de Milton será simplesmente: SELECT CLIENTE FROM CDS WHERE CD="MILTON" CLIENTE 2 3 Então iremos consultar os cds comprados por estes clientes. Observe também a obrigatoriedade da cláusula GROUP BY para valores agregados. precisamos selecionar os CD’S comprados por estes clientes. O predicado IN permite que retornemos valores que estão incluídos em um determinado conjunto.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR ARGENTINA URUGUAI 2 2 Observe o uso da clausula HAVING. Depois. Primeiramente. pois estamos utilizando uma função agregada. A consulta fica então: SELECT CD PAGINA 10 .

4 Em uma Livraria Virtual é solicitado aos clientes que atribuam uma nota para os livros que compraram.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR FROM CDS WHERE CLIENTE IN (SELECT CLIENTE FROM CDS WHERE CD="MILTON") GROUP BY CD CD CAETANO CHICO BUARQUE DJAVAN MILTON Retornando os CDS que provavelmente interessarão mais ao cliente que os outros da tabela. Queremos disponibilizar-lhe PAGINA 11 . resultando na seguinte tabela: SICILIANO CODCLIENTE 2 2 2 3 3 3 4 4 5 6 6 7 7 7 8 8 8 9 9 9 LIVRO NOTA LOGICA DE PROGRAMACAO 8 GRAFOS E ALGORITMOS 9 MATEMATICA PARA COMPUTACAO 10 GRAFOS E ALGORITMOS 8 MATEMATICA PARA COMPUTACAO 10 GRAFOS PARA COMPUTACAO 8 XADREZ BASICO 7 INTRODUCAO AO GAMAO 7 XADREZ BASICO 6 GRAFOS PARA COMPUTACAO 10 GRAFOS E ALGORITMOS 8 XADREZ BASICO 7 MANUAL DE XADREZ 9 XADREZ SEM MESTRE 7 XADREZ SEM MESTRE 8 FINAIS BASICOS 10 TATICA MODERNA EM XADREZ 8 GRAFOS E ALGORITMOS 7 GRAFOS PARA COMPUTACAO 10 INTELIGENCIA ARTIFICIAL 9 Um cliente consulta o livro “GRAFOS E ALGORITMOS”.2. Um exemplo semelhante temos no exercício abaixo: Exercício resolvido 5.

Elaborar uma consulta que crie esta lista.DESCRICAO FROM PRODUTOS PAGINA 12 . AVG(NOTA) FROM SICILIANO WHERE CODCLIENTE IN (SELECT CODCLIENTE FROM SICILIANO WHERE LIVRO="GRAFOS E ALGORITMOS") GROUP BY LIVRO ORDER BY AVG(NOTA) DESC Podemos utilizar o predicado NOT para retornar os registros que não estão na subconsulta. então: SELECT LIVRO. ordenadas decrescentemente. Solução: A consulta que retorna os compradores do livro “GRAFOS E ALGORITMOS” é: SELECT CODCLIENTE FROM SICILIANO WHERE LIVRO="GRAFOS E ALGORITMOS" CODCLIENTE 2 3 6 9 Observe que esta consulta é do tipo que pode retornar vários códigos de clientes (na verdade retornou). os produtos da tabela PRODUTOS que não estão na tabela VENDIDOS. a consulta que retornará os livros comprados por estes clientes e as médias de suas notas.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR uma lista dos “livros comprados por quem compra este livro”. em ordem decrescente das médias de suas notas. Portanto. A solução é: SELECT CODPRODUTO. temos as duas tabelas a seguir: PRODUTOS CODPRODUTO DESCRICAO 1 LAPIS 2 BORRACHA 3 CADERNO 4 PAPEL VENDIDOS NOTA 1 2 3 4 5 DATA CODPRODUTO QUANTIDADE 23/10/02 1 3 23/10/02 2 4 25/10/02 1 2 26/10/02 1 3 27/10/02 3 4 O gerente da loja quer uma relação dos produtos que não estão sendo vendidos. Desta forma. Por exemplo. será. precisamos utilizar o predicado IN para comparação. ou seja.

não podemos utilizar o predicado IN.PRODUTO) Outro exemplo similar e o do exercício abaixo: Exercício resolvido 5. utilizando o predicado ANY. sera: SELECT PRODUTO. menores (<). maiores ou iguais (>=). uma loja tem duas tabelas: a sua tabela de preços e a tabela de preços de varias lojas concorrentes: PRECOS PRODUTO PREÇO GELADEIRA 400 FOGAO 200 FREEZER 300 CONCORRENTES LOJA PRODUTO PREÇO A GELADEIRA 420 A FOGAO 210 A FREEZER 310 B GELADEIRA 410 B FOGAO 185 B FREEZER 305 C GELADEIRA 405 C FOGAO 215 C FREEZER 310 D GELADEIRA 415 D FOGAO 230 D FREEZER 300 Com o objetivo de tornar seus preços mais competitivos. A solução.PRODUTO=PRECOS.PREÇO FROM PRECOS WHERE PREÇO > ANY (SELECT PREÇO FROM CONCORRENTES WHERE CONCORRENTES. utilizaremos o predicado ANY. os produtos da tabela PRODUTOS cujo preço seja maior que ALGUM preço do produto correspondente nas lojas pesquisadas na tabela CONCORRENTES. menores ou iguais (<=) a qualquer um da subconsulta. pois este somente compara igualdades (=).5 As tabelas abaixo são os cardápios de um restaurante de luxo e de outros restaurantes do mesmo gênero: PRATOS PRATO PEIXE PREÇO 25 PESQUISA RESTAURANTE PRATO A PEIXE PREÇO 23 PAGINA 13 . Dito de uma maneira mais rigorosa. Por exemplo. Nesse caso.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR WHERE CODPRODUTO NOT IN (SELECT CODPRODUTO FROM VENDIDOS) No caso de necessitarmos de valores que são maiores (>). o gerente deseja saber quais os produtos que são mais baratos em alguma loja concorrente.2.

então: SELECT PRATO. > ALL significa “maior que TODOS da lista”.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR CARNE CAMARAO 27 32 A A B B B C C C D D D CARNE CAMARAO PEIXE CARNE CAMARAO PEIXE CARNE CAMARAO PEIXE CARNE CAMARAO 27 31 24 25 35 22 26 32 27 24 37 O maitre deseja saber quais os pratos que estão mais caros em algum outro restaurante pesquisado. Exemplo: A tabela abaixo representa os salários dos pedreiros de 3 obras diferentes: NOME SALARIO OBRA ALFREDO 380 3 CARLOS 650 3 GABRIEL 350 2 JOAO 240 1 JOAQUIM 390 2 JORGE 590 3 JOSE 350 1 LUIS 400 1 MANOEL 230 2 MIGUEL 280 2 PEDRO 270 1 RAFAEL 230 2 PAGINA 14 .PRATO) PRATO PREÇO PEIXE 25 CAMARAO 32 O predicado ALL e semelhante ao ANY.PREÇO FROM PRATOS WHERE PREÇO < ANY (SELECT PREÇO FROM PESQUISA WHERE PRATOS. porem a comparação se estende a todos os valores da lista. com o intuito de aumentar o seu preço. A consulta que retorna estes pratos será. Entrementes. Por exemplo.PRATO=PESQUISA. como vimos antes. > ANY significa “maior que ALGUM da lista”.

5 322 1 8.6 A tabela abaixo contem as 3 notas dos alunos da cadeira BANCOS DE DADOS II do curso Tecnologia da Informação da Faculdade Berkeley. Exercício resolvido 5. a consulta desejada ficara: SELECT OBRA.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR Desejamos saber qual a obra de maior folha de pagamento.5 321 2 10 321 3 8.5 322 3 8 323 1 9 323 2 7. SUM(SALARIO) FROM OBRAS GROUP BY OBRA HAVING SUM(SALARIO)>=ALL (SELECT SUM(SALARIO) FROM OBRAS GROUP BY OBRA) OBRA SUM(SALARIO) 3 1620 Que retorna a obra cuja soma dos salários e maior ou igual a soma de salário de todas as obras.5 323 3 9. MATRICULA BIMESTRE NOTA 321 1 9.5 322 2 6.2. A consulta que calcula a folha de pagamento de cada obra será: SELECT SUM(SALARIO) FROM OBRAS GROUP BY OBRA SUM(SALARIO) 1260 1480 1620 Utilizando o predicado ALL. Inc.5 Qual o aluno de maior média? Solução: A consulta que calcula as médias dos alunos é: PAGINA 15 .

33 7.33 Exercícios propostos: 5.2. PAGINA 16 .2.67 8.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR SELECT AVG(NOTA) AVG(NOTA) 9.67 FROM NOTAS GROUP BY MATRICULA Logo. a consulta que retorna o aluno com a maior média será: SELECT MATRICULA. criar uma consulta para retornar o código da peça de maior número de quebras.2 Na tabela abaixo.1 A tabela abaixo representa os orçamentos de 3 fornecedores para uma obra que inclui quatro itens diferentes de serviço: ORÇAMENTO FORNECEDOR ITEM PREÇO 11 100 12 98 13 230 14 147 21 90 22 112 23 219 24 156 31 114 32 105 33 245 34 164 Criar uma consulta que retorne o fornecedor e o orçamento de menor valor total. AVG(NOTA) FROM NOTAS GROUP BY MATRICULA HAVING (AVG(NOTA)>= ALL (SELECT AVG(NOTA)FROM NOTAS GROUP BY MATRICULA)) MATRICULA AVG(NOTA) 321 9. 5.

BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR PECAS CODPECA QUEBRAS 19 3 23 5 44 2 55 3 175 3 5.2.1 A tabela abaixo contém a data.3 Criar uma consulta para retornar os empregados com salário acima do dobro da média na tabela de empregados do exercício resolvido 5.2.4 Criar uma consulta que retorne os filmes alugados pelos clientes que alugaram o filme de código “4” e a quantidade de vezes que estes filmes foram alugados.2.2. 5. o código do cliente e o código do filme alugado em uma locadora: MOVIMENTO DATA CODCLIENTE CODFILME 16/10/02 1 1 16/10/02 1 2 16/10/02 1 3 16/10/02 2 4 16/10/02 2 5 16/10/02 2 6 17/10/02 2 2 17/10/02 2 3 17/10/02 3 1 18/10/02 3 6 18/10/02 4 4 19/10/02 5 4 19/10/02 8 5 20/10/02 9 4 21/10/02 9 11 22/10/02 9 12 23/10/02 8 6 24/10/02 9 6 25/10/02 9 5 5.5 A tabela abaixo contém as casas disponíveis para venda em uma imobiliária: PAGINA 17 .

Para isso solicitou o banco de dados da Loja Quinquilhaivos.000. que contem os modelos de chapéu vendidos. 5.00 a mais ou a menos.2.7 A Sra.6 A tabela abaixo representa o número de votos de cada candidato a prefeito por seção na eleição de 2008: VOTOS NUMERO SECAO VOTOS 12 1 389 12 2 460 12 3 545 13 1 456 13 2 325 13 3 234 14 1 517 14 2 567 14 3 389 Criar uma consulta que retorne o candidato vencedor (com o maior número de votos).2.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR CASAS ENDEREÇO BAIRRO QUARTOS PREÇO AV ATENAS 25 LEBLON 2 40000 AV HISTORIA Q 3 N 45 CENTRO 3 35000 R H C 3 N 25 CENTRO 3 40000 R H Q 5 N 34 COPACABANA 3 42000 R LISBOA 34 IPANEMA 3 38000 R PAZ 35 CENTRO 3 100000 RUA DO SOL 34 BOTAFOGO 2 25000 RUA JUPITER Q 3 N 34 CENTRO 2 49000 RUA MARTE 43 IPANEMA 3 45000 TRAV CIPOAL Q 3 N 45 COPACABANA 2 35000 Um cliente deseja criar uma consulta que retorne as casas cuja diferença de preço para qualquer casa da RUA MARTE seja 10. e a tabela MOVIMENTO. com a tabela CHAPEUS. Criar esta consulta. que contem os modelos de chapéu disponíveis. CHAPEUS CHAPEU MOVIMENTO DATA CHAPEU PAGINA 18 . Futileza deseja comprar um modelo de chapéu que não tenha sido comprado por ninguém. 5.

Precisamos criar uma subconsulta que pesquise. ou autorrelacionar uma consulta significa encadear a tabela com ela mesma. em um site de comparação de preços temos a tabela abaixo com os preços de 3 produtos alimentícios em 3 supermercados diferentes: COMPAREPREÇOS PRODUTO SUPERMERCADO PREÇO ARROZ BOMPREÇO 1.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR DIOR PERRE RAISE TOMBO 23/10/02 DIOR 24/10/02 DIOR 25/10/02 RAISE 26/10/02 DIOR 26/10/02 TOMBO Criar uma consulta que contenha os modelos de chapéus que nunca foram vendidos.5 ARROZ SAMPAIO 1. o menor preço do produto e o supermercado percorrendo ela mesma. Por exemplo. Este poderoso recurso da linguagem SQL abre possibilidades onde a imaginação é o limite.3 FEIJAO SAMPAIO 1. Isso caracteriza as subconsultas correlacionadas. que são criadas através de uma variável de correlação.15 TOMATE SAMPAIO 1.PRODUTO) PRODUTO SUPERMERCADO PREÇO PAGINA 19 .3 O consumidor deseja uma listagem com o supermercado de menor preço para cada produto pesquisado. que pode ter qualquer nome. da seguinte forma: SELECT PRODUTO. as opções de processamento tornam-se ilimitadas. SUPERMERCADO.45 FEIJAO BOMPREÇO 1. Uma vez que podemos para cada registro da tabela criar uma subconsulta percorrendo e recalculando os registros de toda a tabela. para cada produto da tabela COMPAREPREÇOS.7 ARROZ ECONOMICO 1. 5.5 TOMATE ECONOMICO 1. PREÇO FROM COMPAREPREÇOS VARCORRELACAO WHERE PREÇO=(SELECT MIN(PREÇO) FROM COMPAREPREÇOS WHERE PRODUTO=VARCORRELACAO.25 FEIJAO ECONOMICO 1.5 TOMATE BOMPREÇO 1.3 Subconsultas correlacionadas: Correlacionar.

PRODUTO) Pois a tabela GENEROS substitui. que é a variável de correlação criada (pode ter qualquer nome).PRODUTO Retornando desta forma apenas as linhas em que o preço do produto e o menor encontrado.1 PAGINA 20 . todos os produtos são selecionados e retornados para a tabela VARCORRELACAO.3 SAMPAIO 1. seria uma subconsulta simples. SUPERMERCADO FROM COMPAREPREÇOS. que é selecionado através da subconsulta SELECT MIN(PREÇO) FROM COMPAREPREÇOS WHERE PRODUTO = VARCORRELACAO. uma de produtos e outra de produtos. não precisaríamos correlacionar. por exemplo: GENEROS PRODUTO TOMATE ARROZ FEIJAO COMPAREPREÇOS PRODUTO ARROZ ARROZ ARROZ FEIJAO FEIJAO FEIJAO TOMATE TOMATE TOMATE SUPERMERCADO PREÇO BOMPREÇO 1.25 ARROZ SAMPAIO 1.25 ECONOMICO 1.45 BOMPREÇO 1.GENEROS WHERE PREÇO=(SELECT MIN(PREÇO) FROM COMPAREPREÇOS WHERE PRODUTO=GENEROS. a variável de correlação VARCORRELAÇAO.5 ECONOMICO 1. sem correlação. PREÇO. Note que se tivéssemos duas tabelas.5 BOMPREÇO 1.15 SAMPAIO 1.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR PRODUTO SUPERMERCADO PREÇO FEIJAO BOMPREÇO 1. Em primeiro lugar.15 A consulta se processa exatamente como se houvesse duas tabelas: a COMPAREPREÇOS e a VARCORRELAÇAO.7 ECONOMICO 1.PRODUTO.5 SAMPAIO 1. nesse caso. na clausula WHERE. supermercados e preços.3 Nesse caso. Então. Exercício resolvido 5.45 TOMATE ECONOMICO 1. como vimos anteriormente: SELECT GENEROS.3. o preço do produto na tabela VARCORRELAÇAO é comparado com o menor preço desse produto.

CODCLIENTE. com as fitas classificadas por gênero do filme: DATA CODCLIENTE CODFILME GENERO 16/10/02 1 1 AVENTURA 16/10/02 1 2 AVENTURA 16/10/02 1 3 AVENTURA 16/10/02 2 4 DRAMA 16/10/02 2 5 DRAMA 16/10/02 2 6 DRAMA 17/10/02 2 2 AVENTURA 17/10/02 2 3 AVENTURA 17/10/02 3 1 AVENTURA 18/10/02 3 6 DRAMA 18/10/02 4 4 DRAMA 19/10/02 5 4 DRAMA 19/10/02 8 5 AVENTURA 20/10/02 9 4 DRAMA 21/10/02 9 11 MUSICAL 22/10/02 9 12 MUSICAL 23/10/02 8 6 DRAMA 24/10/02 9 6 DRAMA 25/10/02 9 5 DRAMA Deseja-se saber.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR A tabela abaixo representa o movimento de filmes de uma locadora. SELECT GENERO. Primeiramente. para cada gênero. COUNT(GENERO) FROM MOVIMENTO RETIG GROUP BY GENERO. criamos uma variável de correlação (RETIG) para retornar a contagem da quantidade de fitas que cada cliente alugou para cada gênero. CODCLIENTE GENERO CODCLIENTE COUNT(GENERO) AVENTURA 1 3 AVENTURA 2 2 AVENTURA 3 1 AVENTURA 8 1 DRAMA 2 3 DRAMA 3 1 DRAMA 4 1 PAGINA 21 . o cliente que retirou o maior numero de filmes: Solução: Este e o caso trivial da consulta correlacionada.

COUNT(GENERO) FROM MOVIMENTO RETIG GROUP BY GENERO.C ou D.GENERO=GENERO) GROUP BY GENERO.CODCLIENTE)) GENERO CODCLIENTE COUNT(GENERO) AVENTURA 1 3 DRAMA 2 3 DRAMA 9 3 MUSICAL 9 2 Exercício resolvido 5. maior a sua afinidade. Quanto mais questões forem respondidas coincidentemente por duas pessoas.2 Em um site de casamento pela da net é preenchido um questionário com 4 perguntas de múltipla escolha A. a consulta completa ficara: SELECT GENERO.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR DRAMA DRAMA DRAMA MUSICAL 5 8 9 9 1 1 3 2 Em seguida.GENERO=GENERO) GROUP BY GENERO. CODCLIENTE.3. calculamos o cliente cuja contagem e maior entre todos os clientes: HAVING (COUNT(GENERO)>=ALL (SELECT COUNT(GENERO) FROM MOVIMENTO WHERE (RETIG. para cada gênero da variável RETIG.CODCLIENTE)) Desta forma. CODCLIENTE HAVING (COUNT(GENERO)>=ALL (SELECT COUNT(GENERO) FROM MOVIMENTO WHERE (RETIG. para testar a afinidade do futuro casal. Temos a tabela de questões e respostas para 5 nicknames: NICKNAME PERGUNTA RESPOSTA LIA 1A LIA 2B LIA 3C LIA 4A LIANA 1B LIANA 2D LIANA 3C LIANA 4C ROSE 1D PAGINA 22 .B.

Exercícios propostos: 5.1 A tabela abaixo contém as vendas de revistas para diversas bancas vinculadas a uma distribuidora: REVISTAS CODBANCA CODREVISTA QUANTIDADE 1 23 15 1 24 12 1 25 13 1 26 20 2 23 200 PAGINA 23 . criando uma consulta correlacionada: SELECT NICKNAME. COUNT(NICKNAME) FROM PERGUNTAS QUEST WHERE RESPOSTA= (SELECT RESPOSTA FROM PERGUNTAS WHERE PERGUNTA=QUEST.3. quantas respostas são iguais a resposta para a pergunta quando a pergunta e a mesma respondida pelo NICKNAME=”WILSON” (Claro que a coincidência máxima e do próprio WILSON). temos que conferir quantas perguntas ele marcou igual para cada mulher.PERGUNTA AND NICKNAME='WILSON') GROUP BY NICKNAME ORDER BY COUNT(NICKNAME) DESC NICKNAME COUNT(NICKNAME) WILSON 4 LIA 3 DILZA 2 ROSE 1 Onde conferimos. Para isso.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR ROSE ROSE ROSE WILSON WILSON WILSON WILSON DILZA DILZA DILZA DILZA 2B 3C 4D 1A 2B 3D 4A 1D 2B 3A 4A Desejamos testar a afinidade do “WILSON” com as mulheres. para cada NICKNAME.

As tabelas abaixo contêm respectivamente as datas de nascimento dos visitantes de um site de astrologia e as datas limites dos signos do zodíaco: SIGNOS SIGNO DIAINICIO MESINICIO DIAFIM MESFIM AQUARIO 21 1 19 2 ARIES 21 3 20 4 CANCER 21 6 22 7 CAPRICORNIO 22 12 20 1 ESCORPIAO 23 10 22 11 GEMEOS 21 5 20 6 5. A BANCA E A QUANTIDADE para as revistas que venderam mais em alguma banca do que na banca de maior volume de venda de revistas.2 Calcular a média de cada aluno no exercício resolvido 5.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR CODBANCA CODREVISTA QUANTIDADE 2 24 190 2 25 250 2 26 190 3 23 5 3 24 6 3 25 24 3 26 212 4 23 24 4 24 15 4 25 28 4 26 89 5 23 12 5 24 15 5 25 13 5 26 24 Crie uma consulta que retorne as REVISTAS. Obs: a consulta ira retornar: CODREVISTA CODBANCA QUANTIDADE 26 3 212 Pois a revista 26 vendeu mais na banca 3 que na banca 2. 5.2.3.3. descartando a menor nota de cada um. para cada aluno.3 NASCIMENTO NOME CLAUDIO HILDA LAURA LIVIO LUIS LUISA DIANASC MESNASC 24 2 25 1 18 4 28 4 3 2 28 5 PAGINA 24 .6 sabendo-se que o professor resolveu. que é a de maior volume de vendas. considerar apenas as duas maiores notas.

6 desejamos. Por exemplo. Consultas com vários níveis de subconsultas (multianinhadas) ocorrem com muita freqüência na prática.2. NOTA FROM NOTAS WHERE MATRICULA= (SELECT MATRICULA FROM NOTAS GROUP BY MATRICULA HAVING (AVG(NOTA)>= ALL (SELECT AVG(NOTA) BY MATRICULA))) MATRICULA NOTA 321 9. saber quais são as suas notas. após selecionar o aluno de maior média. podemos estar interessados em utilizar o(s) último(s) valor(es) de retorno para satisfazer a uma condição WHERE.4. o que provocará a criação de uma nova consulta tendo a consulta realizada (já com uma subconsulta) como uma subconsulta. no Exercício resolvido 5.1 A tabela abaixo contém a quantidade de funcionários e depósitos de 9 agências da Caixa Econômica Federal em uma determinada região: AGENCIA FUNCIONARIOS DEPOSITOS 27 70 34000000 PAGINA 25 . Exercicio resolvido 5.5 321 10 321 8.5 FROM NOTAS GROUP Com duas subconsultas sucessivamente aninhadas.4 Subconsultas Multianinhadas: Podemos ter quantos níveis de aninhamento quisermos de subconsultas. Temos então a consulta: SELECT MATRICULA.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR MARCELO POLIANA RAIMUNDA RAQUEL ROZIAN WILSON 1 23 2 14 23 23 3 3 2 2 3 11 LEAO LIBRA PEIXES SAGITARIO TOURO VIRGEM 23 23 20 23 21 23 7 9 2 11 4 8 22 22 20 23 20 22 8 10 3 12 5 9 Criar uma consulta que retorne todas as pessoas que tem o signo igual ao signo de “ROZIAN” 5. Em qualquer um dos casos de subconsulta visto até agora.

a consulta que retorna as agências que tem mais funcionários que esta agência será: SELECT AGENCIA.BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR 1307 1413 1521 1577 1649 1693 1739 3044 78 27 14 28 36 40 67 26 36000000 7500000 5000000 8000000 15000000 16000000 37000000 7500000 Desejamos saber quais as agências que têm maior numero de funcionários que a agência que tem maior volume de depósitos.1 PAGINA 26 .2. FUNCIONARIOS.4. DEPOSITOS FROM AGENCIAS WHERE FUNCIONARIOS>=ALL (SELECT FUNCIONARIOS FROM AGENCIAS WHERE DEPOSITOS=(SELECT MAX(DEPOSITOS) FROM AGENCIAS)) ORDER BY DEPOSITOS DESC AGENCIA FUNCIONARIOS DEPOSITOS 1739 67 37000000 1307 78 36000000 27 70 34000000 Lembre-se. o predicado ALL e necessário pois poderá haver mais de uma agência com o maior volume de depósitos.1 Crie uma consulta para retornar os itens e preços do fornecedor com menor orçamento do exercício proposto 5. Exercícios propostos: 5. Solução: A consulta que retorna a quantidade de funcionários da agência que tem o maior volume de depósitos é: SELECT FUNCIONARIOS FROM AGENCIAS WHERE DEPOSITOS= (SELECT MAX(DEPOSITOS) FROM AGENCIAS) FUNCIONARIOS 67 Portanto. para transferência de mão-de-obra.

5 PAGINA 27 .BANCO DE DADOS RELACIONAIS – WILSON DE JESUS BARROS JÚNIOR 5.3 Crie uma consulta para retornar os restaurantes em que os pratos estão mais caros que algum prato.6 Crie uma consulta que retorne a votação por seção do candidato vencedor do exercício 5.3 5.5 Crie uma consulta que retorne as notas do aluno que tem a maior média do exercício resolvido 5.2 Crie uma consulta para retornar as copas em que os países que foram campeões tantas vezes quanto o URUGUAI foram campeões. utilizando a tabela do exercício resolvido 5.4. utilizando o exercício resolvido 5.4.2.2.2.4 5.4.4.2.6 5.