Banco de Dados I SQL – DML Frederico D. Bortoloti [email protected] SQL - DML • O Os exemplos l d da aula l serão ã elaborados l b d para o esquema de dados a seguir: Empregado(matricula, nome, Empregado(matricula nome endereco endereco, salario salario, supervisor, depto) Departamento(coddep nome, Departamento(coddep, nome gerente gerente, dataini) Projeto(codproj, nome, local, depart) Al Alocacao(matric,codigop, ( ti di h horas) ) Dependente(coddepend, matricula, nome, sexo) SQL - DML • As operações de manipulação sem cursor são – SELECT – INSERT – UPDATE – DELETE SQL - DML • O comando SELECT: forma básica SELECT <lista atributos> FROM <lista tabelas> WHERE <condição> • O resultado de qualquer comando SELECT é uma tabela – O campo FROM realiza produto cartesiano das tabelas relacionadas – WHERE deve trazer as condições de junção SQL - DML: Exemplos • Q1 Q1. Obt Obtenha h todos t d os atributos t ib t de d ttodos d os empregados Select * From Empregado p g • Q2 Q2. Selecione as matrículas dos empregados Select matricula F From empregado d SQL - DML: Exemplos • Q3 Q3. Obtenha Obt h o salário lá i d do empregado d JJosé é Select salario From Empregado Where nome = ‘José’ • Q4. Selecione todos os atributos de todos os empregados do departamento d5 Select * From Empregado Where depto = ‘d5’ d5 SQL - DML: Exemplos • Q5. Faça o produto cartesiano, seguido de projeção de Empregados X Departamento retornando a matrícula do empregado e o nome do departamento Select matricula, Departamento.nome From Empregado, Empregado Departamento – A cláusula FROM já realiza o produto cartesiano – Departamento.nome é especificado para não haver confusão com o atributo nome de empregado – Empregados são relacionados com outros d departamentos t t além lé d daquele l em que ttrabalham b lh SQL - DML: Exemplos • Q6 Q6. Selecione S l i o nome e o endereço d d de ttodos d os empregados que trabalham no departamento de produção Select e.nome, e.endereco F From empregado d e, d departamento t t d Where d.nome = ‘Produção’ and d.coddep = e.depto d t SQL - DML: Exemplos • Q7 Q7. Para P cada d projeto j t em ‘F ‘Fortaleza’, t l ’ liliste t o código do projeto, o departamento que controla o projeto e o nome do gerente com endereço e salário Select p.codproj, p codproj d d.nome, nome e e.nome, nome e.endereco, e.salario From Projeto p p, Departamento d d, Empregado e Where p p.depart depart = d d.coddep coddep and d d.gerente gerente = e.matricula and p.local = ‘Fortaleza’ SQL - DML: Exemplos • Q8 Q8. P Para cada d empregado, d recupere seu nome e o nome do seu supervisor Select e.nome, s.nome From Empregado e s Where s.matricula = e.supervisor SQL - DML: Exemplos – Q9. Selecione todos os atributos de todos os empregados do departamento pessoal Select * From Empregado e, Departamento d Where d.nome = ‘Pessoal’ and d coddep = e d.coddep e.depto depto – Q10. Recupere os salários dos empregados Select salario From empregado SQL - DML: Exemplos • Algumas vezes surgem duplicatas como p a uma q query. y Podemos elimináresposta las usando o comando DISTINCT na cláusula SELECT – Q11. Q11 Selecione S l i os diferentes dif salários lá i pagos pela empresa aos empregados Select distinct salario p g From empregado SQL - DML: Exemplos • SQL implementa a operação UNIÃO Ã da g relacional. É requerido q q que as álgebra relações sejam compatíveis de união – Q12. Liste todos os nomes de projetos que envolvem l o empregado d ‘Sil ‘Silva’’ como trabalhador ou como gerente do d departamento t t que controla t l o projeto j t SQL - DML: Exemplos (SELECT p.nome FROM Projeto j P,, Departamento p d,, Empregado p g e WHERE d.coddep d coddep = p p.depart depart and d.gerente d gerente = e.matricula and e.nome = ‘Silva’) UNION ((SELECT p p.nome FROM Projeto p, Alocação a, Empregado e WHERE p.codproj d j = a.codproj d j and d e.matricula ti l = a.matricula and e.nome = ‘Silva’) SQL - DML: Exemplos • Além da operação UNIÃO, Ã o SQL p as operações p ç INTERSEÇÃO Ç implementa e DIFERENÇA ( ∩ e - ) – INTERSECT – EXCEPT • A sintaxe para os dois comandos é a mesma da UNIÃO SQL - DML: Exemplos • Consultas Aninhadas: consultas que possuem consultas completas p p dentro de sua cláusula WHERE – Motivação: Algumas queries requerem que valores do BD sejam buscados e então usados numa condição – Q13. A consulta Q12 poderia ser reescrita da seguinte forma: SQL - DML: Exemplos SELECT DISTINCT nome FROM Projeto WHERE codproj in (SELECT p.codproj FROM Projeto p, p Departamento d d, Empregado e WHERE p.depart = d.coddep and d.gerente = e.matricula and e.nome = ‘Silva’)) or codproj in (SELECT a.codigop FROM Alocação a, Empregado e WHERE a.matric a matric = e.matricula e matricula and e e.nome nome = ‘Silva’) SQL - DML: Exemplos • Q14 Q14. Recupere o nome de cada empregado que tem um dependente com o mesmo nome e mesmo sexo SELECT e.nome FROM empregado e WHERE e.matricula in (SELECT matricula FROM dependente d d t WHERE matricula = e.matricula and e e.nome nome = nome and e.sexo = sexo) Obs.: Veja que e.matricula, e.nome e e.sexo são atributos de empregado da consulta externa SQL - DML: Exemplos – Q15. Q15 Re Re-escrevendo escrevendo a Q14 sem usar aninhamento SELECT e.nome FROM empregado e e, dependente d WHERE e.matricula = d.matricula and e.nome = d.nome and e.sexo = d.sexo SQL - DML: Exemplos • A função EXISTS – É usada para verificar se o resultado de uma consulta aninhada é vazio ou não não. É sempre usado em conjunto com um query aninhada – A consulta Q14 poderia ser: SELECT e.nome FROM empregado d e WHERE EXISTS (SELECT * FROM dependente WHERE e.matricula = matricula and e.nome = nome and e.sexo = sexo) SQL - DML: Exemplos • Podemos usar o NOT EXISTS(Q) – Q16. Recupere os nomes dos empregados que não têm dependentes SELECT e.nome FROM empregado e WHERE NOT EXISTS (SELECT * FROM dependente WHERE e.matricula = matricula) SQL - DML: Exemplos • Podemos usar um conjunto de valores explícitos – Q17. Selecione a matricula de todos os empregados que trabalham nos projetos 10, 20 ou 30 SELECT DISTINCT matric FROM alocacao WHERE codigop in (10,20,30) (10 20 30) SQL - DML: Exemplos • Podemos verificar valores nulos através de IS NULL e IS NOT NULL – Q18. Selecione os nomes de todos os empregados que não têm supervisores SELECT nome FROM empregado WHERE supervisor IS NULL SQL - DML: Funções • SQL fornece 5 funções ç embutidas – COUNT: retorna o número de tuplas ou valores especificados numa query – SUM: retorna a soma os valores de uma coluna – AVG: retorna a média dos valores de uma coluna l – MAX: retorna o maior valor de uma coluna – MIN: identifica o menor valor de uma coluna • Estas funções ç só p podem ser usadas numa cláusula select ou numa cláusula HAVING (a ser vista depois) SQL - DML: Exemplos – Q19. Q19 Encontre o total de salários salários, o maior e o menor salário e a média salarial da relação empregados SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario) FROM Empregado E d SQL - DML: Exemplos – Q20. Q20 Encontre o maior e menor salário do departamento de Produção SELECT MAX( MAX(salario), l i ) MIN(salario) MIN( l i ) FROM Empregado e, Departamento d WHERE e.depto = d.coddep and d.nome = ‘Produção’ Produção – Q.21 Obtenha o número de empregados da empresa SELECT COUNT(*) FROM empregado SQL - DML: Exemplos – Q.22 Q 22 Obter o número de salários distintos do departamento de Contabilidade SELECT COUNT(DISTINCT salario) l i ) FROM empregado e, departamento d WHERE (e.depto = d.coddep and d.nome = ‘Contabilidade’) Contabilidade ) – O que aconteceria se escrevêssemos COUNT(salario) ao invés de COUNT(DISTINCT salario)? SQL - DML: Exemplos – Q23. Q23 Obter o nome dos empregados que tenham 2 ou mais dependentes SELECT e.nome FROM empregado e WHERE (SELECT COUNT(*) FROM Dependente d WHERE e.matricula = d matricula) d.matricula) >= 2 SQL - DML: Exemplos • Cláusulas GROUP BY e HAVING – Usadas para lidar com grupos – Q24. Q24 Para P cada d departamento, d t t obter bt o código ódi do departamento, o número de empregados e a média salarial SELECT depto, COUNT(*), AVG(salario) FROM Empregado E d GROUP BY depto ÖAs tuplas de empregados são separadas em grupos (departamento) e as funções COUNT e AVG são ã aplicadas li d a cada d grupo separadamente SQL - DML: Exemplos • Q25 Q25. Para cada projeto projeto, obter o código do projeto, seu nome e o número de empregados que trabalham nele SELECT codigop, nome, COUNT( COUNT(*)) FROM Projeto p, Alocacao a WHERE p.codproj = a.codigop GROUP BY p p.codproj, codproj p p.nome nome – O agrupamento e as funções são aplicadas após a junção SQL - DML: Exemplos • HAVING – Cláusula usada em conjunto com GROUP BY para permitir a inclusão de condições nos grupos • Q26. Para cada projeto que possui mais de 2 empregados trabalhando trabalhando, obter o código do projeto, nome do projeto e número de empregados que trabalha neste projeto SQL - DML: Exemplos SELECT p p.codproj, codproj p p.nome, nome COUNT(*) FROM Projeto p, Alocacao a WHERE p p.codproj codproj = a a.codigop codigop GROUP BY p.codproj, p.nome HAVING COUNT(*) > 2 SQL - DML: Exemplos • Operadores p de comparação p ç e aritméticos • BETWEEN – Sintaxe: expressão [NOT] BETWEEN expressão AND expressão – Ex.: Ex : y BETWEEN x AND z equivale a x <= y <= z – Q27. Q27 Selecione os nomes dos empregados que ganham mais de 1000 e menos de 2000 reais SELECT nome FROM Empregado WHERE salario BETWEEN 1000 AND 2000 SQL - DML: Exemplos • LIKE – Permite comparações p ç de substrings. g Usa dois caracteres reservados ‘%’ (substitui um número arbitrário de caracteres)) e ‘_‘ (substitui um único caracter) – Q.28 Q 28 Obter os nomes de empregados cujos endereços estão em Natal, RN SELECT nome FROM empregado WHERE endereco LIKE ‘%Natal,RN%’ SQL - DML: Exemplos – Q29. Queremos ver o efeito de dar aos empregados que trabalham no ProdutoX um aumento de 10% SELECT e.nome, 1.1*salario FROM empregado e, alocacao a, projeto p WHERE e.matricula e matricula = a a.matricula matricula and a.codigop = p.codproj and p.nome = ‘ProdutoX’ ProdutoX SQL - DML: Exemplos • Ordenação – O operador ORDER BY permite ordenar o resultado de uma query por um ou mais atributos – Q.30 Obter uma lista de empregados e seus respectivos departamentos e projetos projetos, listando ordenado pelo nome do departamento SELECT d d.nome, nome e e.nome, nome p p.nome nome FROM departamento d, empregado e, projeto p WHERE d d.coddep dd = e.depto d t and d e.matricula ti l = a.matricula and a.codigop = p codproj p.codproj ORDER BY d.nome, e.nome SQL - DML: Exemplos • Ordenação – A ordem default é ascendente (ASC) caso queiramos ordem decrescente usamos DESC ORDER BY d.nome d nome DESC DESC, e e.nome nome ASC Inserção de Dados • O comando Insert – Usado para adicionar uma tupla a uma relação – Sintaxe: INSERT INTO tabela [ (lista colunas)] fonte – Onde fonte pode ser uma especificação de pesquisa (Select) ou uma cláusula VALUES da forma • VALUES (lista de valores atômicos) – Obs.: Se o comando INSERT incluir a cláusula VALUES então uma única tupla é inserida na relação – Ex. INSERT INTO Empregado (matricula, nome) VALUES (9491,’Ana’) Inserção de Dados – Obs.: A inserção será rejeitada se tentarmos omitir um atributo que não permite valores nulos (NOT NULL) – Ex.: INSERT INTO Empregado (nome, salario) VALUES(‘Flávia’, 960) – Podemos inserir várias tuplas numa relação através de uma query Inserção de Dados CREATE TABLE DEPTO DEPTO_INFO INFO (nome character(15), numemp integer, ) totsal real); INSERT INTO DEPTO INFO(nome, numemp, totsal) DEPTO_INFO(nome, SELECT d.nome, COUNT(*), SUM(salario) FROM Departamento d d, Empregado e WHERE d.coddep = e.depto GROUP BY d.nome d nome Remoção de Dados • O comando d DELETE – Remove tuplas de uma relação – Sintaxe DELETE FROM tabela [WHERE condição] – Obs.: Se omitirmos a cláusula WHERE, então o DELETE deve ser aplicado a todas as tuplas da relação. Porém, a relação permanece no BD como uma relação p ç vazia Modificação de Dados • O comando d UPDATE – Modifica o valor de atributos de uma ou mais tuplas. – Sintaxe UPDATE tabela ç de valores SET lista_atributos com atribuições [ [WHERE condição] ç ] – Obs.: omitir a cláusula WHERE implica que o UPDATE deve ser aplicado p a todas as tuplas p da relação Modificação de Dados • O comando UPDATE – Ex. Modifique q o nome do Departamento p de Computação para Departamento de Informática UPDATE Departamento SET nome = ‘Informática’ WHERE nome = ‘Computação’ Modificação de Dados • O comando UPDATE – Ex. Dê um aumento de 10% % a todos os empregados do departamento de Pesquisa UPDATE Empregado SET salario = salario * 1 1.1 1 WHERE depto in (SELECT coddep FROM Departamento q ) WHERE nome =‘Pequisa’)