Apostila de sql

12

Click here to load reader

description

Material sobre linguagem SQL

Transcript of Apostila de sql

Page 1: Apostila de sql

1

A Linguagem SQL

1 Introdução

A linguagem SQL pode ser considerada como uma das principais razões para o sucesso dos bancos de dados relacionais, pois ela se tornou um padrão para SGBD's relacionais. Na prática, existem muitas diferenças entre os diversos SGBD's comerciais. Entretanto, o usuário pode sempre optar por utilizar somente as características que fazem parte do padrão, podendo assim migrar 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 que podem ser especificadas em um banco de dados relacional. Elas também são importantes para a otimização e o processamento 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 de SGBD's comerciais. Uma razão para isso é o fato de que uma consulta na álgebra relacional é escrita na forma de uma seqüência de operações que, ao serem executadas, produzem o resultado esperado. Dessa forma, o usuário deve especificar como – ou seja, em que ordem – executar as operações de consulta. Por outro lado, a linguagem SQL fornece uma interface de 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 algumas características da álgebra relacional, sendo baseada, em sua maior parte, no cálculo relacional de tuplas, que se trata de outra linguagem de consulta formal para bancos de dados relacionais. A sintaxe da SQL é mais amigável ao usuário do que qualquer uma das linguagens formais.

O nome SQL é derivado de Structured Query Language (Linguagem de Consulta Estruturada). Ela é dividida em três partes de 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 Exemplos

Serão utilizado como exemplo para os comandos SQL as seguintes relações:

Empregado

Departamento

(codEmpr , nome, salário, sexo, estadoCivil, codDepto)

(codDepto , nome, orçamento)

2 Definição de esquemas em SQL

A SQL utiliza os termos tabela, linha e coluna para, respectivamente, relação, tupla e atributo – temos da álgebra relacional. Os comandos da SQL para definição dos dados são CREATE (criar), ALTER (alterar) e DROP (remover).

2.1 Tipo de dados

Os 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 tipo

de 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.

Page 2: Apostila de sql

2

2.2 O comando CREATE TABLE

O comando CREATE TABLE é utilizado para especificar uma nova relação dando a ela um nome e especificando seus atributos

e restrições. Os atributos são especificados primeiramente e, a cada atributo é dado um nome, um tipo de dado para especificar seu domínio de valores e qualquer restrição de atributo tal como NOT NULL. As restrições de chave, de integridade

da entidade e de integridade referencial podem ser especificadas, dentro da instrução CRATE TABLE, depois que os atributos

forem 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 (c odDepto) );

2.3 Sobre as restrições

Uma vez que a SQL permite NULLs como valores de atributos, a restrição NOT NULL pode ser especificada caso NULL não seja

permitido 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 chave

primária seja composta por mais de um atributo, eles devem vir separados por vírgula. A cláusula UNIQUE especifica as

chaves candidata, ou seja, aquelas cuja combinação de valores não se repete. A integridade referencial é especificada na cláusula FOREIGN KEY.

Conforme foi visto em aula, uma restrição de integridade pode ser violada quando tuplas são inseridas ou excluídas, ou quando um atributo de chave estrangeira é modificado. Na SQL pode-se especificar a ação a ser tomada se uma restrição de integridade referencial for violada. As opções são: SET NULL, CASCADE e SET DEFAULT. Além disso, deve ser qualificada se a

açã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 (c odDepto)

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 de Empregado. Quando uma linha de departamento for alterada os registros relacionados serão alterados também.

2.4 O comando DROP TABLE

Se uma determinada tabela não for mais necessária, ela e sua definição podem ser excluídas utilizando o comando DROP

TABLE. 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).

Page 3: Apostila de sql

3

Exemplo 3

No 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 tabela

Empregado.

DROP TABLE Departamento CASCADE;

2.5 O comando ALTER TABLE

A 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 SQL

Em 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 INSERT

Em seu modo mais simples, o comando INSERT é utilizado para adicionar uma única tupla a uma relação. Deve-se especificar

o nome da relação e uma lista de valores. Os valores devem ser relacionados na mesma ordem no qual os atributos correspondentes 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 DELETE

O 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 de

dados 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 < 500

3.3 Comando UPDATE

O comando UPDATE é utilizado para modificar valores de atributos de uma ou mais tuplas selecionadas. Como no comando

DELETE, uma cláusula WHERE no comando UPDATE seleciona as tuplas a serem modificadas. A cláusula SET especifica os

atributos e os seus novos valores.

