Você está na página 1de 51

Sistemas de Informação

BANCO DE DADOS I

Prof. Me. Aldo Henrique


23:36:08  2

Na aula anterior (Aula 9): Na aula de hoje (Aula 10):


Sistemas
De Linguagem SQL (parte 2). Linguagem SQL (parte 3)
Informação
 23:36:08  3

Consultas Aninhadas
Sistemas
De
Informação

• Um bloco completo de SELECT-FROM-WHERE,


chamado de consulta aninhada, pode ser
especificada na cláusula WHERE de uma outra
consulta, chamada consulta externa;

• Muitas das consultas que fizemos anteriormente


podem ser especificadas utilizando o conceito de
aninhamento
 23:36:08  4

Consultas Aninhadas
Sistemas
De
Informação Exemplo: Recupere o nome e o
endereço de todos os funcionários
que trabalham no departamento
‘Pesquisa’.
 23:36:08  5

Consultas Aninhadas
Sistemas
De
Informação • Consulta:

SELECT PNOME, UNOME, ENDERECO


FROM FUNCIONARIO
WHERE DEPARTAMENTO_DNUMERO IN
(SELECT DNUMERO
FROM DEPARTAMENTO
WHERE DNOME = ‘Pesquisa’)
 23:36:08  6

Consultas Aninhadas
Sistemas
De
Informação • A consulta aninhada seleciona o número do
departamento ‘Pesquisa’;
• A consulta externa seleciona uma tupla de
FUNCIONÁRIO se o DEPARTAMENTO_DNUMERO
está no resultado da consulta aninhada;
• O operador de comparação IN compara um valor v
com um conjunto de valores V, e resulta em TRUE se
v é um dos elementos de V;
• Geralmente podemos ter vários níveis de aninhamento
de consultas;
 23:36:08  7

Consultas Aninhadas
Sistemas
De
Informação • A consulta aninhada seleciona o número do
departamento ‘Pesquisa’;
• A consulta externa seleciona uma tupla de
FUNCIONÁRIO se o DEPARTAMENTO_DNUMERO
está no resultado da consulta aninhada;
• O operador de comparação IN compara um valor v
com um conjunto de valores V, e resulta em TRUE se
v é um dos elementos de V;
• Geralmente podemos ter vários níveis de aninhamento
de consultas;
 23:36:08  8

Consultas Aninhadas
Sistemas
De
Informação • A consulta aninhada seleciona o número do
departamento ‘Pesquisa’;
• A consulta externa seleciona uma tupla de
FUNCIONÁRIO se o
DEPARTAMENTO_DNUMERO está no resultado
da consulta aninhada;
• O operador de comparação IN compara um valor
v com um conjunto de valores V, e resulta em
TRUE se v é um dos elementos de V;
• Geralmente podemos ter vários níveis de
aninhamento de consultas;
 23:36:08  9

Consultas Aninhadas
Sistemas
De
Informação • A consulta aninhada seleciona o número do
departamento ‘Pesquisa’;
• A consulta externa seleciona a tupla de
FUNCIONÁRIO se o DEPARTAMENTO_DNUMERO
está no resultado da consulta aninhada;
• O operador de comparação IN compara um valor v
com um conjunto de valores V, e resulta em TRUE se
v é um dos elementos de V;
• Geralmente podemos ter vários níveis de
aninhamento de consultas;
 23:36:08  10

Sistemas
De
Informação
 23:36:08  11

Consultas Aninhadas Correlacionadas


Sistemas
De
Informação

• Sempre que uma condição na cláusula WHERE


de uma consulta aninhada se referir a algum
atributo da relação declarada na consulta externa,
as duas consultas são chamadas correlacionadas;

• Exemplos: Recupere o nome de cada funcionário


que tenha um dependente com o mesmo nome do
funcionário;
 23:36:08  12

SELECT F.PNOME, F.UNOME


FROM FUNCIONARIO AS F
Sistemas
WHERE F.CPF IN
De
Informação
(SELECT FUNCIONARIO_CPF
FROM DEPENDENTE
WHERE FUNCIONARIO_CPF =
F.CPF AND F.PNOME =
NOMEDEPENDENTE)
 23:36:08  13

