SISTEMAS DE BANCO DE DADOS Prof. Adriano Pereira Maranhão 1
SQL Structured Query Language SQL Desenvolvida pela IBM Structured English Query Language Sequel Linguagem de consulta para o sistema R Primeiro protótipo de SBD relacional Especificar consultas de forma interativa ad hoc queries Padrão ANSI SQL 86,SQL 89,SQL 92, SQL 99 e SQL 2003 2
SQL DEFINIÇÃO DE ESQUEMAS Esquema de um banco de dados relacional Conjunto de esquemas de relação mais um conjunto de restrições de integridade IC Expressões DDL do SQL permitem especificar Esquema de relações(tabelas) Domínio de valores associados a cada atributo Restrições de integridade Conjunto de índices a serem mantidos para cada relação Estrutura de armazenamento físico de cada relação 3
SQL DEFINIÇÃO DE ESQUEMAS Criando tabelas -Estrutura básica CREATE TABLE nome-tabela (nome-coluna tipo-de-dados [not null], [nome-coluna tipo-de-dados [not null] ], [CONSTRAINT nome-restrição] UNIQUE nome-coluna PRIMARY KEY(nome-coluna {, nome-coluna}) FOREIGN KEY (nome-coluna {, nome-coluna}) REFERENCES nome-tabela [ON DELETE CASCADE SET NULL NO ACTION ], [ON UPDATE CASCADE], CHECK (predicado) ) 4
SQL DEFINIÇÃO DE ESQUEMAS Removendo tabelas-estrutura básica DROP TABLE nome-tabela [CASCADE RESTRICT] Remove as tuplas da tabela e sua definição do catálogo CASCADE remove as restrições do tipo foreign key tabelas que referenciam a tabela removida Alterando tabelas- Estrutura básica ALTER TABLE nome-tabela [ADD nome-coluna tipo de dados] [DROP nome-coluna ] [ADD CONSTRAINT nome-restrição] [DROP CONSTRAINT nome-restrição] 5
CONSULTAS BÁSICAS EM SQL select < lista de atributos> from < lista de nomes de relação> where < condição de seleção> ; select from where A1,...,An R1,...,Rm <condição>; (R1 x... x Rm) [ <condição> ] [A1,...,An] produto cartesiano seleção projeção
Esquema Exemplo E (code, enome, dno, sal, localização) D (dno, dnome, ger) Q1: Liste todas informações em E sobre empregados em Fortaleza. select * from where E E.localização = Fortaleza ;
Q2: Liste todas as informações em D select * from D; A cláusula where é opcional.
IMPLEMENTANDO JUNÇÃO
Implementando Junção Q3: Liste todos os empregados e o nome dos seus departamentos select enome, dnome from E, D where E.dno = D.dno; Para resolver ambiguidades
Implementando Junção Q4: Nome dos empregados gerenciados por 01 e que tem um salário < R$1000? select enome from E, D where E.dno = D.dno AND D.ger = 01 AND sal < 1000; SQL não tem nenhum suporte especial para junção natural
Implementando Junção Q5: Nome dos empregados que ganham mais que seu gerente? select E1.enome from E E1, D, E E2 where E1.dno = D.dno D.ger = E2.code E1.sal > E2.sal; AND AND Nós precisamos de duas cópias de E. Cria-se uma alias para evitar ambiguidades.
Implementando Junção Q6: Nome dos gerentes que ganham menos que os seus empregados? select distinct E2.enome from where E E1, D, E E2 E1.dno = D.dno AND D.ger = E2.code AND E1.sal > E2.sal; 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.
Implementando Junção PEÇAS (#p, pnome) FORNECEDORES_PEÇAS (#f,#p,qtd) Q7: Encontre a quantidade fornecida de cada peça.devem constar inclusive as peças que não são fornecidas por nenhum fornecedor. select pnome, qtd from PEÇAS P, FORNECEDORES_PEÇAS FP where P.#p *= FP.#P Outer Join
Implementando Junção PEÇAS #p pnome P1 mouse P2 teclado P3 monitor P4 disco rígido RESULTADO RESULTADO #p qtd qtd P1 mouse 10 10 P1 mouse 20 20 P2 teclado 15 15 P3 monitor null null FORNECEDORES_PEÇAS #f #p qtd F1 P1 10 F1 P2 15 F2 P1 20 disco rígido null
DEFININDO VISÕES
Definindo Visão 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.
Definindo Visão Q9 : Imprima o nome de todos os empregados que ganham mais de 90% do salário do seu gerente. create view as select from where ESGS(e_nome, e_sal, g_nome, g_sal) E1.enome, E1.sal, E2.enome, E2.sal E E1, D, E E2 E1.dno = D.dno AND D.ger = E2.code; select from where e_nome ESGS e_sal > 0.9 * g_sal;
CONSULTAS COM SUBCONSULTAS
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 ANY (SOME) ou ALL.
Subconsultas: Membros de um conjunto Q10: Quem está no mesmo departamento de Vera? 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 (select dno from E where enome = Vera ); ( NOT IN)
Subconsultas: Membros de um conjunto EMP ( enome, #CI, idade) DEP ( nome, e_#ci,... ) 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);
Subconsultas: Membros de um conjunto EMP ( enome, #CI, idade) DEP ( nome, e_#ci,... ) 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);
Subconsultas 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);
Subconsultas Q13: Nomes dos empregados que não têm dependentes? select E.enome from EMP where NOT EXISTS ( select * from DEP where e_#ci = #CI );
Subconsultas Q14: Quem ganha mais do que alguém no departamen de brinquedos? select enome from E where sal > any (select from where sal E, D E.dno = D.dno AND D.dnome = brinquedo ); > any (some) --- Maior do que ao menos um.
ORDENANDO RESULTADOS
Ordenando resultados Q15: 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. Select * from E order by dno, sal DESC, enome;
GERANDO DADOS DE RESUMO
GERANDO DADOS DE RESUMO Funções de Agregação GROUP BY e HAVING
FUNÇÕES DE AGREGAÇÃO
Funções de Agregação Q16: Qual é a média de salário dos empregados no departamento de brinquedos? * Nao podemos responder em alg. rel.. mas é facil em SQL. select avg(sal) from E, D where E.dno = D.dno AND D.dname = brinquedo ; Na cláusula select, pode-se usar: avg(a), sum(a), min(a), max(a), count(a)
Funções de Agregação Q17: Quantos empregados trabalham em mais de um departamento? 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);
Funções de Agregação Q18: Nome dos empregados que ganham mais que a média de salário do seu departamento? select enome from E E1 where sal > (select avg(sal) from E E2 where E2.dno = E1.dno);
GROUP BY E HAVING
GROUP BY Q19: Para cada departamento, liste o número total de empregados do departamento e a soma total dos salários. select dnome, sum(sal), count (enome) from E, D where E.dno = D.dno; 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 Quando queremos que um agregado seja computado separadamente para cada valor de um atributo então deveremos usar: group by
GROUP BY Q20: Para cada departamento, liste o número total de empregados do departamento e a soma total dos salários. select dnome, sum (sal), count (enome) from E, D where E.dno = D.dno group by dnome; Os atributos do group-by devem ser exatamente os itens não-agregado da linha de seleção (na maioria das SQLs).
GROUP BY Q21: Para cada departamento dê o número de empregados e a média de salário. select DNO, COUNT(*), AVG(sal) from EMP group by DNO;
GROUP BY Q22: 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 departamentos? Create View MediaDep(dnome, avgsal, noemps) as select from where dnome, avg(sal), count(enome) E, D E.dno = D.dno group by dnome; Select dnome from MediaDep where avgsal > (select avg(avgsal) AND from MediaDep) noemps > (select avg(noemps) from MediaDep);
GROUP BY e HAVING Q23: Mesma que Q22, mas exclua deptos com menos R$10000 na soma total dos salários dos seu empregados, e imprima a resposta em ordem alfabética. 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 order by dnome; Somente para testes em um grupo inteiro. Não para testes em tuplas. todas as condições devem envolver agregados.
GROUP BY Q24: Quais departamentos têm uma média de salário >R$ 2.000. select dnome, avg(sal) from E, D where E.dno = D.dno group by dnome having avg(sal) > 2.000
GROUP BY Q25: Subconsultas Quais departamentos na têm Cláusula uma média FROM de salario >R$ 2.000. 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 Note que não precisamos usar a clausula HAVING
Q26: 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.
COMPUTE E COMPUTE BY
COMPUTE Q27: Liste todos os tipos de livros que terminam com info e a soma total dos seus tipo preços. preço DB_info 30.95 DB_info 10.40 IA_info 42.05 RC_info 67.20 sum 150.60 select tipo, preço from TÍTULOS where tipo like %info order by tipo, preço compute SUM(preço) TÍTULO (título, tipo, preço)
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 mesmos atributos e na mesma ordem).
ESQUEMA EXEMPLO EMPREGADOS (E) enome CPF salário CPF_Supervisor dnumero DEPARTAMENTOS (D) dnome dnúmero CPF_gerente TRABALHA (T) PROJETOS (P) CPF_Emp pnumero pnome pnúmero dnúmero
OPERAÇÕES DE CONJUNTO Q28: 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 union E.enome = João Silva select pnome from T, P, E where T.pnum=P. dnum and T.CPF_emp = E.CPF and E.enome = João Silva
OPERAÇÕES DE CONJUNTO Q29: Liste os nomes dos empregados que não trabalham em nenhum projeto select enome from E MINUS (EXCEPT) select enome from T, E where T.CPF_emp = E.CPF
OPERAÇÕES DE CONJUNTO Q30: Liste os nomes dos empregados que não trabalham em nenhum projeto select enome from E where NOT EXIST (select * from T where T.CPF_emp = E.CPF )
COMPARAÇÃO DE CONJUNTOS Q31: 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 ))
DE AR PARA SQL 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 ;
De AR para SQL 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 5: Diferença select A1,..., An R1 - R2 from R1 except select B1,..., Bn from R2); 6: Interseção select A1,..., An R1 R2 from R1 intersect select B1,..., Bn from R2);