• Nenhum resultado encontrado

FBD - Slide 04 - Consultas SQL.pdf

N/A
N/A
Protected

Academic year: 2021

Share "FBD - Slide 04 - Consultas SQL.pdf"

Copied!
62
0
0

Texto

(1)
(2)

Consultas em SQL

• Consultas Básicas

• Implementando Junção

• Definindo Visão

• Subconsultas

• Ordenando resultados

• Operações e Comparação de Conjuntos

• Gerando resumos

(3)

select

< lista de atributos>

from

< lista de nomes de relação>

where

< condição de seleção> ;

select

A1,...,An

from

R1,...,Rm

where

<condição>;

(R1 x ... x Rm) [ <condição> ] [A1,...,An]

produto cartesiano seleção projeção

(4)

Q1: Liste todas informações em E sobre empregados

em Fortaleza.

select

*

from

E

where

E.localização

=

‘Fortaleza’;

E (enome, dno, sal, localização)

D (dno, dnome, ger)

(5)

Q2: Liste todas as informações em D

select

*

from

D

;

(6)
(7)

Q3: Liste todos os empregados e o nome dos seus

departamentos

Implementando Junção

select

enome

,

dnome

from

E

,

D

where

E.dno

=

D.dno

;

select

enome

,

dnome

from

E

inner join

D

on

E.dno

=

D.dno

;

Implícito

(8)

Q4: Nome dos empregados gerenciados por Gustavo e

que tem um salário < R$1000?

Implementando Junção

select

enome

from

E, D

where

E.dno

=

D.dno

AND

D.ger

=

‘gustavo’

AND

sal

<

1000;

SQL não tem nenhum suporte especial para junção natural

(9)

Q4: Nome dos empregados gerenciados por Gustavo e

que tem um salário < R$1000?

Implementando Junção

select

enome

from

E

inner join D on

E.dno

=

D.dno

where

D.ger

=

‘gustavo’

AND

(10)

Q5: Nome dos empregados que ganham mais que

seu gerente?

Implementando Junção

select

E1.enome

from

E E1,

D,

E E2

where

E1.dno

=

D.dno

AND

D.ger

=

E2.enome

AND

E1.sal

>

E2.sal;

Nós precisamos de duas cópias de E. Cria-se uma alias para evitar ambiguidades.

(11)

Q5: Nome dos empregados que ganham mais que

seu gerente?

Implementando Junção

select

E1.enome

from

E E1

inner join D on E1.dno

=

D.dno

inner join E E2 on

D.ger

=

E2.enome

where E1.sal

>

E2.sal;

(12)

Q6: Nome dos gerentes que ganham menos que os seus

empregados?

Implementando Junção

SQL não elimina tuplas duplicadas! você deve requisitar explicitamente dizendo ‘select distinct.’. Caso contrário, a resposta repetirá o nome do

gerente para cada empregado que ganha mais.

select

distinct

E2.enome

from

E E1, D, E E2

where

E1.dno

= D.dno

AND

D.ger

= E2.enome

AND

E1.sal

> E2.sal;

(13)

Q6: Nome dos gerentes que ganham menos que os seus

empregados?

Implementando Junção

SQL não elimina tuplas duplicadas! você deve requisitar explicitamente dizendo ‘select distinct.’. Caso contrário, a resposta repetirá o nome do

gerente para cada empregado que ganha mais.

select

distinct

E2.enome

from

E E1

inner join D

on

E1.dno

= D.dno

inner join

E E2

on D.ger

= E2.enome

where

E1.sal

> E2.sal;

(14)

Q7: Encontre a quantidade fornecida de cada peça.

Devem constar inclusive as peças que não são

fornecidas por nenhum fornecedor.

Implementando Junção