Consultas Aninhadas Correlacionadas


Sistemas
De
SELECT F.PNOME, F.UNOME
Informação

FROM FUNCIONARIO AS F
WHERE F.CPF IN
(SELECT FUNCIONARIO_CPF
FROM DEPENDENTE
WHERE FUNCIONARIO_CPF = F.CPF
AND F.PNOME = NOMEDEPENDENTE)

Atributos Correlacionados
 23:36:08  14

Sistemas
De
Informação
 23:36:08  15

Consultas Aninhadas Correlacionadas


Sistemas
De
Informação

• Na consulta anterior, a consulta aninhada tinha


um resultado diferente para cada tupla da
consulta externa;

• Consultas escritas com blocos SELECT


FROM WHERE e que utilizem operadores de
comparação IN, sempre podem ser expressas
como uma consulta simples;
 23:36:08  16

Consultas Aninhadas Correlacionadas


Sistemas
De
Informação SELECT F.PNOME, F.UNOME
FROM FUNCIONARIO AS F
WHERE F.CPF IN
(SELECT FUNCIONARIO_CPF
FROM DEPENDENTE
WHERE FUNCIONARIO_CPF = F.CPF AND
F.PNOME = NOMEDEPENDENTE);
=

SELECT F.PNOME, F.UNOME


FROM FUNCIONARIO AS F, DEPENDENTE AS D
WHERE F.CPF = D.FUNCIONARIO_CPF AND F.PNOME =
D.NOMEDEPENDENTE;
 23:36:08  17

Função EXISTS
Sistemas
De
Informação • EXISTS é usada para verificar se o resultado de
uma consulta aninhada é vazia ou não;
• Podemos reformular o exemplo anterior para
utilizar o EXISTS da seguinte forma:

SELECT F.PNOME, F.UNOME


FROM FUNCIONARIO AS F
WHERE EXISTS (SELECT * FROM DEPENDENTE
WHERE FUNCIONARIO_CPF = F.CPF AND
F.PNOME = NOMEDEPENDENTE);
 23:36:08  18

Função EXISTS
Sistemas
De
Informação
• Exemplo 2: Recuperar o nome dos empregados
que não possuem dependentes.

SELECT PNOME, UNOME


FROM FUNCIONARIO
WHERE NOT EXISTS (SELECT *
FROM DEPENDENTE
WHERE CPF = FUNCIONARIO_CPF);
 23:36:08  19

Função EXISTS
Sistemas
De
Informação Exemplo 3: Relacione os nomes dos
gerentes que possuem ao menos um
dependente;
 23:36:08  20

Função EXISTS
Sistemas
De
Informação Exemplo 3: Relacione os nomes dos gerentes
que possuem ao menos um dependente;
SELECT PNOME, UNOME Recupera todas as tuplas de
FROM FUNCIONARIO DEPENDENTE relacionados
WHERE EXISTS (SELECT * à algum FUNCIONARIO
FROM DEPENDENTE
WHERE CPF=FUNCIONARIO_CPF)
Seleciona todas as tuplas de
AND DEPARTAMENTO gerenciadas
EXISTS (SELECT * por algum FUNCIONARIO

As duas condições FROM DEPARTAMENTO


devem ser WHERE CPF = FUNCIONARIO_CPF)
verdadeiras!!!
 23:36:08  21

Sistemas
De
Informação

Nenhum departamento possui


CPF_SUPERVISOR = 123456789 logo este
empregado não faz
parte da resposta

Existe pelo menos um dependente do empregado


SELECT PNOME, UNOME
FROM FUNCIONARIO
WHERE EXISTS (SELECT *
FROM DEPENDENTE
WHERE CPF=FCPF)
AND
EXISTS (SELECT *
FROM DEPARTAMENTO
WHERE CPF=CPF_SUPERVISOR)
 23:36:08  22

Sistemas
De
Informação

Existe pelo menos um departamento


gerenciado pelo funcionário.