Page 4: Apostila de sql

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 = 10

4 Consultas em SQL

A 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 permite que 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), mas sim um multiconjunto de tuplas. Para garantir que uma relação SQL seja um conjunto de tuplas deve-se declarar uma restrição de chave ou utilizar a opção DISTINCT (descrita posteriormente) com a instrução SELECT.

4.1 O comando SELECT

O comando SELECT é composto por várias cláusulas. Porém apenas as cláusulas SELECT e FROM são obrigatórias. As demais

poderã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|DES C] ]

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 de

Empregado que satisfazem a condição da cláusula WHERE, e então projeta o resultado do atributo salário, listado na cláusula

SELECT. 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ário

Portanto, uma simples consulta em SQL, com um único nome de relação na cláusula FROM, é semelhante a um par

SELECIONAR-PROJETAR de operações da álgebra relacional. A cláusula SELECT da SQL especifica os atributos de projeção e a

cláusula WHERE especifica a condição de seleção. A única diferença é que na consulta em SQL pode-se obter tuplas duplicadas

no 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íguos

Na SQL, o mesmo nome pode ser utilizado para dois (ou mais) atributos, contanto que os atributos estejam em diferentes tabelas. Se uma consulta se referir a dois ou mais atributos com o mesmo nome, deve-se qualificar o nome do atributo com o nome da tabela para evitar ambigüidade. Isto é realizado colocando-se o nome da tabela antes do nome do atributo e separando 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 no comando.

Page 5: Apostila de sql

5

Exemplo 11 Recupere o nome dos empregados que trabalham no departamento Pessoal.

SELECT Empregado.nome

FROM Empregado, Departamento

WHERE Empregado.codDepto = Departamento.codDepto AN D Departamento.nome = ‘Pessoal’;

4.1.2 Junções