PEÇAS (#p, pnome)

FORNECEDORES_PEÇAS (#f,#p,qtd)

select

pnome

,

qtd

from

PEÇAS P

,

FORNECEDORES_PEÇAS FP

where

P.#p

*=

FP.#P

(15)

Q7: Encontre a quantidade fornecida de cada peça.

Devem constar inclusive as peças que não são

fornecidas por nenhum fornecedor.

Implementando Junção

PEÇAS (#p, pnome)

FORNECEDORES_PEÇAS (#f,#p,qtd)

select

pnome

,

qtd

from

PEÇAS P

left join

FORNECEDORES_PEÇAS FP

on

P.p = FP.p

(16)

Implementando Junção

PEÇAS P1 mouse P2 teclado P3 monitor P4 disco rígido #p pnome FORNECEDORES_PEÇAS F1 P1 10 F1 P2 15 F2 P1 20 #f #p qtd RESULTADO P1 10 P1 20 P2 15 P3 null #p qtd RESULTADO mouse 10 mouse 20 teclado 15 monitor null #p qtd

(17)
(18)
(19)

Q8: Como criar uma visão para salvar o resultado de uma

consulta temporariamente?

create view

<nome_da_ visão>

as

<uma_consulta>

create view

EDM

(

emp

,

dept

,

ger

)

as select

enome

,

dnome

,

ger

from

E

,

D

where

e.dno

=

d.dno

;

Se desejável, os nomes das colunas podem ser renomeados.

(20)

Q9 : Imprima o nome de todos os empregados que

ganham mais de 90% do salário do seu gerente.

create view ESGS(e_nome, e_sal, g_nome, g_sal)

as select E1.enome, E1.sal, E2.enome, E2.sal

from E E1, D, E E2

where E1.dno = D.dno AND

D.ger = E2.enome;

select e_nome

from ESGS

where e_sal > 0.9 * g_sal;

(21)
(22)

Tipos de Subconsultas

• Testa membros de um conjunto:

– IN

– NOT IN

• Verificação de Relações Vazias:

– EXISTS

– NOT EXISTS

• Comparação de Conjuntos: Subconsultas

introduzidas com um operador de comparação

(=,< >, >, >=, <, <=, ou !> ) seguida por

(23)

Q10: Quem está no mesmo departamento de Vera?

Subconsultas: Membros de um conjunto

select E1.enome

from E E1, E E2

where E2.enome = “Vera” and

E1.dno = E2.dno;

select enome

from E

where E.dno IN (‘NOT IN)

(select dno

from E subconsulta

(24)

Q11: Nomes dos empregados que têm um dependente com

o mesmo nome do empregado?

select E.enome

from EMP E

where E.#CI IN ( select e_#CI

from DEP

where e_#CI = E.#CI AND

DEP.nome = E.enome);

EMP ( enome, #CI, idade) DEP ( nome, e_#CI, ... )

(25)

Q11: Nomes dos empregados que têm um dependente com

o mesmo nome do empregado?

select E.enome

from EMP E

where E.enome IN ( select nome

from DEP

where e_#CI = E.#CI);

EMP ( enome, #CI, idade) DEP ( nome, e_#CI, ... )

(26)

Q12: Nomes dos empregados que têm um dependente com

o mesmo nome do empregado?

select E.enome

from EMP E

where EXISTS ( select *

from DEP

where e_#CI = E.#CI AND

nome = E.enome);

(27)

Q13: Nomes dos empregados que não têm dependentes?

Subconsultas

select

E.enome

from

EMP

where NOT EXISTS ( select

*

from

DEP

(28)

Q14: Quem tem o maior salário?

Subconsultas

select

enome

from

E

where sal

>= all (select

sal

from

E

);

(29)

Q15: Quem ganha mais do que alguém no departamento

de brinquedos?

Subconsultas

select

enome

from

E

where

sal

> any

(select

sal

from

E, D

where

E.dno

= D.dno

AND

D.dnome

=

“brinquedo”);

“> any”

(some) --- Maior do que ao menos um.

(30)
(31)

Q

16: Imprima E. Ordene as tuplas pelo número do depto. Para cada depto, ordene do mais alto para o mais baixo

salário. Se existir empate de salario, use ordem alfabética no nome.

Ordenando resultados

Especifica ordem de apresentação na tela

enome dno sal

localização

Susana 1 3000 Rio Maria 1 2000 Rio Jane 1 1900 Rio Jim 2 1500 Fortaleza João 2 1500 Fortaleza Select * from E

(32)
(33)

Gerando Dados de Resumo

• Funções de Agregação

• GROUP BY e HAVING

(34)
(35)

Q17: Qual é a média de salário dos empregados no

departamento de brinquedos?

* Nao podemos responder em alg. rel. . mas é facil em SQL.

Funções de Agregação

select avg(sal)

from

E, D

where

E.dno

= D.dno

AND

D.dname

= “brinquedo”;

Na cláusula select , pode-se usar:

(36)

Q18: Quantos empregados trabalham em mais de um

departamento?

Funções de Agregação

select count (distinct

enome)

from

E E1

where

enome

in

(select

E.enome

from

E E2

where

E2.enome

= E1.enome

AND

E2.dno

!= E1.dno);

(37)

Q19: Nome dos empregados que ganham mais que a

média de salário do seu departamento ?

Funções de Agregação

A maioria das consultas SQL requerem ‘all’ aqui ! select enome from E E1

where sal > all

(select avg(sal)

from E E2

(38)
(39)

Resposta errada !!! Imprime cada nome de

departamento seguido pelo salário da companhia e total de empregados.

brinquedo 1,000, 500 2002 Manuf 1,000, 500 2002 Pessoal 1,000, 500 2002

GROUP BY

select

dnome, sum(sal), count (enome)

from

E, D

where

E.dno

= D.dno;

Q20: Para cada departamento, liste o número total de

(40)

Quando queremos que um agregado seja

computado separadamente para cada valor de um atributo então deveremos usar:

‘group by’

(41)

Q21: Para cada departamento, liste o número total de

empregados do departamento e a soma total dos

salários.

GROUP BY

select

dnome, sum (sal), count (enome)

from

E, D

where

E.dno

= D.dno

group by

dnome;

“ Os atributos do “grouped-by “

devem ser exatamente os itens

não-agregado da linha de seleção (na maioria das SQLs).”

(42)

Q22: Para cada departamento dê o número de empregados

e a média de salário.

GROUP BY

select

DNO, COUNT(*), AVG(sal)

from

EMP

(43)

Create View MediaDep(dnome, avgsal, noEmps)

as select dnome, avg(sal), count(enome)

from E, D

where E.dno = D.dno

group by dnome;

GROUP BY

select dnome

from MediaDep

where avgsal > all (select avg(avgsal)

from MediaDep)

AND

noEmps > all (select avg(noEmps)

from MediaDep);

Q23: Quais departamentos têm mais empregados do que a média dos dept, e uma média de salario por empregado mais alta que a média dos

(44)

Q

24: Mesma que

Q

22, mas exclua deptos com menos R$10000 na soma total dos salários dos seu empregados, e imprima a

resposta em ordem alfabética.

GROUP BY e HAVING

Somente para testes em um grupo inteiro. Não para testes em tuplas. todas as condições devem

envolver agregados.

Create view GrandesDeptos (dnome, avgSal, noEmps)

as select dnome, avg(sal), count(enome)

from E, D

where E.dno = d.dno

group by dnome

having sum(sal) >=10000

(45)

GROUP BY

select dnome, avg(sal)

from E, D

where E.dno = D.dno

group by dnome

having avg(sal) > 2.000

(46)

GROUP BY

select dnome

from ( select dnome, avg(sal)

from E, D

where E.dno = D.dno

group by dnome)

as resultado (dnome, avgsal)

where avgsal > 2.000

Subconsultas na Cláusula FROM

Q

25: Quais departamentos têm uma média de salario >R$ 2.000.

(47)

Q

25: Para cada empregado em dois ou mais depts, imprima o salario total dos seus gerentes. Assuma que um dept só tem um gerente.

Create view dois_depts

as select E1.enome, sum(E2.sal) #4

from E E1, D, E E2

where E1.dno = D.dno AND #1

E2.enome = D.ger

group by E1.enome #2

having count(*) > 1 #3

order by enome; #5

Sequencia de avaliação das consultas:

#1: primeiro, tuplas são escolhidas #2: então, grupos são formados #3: então, grupos são eliminados

#4: então, os agregados são computados para a linha de seleção

#5: então, as tuplas da resposta são ordenadas corretamente e impressas. Esta sequência de avaliação é seguida por todas as consultas.

(48)
(49)

Q26: Liste todos os tipos de livros que terminam com

‘info’ e a soma total dos seus preços.

select

tipo

,

preço

from

TÍTULOS

where

tipo

like

‘%info’

order by

tipo

,

preço

compute SUM(

preço

)

DB_info 30.95 DB_info 10.40 IA_info 42.05 RC_info 67.20 sum 150.60 tipo preço

TÍTULO (título, tipo, preço)

(50)

Q26: Liste todos os tipos de livros que terminam

com ‘info’e a soma total dos seus preços.

select

tipo

,

preço

from

TÍTULOS

where

tipo

like

‘%info’

order by

tipo

,

preço

compute SUM(

preço

) by

tipo

compute SUM(

preço

)

DB_info 30.95 DB_info 10.40 sum 41.35 IA_info 42.05 42.05 sum 150.60 tipo preço

TÍTULO (título, tipo, preço)

(51)

Operações de Conjunto

• SQL tem incorporado algumas das operações de

conjunto da álgebra relacional

– União (UNION)

– Diferença (MINUS)

– Interseção (INTERSECT)

• Tuplas duplicadas são eliminadas do resultado

• As relações devem ser compatíveis ( têm os

(52)

EMPREGADOS (E)

enome CPF salário CPF_Supervisor dnumero

DEPARTAMENTOS (D)

dnome dnúmero CPF_gerente

TRABALHA (T)

CPF_Emp pnumero pnome pnúmero dnúmero

PROJETOS (P)

(53)

Operações de Conjunto

Q27: Liste os nomes dos projetos que têm um empregado

chamado “João Silva”que trabalha no projeto ou gerencia o

departamento que controla o projeto

select pnome

from P, D, E

where P.dnum=D. dnum and D.CPF_gerente = E.CPF and E.enome = ‘João Silva’

union

select pnome

from T, P, E

where T.pnum=P. dnum and T.CPF_emp = E.CPF and E.enome = ‘João Silva’

(54)

Operações de Conjunto

Q28: Liste os nomes dos empregados que não trabalham

em nenhum projeto

select enome from E MINUS (EXCEPT) select enome from T, E

(55)

Operações de Conjunto

Q29: Liste os nomes dos empregados que não trabalham

em nenhum projeto

select enome

from E

where NOT EXIST (select *

from T

(56)

Comparação de Conjuntos

• SQL tem especificado o operador de comparação

de conjuntos CONTAINS

• S1 CONTAINS S2

– retorna Verdadeiro se S1 contém todos os valores de

S2

• A maioria dos sistemas não implementam este

operador

(57)

Comparação de Conjuntos

Q30: Liste os nomes dos empregados que trabalham em

todos os projetos

select enome

from E

where ((select pnumero

from T

where T.CPF_emp = E.CPF ) Contains

(select pnumero

(58)

Comparação de Conjuntos

Q31: Liste os nomes dos empregados que trabalham em

todos os projetos

select enome

from E

where NOT EXISTS ( (select pnumero from P)

EXCEPT

(select pnumero

from T

(59)

Comparação de Conjuntos

Q32: Liste os nomes dos empregados que trabalham em

todos os projetos

select enome

from E

where NOT EXISTS ( select *

from P

where NOT EXITS (select *

from T

where T.CPF_emp = E.CPF and )) T.pnum = P.CPF ))

(60)

1: seleção select *

R[A = ‘a’] from R

where A = ‘a’;

2: projeção select A1,...,Ak

R[ A1,...,Ak] from R;

3: Produto cartesiano select *

R1 x R2 from R1, R2 ;

(61)

4:União select *

R1 U R2 from R1

-- sem duplicatas- union

select * from R2; 5: Diferença select * R1 - R2 from R1 where * not in (select * from R2);

De AR para SQL

(62)

5: Diferença select A1, ..., An R1 - R2 from R1 except select B1, ..., Bn from R2);

De AR para SQL

6: Interseção select A1, ..., An

R1 R2 from R1

intersect

select B1, ..., Bn

Referências

Documentos relacionados

Para isso, estudamos sobre Educação Matemática, tendências da educação matemática, em especial, a Resolução de problemas; estudamos também sobre o ensino de Matemática

teen. violentamente acus-ido não bó' tía tribuna da Assembléia fcsgisiat.ya, como também pe'-- Procuradoria do Estado e pelas colunns da imprensa. Na primeira

O objetivo desta pesquisa foi quantificar a atividade da redutase do nitrato (RN) e a assimilação do nitrogênio em função da dose e do tempo decorrido de uma única aplicação

Esses novos agricultores, segundo Wanderley, ou pelo menos parte deles, quando comparados aos “camponeses ou outros tipos tradicionais, são também, ao mesmo

TABELA 02: Dados de produção de arroz, milho, soja e mandioca obtidos no sistema agrossilvicultural (ASC) nas condições de baixo (BI) e alto (AI) insumos, em tres anos... A

Há vários ti- pos de 2HDM, iremos nos restringir a dois tipos: o modelo de dubleto inerte(2HDMI), em que apenas um dos dubletos desenvolve vev, e uma das partículas escalares, ge-

O esforço resistente último de pilares de aço formado a frio submetido à compressão centrada combinada com distribuição uniforme de temperatura pode ser determinada por meio

ensino superior como um todo e para o curso específico; desenho do projeto: a identidade da educação a distância; equipe profissional multidisciplinar;comunicação/interatividade