Existe pelo menos um dependente do funcionário


SELECT PNOME, UNOME
FROM FUNCIONARIO
WHERE EXISTS (SELECT *
FROM DEPENDENTE
WHERE CPF=FCPF)
AND
EXISTS (SELECT *
FROM DEPARTAMENTO
WHERE CPF=CPF_SUPERVISOR)
 23:36:08  23

Sistemas
De
Informação

Nenhum departamento gerenciado pelo


funcionário.

Nenhum dependente!!!!!!
SELECT PNOME, UNOME
FROM FUNCIONARIO
WHERE EXISTS (SELECT *
FROM DEPENDENTE
WHERE CPF=FCPF)
AND
EXISTS (SELECT *
FROM DEPARTAMENTO
WHERE CPF=CPF_SUPERVISOR)
 23:36:08  24

Sistemas
De
Informação

Existe pelo menos um departamento


gerenciado pelo funcionário.

Existe pelo menos um dependente do funcionário.


SELECT PNOME, UNOME
FROM FUNCIONARIO
WHERE EXISTS (SELECT *
FROM DEPENDENTE
WHERE CPF=FCPF)
AND
EXISTS (SELECT *
FROM DEPARTAMENTO
WHERE CPF=CPF_SUPERVISOR)
 23:36:08  25

Sistemas
De
Informação

Resultado

SELECT PNOME, UNOME


FROM FUNCIONARIO
WHERE EXISTS (SELECT *
FROM DEPENDENTE
WHERE CPF=FCPF)
AND
EXISTS (SELECT *
FROM DEPARTAMENTO
WHERE CPF=CPF_SUPERVISOR)
 23:36:08  26

Conjuntos Explícitos
Sistemas
De
Informação • Ao invés de utilizarmos consultas aninhadas,
também podemos fornecer um conjunto de
valores da seguinte maneira.

• Exemplo: Selecione o CPF dos funcionários que


trabalham nos projetos 1, 2 ou 3.
Se PROJETO_PROJNUMERO for igual a
1, 2 ou 3, a cláusula WHERE será TRUE
SELECT DISTINCT FUNCIONARIO_CPF
FROM TRABALHA_EM
WHERE PROJETO_PROJNUMERO IN (1, 2, 3)
 23:36:08  27

Junções (Joins)
Sistemas
De
Informação •O conceito de junção foi incorporado na SQL
para que o resultado de uma junção entre duas
tabelas pudesse ser utilizado na cláusula FROM
de uma consulta.
 23:36:08  28

Tipos de Joins
Sistemas
De
Informação • CROSS JOINS
• Cria um produto cartesiano entre conjunto de dados
das tabelas;
• Ele não cria relacionamento entre os conjuntos e
retorna cada combinação possível entre as linhas;

• Exemplo:

SELECT CPF, DNOME


FROM FUNCIONARIO CROSS JOIN
DEPARTAMENTO;
 23:36:08  29

Tipos de Joins
Sistemas
De
Informação • INNER JOIN (OU JOIN):
• Produz uma única tabela que contém os atributos da
primeira tabela seguidos dos atributos da segunda
tabela;
• Somente a tuplas que satisfazem o critério de junção
farão parte do resultado;

• Exemplo: Selecione o primeiro nome, sobrenome e


endereço dos funcionários que trabalham no
departamento ‘Pesquisa’.
 23:36:08  30

Tipos de Joins
Sistemas
De
Informação • INNER JOIN

Tabelas da
• Consulta:
Junção

SELECT f.PNOME, f.UNOME, f.ENDERECO


FROM FUNCIONARIO AS f INNER JOIN DEPARTAMENTO
AS d ON f.DEPARTAMENTO_DNUMERO = d.DNUMERO
WHERE d.DNOME = ‘Pesquisa’;

Critério da
Junção
 23:36:08  31

Tipos de Joins
Sistemas
De
Informação • LEFT OUTER JOIN (T1 LEFT OUTER JOIN T2)
• Produz uma única tabela que contém os atributos da
primeira tabela seguidos dos atributos da segunda
tabela;