O Exemplo 11 (acima) além de apresentar o tratamento de atributos com o mesmo nome exemplifica uma junção entre duas tabelas. Esse comando SQL é corresponde à seqüência de operações PRODUTO CARTESIANO-SELECIONAR-PROJETAR (ou às

operaçõ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 as

linhas sem significado, é necessário se colocar a condição de junção entre tabelas na cláusula WHERE (no Exemplo 11, a

condiçã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 AN D Empregado.nome = ‘Ane’;

4.1.3 Renomeando atributos e tabelas

Pode-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 > 200 00; Neste exemplo, o atributo a ser retornado salário foi renomeado para salárioDosEmpregados e as tabelas Empregado e

Departamento 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 a renomeação.

4.1.4 Cláusula WHERE não especificada

A 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ção

especificada 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ção

estiver 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 dessas

condiçõ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 Empregados

4.1.5 Uso do asterisco (*)

Para recuperar todos os valores de todos os atributos das tuplas selecionadas, não é necessário relacionar explicitamente na SQL o nome dos atributos. Para isso pode-se especificar um asterisco (* ) na cláusula SELECT, que corresponde a todos os

atributos.

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.

Page 6: Apostila de sql

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 DISTINCT

Como mencionado, a SQL geralmente trata uma tabela não como um conjunto mas como um multiconjunto; tuplas duplicadas podem aparecer mais do que uma vez em uma tabela e no resultado de uma consulta. A SQL não elimina automaticamente 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. Uma

consulta com SELECT DISTINCT elimina duplicatas, enquanto uma consulta com SELECT ALL não elimina (não especificar

SELECT 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 relacional

Observe a seguinte operação da álgebra relacional:

π( σ(Empregado) ) codDepto = 3 e estadoCivil = ‘C’ salário

Exemplo 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 os

mesmos.

4.3 Operador IS

O valor NULL representa a ausência de valor, ou seja, ele pode representar que um valor está ausente, não foi definido ou nã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, para saber 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 BY

A 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.

Page 7: Apostila de sql

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 no me, codDepto

FROM Empregado FROM Empr egado

ORDER BY codDepto, nome ORDER BY codDepto, nome DESC

A ordem padrão é a ascendente de valores, mas pode-se especificar a palavra chave DESC se for desejado uma ordem

descendente de valores.

Exemplo 22 Recupere todos os empregados casados ordenados decrescentemente por salário.

SELECT *

FROM Empregado

WHERE estadoCivil = ‘C’

ORDER BY salário DESC

4.5 Funções de agregação

As 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 coluna

As 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 o

salário médio.

SELECT SUM(salário), MAX(salário), MIN(salário), AV G(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á contado

o 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 o

nú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 BY

As 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 o conjunto que satisfaça a condição. Por exemplo, suponha que se deseje encontrar o salário médio dos empregados para cada um dos departamentos. Neste casos, é necessário agrupar as tuplas que possuem o mesmo valor para o atributo código de departamento (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ção

podem 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 que

satisfaçam uma determinada condição. Enquanto a cláusula WHERE é utilizada na aplicação de condições para cada uma das

linhas da tabela, a cláusula HAVING é utilizada para selecionar grupos de linhas que satisfaçam a condição especificada.

Page 8: Apostila de sql

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 IN

O 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 conjuntos

4.8.1 UNION

O operador UNION é o mecanismo disponibilizado pela SLQ para fazer a união de conjuntos. Diferentemente do que acontece

com o comando SELECT, linhas duplicadas são eliminadas do resultado de uma união a não ser que o operador UNION inclua

explicitamente 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 dos

departamentos 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 INTERSECT

O operador INTERSECT é o mecanismo disponibilizado pela SLQ para fazer a interseção de conjuntos. De forma semelhante ao

UNION, por default as linhas semelhantes são eliminadas. Para obter todas as repetições deve-se usar INTERSECT ALL.

Page 9: Apostila de sql

9

Exemplo 32 O código dos departamentos com orçamento maior que R$ 10.000,00 e que possuem empregados que ganham

menos de R& 1.000,00.

( SELECT codDepto

FROM Departamento

WHERE orcamento > 10000 )

INTERSECT

( SELECT codDepto

FROM Empregado

WHERE salario < 1000 )

4.8.3 EXCEPT

O operador EXCEPT é o mecanismo disponibilizado pela SLQ para se fazer a operação de diferença de conjuntos. Não

esquecendo 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 que

ganham menos de R& 1.000,00.

( SELECT codDepto

FROM Departamento

WHERE orcamento > 10000 )

EXCEPT

( SELECT codDepto

FROM Empregado

WHERE salario < 1000 )

4.9 Consultas aninhadas

Os exemplos de consultas aninhadas serão feitos sobre as seguintes tabelas:

Vendedor

Produto

( codVendedor , nome, idade, comissão )

( codProduto , nome, preço )

Venda codProduto , data , qtd )( codVendedor ,

4.9.1 Subconsultas

Algumas consultas requerem que valores existentes no banco de dados sejam recuperados e, em seguida, utilizados numa condição de comparação. Essas consultas podem ser formuladas utilizando subconsultas. Subconsultas são blocos completos SELECT...FROM...WHERE dentro da cláusula WHERE de outra consulta (chamada de consulta externa).

Page 10: Apostila de sql

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 = 10

Exemplo 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 conjunto de valores V. A palavra-chave SOME pode ser combinada com os operadores =, <, >, <=, >=, <>. O operador > SOME

retorna 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, a

condiçã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 EXISTS

Sempre que uma condição na cláusula WHERE de uma subconsulta faz referência a algum atributo de uma relação declarada

na consulta externa, diz-se que as duas consultas são correlacionadas. Assim, a subconsulta é avaliada uma vez para cada tupla da consulta externa.

A função EXISTS é utilizada para verificar se o resultado de uma subconsulta correlacionada é vazio (não possui nenhuma

tupla) ou não.

Observação: Em geral, uma subconsulta pode ser expressa como uma consulta de um único bloco.

Page 11: Apostila de sql

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.ve ndedor

AND produto = 1010)

----Ou

SELECT nome

FROM Vendedores, Vendas

WHERE Vendedores.vendedor = Vendas.vendedor

AND produto = 1010

Exemplo 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.p roduto

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.produ to

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 os produtos 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 dia nenhum. 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.vend edor

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 de nomes 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ão reflete automaticamente estas atualizações. Isso porque a visão não, necessariamente, armazena os dados fisicamente.

Page 12: Apostila de sql

12

Pode-se imaginar uma visão como um modo de especificar uma tabela à qual precisa-se para fazer referências com freqüência, embora ela possa não existir fisicamente. Por exemplo, supondo que freqüentemente seja necessário recuperar o nome do empregado e os nomes do departamento em que ele trabalha. Então pode-se criar uma visão sobre estes dados, ou invé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 eles

estão alocados.

CREATE VIEW TrabalhaEm AS

SELECT codEmpr, Empregado.nome, Departamento.nom e

FROM Empregado, Departamento

WHERE Empregado.codDepto = Departamento.codDepto

Depois 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;