SQL Maria Cláudia Yoko Cavalcanti Instituto Militar de Engenharia IME SQL Introdução 1
SQL Structured Query Language Linguagem de fato de acesso a BDs relacionais 1970: E. Codd/IBM propõe o Modelo Relacional 1981: Primeiro produto comercial SQL/DS 1987: ANSI SQL é aceito como padrão ISO 1992: SQL2 - novos tipos e comandos, restrições de integridade SQL:1999 ou SQL3 LOBs, triggers, OO,... SQL:2003 table functions, sequenciais, merge,... SQL/XML:2003 mapeamento, schema,... SQL ANSI SQL SGBD SQL Vários produtos com diferentes sabores de SQL Acesso direto às bases de dados para consulta, atualização e definição de dados Outras formas de se usar SQL Consulta: comando SELECT Atualização: comandos UPDATE, INSERT, DELETE Definição de dados: comandos CREATE, ALTER, DROP 2
Links interessantes BNF Grammars for SQL-92, SQL- 99 and SQL-2003 http://savage.net.au/sql/ Modelo Relacional Um banco de dados relacional contém um ou mais objetos chamados tabelas. As informações estão armazenadas nestas tabelas. As linhas contém dados e são conhecidas como tuplas. A tabela abaixo contém informações sobre a temperatura das cidades. city state high low Phoenix Arizona 105 90 Tucson Arizona 101 92 Flagstaff Arizona 88 69 San Diego California 77 60 Albuquerque New Mexico 80 72 3
4 Base de Dados Empresa EMPREGADO DEPARTAMENTO DEPTO_LOCAL PROJETO TRABALHA_EM DEPENDENTE Depto MatrículaGerente SuperMat Depto MatrículaEmp PCódigo MatrículaEmp A tabela Empregado Nome Maria João Abel Carlos Edson Flávio Gilda Hilton Irene José Kátia Noel Otto Snome Silva Goya Flores Gardel Celui Altolá Gomes Silva Santos Souza Moura Reis Bastos Matrícula 001 002 003 004 005 006 007 008 009 010 011 012 013 DataNasc 13/07/55 23/12/65 31/10/73 11/09/72 21/02/44 30/09/56 01/08/66 15/05/64 16/04/63 25/05/59 22/03/60 03/01/61 01/11/62 Endereço Sexo F M M M M M F M F M F M M Salário 1000 1000 3000 1000 3000 3000 1000 3000 SuperVisor NULL 001 001 002 003 003 003 002 002 003 002 003 003 Depto DG DG DG DES PROD PROD PROD DES DES DES PROD DES DES EMPREGADO
O comando SELECT SELECT [ALL DISTINCT] lista-de-seleção FROM tabela [,tabela]... [WHERE condição ] [GROUP BY atributo(s)] [HAVING condição] [ORDER BY atributo(s)] Tipos de dados do SQL Integer: int, smallint, tinyint Float: float, double, real Char: char(), varchar() Date, Time Money Binary 5
Exemplos de uso do Select 1. Recuperação simples de tabelas SELECT NOME, DATANASC Nome Maria João Abel Carlos Edson Flávio Gilda Hilton Irene José Kátia Noel Otto DataNasc 13/07/55 23/12/65 31/10/73 11/09/72 21/02/44 30/09/56 01/08/66 15/05/64 16/04/63 25/05/59 22/03/60 03/01/61 01/11/62 Exemplos de uso do Select 2. Listar todos os atributos para tuplas obedecendo a uma determinada condição SELECT * WHERE SEXO = 'F Nome Snome Matrícula DataNasc Endereço Sexo Salário SuperVisor Depto Maria Gilda Irene Kátia Silva Gomes Santos Moura 001 007 009 011 13/07/55 01/08/66 16/04/63 22/03/60 F F F F 1000 3000 3000 NULL 003 002 002 DG PROD DES PROD 6
Exemplos de uso do Select 3. Recuperação com a eliminação de tuplas duplicadas SELECT DISTINCT SALÁRIO 4. Recuperação com valores computados de colunas Salário 1000 3000 SELECT DISTINCT SALARIO, SALARIO * 1,10 AS Novo Salário Salário Novo Salário 1000 3000 1100 2200 3300 Exemplos de uso do Select 5. Ordenando o resultado de uma consulta SELECT NOME,SALARIO ORDER BY NOME Nome Abel Carlos Edson Flávio Gilda Hilton Irene João José Kátia Maria Noel Otto Salário 1000 1000 3000 1000 3000 3000 1000 3000 7
Exemplos de uso do Select Matrícula 6. Recuperação com condições envolvendo conjuntos e intervalos: Usando IN: SELECT DISTINCT MATRICULA WHERE SUPERVISOR IN (001,003) Nome 002 003 005 006 007 010 012 013 Salário Usando BETWEEN: SELECT NOME, SALARIO WHERE SALARIO BETWEEN 1000 AND Maria João Abel Carlos Flávio Gilda José Noel Otto 1000 1000 1000 1000 Exemplos de uso do Select 7. Recuperação por aproximação usando LIKE: "_" - uma ocorrência de qualquer caractere, "%" - nenhuma ou várias ocorrências de quaisquer caracteres. SELECT NOME WHERE NOME LIKE J%' Nome João José 8. Usando NULL em comparações: SELECT NOME WHERE SUPERVISOR IS NULL Nome Maria 8
Selecionando tuplas 9. Usando a cláusula CASE Sintaxe: SELECT colunas, CASE WHEN condição THEN ação... [ELSE ação] END FROM tabela; Exemplo simulando aumentos salariais; SELECT nomeemp, salario, CASE WHEN supervisor = 001 THEN salario *.4 WHEN supervisor = 002 THEN salario *.3 ELSE salario *.1 END novo_salario FROM empregado; Selecionando tuplas 10. Usando a cláusula CASE abreviada Sintaxe: SELECT colunas, CASE coluna valor THEN ação... [ELSE ação] END FROM tabela; Exemplo simulando aumentos salariais; SELECT nomeemp, salario, CASE supervisor WHEN 001 THEN salario *.4 WHEN 002 THEN salario *.3 ELSE salario *.1 END FROM empregado; 9
Tabelas S, P e SP S (suppliers) S# SNAME STATUS CITY S1 Smith 20 London S2 Jones 10 Paris S3 Blake 30 Paris S4 Clark 20 London S5 Adams 30 Athens P (parts) P# PNAME COLOR WEIGHT CITY P1 Nut Red 12 London P2 Bolt Green 17 Paris P3 Screw Blue 17 Rome P4 Screw Red 14 London P5 Cam Blue 12 Paris P6 Cog Red 19 London SP (fornecimento) S# P# QTY S1 P1 300 S1 P2 200 S1 P3 400 S1 P4 200 S1 P5 100 S1 P6 100 S2 P1 300 S2 P2 400 S3 P2 200 S4 P2 200 S4 P4 300 S4 P5 400 SQL Funções de Agregação 10
Exemplos de uso do Select 9. Uso de funções de agregação: SELECT AVG(SALARIO) SELECT MAX(SALARIO) SELECT MIN(SALARIO) SELECT SUM(SALARIO) SELECT COUNT(*) AVG(SALARIO) MAX(SALARIO) 3000 MIN(SALARIO) 1000 SUM(SALARIO) 26000 COUNT(*) 13 Outras funções Desvio padrão e variância STDDEV SELECT STDDEV(salario) FROM empregado; VARIANCE SELECT VARIANCE(salario) FROM empregado; Conversão de tipos CAST (coluna AS novo_tipo_de_dado) nome_coluna SELECT CAST(AVG(salario) AS DECIMAL (10,2)) média_salarial FROM empregado; 11
Outras funções Não estão no padrão SQL Numéricas POWER, POSITION, LENGHT Alfanuméricas UPPER, LOWER, TRIM, SUBSTRING, CONVERT, REPLACE Manipulação de datas YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, EXTRACT Função COALESCE Está no padrao SQL, mas usada dentro da cláusula CASE Sintaxe FORA DO PADRÃO: SELECT colunas, COALESCE(coluna_teste, coluna_subst) supervisão FROM tabela; Exemplo SELECT matricula, nomeemp, COALESCE(supervisor, matricula) supervisão FROM empregado; Matricula nome supervisão 001 Maria 001 002 João 001... 12
Exemplos de uso do Select 10. Agrupando o resultado: SELECT DEPTO, AVG(SALARIO) GROUP BY DEPTO SELECT SUPERVISOR, COUNT(*) GROUP BY SUPERVISOR SELECT SEXO, SUM(SALARIO) GROUP BY SEXO Depto DG 1333 PROD 2250 DES 2167 Supervisor 001 2 002 4 003 6 1 Sexo F 9000 M 17000 AVG(Salario) COUNT(*) SUM(Salario) Exemplos de uso do Select 10. Agrupando o resultado: SELECT DEPTO, AVG(SALARIO) GROUP BY DEPTO HAVING AVG(SALARIO) > SELECT SUPERVISOR, COUNT(*) GROUP BY SUPERVISOR HAVING COUNT(*) > 3 SELECT SEXO, SUM(SALARIO) GROUP BY SEXO HAVING SUM(SALARIO)!= 0 Depto PROD 2250 DES 2167 Supervisor 002 4 003 6 Sexo F 9000 M 17000 AVG(Salario) COUNT(*) SUM(Salario) 13
Valor Nulo O dado pode ser obrigatório (NOT NULL) ou de preenchimento opcional (NULL) Indica um dado não preenchido, de valor ignorado, ou um campo que não tem valor naquele registro. Não participa nas computações. média (2,4,0 ) = 2 ( 6 / 3 ) média (2,4,NULL) = 3 ( 6 / 2 ) Valor Nulo 11. Observando os valores nulos SELECT COUNT(*) AS Total de empregados, COUNT(SUPERVISOR) AS Total de empregados supervisionados Total de Empregados 13 12 Total de Empregados Supervisionados 14
Observações Função_de_agregação( [DISTINCT] expressão) SELECT AVG( DISTINCT SALARIO) ------- Sumariar em mais de um nível NÃO é possível SELECT Depto, Avg(Salario), Supervisor, COUNT(Nome) GROUP BY Depto, Supervisor Group by pode ser usado sem Funções de Agregação Funciona como se fosse um DISTINCT Observações Group by NÃO necessariamente ordena, para garantir recomenda-se o uso da cláusula ORDER BY É possível ordenar pela função de agregação SELECT Depto, avg(salario), count(*) GROUP BY Depto ORDER BY avg(salario) 15
Having X Where WHERE seleciona as tuplas antes da agregação HAVING seleciona as tuplas depois da agregação SELECT Supervisor, COUNT(*) WHERE Salario > GROUP BY Supervisor SELECT Supervisor, COUNT(*) GROUP BY Supervisor HAVING Salario > Supervisor 002 3 003 1 Supervisor 002 4 003 6 COUNT(*) COUNT(*) SQL Junção União Subconsultas 16
Junções Em várias consultas será necessário correlacionar os dados de várias tabelas. Por exemplo: Qual o nome do depto de cada empregado? Liste os nomes dos empregados de um projeto? Qual o nome dos gerentes de cada departamento? Tabelas do BD Empresa EMPREGADO Nome SNome Matrícula DataNasc Endereço Sexo Salário SuperMat Depto DEPARTAMENTO DeptoNome DeptoSigla MatrículaGerente PROJETO PNome PCódigo PLocalização Depto TRABALHA_EM MatrículaEmp PCódigo Horas 17
18 A tabela Empregado Nome Maria João Abel Carlos Edson Flávio Gilda Hilton Irene José Kátia Noel Otto Snome Silva Goya Flores Gardel Celui Altolá Gomes Silva Santos Souza Moura Reis Bastos Matrícula 001 002 003 004 005 006 007 008 009 010 011 012 013 DataNasc 13/07/55 23/12/65 31/10/73 11/09/72 21/02/44 30/09/56 01/08/66 15/05/64 16/04/63 25/05/59 22/03/60 03/01/61 01/11/62 Endereço Sexo F M M M M M F M F M F M M Salário 1000 1000 3000 1000 3000 3000 1000 3000 SuperVisor NULL 001 001 002 003 003 003 002 002 003 002 003 003 Depto DG DG DG DES PROD PROD PROD DES DES DES PROD DES DES EMPREGADO Outras tabelas do BD Empresa DeptoNome Direção Geral Produção Desenvolvimento Gerente 001 002 003 DeptoSigla DG PROD DES DEPARTAMENTO PNome Tamar Jubarte Pantanal PLocalização Itaúnas Abrolhos Bonito PCódigo T1 J2 P3 PROJETO Depto PROD PROD DES MatrículaEmp 004 005 006 007 008 009 010 011 012 013 009 010 012 013 PCódigo P3 T1 T1 J2 P3 P3 P3 J2 P3 P3 T1 T1 J2 J2 TRABALHA_EM Horas 40 40 40 40 40 20 20 40 20 20 20 20 20 20
Multiplicação - Produto Cartesiano C1 C2 --------- AA 11 BB 22 C3 C4 --------- 11 ** 22 ## C1 C2 C3 C4 ----------------- AA 11 11 ** AA 11 22 ## BB 22 11 ** BB 22 22 ## Junção C1 C2 --------- AA 11 BB 22 C3 C4 --------- 11 ** 22 ## C2 = C3 C1 C2 C3 C4 ----------------- AA 11 11 ** BB 22 22 ## 19
Em SQL Multiplicação: SELECT * FROM DEPARTAMENTO, PROJETO Junção: SELECT * FROM DEPARTAMENTO, PROJETO WHERE PROJETO.Depto = DEPARTAMENTO.DeptoSigla Usando apelidos para as tabelas: SELECT * FROM DEPARTAMENTO d, PROJETO p WHERE p.depto = d.deptosigla Selecionando somente as colunas que interessam: SELECT d.deptonome, p.pnome FROM DEPARTAMENTO d, PROJETO p WHERE p.depto = d.deptosigla Em SQL Selecionando somente as colunas e tuplas que interessam: Exemplo: Liste o nome do departamento e dos projetos que se localizam em Abrolhos SELECT d.deptonome, p.pnome FROM DEPARTAMENTO d, PROJETO p WHERE p.depto = d.deptosigla AND p.localização = Abrolhos deptonome pnome ---------------------- Produção Jubarte 20
Tipos de Junção Equijoin: junção baseada na igualdade Self join: junção da tabela com ela mesma Exemplo: Liste os empregados, dois a dois, que possuem o mesmo sobrenome (prováveis parentes) SELECT e1.nome, e2.nome FROM empregado e1, empregado e2 WHERE e1.snome = e2.snome e1.nome e2.nome ---------------------- Maria Maria Maria Hilton Hilton Maria Hilton Hilton Como fazer para evitar as combinações de tuplas iguais? Tipos de Junção Equijoin: junção baseada na igualdade Self join: junção da tabela com ela mesma Exemplo: Liste os empregados, dois a dois, que possuem o mesmo sobrenome (prováveis parentes) SELECT e1.nome, e2.nome FROM empregado e1, empregado e2 WHERE e1.snome = e2.snome AND e1.matricula!= e2.matricula e1.nome e2.nome ---------------------- Maria Hilton Hilton Maria Como fazer para evitar as duplicatas? 21
Tipos de Junção Equijoin: junção baseada na igualdade Self join: junção da tabela com ela mesma Exemplo: Liste os empregados, dois a dois, que possuem o mesmo sobrenome (prováveis parentes) SELECT e1.nome, e2.nome FROM empregado e1, empregado e2 WHERE e1.snome = e2.snome AND e1.matricula < e2.matricula e1.nome e2.nome ---------------------- Maria Hilton Tipos de Junção Outer Join mostra tuplas que NÃO satisfazem à condição de junção, além das tuplas que satisfazem útil para ver os resultados em contraste com as tuplas que falham muitos fornecedores de SGBD implementaram esta funcionalidade antes do padrão SQL92 sintaxe varia, alguns usam na cláusula WHERE *= inclui todas as tuplas da primeira tabela (left) =* inclui todas as tuplas da segunda tabela (right) 22
Tipos de Junção Exemplo Liste todos os Departamentos e seus projetos, mesmo que o Departamento não possua projeto SELECT d.deptonome, p.pnome FROM departamento d, projeto p WHERE d.depto *= p.depto DeptoNome Pnome ----------------------------- Direção Geral NULL Produção Tamar Produção Jubarte Desenvolvimento Pantanal Tipos de Junção Sintaxe da Junção Externa... FROM tabela1 [LEFT RIGHT FULL] OUTER JOIN tabela 2 ON condição Ex. SELECT d.deptonome, p.pnome FROM departamento d LEFT OUTER JOIN projeto p ON d.deptosigla = p.depto;... FROM tabela1 [LEFT RIGHT FULL] OUTER JOIN tabela 2 USING (atributo1, atributo2) SELECT d.deptonome, p.pnome FROM departamento d LEFT OUTER JOIN projeto p USING (d.deptosigla, p.depto); 23
Junção com 3 Tabelas Listar empregados e os projetos em que trabalham 20 horas. SELECT e. Nome, e.snome, p.pnome e, PROJETO p, TRABALHA_EM t WHERE e.matricula = t.matriculaemp AND t.pcódigo = p.pcódigo AND t.horas= 20; Subconsultas Sintaxe Simplificada SELECT [DISTINCT] lista_select FROM lista_tabelas WHERE {expressão {[NOT] IN operador_comparação [ALL ANY]} [NOT] EXISTS } (SELECT [DISTINCT] lista_subselect FROM lista_tabelas WHERE condições) [GROUP BY lista_groupby] [HAVING condições] [ORDER BY lista_orderby] 24
Subconsultas As subconsultas podem ser ou não correlacionadas Não correlacionada: de dentro para fora: a consulta externa baseia-se em valores obtidos pela consulta interna a consulta interna é resolvida primeiro Correlacionada: de fora para dentro: a consulta externa provê valores para que a consulta interna possa ser resolvida para cada tupla resolvida na consulta externa, resolvese a consulta interna Subconsultas SELECT nome, snome FROM empregado WHERE matricula IN (SELECT matriculaemp FROM trabalha_em WHERE horas = 40) Correlacionada A consulta interna é dependente Não Correlacionada A consulta interna é independente SELECT nome, snome FROM empregado e WHERE 40 IN (SELECT horas FROM trabalha_em t WHERE t.matriculaemp = e.matricula ) 25
Subconsultas X Junções Subconsultas são apropriadas para consultas que envolvem comparação com agregações SELECT max(salario) FROM empregados SELECT nome,snome FROM empregados WHERE salario = 3000 SELECT nome,snome Hilton Irene FROM empregados Katia WHERE salario = (SELECT max(salario)from empregados) Max(salario) ------------ 3000 Nome Snome ----------------------- Edson Celui Silva Santos Moura Subconsultas X Junções Junções são mais adequadas para resultados que envolvem campos das várias tabelas usadas Exemplo: Liste o nome do projeto e a matrícula dos empregados que trabalham em projetos de 40 horas. SELECT p.pnome, t.matriculaemp FROM projetos p WHERE p.pcodigo IN (SELECT t.pcodigo FROM trabalha_em t WHERE t.horas = 40) SELECT p.pnome, t.matriculaemp FROM projetos p, trabalha_em t WHERE p.pcodigo = t.pcodigo and p.horas = 40 26
Subconsultas Tipos Tabela: retornam Zero ou mais itens operador IN ou operador de comparação modificado por ANY/ALL Escalar: retornam um único valor operador de comparação não modificado Booleana: retornam V (verdadeiro) ou F (falso) operador EXISTS Subconsultas - [NOT] IN Liste o nome dos empregados que trabalham em projetos com CH =40 horas SELECT e.nome FROM empregados e WHERE e.matricula IN (SELECT t.matriculaemp FROM trabalha_em t WHERE t.horas = 40) 27
Subconsultas - [NOT] IN Liste o nome dos empregados que Não trabalham em projetos com CH de 40 horas SELECT e.nome FROM empregados e WHERE e.matricula NOT IN (SELECT t.matriculaemp FROM trabalha_em t WHERE t.horas = 40) Subconsultas - [NOT] IN Relacionar tabelas com elas mesmas pode ser feito de duas maneiras: self-join ou subconsulta Exemplo: Liste os empregados que possuem o mesmo sobrenome que Maria SELECT e1.nome FROM empregado e1, empregado e2 WHERE e1.snome = e2.snome AND e2.nome = Maria AND e2.matricula!= e1.matricula SELECT e1.nome FROM empregado e1 WHERE e1.snome IN (SELECT e2.snome FROM empregado e2 WHERE e2.nome = Maria AND e2.matricula!= e1.matricula) 28
Subconsultas - operador único Subconsultas na cláusula HAVING Exemplo: Encontre os departamentos (e liste o total de empregados por departamento) cujos empregados ganham em média mais que a média salarial geral de todos os empregados SELECT depto, count(*) FROM empregado GROUP BY depto HAVING avg(salario) > (SELECT avg(salario) FROM empregado) Subconsultas - operador único Subconsultas correlacionadas Exemplo: Encontre os empregados que ganham mais que a média salarial de seu próprio departamento SELECT nome FROM empregado e1 WHERE e1.salario > (SELECT avg(e2.salario) FROM empregado e2 WHERE e2.depto = e1.depto) 29
Subconsultas - op [ANY ALL] a > ALL (subconsulta) verdadeiro se a for maior que TODOS os elementos do resultado a > ANY (subconsulta ou consulta) verdadeiro se a for maior que ALGUM dos elementos do resultado ou conjunto (em outras palavras, maior que o mínimo) Pode-se usar >, >=, <, <=, = ou!= Subconsultas - op [ANY ALL] Selecionar os empregados que ganham maiores salários que os do departamento de Produção SELECT Nome FROM empregado WHERE Salario > ALL (SELECT Salario FROM empregado WHERE depto = PROD ) Selecionar os empregados que não ganham salário mínimo (que ganham acima do menor salário) SELECT Nome FROM empregado WHERE Salario > ANY (SELECT Salario FROM empregado) Obs: Quando algum dos valores da subconsulta é NULL o resultado pode não ser apresentado 30
Subconsultas - EXISTS Teste de existência Liste todos os empregados que trabalham no projeto T. SELECT nome FROM empregado e WHERE EXISTS (SELECT * FROM trabalha_em WHERE matriculaemp = e.matricula AND pcodigo = T ) Subconsultas - EXISTS Teste de inexistência Liste todos os empregados que não trabalham no projeto T. SELECT nome FROM empregado e WHERE NOT EXISTS (SELECT * FROM trabalha_em WHERE matriculaemp = e.matricula AND pcodigo = T ) 31
Subconsultas - EXISTS Interseção Liste os empregados cujos departamentos possuem Projetos SELECT nome FROM empregados e WHERE EXISTS (SELECT * FROM projetos p WHERE e.depto = p.depto) Subconsultas - EXISTS Diferença Liste os empregados cujos departamentos não possuem Projetos SELECT nome FROM empregados e WHERE NOT EXISTS (SELECT * FROM projetos p WHERE e.depto = p.depto) 32
Subconsultas - EXISTS Divisão Liste os empregados que trabalham em todos os projetos SELECT nome FROM empregado e WHERE NOT EXISTS (SELECT * FROM projetos p WHERE NOT EXISTS (SELECT * FROM trabalha_em t WHERE e.matricula = t.matriculaemp and p.codigo = t.pcodigo)) Subconsultas - observações Exemplo: liste os empregados que ganham salário máximo dentro de seu departamento. SELECT e1.nome FROM empregado e1 WHERE e1.salario = (SELECT max(e2.salario) FROM empregado e2 WHERE e2.depto = e1.depto) SELECT e1.nome FROM empregado e1 WHERE NOT EXISTS (SELECT * FROM empregado e2 WHERE e2.depto = e1.depto AND e1.salario < e2.salario) As implementações variam, mas a solução usando not exists deveria ser mais rápida. 33
Subconsultas - observações Não se deve ordenar o resultado de uma subconsulta SELECT nome, snome FROM empregado WHERE matricula IN (SELECT matriculaemp FROM trabalha_em WHERE horas = 40 ORDER BY matricula) Subconsultas - observações Subconsultas em outras cláusulas (SQL2003) SELECT col1, col2,..., (subcons escalar) FROM tab1,... (subcons tabela) WHERE operando = (subcons escalar) OR operando IN (subcons tabela) OR operando > [ALL ANY] (subcons tabela) Evita-se usar, pois nem todas as implementações oferecem 34
Subconsultas observações Sumariar em mais de um nível torna-se possível quando são usadas subconsultas na cláusula FROM SELECT e1.depto, e2.mediasal, e1.supervisor, COUNT(e1.Nome) e1, (SELECT Depto, Avg(Salario) as mediasal FROM EMPREGADO GROUP BY Depto) e2 WHERE e1.depto = e2.depto GROUP BY e1.depto, e2.mediasal, e1.supervisor Subconsultas - observações Subconsultas com múltiplas colunas Nem todos os SGBDs implementam Técnicas: Concatenar SELECT pcodigo, matriculaemp FROM trabalha_em WHERE pcodigo horas IN (SELECT pcodigo MAX(horas) FROM trabalha_em GROUP BY pcodigo); Formar um par entre parênteses SELECT pcodigo, matriculaemp FROM trabalha_em WHERE (pcodigo, horas) IN (SELECT pcodigo, MAX(horas) FROM trabalha_em GROUP BY pcodigo); 35
União Podemos unir o resultado de várias consultas, desde que os tipos dos resultados sejam os mesmos Departamentos gerenciados por mulheres e departamentos que atuam em projetos localizados no Espírito Santo SELECT NOME_DEP FROM DEPARTAMENTO D, EMPREGADO E WHERE D.GERENTE = E.#EMP AND E.SEXO = 'F' UNION SELECT NOME_DEP FROM DEPARTAMENTO D, PROJETO P, WHERE D.NOME_DEP = P.NOME_DEP AND P.PLocalizacao LIKE *,ES* União É possível manter todas as tuplas, mesmo as duplicatas no resultado Evita a sobrecarga do SGBD para remover as duplicatas UNION ALL 36
Interseção Sintaxe <comando select> INTERSECT [corresponding [BY (col1, col2,...)] ] <comando select> Corresponding: considera somente colunas de mesmo nome, By: considera somente as colunas listadas Exemplo: Liste os departamentos envolvidos em Projetos SELECT depto FROM empregados INTERSECT SELECT depto FROM projetos Diferença Sintaxe <comando select> EXCEPT [corresponding [BY (col1, col2,...)] ] <comando select> Corresponding: considera somente colunas de mesmo nome, By: considera somente as colunas listadas Pressupõe coincidência de nomes Exemplo: Liste os departamentos NÃO envolvidos em Projetos SELECT depto FROM empregados EXCEPT SELECT depto FROM projetos 37
SQL Comandos de atualização Incluindo tuplas Sintaxe INSERT INTO tabela (atributo [,atributo]...) VALUES (constante [,constante]...) ; Exemplos: 1. Adicionando tuplas completas A ordem dos atributos deve ser obedecida: Pcódigo, Pnome, Plocalização, Depto INSERT INTO PROJETO VALUES (4, ECOBASE, NULL, DES ); 38
Incluindo tuplas Os atributos podem ser omitidos desde que permitam nulos ou, caso contrário, apresentem valores default definidos previamente Exemplos: 2. Adicionando tuplas com atributos anuláveis INSERT INTO PROJETO (Pnome, Pcódigo, Depto) VALUES ( ECOBASE, 4, DES ); 3. Adicionando tuplas com atributos não anuláveis mas com valores default associados (Depto char(5) not null default DES ) INSERT INTO PROJETO (Pcódigo, Pnome) VALUES ( 4, ECOBASE );... Tupla inserida: 4, ECOBASE, null, DES ) Incluindo várias tuplas INSERT INTO tabela (atributo [,atributo]...) operação-select ; Exemplos: 4. Inserindo várias tuplas INSERT INTO PROJINFO (Depto, totprojetos) SELECT Depto, count(*) FROM PROJETO GROUP BY Depto; O que acontece com PROJINFO se PROJETO for atualizada? 39
Alterando tuplas UPDATE tabela SET atributo = expressão [, atributo=expressão]... [WHERE condição] ; Exemplos: UPDATE EMPREGADO SET salário = 1,1 * salário; UPDATE PROJETO SET LOCALIZACAO = 'BARRA', WHERE PCODIGO= 12; UPDATE EMPREGADO SET SALARIO = SALARIO * 1.1 WHERE NOME_DEP IN (SELECT NOME_DEP FROM DEPARTAMENTO WHERE NOME_DIR = 'SUPORTE') ; Atualizando tuplas Usando a cláusula CASE Sintaxe UPDATE tabela SET coluna = CASE WHEN condição THEN ação... [ELSE ação] END; Exemplo realizando aumentos salariais; UPDATE empregado SET salario = CASE WHEN supervisor = 001 THEN salario *.4 WHEN supervisor = 002 THEN salario *.3 ELSE salario *.1 END; 40
Removendo tuplas DELETE FROM tabela [WHERE condição] ; Exemplos: DELETE FROM Empregado; DELETE FROM PROJTEMP WHERE Pcódigo IN (SELECT Pcódigo FROM Projeto); Atenção! Sem a cláusula where, remove todas as tuplas! 41