• Todas as tuplas de T1 são incluídas e somente aquelas


tuplas da T2 que satisfazem o critério de junção são
incluídas;

• A parte faltante é preenchida com NULL;


 23:36:08  32

Tipos de Joins
Sistemas
De
Informação • LEFT OUTER JOIN

• Exemplo: Selecione o nome e sobrenome dos


funcionários e seus respectivos supervisores.

• OBS: Mostrar também os funcionários que


não possuem supervisores.
 33

Sistemas
De
Informação
 23:36:08  34

Tipos de Joins
Sistemas
De
Informação • LEFT OUTER JOIN

SELECT F.PNOME, F.UNOME, S.PNOME, S.UNOME


FROM FUNCIONARIO AS F LEFT OUTER JOIN
FUNCIONARIO AS S ON F.SUPERVISOR_CPF = S.CPF;

PNOME e UNOME de funcionários que não possuem um


supervisor também serão apresentados, porém com
PNOME e UNOME do supervisor com valores nulos.
 35

Tipos de Joins
Sistemas
De
Informação • RIGHT OUTER JOIN (T1 RIGHT OUTER JOIN
T2)

• Mesmo que a LEFT OUTER JOIN, mas neste caso


todas as tuplas de T2 serão incluídas e somente
aquelas tuplas de T1 que satisfazem o critério de
junção serão incluídas no resultado;

• A parte faltante é preenchida com NULL;


 36

Tipos de Joins
Sistemas
De
Informação • FULL OUTER JOIN (T1 FULL OUTER JOIN T2)

• Mesmo que a LEFT OUTER JOIN, mas neste caso


todas as tuplas de T1 e T2 serão incluídas;

• A parte faltante é preenchida com NULL;


 23:36:08  37

Tipos de Joins
Sistemas
De
Informação • NATURAL JOIN

• Similar ao INNER JOIN, entretanto utiliza como


cláusula todas as colunas que possuam o mesmo
nome nas tabelas envolvidas na consulta com a
operação de igualdade;
 23:36:08  38

Tipos de Joins
Sistemas
De
Informação

SELECT DNOME, DLOCALIZAÇÃO


FROM DEPARTAMENTO AS D, LOCAIS-DEPTO AS L
WHERE DNOME = ‘Pesquisa’ AND D.DNUMERO = L.DNUMERO;

SELECT DNOME, DLOCALIZAÇÃO


FROM DEPARTAMENTO NATURAL JOIN LOCAIS-DEPTO
WHERE DNOME = ‘Pesquisa’;
 39

Funções Agregadas
Sistemas
De
Informação • As
funções agregadas transformam um conjunto
de dados (linhas) num único valor;

• A Linguagem SQL oferece as seguintes funções


agregadas:
• COUNT;
• SUM;
• AVG;
• MAX;
• MIN;
 40

Funções Agregadas
Sistemas
De • COUNT
Informação
• Retorna a quantidade de tuplas ou valores especificados em
uma consulta
Exemplo: Retornar o número de funcionários
Se não colocarmos o
SELECT COUNT(*)
DISTINCT, então salários
FROM
com valores idênticos
FUNCIONARIO
serão contados novamente
Exemplo: Retornar a quantidade de valores diferentes para salários
da empresa

SELECT COUNT(DISTINCT SALARIO)


FROM FUNCIONARIO
 41

Funções Agregadas
Sistemas
De • SUM
Informação
•Retorna a soma de um conjunto de valores
Exemplo: Retornar o total da folha salarial da
empresa

SELECT SUM (SALARIO)


FROM FUNCIONARIO;
• MAX
• Retorna o maior valor dentre um conjunto de valores
Exemplo: Retornar o valor do maior salário pago pela
empresa

SELECT MAX (SALARIO)


FROM FUNCIONARIO;
 42

Funções Agregadas
Sistemas
De • MIN
Informação
• Retorna o menor valor dentre um conjunto de valores
Exemplo: Retornar o menor salário pago pelo departamento Pesquisa

SELECT MIN (SALARIO)


