Apostila de sql

1,206
-1

Published on

Material sobre linguagem SQL

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,206
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
110
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Apostila de sql

  1. 1. A Linguagem SQL1 IntroduçãoA linguagem SQL pode ser considerada como uma das principais razões para o sucesso dos bancos de dados relacionais, poisela se tornou um padrão para SGBDs relacionais. Na prática, existem muitas diferenças entre os diversos SGBDs comerciais.Entretanto, o usuário pode sempre optar por utilizar somente as características que fazem parte do padrão, podendo assimmigrar de um SGBD para outro sem grande esforço.As operações de álgebra relacional aprendidas no curso são muito importantes para compreender os tipos de solicitações quepodem ser especificadas em um banco de dados relacional. Elas também são importantes para a otimização e oprocessamento de consultas em um SGBD relacional, conforme será visto na disciplina de Tópicos de Banco de Dados I.Entretanto, as operações de álgebra relacional são consideradas demasiadamente técnicas para a maioria dos usuários deSGBDs comerciais. Uma razão para isso é o fato de que uma consulta na álgebra relacional é escrita na forma de umaseqüência de operações que, ao serem executadas, produzem o resultado esperado. Dessa forma, o usuário deve especificarcomo – ou seja, em que ordem – executar as operações de consulta. Por outro lado, a linguagem SQL fornece uma interfacede linguagem declarativa de alto nível, de forma que o usuário especifique somente qual o resultado que deve ocorrer,deixando a efetiva otimização e decisões sobre como executar a consulta a cargo do SGBD. A SQL inclui algumascaracterísticas da álgebra relacional, sendo baseada, em sua maior parte, no cálculo relacional de tuplas, que se trata deoutra linguagem de consulta formal para bancos de dados relacionais. A sintaxe da SQL é mais amigável ao usuário do quequalquer uma das linguagens formais.O nome SQL é derivado de Structured Query Language (Linguagem de Consulta Estruturada). Ela é dividida em três partesde acordo com os tipos de comandos: DML (linguagem de manipulação de dados) – permite consultas, modificação de informações existentes, criação de novos dados ou exclusão de dados das tabelas; DDL (linguagem de definição de dados) – descreve como as tabelas e os outros objetos do banco de dados podem ser definidos, alterados e removidos; DCL (linguagem de controle de dados) – dá uma visão dos mecanismos de controle subdividido em três grupos de comandos para controle: das transações, da sessão e do sistema.1.1 ExemplosSerão utilizado como exemplo para os comandos SQL as seguintes relações: Empregado (codEmpr, nome, salário, sexo, estadoCivil, codDepto) Departamento (codDepto, nome, orçamento)2 Definição de esquemas em SQLA SQL utiliza os termos tabela, linha e coluna para, respectivamente, relação, tupla e atributo – temos da álgebrarelacional. Os comandos da SQL para definição dos dados são CREATE (criar), ALTER (alterar) e DROP (remover).2.1 Tipo de dadosOs tipos de dados disponíveis para atributos incluem dados numéricos, string de caracteres, data e hora.Tipos de dados numéricos incluem: Números inteiros de vários tamanhos: INTEGER ou INT e SMALLINT; e Números reais de várias precisões: FLOAT, REAL, DOUBLE PRECISION e DECIMAL. Números formatados podem ser declarados utilizando DECIMAL (i,j), onde i, a precisão, é o número total de dígitos antes da vírgula e j, a escala, é o número de dígitos após o ponto decimal.Tipos de dados de strings de caracteres podem ser: De tamanho fixo: CHAR(n), onde n é o número de caracteres; ou De tamanho variável: VARCHAR(n), onde n é o número máximo de caracteres.O tipo de dado DATE possui dez posições e seus componentes são ano, mês e dia, geralmente na forma AAAA-MM-DD. O tipode dado a possui pelo menos oito posições, com os componentes hora, minuto e segundo, geralmente na forma HH:MM:SS.Somente datas e horas válidas deveriam ser permitidas pela implementação da SQL. 1
  2. 2. 2.2 O comando CREATE TABLEO comando CREATE TABLE é utilizado para especificar uma nova relação dando a ela um nome e especificando seus atributose restrições. Os atributos são especificados primeiramente e, a cada atributo é dado um nome, um tipo de dado paraespecificar seu domínio de valores e qualquer restrição de atributo tal como NOT NULL. As restrições de chave, de integridadeda entidade e de integridade referencial podem ser especificadas, dentro da instrução CRATE TABLE, depois que os atributosforem declarados. Uma outra opção é declarar estar restrições posteriormente, utilizando o comando ALTER TABLE.Exemplo 1 CREATE TABLE Departamento ( codDepto INT NOT NULL, nome VARCHAR (50) NOT NULL, orçamento DECIMAL (10, 2), PRIMARY KEY (codDepto), UNIQUE (nome) ); CREATE TABLE Empregado ( codEmpr INT NOT NULL, nome VARCHAR (50) NOT NULL, salário DECIMAL (10, 2), sexo CHAR (1), estadoCivil CHAR (1), codDepto INT NOT NULL, PRIMARY KEY (codEmpr), FOREIGN KEY (codDepto) REFERENCES Departamento (codDepto) );2.3 Sobre as restriçõesUma vez que a SQL permite NULLs como valores de atributos, a restrição NOT NULL pode ser especificada caso NULL não sejapermitido para um determinado atributo. Como por exemplo, o nome de um empregado não pode ser nulo.A cláusula PRIMARY KEY especifica um ou mais atributos que compõem a chave primária de uma tabela. Caso a chaveprimária seja composta por mais de um atributo, eles devem vir separados por vírgula. A cláusula UNIQUE especifica aschaves candidata, ou seja, aquelas cuja combinação de valores não se repete. A integridade referencial é especificada nacláusula FOREIGN KEY.Conforme foi visto em aula, uma restrição de integridade pode ser violada quando tuplas são inseridas ou excluídas, ouquando um atributo de chave estrangeira é modificado. Na SQL pode-se especificar a ação a ser tomada se uma restrição deintegridade referencial for violada. As opções são: SET NULL, CASCADE e SET DEFAULT. Além disso, deve ser qualificada se aação é deve tomada na exclusão (ON DELETE) ou na atualização (ON UPDATE).Exemplo 2 Detalhando o relacionamento existente entre Empregado e Departamento: CREATE TABLE Empregado ( codEmpr INT NOT NULL, nome VARCHAR (50) NOT NULL, salário DECIMAL (10, 2), sexo CHAR (1), estadoCivil CHAR (1), codDepto INT NOT NULL, PRIMARY KEY (codEmpr), FOREIGN KEY (codDepto) REFERENCES Departamento (codDepto) ON DELETE SET NULL ON UPDATE SET CASCADE );Neste exemplo, quando uma linha da tabela Departamento for excluída será colocado NULL nas linhas relacionadas deEmpregado. Quando uma linha de departamento for alterada os registros relacionados serão alterados também.2.4 O comando DROP TABLESe uma determinada tabela não for mais necessária, ela e sua definição podem ser excluídas utilizando o comando DROPTABLE. Existem duas opções de comportamento na exclusão: CASCADE – todas as restrições que referenciam a tabela são removidas automaticamente juntamente com a tabela em questão; RESTRICT – a tabela em questão só será removida se ela não for referenciada por outra tabela (por exemplo, através de definições de chaves estrangeiras). 2
  3. 3. Exemplo 3No modo RESTRICT, a tabela Departamento não pode ser removida porque ela é referenciada pela tabela Empregado. DROP TABLE Departamento RESTRICT;No modo CASCADE, a tabela Departamento será excluída juntamente com todos os dados e com a chave estrangeira da tabelaEmpregado. DROP TABLE Departamento CASCADE;2.5 O comando ALTER TABLEA definição de uma tabela pode ser alterada utilizando-se o comando ALTER TABLE. Através da alteração de uma tabela épossível: adicionar ou retirar uma coluna, alterar a definição de uma coluna e adicionar ou retirar restrições de tabela.Exemplo 4 Adicionar mais um campo à tabela Empregado: ALTER TABLE Empregado ADD endereço VARCHAR(50);Para remover uma coluna, deve-se escolher uma das opções para controla o comportamento da eliminação: CASCADE – todas as restrições que referenciam a coluna são automaticamente excluídas, juntamente com a coluna; RESTRICT – o comando só é bem-sucedido, se nenhuma restrição referenciar a coluna.Exemplo 5 Remover um campo da tabela Empregado: ALTER TABLE Empregado DROP endereço CASCADE;3 Manipulação dos dados em SQLEm SQL, existem três comandos para podem ser utilizados para modificar os dados do banco de dados: INSERT (incluir),DELETE (excluir) e UPDATE (atualizar).3.1 Comando INSERTEm seu modo mais simples, o comando INSERT é utilizado para adicionar uma única tupla a uma relação. Deve-se especificaro nome da relação e uma lista de valores. Os valores devem ser relacionados na mesma ordem no qual os atributoscorrespondentes foram especificados no comando CREATE TABLE. Caso não se deseje inserir os valores de todos os atributos,pode-se especificar explicitamente os nomes dos atributos.Exemplo 6 Incluir a empregada Elisa Maria, com código 5, salário de R$ 1000,00, casada e locada ao departamento 10. INSERT INTO Empregado VALUES (5, ‘Elisa Maria’, 1000, ‘F’, ‘C’, 10)Exemplo 7 Incluir o empregado José Carlos, com código 6 e locado ao departamento 10. INSERT INTO Empregado (codEmpr, nome, codDepto) VALUES (6, ‘José Carlos’, 10)3.2 Comando DELETEO comando DELETE remove tuplas de uma relação. Ele possui a cláusula WHERE para selecionar as tuplas a serem excluídas.Se a cláusula WHERE for omitida, todas as tuplas da relação serão excluídas, entretanto, a tabela permanecerá no banco dedados como uma tabela vazia (deve-se utilizar o comando DROP TABLE remover completamente a tabela).Exemplo 8 Exclua todos os empregados que ganham menos de R$500,00 e estão vinculados ao departamento 10. DELETE FROM Empregado WHERE salário < 5003.3 Comando UPDATEO comando UPDATE é utilizado para modificar valores de atributos de uma ou mais tuplas selecionadas. Como no comandoDELETE, uma cláusula WHERE no comando UPDATE seleciona as tuplas a serem modificadas. A cláusula SET especifica osatributos e os seus novos valores. 3
  4. 4. Exemplo 9 Conceder um aumento de 10% para todos os empregados do departamento 10. UPDATE Empregado SET salário = salário * 1.1 WHERE codDepto = 104 Consultas em SQLA SQL possui uma instrução básica para recuperar informações de um banco de dados: a instrução SELECT.Observação: existe uma importante diferença entre a SQL e o modelo relacional formal discutido no curso: a SQL permiteque uma tabela (relação) possua duas ou mais tuplas idênticas em todos os seus valores de atributos. Portanto, em geral,uma tabela em SQL não é um conjunto de tuplas (porque um conjunto de tuplas não permite dois membros idênticos), massim um multiconjunto de tuplas. Para garantir que uma relação SQL seja um conjunto de tuplas deve-se declarar umarestrição de chave ou utilizar a opção DISTINCT (descrita posteriormente) com a instrução SELECT.4.1 O comando SELECTO comando SELECT é composto por várias cláusulas. Porém apenas as cláusulas SELECT e FROM são obrigatórias. As demaispoderão ser utilizadas de acordo com a necessidade e na ordem apresentada a seguir1: SELECT [DISTINCT|ALL] lista de atributos a serem retornados FROM lista de tabelas [ WHERE condição de linha ] [ GROUP BY lista atributos de agrupamento ] [ HAVING condição de agrupamento ] [ ORDER BY lista de atributos de ordenação [ASC|DESC] ]Onde: SELECT – lista os atributos ou funções a serem recuperadas. Como default, lista todos os valores (cláusula ALL), mas pode listar apenas os valores diferentes (cláusula DISTINCT); FROM – especifica todas as tabelas necessárias na consulta; WHERE – especifica as condições para seleção de tuplas dessas relações, incluindo condições de junção; GROUP BY – especifica atributos de agrupamento; HAVING – especifica uma condição nos grupos sendo selecionados (em vez de nas tuplas individuais, como ocorre no WHERE); ORDER BY – especifica a ordem de exibição do resultado de uma consulta; pode ser ascendente (ASC) ou decrescente (DESC).Exemplo 10 Recupere os salários dos empregados casados (C) do departamento com código igual a 3. SELECT salário FROM Empregado WHERE codDepto = 3 AND estadoCivil = ‘C’;Esta consulta envolve somente a relação Empregado que é listada na cláusula FROM. A consulta seleciona as tuplas deEmpregado que satisfazem a condição da cláusula WHERE, e então projeta o resultado do atributo salário, listado na cláusulaSELECT. Essa operação é semelhante à seguinte operação da álgebra relacional – exceto pelo fato de que linhas duplicadas,caso haja alguma, não seriam eliminadas com o comando SELECT: π( σ(Empregado) ) codDepto = 3 e estadoCivil = ‘C’ salárioPortanto, uma simples consulta em SQL, com um único nome de relação na cláusula FROM, é semelhante a um parSELECIONAR-PROJETAR de operações da álgebra relacional. A cláusula SELECT da SQL especifica os atributos de projeção e acláusula WHERE especifica a condição de seleção. A única diferença é que na consulta em SQL pode-se obter tuplas duplicadasno resultado da consulta, porque a restrição de que a relação seja um conjunto não é imposta.4.1.1 Lidando com nomes de atributos ambíguosNa SQL, o mesmo nome pode ser utilizado para dois (ou mais) atributos, contanto que os atributos estejam em diferentestabelas. Se uma consulta se referir a dois ou mais atributos com o mesmo nome, deve-se qualificar o nome do atributo com onome da tabela para evitar ambigüidade. Isto é realizado colocando-se o nome da tabela antes do nome do atributo eseparando os dois através de um ponto.1 As cláusulas entre colchetes são opcionais. As cláusulas separadas por | são exclusivas, ou seja, apenas uma das duas pode estar presente nocomando. 4
  5. 5. Exemplo 11 Recupere o nome dos empregados que trabalham no departamento Pessoal. SELECT Empregado.nome FROM Empregado, Departamento WHERE Empregado.codDepto = Departamento.codDepto AND Departamento.nome = ‘Pessoal’;4.1.2 JunçõesO Exemplo 11 (acima) além de apresentar o tratamento de atributos com o mesmo nome exemplifica uma junção entre duastabelas. Esse comando SQL é corresponde à seqüência de operações PRODUTO CARTESIANO-SELECIONAR-PROJETAR (ou àsoperações JUNTAR-PROJETAR) da álgebra relacional.Em SQL, sempre é feito o produto cartesiano2 entre todas as tabelas colocadas na cláusula FROM. Por isso, para eliminar aslinhas sem significado, é necessário se colocar a condição de junção entre tabelas na cláusula WHERE (no Exemplo 11, acondição de junção é Empregado.codDepto = Departamento.codDepto, já a condição Departamento.nome = ‘Pessoal’ échamada de condição de seleção).Exemplo 12 Recupere o nome do departamento em que a Ane trabalha. SELECT Departamento.nome FROM Empregado, Departamento WHERE Empregado.codDepto = Departamento.codDepto AND Empregado.nome = ‘Ane’;4.1.3 Renomeando atributos e tabelasPode-se utilizar a palavra-chave AS para renomear atributos e tabelas, conforme apresentado no Exemplo 13.Exemplo 13 Recupere o salário dos empregados que trabalham nos departamentos com orçamento maior que R$20.000,00. SELECT E.salário AS salárioDosEmpregados FROM Empregado AS E, Departamento AS D WHERE E.codDepto = D.codDepto AND D.orçamento > 20000;Neste exemplo, o atributo a ser retornado salário foi renomeado para salárioDosEmpregados e as tabelas Empregado eDepartamento foram renomeadas para E e D, respectivamente.Uma vez que uma determinada tabela tenha sido renomeada, não é possível mais utilizar o nome antigo na consulta. Éimportante ressaltar que, a renomeação das tabelas e dos campos só é válida no contexto do comando SQL onde foi feita arenomeação.4.1.4 Cláusula WHERE não especificadaA falta de uma cláusula WHERE indica que não há uma condição na seleção de tuplas. Portanto, todas as tuplas da relaçãoespecificada na cláusula FROM estão qualificadas e serão selecionadas para o resultado da consulta. Isso é equivalente àcondição WHERE TRUE, que significa que a condição é verdadeira para todas as linhas da tabela. Se mais de uma relaçãoestiver especificada na cláusula FROM e não existir nenhuma cláusula WHERE, então o produto cartesiano dessas relações éselecionado.É extremamente importante especificar todas as condições de seleção e de junção na cláusula WHERE. Se alguma dessascondições for ignorada, isso pode resultar em relações incorretas e muito grandes.Exemplo 14 Selecione todos os nomes de todos os empregados. SELECT nome FROM Empregados4.1.5 Uso do asterisco (*)Para recuperar todos os valores de todos os atributos das tuplas selecionadas, não é necessário relacionar explicitamente naSQL o nome dos atributos. Para isso pode-se especificar um asterisco (*) na cláusula SELECT, que corresponde a todos osatributos.2 Suponha os conjuntos A = (X, Y, Z) e B = (X, W, Z). O produto cartesiano entre A e B será o conjunto (XX, XW, XZ, YX, YW, YZ, ZX, ZW, ZZ).Ou seja, cada elemento do conjunto o A é associado a cada elemento do conjunto B. 5
  6. 6. Exemplo 15 Todos os atributos dos empregados que trabalham no departamento de código 1. SELECT * FROM Empregado WHERE codDepto = 1;4.2 ALL x DISTINCTComo mencionado, a SQL geralmente trata uma tabela não como um conjunto mas como um multiconjunto; tuplasduplicadas podem aparecer mais do que uma vez em uma tabela e no resultado de uma consulta. A SQL não eliminaautomaticamente tuplas duplicadas no resultado das consultas pelos seguintes motivos: a eliminação de linhas duplicadas é uma operação onerosa (um modo de implementá-la é primeiramente ordenar as tuplas e, então, eliminar as duplicatas); o usuário pode desejar ver as tuplas duplicadas no resultado de uma consulta; quando uma função de agregação (ainda serão apresentadas) é aplicada às tuplas, na maioria dos casos, não é desejado eliminar as duplicatas.Se for desejado, efetivamente, eliminar as tuplas duplicadas do resultado de uma consulta na SQL, deve-se utilizar a palavra-chave DISTINCT na cláusula SELECT. Isso significa que somente tuplas diferentes devem permanecer no resultado. Umaconsulta com SELECT DISTINCT elimina duplicatas, enquanto uma consulta com SELECT ALL não elimina (não especificarSELECT com ALL ou com DISTINCT é equivalente a SELECT ALL).Exemplo 16 Recupere o salário de todos os empregados. SELECT ALL salário ou SELECT salário FROM Empregado; FROM Empregado;Exemplo 17 Recupere todos os valores diferentes de salários. SELECT DISTINCT salário FROM Empregado;4.2.1 SQL x Álgebra relacionalObserve a seguinte operação da álgebra relacional: π( σ(Empregado) ) codDepto = 3 e estadoCivil = ‘C’ salárioExemplo 18 Escreva o comando SQL que sempre retorna os mesmos dados da operação da álgebra relacional abaixo. SELECT DISTINCT salário FROM Empregado WHERE codDepto = 3 AND estadoCivil = ‘C’;Repare que se a consulta SQL for escrita sem o DISTINCT não é possível garantir que os dados retornados serão sempre osmesmos.4.3 Operador ISO valor NULL representa a ausência de valor, ou seja, ele pode representar que um valor está ausente, não foi definido ounão é aplicado. Assim o NULL não é igual, não é diferente, não é menor do que qualquer outro valor, inclusive outro NULL.Portanto não se pode utilizar os operadores convencionais de comparação (=, <>, <, >, ...)Assim, para comparar um atributo com NULL, a SQL utiliza o operador IS, para saber se o atributo é NULL, ou IS NOT, parasaber se o atributo possui um valor.Exemplo 19 Recupere dos empregados que não indicaram seu estado civil. SELECT nome FROM Empregado WHERE estadoCivil IS NULL;Exemplo 20 Recupere dos empregados que indicaram seu estado civil. SELECT nome FROM Empregado WHERE estadoCivil IS NOT NULL;4.4 Cláusula ORDER BYA SQL permite ao usuário ordenar as tuplas no resultado de uma consulta pelos valores de um ou mais atributos. Para isso,utiliza-se a cláusula ORDER BY. 6
  7. 7. Exemplo 21 Recupere uma lista dos empregados ordenados pelo número do departamento e, dentro de cada departamento,ordenados por nome. SELECT nome, codDepto ou SELECT nome, codDepto FROM Empregado FROM Empregado ORDER BY codDepto, nome ORDER BY codDepto, nome DESCA ordem padrão é a ascendente de valores, mas pode-se especificar a palavra chave DESC se for desejado uma ordemdescendente de valores.Exemplo 22 Recupere todos os empregados casados ordenados decrescentemente por salário. SELECT * FROM Empregado WHERE estadoCivil = ‘C’ ORDER BY salário DESC4.5 Funções de agregaçãoAs funções de agregação são: COUNT(*) – número de tuplas (ou valores) SUM(coluna) – soma de valores de uma determinada coluna MAX(coluna) – maior valor em uma determinada coluna MIN(coluna) – menor valor em uma determinada coluna AVG(coluna) – média dos valores de uma determinada colunaAs funções de agregação podem aparecer apenas na cláusula SELECT ou na cláusula HAVING (vista futuramente). NÃO épossível utilizar uma função de agregação na cláusula FROM, nem na cláusula WHERE.Exemplo 23 Retorne, respectivamente, a soma dos salários de todos os empregados, o maior salário, o menor salário e osalário médio. SELECT SUM(salário), MAX(salário), MIN(salário), AVG(salário) FROM Empregado;A função de agregação COUNT pode ser usada de duas formas: COUNT(*) ou COUNT(coluna). Nos dois casos será contadoo número de tuplas. A diferença é que no segundo caso se algum valor da coluna especificada for NULL, a tupla não serácomputada. Além disso, é possível utilizar a cláusula DISTINCT em combinação com o COUNT para retornar apenas onúmero de valores diferentes (Exemplo 25).Exemplo 24 Retorne o número total de empregados do departamento 20. SELECT COUNT(*) FROM Empregado WHERE codDepto = 20;Exemplo 25 Retorne o número de valores diferentes de salário no banco de dados. SELECT COUNT( DISTINCT salário ) FROM Empregado;4.6 Cláusula GROUP BYAs funções de agregação (vistas na seção 4.5) podem ser aplicadas a grupos de linhas de uma tabela, ou invés de a todo oconjunto que satisfaça a condição. Por exemplo, suponha que se deseje encontrar o salário médio dos empregados para cadaum dos departamentos. Neste casos, é necessário agrupar as tuplas que possuem o mesmo valor para o atributo código dedepartamento (atributo de agrupamento) e, então, aplicar a função de agregação para cada um desses grupos,independentemente. A SQL possui a cláusula GROUP BY para esta finalidade.A cláusula GROUP BY especifica os atributos de agrupamento. Apenas os atributos de agrupamento e funções de agregaçãopodem aparecer na cláusula SELECT.Exemplo 26 Para cada departamento, recupera média de salários dos seus empregados. SELECT codDepto, AVG(salário) FROM Empregado GROUP BY codDepto;A cláusula GROUP BY pode ser utilizada em conjunto com a cláusula HAVING, caso deseje-se recuperar apenas os grupos quesatisfaçam uma determinada condição. Enquanto a cláusula WHERE é utilizada na aplicação de condições para cada uma daslinhas da tabela, a cláusula HAVING é utilizada para selecionar grupos de linhas que satisfaçam a condição especificada. 7
  8. 8. Exemplo 27 Recupere a média de salário dos departamentos que possuem mais 10 empregados. SELECT codDepto, AVG(salário) FROM Empregrado GROUP BY codDepto HAVING COUNT(*) > 10;4.7 Operador INO operador IN possibilita a utilização de conjuntos explícitos de valores.Exemplo 28 Recupere o nome d os empregados cujo estado civil é casado, solteiro ou viúvo. SELECT nome FROM empregado WHERE estaoCivil IN (‘C’,‘S’,‘V’)4.8 Tabelas como conjuntos4.8.1 UNIONO operador UNION é o mecanismo disponibilizado pela SLQ para fazer a união de conjuntos. Diferentemente do que acontececom o comando SELECT, linhas duplicadas são eliminadas do resultado de uma união a não ser que o operador UNION incluaexplicitamente o quantificador ALL. Qualquer número de SELECT’s pode ser unido pelo UNION.Exemplo 29 O código dos departamentos com orçamento maior que R$ 10.000,00 juntamente com o código dosdepartamentos que possuem empregados que ganham menos de R& 1.000,00. ( SELECT codDepto FROM Departamento WHERE orcamento > 10000 ) UNION ( SELECT codDepto FROM Empregado WHERE salario < 1000 )Exemplo 30 Idem a anterior, sem eliminar os códigos de departamento que satisfazem as duas condições. ( SELECT codDepto FROM Departamento WHERE orcamento > 10000 ) UNION ALL ( SELECT codDepto FROM Empregado WHERE salario < 1000 )Exemplo 31 Idem a anterior, indicando qual das duas condições foi atendida para a inclusão do elemento no resultado final. ( SELECT codDepto, ‘Orçamento maior’ AS comentario FROM Departamento WHERE orcamento > 10000 ) UNION ( SELECT codDepto, ‘Salário menor’ AS comentario FROM Empregado WHERE salario < 1000 )4.8.2 INTERSECTO operador INTERSECT é o mecanismo disponibilizado pela SLQ para fazer a interseção de conjuntos. De forma semelhante aoUNION, por default as linhas semelhantes são eliminadas. Para obter todas as repetições deve-se usar INTERSECT ALL. 8
  9. 9. Exemplo 32 O código dos departamentos com orçamento maior que R$ 10.000,00 e que possuem empregados que ganhammenos de R& 1.000,00. ( SELECT codDepto FROM Departamento WHERE orcamento > 10000 ) INTERSECT ( SELECT codDepto FROM Empregado WHERE salario < 1000 )4.8.3 EXCEPTO operador EXCEPT é o mecanismo disponibilizado pela SLQ para se fazer a operação de diferença de conjuntos. Nãoesquecendo que, para manter todas as repetições, deve-se usar EXCEPT ALL.Exemplo 33 O código dos departamentos com orçamento maior que R$ 10.000,00 mas que possuem não empregados queganham menos de R& 1.000,00. ( SELECT codDepto FROM Departamento WHERE orcamento > 10000 ) EXCEPT ( SELECT codDepto FROM Empregado WHERE salario < 1000 )4.9 Consultas aninhadasOs exemplos de consultas aninhadas serão feitos sobre as seguintes tabelas: Vendedor ( codVendedor, nome, idade, comissão ) Produto ( codProduto, nome, preço ) Venda ( codVendedor, codProduto, data, qtd )4.9.1 SubconsultasAlgumas consultas requerem que valores existentes no banco de dados sejam recuperados e, em seguida, utilizados numacondição de comparação. Essas consultas podem ser formuladas utilizando subconsultas. Subconsultas são blocos completosSELECT...FROM...WHERE dentro da cláusula WHERE de outra consulta (chamada de consulta externa). 9
  10. 10. Exemplo 34 O nome dos vendedores que estão acima da média de idade dos vendedores SELECT nome FROM Vendedores WHERE idade > (SELECT AVG(idade) FROM Vendedores)Exemplo 35 O número dos vendedores que venderam os mesmos produtos que o vendedor de código 10. SELECT DISTINCT vendedor FROM Vendas WHERE vendedor <> 10 AND produto IN (SELECT DISTINCT produto FROM Vendas WHERE vendedor = 10) ----Ou (sem subconsulta) SELECT DISTINCT V1.vendedor FROM Vendas V1, Vendas V2 WHERE V1.vendedor <> 10 AND V1.produto = V2.produto AND V2.vendedor = 10Exemplo 36 O nome dos vendedores que venderam os mesmos produtos que a Ane (com subconsulta) SELECT DISTINCT nome FROM Vendedores, Vendas WHERE Vendedores.vendedor = Vendas.vendedor AND nome <> Ane AND produto IN (SELECT DISTINCT produto FROM Vendedores, Vendas WHERE vendedores.vendedor = vendas.vendedor AND nome = Ane)Observação:Além do operador IN, outros operadores de comparação podem ser utilizados para comparar um único valor i a um conjuntode valores V. A palavra-chave SOME pode ser combinada com os operadores =, <, >, <=, >=, <>. O operador > SOMEretorna true se o valor i for maior que algum valor no conjunto V e assim, respectivamente, para os outros operadores.Portanto, = SOME é idêntico a IN, porém <> SOME NÃO é a mesma coisa que NOT IN.A palavra-chave ALL também pode ser combinada com cada um desses operadores (=, <, >, <=, >=, <>). Por exemplo, acondição de comparação i > ALL V retorna true se o valor i for maior que todos os valores do conjunto V.Exemplo 37 O nome dos vendedores que sejam mais velhos do que pelo menos um vendedor com comissão igual a 8 SELECT nome FROM Vendedores WHERE idade > SOME (SELECT idade FROM Vendedores WHERE comissao = 8)Exemplo 38 O nome dos vendedores que sejam mais velhos do que todos os vendedores com comissão igual a 8 SELECT nome FROM Vendedores WHERE idade > ALL (SELECT idade FROM Vendedores WHERE comissao = 8)4.9.2 Subconsultas correlacionadas e Função EXISTSSempre que uma condição na cláusula WHERE de uma subconsulta faz referência a algum atributo de uma relação declaradana consulta externa, diz-se que as duas consultas são correlacionadas. Assim, a subconsulta é avaliada uma vez para cadatupla da consulta externa.A função EXISTS é utilizada para verificar se o resultado de uma subconsulta correlacionada é vazio (não possui nenhumatupla) ou não.Observação: Em geral, uma subconsulta pode ser expressa como uma consulta de um único bloco. 10
  11. 11. Exemplo 39 O nome dos vendedores que venderam o produto 1010. SELECT nome FROM Vendedores WHERE EXISTS (SELECT * FROM Vendas WHERE Vendedores.vendedor = Vendas.vendedor AND produto = 1010) ----Ou SELECT nome FROM Vendedores, Vendas WHERE Vendedores.vendedor = Vendas.vendedor AND produto = 1010Exemplo 40 O nome dos produtos que não foram vendidos no dia 02/08/2003 SELECT nome FROM Produtos WHERE NOT EXISTS (SELECT * FROM Vendas WHERE Produtos.produto = Vendas.produto AND Vendas.data = ‘02/08/2003’)Exemplo 41 ERRADO: O nome dos produtos que não foram vendidos no dia 02/08/2003 SELECT nome FROM Produtos WHERE EXISTS (SELECT * FROM Vendas WHERE Produtos.produto = Vendas.produto AND Vendas.data <> ‘02/08/2003’)ATENÇÃO: O resultado da consulta Exemplo 40 é DIFERENTE do resultado da consulta Exemplo 41.A consulta Exemplo 40 está certa! Ela só retornará os produtos que não foram vendidos no dia 02/08/2003, o que inclui osprodutos que não foram vendidos em dia nenhum.Já a consulta Exemplo 41 não satisfaz o que foi pedido. Ela NÃO retornará os produtos que não foram vendidos em dianenhum. Além disso, serão retornados os produtos que tiverem sido vendidos em outro dia além do dia 02/08/2003.Exemplo 42 Os produtos que não foram vendidos SELECT * FROM Produtos WHERE NOT EXISTS (SELECT * FROM Vendas WHERE Vendas.produto = Produtos.produto)Exemplo 43 O nome dos vendedores que venderam todos os produtos SELECT nome FROM Vendedores WHERE NOT EXISTS (SELECT * FROM Produtos WHERE NOT EXISTS (SELECT * FROM Vendas WHERE Vendas.vendedor = Vendedores.vendedor AND Vendas.produto = Produtos.produto ));5 Visões (views)Visões (ou views) são tabelas ‘virtuais’ derivadas de outras tabelas ou visões. Uma visão possui um nome, uma lista denomes de atributos e uma consulta para especificar o conteúdo da visão.Uma visão está sempre atualizada. Se as tuplas nas tabelas de base nas quais a visão é definida forem modificadas, a visãoreflete automaticamente estas atualizações. Isso porque a visão não, necessariamente, armazena os dados fisicamente. 11
  12. 12. Pode-se imaginar uma visão como um modo de especificar uma tabela à qual precisa-se para fazer referências comfreqüência, embora ela possa não existir fisicamente. Por exemplo, supondo que freqüentemente seja necessário recuperar onome do empregado e os nomes do departamento em que ele trabalha. Então pode-se criar uma visão sobre estes dados, ouinvés de escrever a junção toda vez que ela for necessária.O comando para criação de uma visão o CREATE VIEW.Exemplo 44 Criar uma visão que retorne o código e o nome do empregados com o nome dos departamentos a que elesestão alocados. CREATE VIEW TrabalhaEm AS SELECT codEmpr, Empregado.nome, Departamento.nome FROM Empregado, Departamento WHERE Empregado.codDepto = Departamento.codDeptoDepois de criada uma visão, ela pode ser usada, por exemplo, em um comando SQL como se fosse uma tabela. SELECT * FROM TrabalhaEm WHERE codEmpr = 1; 12

×