FROM FUNCIONARIO JOIN DEPARTAMENTO ON DNO = DNUMERO
WHERE DNOME = ‘Pesquisa’;

• AVG
• Retorna a média dentre um conjunto de valores
Exemplo: Retornar a média de salário pago pela empresa

SELECT AVG (SALARIO)


FROM FUNCIONARIO;
 43

Funções Agregadas
Sistemas
De
Informação • Podemos utilizar funções agregadas em
consultas aninhadas.

Exemplo: Liste todos os empregados que


possuem dois ou mais dependentes.

SELECT PNOME, UNOME O operador >=


FROM FUNCIONARIO pode ser utilizado
WHERE (SELECT COUNT(*) porque o resultado
da consulta
FROM DEPENDENTE
aninhada será um
WHERE CPF=FCPF)>= 2
único valor!!!
 44

GROUP BY e HAVING
Sistemas
De
Informação
• GROUP BY
• Muitas vezes é interessante aplicar funções de agregação em
grupos de tuplas relacionadas. Para estes casos, a SQL fornece
o comando de agrupamento GROUP BY.

• O GROUP BY particiona o resultado da consulta em


subgrupos que obedecem a um determinado critério de tal
forma que as funções agregadas serão aplicadas
individualmente a cada subgrupo.

• Quando utilizamos GROUP BY, somente os atributos


especificados em na cláusula GROUP BY podem aparecer
na cláusula SELECT, junto com as funções agregadas.
 45

GROUP BY e HAVING
Sistemas
De
Informação Exemplo: Para cada departamento, retornar o seu número, o
número de funcionários e a média salarial.

SELECT DNO, COUNT(*), AVG (SALARIO)


FROM FUNCIONARIO Somente este atributo
GROUP BY DNO pode aparecer junto com
as funções agregadas
na cláusula SELECT
 46

GROUP BY e HAVING
Sistemas
De
Informação • HAVING

• Muitas vezes podemos precisar de aplicar uma


determinada função à um subgrupo ( construído pelo
GROUP BY) de tal forma que somente aqueles
subgrupos que satisfizerem uma determinada condição
serão considerados nos cálculos das funções.

• Nestas situações, utilizamos o HAVING da seguinte


forma:
 47

GROUP BY e HAVING
Sistemas
De
Informação Exemplo: Para cada projeto com mais de dois funcionários, liste
seu número, seu nome, e o número de empregados que nele
trabalham.

SELECT PNUMERO, PJNOME, COUNT(*)


FROM PROJETO, TRABALHA_EM
No WHERE temos
WHERE PNUMERO = PNO
condições para seleção
GROUP BY PNUMERO, PJNOME
de tuplas
HAVING COUNT(*) > 2
No HAVING temos
condições para seleção de
subgrupos
 48

Exemplo - HAVING
Sistemas
De
Informação

Resultado
Final
 49

Resumo das consultas SQL


Sistemas
De
Informação • Uma consulta em SQL pode ter até seis cláusulas, mas
apenas as duas primeiras são obrigatórias SELECT e
FROM. As cláusulas são especificadas nesta ordem:

SELECT <lista de atributos>


FROM <lista de tabelas>
[WHERE <condição>]
[GROUP BY <atributos agrupados
[HAVING <condição de agrupamento>]
[ORDER BY <lista de atributos>]
 50

Resumo das consultas SQL


Sistemas
De • SELECT lista os atributos ou funções que serão recuperados
Informação

• FROM especifica todas as relações necessárias para a


consulta (mas não as utilizadas em consultas aninhadas)

• WHERE especifica as condições de seleção e junção de tuplas


para as tabelas especificadas na cláusula FROM

• GROUP BY especifica atributos para agrupamentos

• HAVING especifica condições para a seleção de grupos

• ORDER BY especifica a ordem para mostrar os resultados de


uma consulta
 51

Referências
Sistemas
De
Informação • ELMASRI, R; NAVATHE, S. B. Sistemas de
Bancos de Dados. São Paulo. Addison Wesley,
4ed, 2005.

• Cap. 5 (6 ed)

Você também pode gostar