Sunteți pe pagina 1din 12

A Linguagem SQL

1 Introduo

A linguagem SQL pode ser considerada como uma das principais razes para o sucesso dos bancos de dados relacionais, pois ela se tornou um padro para SGBD's relacionais. Na prtica, existem muitas diferenas entre os diversos SGBD's comerciais. Entretanto, o usurio pode sempre optar por utilizar somente as caractersticas que fazem parte do padro, podendo assim migrar de um SGBD para outro sem grande esforo. As operaes de lgebra relacional aprendidas no curso so muito importantes para compreender os tipos de solicitaes que podem ser especificadas em um banco de dados relacional. Elas tambm so importantes para a otimizao e o processamento de consultas em um SGBD relacional, conforme ser visto na disciplina de Tpicos de Banco de Dados I. Entretanto, as operaes de lgebra relacional so consideradas demasiadamente tcnicas para a maioria dos usurios de SGBD's comerciais. Uma razo para isso o fato de que uma consulta na lgebra relacional escrita na forma de uma seqncia de operaes que, ao serem executadas, produzem o resultado esperado. Dessa forma, o usurio deve especificar como ou seja, em que ordem executar as operaes de consulta. Por outro lado, a linguagem SQL fornece uma interface de linguagem declarativa de alto nvel, de forma que o usurio especifique somente qual o resultado que deve ocorrer, deixando a efetiva otimizao e decises sobre como executar a consulta a cargo do SGBD. A SQL inclui algumas caractersticas da lgebra relacional, sendo baseada, em sua maior parte, no clculo relacional de tuplas, que se trata de outra linguagem de consulta formal para bancos de dados relacionais. A sintaxe da SQL mais amigvel ao usurio do que qualquer uma das linguagens formais. O nome SQL derivado de Structured Query Language (Linguagem de Consulta Estruturada). Ela dividida em trs partes de acordo com os tipos de comandos: DML (linguagem de manipulao de dados) permite consultas, modificao de informaes existentes, criao de novos dados ou excluso de dados das tabelas; DDL (linguagem de definio 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 viso dos mecanismos de controle subdividido em trs grupos de comandos para controle: das transaes, da sesso e do sistema.

1.1

Exemplos

Sero utilizado como exemplo para os comandos SQL as seguintes relaes:


Empregado (codEmpr, nome, salrio, sexo, estadoCivil, codDepto)

Departamento (codDepto, nome, oramento)

Definio de esquemas em SQL

A SQL utiliza os termos tabela, linha e coluna para, respectivamente, relao, tupla e atributo temos da lgebra relacional. Os comandos da SQL para definio dos dados so CREATE (criar), ALTER (alterar) e DROP (remover).

2.1

Tipo de dados

Os tipos de dados disponveis para atributos incluem dados numricos, string de caracteres, data e hora. Tipos de dados numricos incluem: Nmeros inteiros de vrios tamanhos: INTEGER ou INT e SMALLINT; e Nmeros reais de vrias precises: FLOAT, REAL, DOUBLE PRECISION e DECIMAL. Nmeros formatados podem ser declarados utilizando DECIMAL (i,j), onde i, a preciso, o nmero total de dgitos antes da vrgula e j, a escala, o nmero de dgitos aps o ponto decimal. Tipos de dados de strings de caracteres podem ser: De tamanho fixo: CHAR(n), onde n o nmero de caracteres; ou De tamanho varivel: VARCHAR(n), onde n o nmero mximo de caracteres. O tipo de dado DATE possui dez posies e seus componentes so ano, ms e dia, geralmente na forma AAAA-MM-DD. O tipo de dado a possui pelo menos oito posies, com os componentes hora, minuto e segundo, geralmente na forma HH:MM:SS. Somente datas e horas vlidas deveriam ser permitidas pela implementao da SQL.

2.2

O comando CREATE TABLE

O comando CREATE TABLE utilizado para especificar uma nova relao dando a ela um nome e especificando seus atributos e restries. Os atributos so especificados primeiramente e, a cada atributo dado um nome, um tipo de dado para especificar seu domnio de valores e qualquer restrio de atributo tal como NOT NULL. As restries de chave, de integridade da entidade e de integridade referencial podem ser especificadas, dentro da instruo CRATE TABLE, depois que os atributos forem declarados. Uma outra opo declarar estar restries posteriormente, utilizando o comando ALTER TABLE. Exemplo 1

CREATE TABLE Departamento ( codDepto INT NOT NULL, nome VARCHAR (50) NOT NULL, oramento DECIMAL (10, 2), PRIMARY KEY (codDepto), UNIQUE (nome) ); CREATE TABLE Empregado ( codEmpr INT NOT NULL, nome VARCHAR (50) NOT NULL, salrio 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 restries

Uma vez que a SQL permite NULLs como valores de atributos, a restrio NOT NULL pode ser especificada caso NULL no seja permitido para um determinado atributo. Como por exemplo, o nome de um empregado no pode ser nulo. A clusula PRIMARY KEY especifica um ou mais atributos que compem a chave primria de uma tabela. Caso a chave primria seja composta por mais de um atributo, eles devem vir separados por vrgula. A clusula UNIQUE especifica as chaves candidata, ou seja, aquelas cuja combinao de valores no se repete. A integridade referencial especificada na clusula FOREIGN KEY. Conforme foi visto em aula, uma restrio de integridade pode ser violada quando tuplas so inseridas ou excludas, ou quando um atributo de chave estrangeira modificado. Na SQL pode-se especificar a ao a ser tomada se uma restrio de integridade referencial for violada. As opes so: SET NULL, CASCADE e SET DEFAULT. Alm disso, deve ser qualificada se a ao deve tomada na excluso (ON DELETE) ou na atualizao (ON UPDATE). Exemplo 2 Detalhando o relacionamento existente entre Empregado e Departamento:

CREATE TABLE Empregado ( codEmpr INT NOT NULL, nome VARCHAR (50) NOT NULL, salrio 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 excluda ser colocado NULL nas linhas relacionadas de Empregado. Quando uma linha de departamento for alterada os registros relacionados sero alterados tambm.

2.4

O comando DROP TABLE

Se uma determinada tabela no for mais necessria, ela e sua definio podem ser excludas utilizando o comando DROP TABLE. Existem duas opes de comportamento na excluso: CASCADE todas as restries que referenciam a tabela so removidas automaticamente juntamente com a tabela em questo; RESTRICT a tabela em questo s ser removida se ela no for referenciada por outra tabela (por exemplo, atravs de definies de chaves estrangeiras).

Exemplo 3 No modo RESTRICT, a tabela Departamento no pode ser removida porque ela referenciada pela tabela Empregado.

DROP TABLE Departamento RESTRICT;


No modo CASCADE, a tabela Departamento ser excluda juntamente com todos os dados e com a chave estrangeira da tabela Empregado.

DROP TABLE Departamento CASCADE;

2.5

O comando ALTER TABLE

A definio de uma tabela pode ser alterada utilizando-se o comando ALTER TABLE. Atravs da alterao de uma tabela possvel: adicionar ou retirar uma coluna, alterar a definio de uma coluna e adicionar ou retirar restries de tabela. Exemplo 4 Adicionar mais um campo tabela Empregado:

ALTER TABLE Empregado ADD endereo VARCHAR(50);


Para remover uma coluna, deve-se escolher uma das opes para controla o comportamento da eliminao: CASCADE todas as restries que referenciam a coluna so automaticamente excludas, juntamente com a coluna; RESTRICT o comando s bem-sucedido, se nenhuma restrio referenciar a coluna. Exemplo 5 Remover um campo da tabela Empregado:

ALTER TABLE Empregado DROP endereo CASCADE;

Manipulao dos dados em SQL

Em SQL, existem trs 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 relao. Deve-se especificar o nome da relao 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 no 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 cdigo 5, salrio 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 cdigo 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 relao. Ele possui a clusula WHERE para selecionar as tuplas a serem excludas. Se a clusula WHERE for omitida, todas as tuplas da relao sero excludas, 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 esto vinculados ao departamento 10.

DELETE FROM Empregado WHERE salrio < 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 clusula WHERE no comando UPDATE seleciona as tuplas a serem modificadas. A clusula SET especifica os atributos e os seus novos valores.

Exemplo 9

Conceder um aumento de 10% para todos os empregados do departamento 10.

UPDATE Empregado SET salrio = salrio * 1.1 WHERE codDepto = 10

Consultas em SQL

A SQL possui uma instruo bsica para recuperar informaes de um banco de dados: a instruo SELECT. Observao: existe uma importante diferena entre a SQL e o modelo relacional formal discutido no curso: a SQL permite que uma tabela (relao) possua duas ou mais tuplas idnticas em todos os seus valores de atributos. Portanto, em geral, uma tabela em SQL no um conjunto de tuplas (porque um conjunto de tuplas no permite dois membros idnticos), mas sim um multiconjunto de tuplas. Para garantir que uma relao SQL seja um conjunto de tuplas deve-se declarar uma restrio de chave ou utilizar a opo DISTINCT (descrita posteriormente) com a instruo SELECT.

4.1

O comando SELECT

O comando SELECT composto por vrias clusulas. Porm apenas as clusulas SELECT e FROM so obrigatrias. As demais podero ser utilizadas de acordo com a necessidade e na ordem apresentada a seguir1:

[ [ [ [
Onde:

SELECT [DISTINCT|ALL] lista de atributos a serem retornados FROM lista de tabelas WHERE condio de linha ] GROUP BY lista atributos de agrupamento ] HAVING condio de agrupamento ] ORDER BY lista de atributos de ordenao [ASC|DESC] ]

SELECT lista os atributos ou funes a serem recuperadas. Como default, lista todos os valores (clusula ALL), mas pode listar apenas os valores diferentes (clusula DISTINCT); FROM especifica todas as tabelas necessrias na consulta; WHERE especifica as condies para seleo de tuplas dessas relaes, incluindo condies de juno; GROUP BY especifica atributos de agrupamento; HAVING especifica uma condio nos grupos sendo selecionados (em vez de nas tuplas individuais, como ocorre no WHERE); ORDER BY especifica a ordem de exibio do resultado de uma consulta; pode ser ascendente (ASC) ou decrescente (DESC). Exemplo 10 Recupere os salrios dos empregados casados (C) do departamento com cdigo igual a 3.

SELECT salrio FROM Empregado WHERE codDepto = 3 AND estadoCivil = C;


Esta consulta envolve somente a relao Empregado que listada na clusula FROM. A consulta seleciona as tuplas de Empregado que satisfazem a condio da clusula WHERE, e ento projeta o resultado do atributo salrio, listado na clusula SELECT. Essa operao semelhante seguinte operao da lgebra relacional exceto pelo fato de que linhas duplicadas, caso haja alguma, no seriam eliminadas com o comando SELECT:

( (Empregado) )
codDepto = 3 e estadoCivil = C salrio

Portanto, uma simples consulta em SQL, com um nico nome de relao na clusula FROM, semelhante a um par SELECIONAR-PROJETAR de operaes da lgebra relacional. A clusula SELECT da SQL especifica os atributos de projeo e a clusula WHERE especifica a condio de seleo. A nica diferena que na consulta em SQL pode-se obter tuplas duplicadas no resultado da consulta, porque a restrio de que a relao seja um conjunto no imposta.

4.1.1 Lidando com nomes de atributos ambguos


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 ambigidade. Isto realizado colocando-se o nome da tabela antes do nome do atributo e separando os dois atravs de um ponto.

As clusulas entre colchetes so opcionais. As clusulas separadas por | so exclusivas, ou seja, apenas uma das duas pode estar presente no comando.

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 Junes
O Exemplo 11 (acima) alm de apresentar o tratamento de atributos com o mesmo nome exemplifica uma juno entre duas tabelas. Esse comando SQL corresponde seqncia de operaes PRODUTO CARTESIANO-SELECIONAR-PROJETAR (ou s operaes JUNTAR-PROJETAR) da lgebra relacional. Em SQL, sempre feito o produto cartesiano2 entre todas as tabelas colocadas na clusula FROM. Por isso, para eliminar as linhas sem significado, necessrio se colocar a condio de juno entre tabelas na clusula WHERE (no Exemplo 11, a condio de juno Empregado.codDepto = Departamento.codDepto, j a condio Departamento.nome = Pessoal chamada de condio de seleo). 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 tabelas
Pode-se utilizar a palavra-chave AS para renomear atributos e tabelas, conforme apresentado no Exemplo 13. Exemplo 13 20.000,00. Recupere o salrio dos empregados que trabalham nos departamentos com oramento maior que R$

SELECT E.salrio AS salrioDosEmpregados FROM Empregado AS E, Departamento AS D WHERE E.codDepto = D.codDepto AND D.oramento > 20000;
Neste exemplo, o atributo a ser retornado salrio foi renomeado para salrioDosEmpregados e as tabelas Empregado e Departamento foram renomeadas para E e D, respectivamente. Uma vez que uma determinada tabela tenha sido renomeada, no possvel mais utilizar o nome antigo na consulta. importante ressaltar que, a renomeao das tabelas e dos campos s vlida no contexto do comando SQL onde foi feita a renomeao.

4.1.4 Clusula WHERE no especificada


A falta de uma clusula WHERE indica que no h uma condio na seleo de tuplas. Portanto, todas as tuplas da relao especificada na clusula FROM esto qualificadas e sero selecionadas para o resultado da consulta. Isso equivalente condio WHERE TRUE, que significa que a condio verdadeira para todas as linhas da tabela. Se mais de uma relao estiver especificada na clusula FROM e no existir nenhuma clusula WHERE, ento o produto cartesiano dessas relaes selecionado. extremamente importante especificar todas as condies de seleo e de juno na clusula WHERE. Se alguma dessas condies for ignorada, isso pode resultar em relaes 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, no necessrio relacionar explicitamente na SQL o nome dos atributos. Para isso pode-se especificar um asterisco (*) na clusula SELECT, que corresponde a todos os atributos.

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.

Exemplo 15

Todos os atributos dos empregados que trabalham no departamento de cdigo 1.

SELECT * FROM Empregado WHERE codDepto = 1;

4.2

ALL x DISTINCT

Como mencionado, a SQL geralmente trata uma tabela no 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 no elimina automaticamente tuplas duplicadas no resultado das consultas pelos seguintes motivos: a eliminao de linhas duplicadas uma operao onerosa (um modo de implement-la primeiramente ordenar as tuplas e, ento, eliminar as duplicatas); o usurio pode desejar ver as tuplas duplicadas no resultado de uma consulta; quando uma funo de agregao (ainda sero apresentadas) aplicada s tuplas, na maioria dos casos, no desejado eliminar as duplicatas. Se for desejado, efetivamente, eliminar as tuplas duplicadas do resultado de uma consulta na SQL, deve-se utilizar a palavrachave DISTINCT na clusula SELECT. Isso significa que somente tuplas diferentes devem permanecer no resultado. Uma consulta com SELECT DISTINCT elimina duplicatas, enquanto uma consulta com SELECT ALL no elimina (no especificar SELECT com ALL ou com DISTINCT equivalente a SELECT ALL). Exemplo 16 Recupere o salrio de todos os empregados.

SELECT ALL salrio FROM Empregado;


Exemplo 17

ou

SELECT salrio FROM Empregado;

Recupere todos os valores diferentes de salrios.

SELECT DISTINCT salrio FROM Empregado; 4.2.1 SQL x lgebra relacional


Observe a seguinte operao da lgebra relacional:

( (Empregado) )
codDepto = 3 e estadoCivil = C salrio

Exemplo 18

Escreva o comando SQL que sempre retorna os mesmos dados da operao da lgebra relacional abaixo.

SELECT DISTINCT salrio FROM Empregado WHERE codDepto = 3 AND estadoCivil = C;


Repare que se a consulta SQL for escrita sem o DISTINCT no possvel garantir que os dados retornados sero sempre os mesmos.

4.3

Operador IS

O valor NULL representa a ausncia de valor, ou seja, ele pode representar que um valor est ausente, no foi definido ou no aplicado. Assim o NULL no igual, no diferente, no menor do que qualquer outro valor, inclusive outro NULL. Portanto no se pode utilizar os operadores convencionais de comparao (=, <>, <, >, ...) 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 no 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

Clusula ORDER BY

A SQL permite ao usurio ordenar as tuplas no resultado de uma consulta pelos valores de um ou mais atributos. Para isso, utiliza-se a clusula ORDER BY.

Exemplo 21 Recupere uma lista dos empregados ordenados pelo nmero do departamento e, dentro de cada departamento, ordenados por nome.

SELECT nome, codDepto FROM Empregado ORDER BY codDepto, nome


descendente de valores. Exemplo 22

ou

SELECT nome, codDepto FROM Empregado ORDER BY codDepto, nome DESC

A ordem padro a ascendente de valores, mas pode-se especificar a palavra chave DESC se for desejado uma ordem

Recupere todos os empregados casados ordenados decrescentemente por salrio.

SELECT * FROM Empregado WHERE estadoCivil = C ORDER BY salrio DESC

4.5

Funes de agregao
COUNT(*) nmero 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) mdia dos valores de uma determinada coluna

As funes de agregao so:

As funes de agregao podem aparecer apenas na clusula SELECT ou na clusula HAVING (vista futuramente). NO possvel utilizar uma funo de agregao na clusula FROM, nem na clusula WHERE. Exemplo 23 Retorne, respectivamente, a soma dos salrios de todos os empregados, o maior salrio, o menor salrio e o salrio mdio.

SELECT SUM(salrio), MAX(salrio), MIN(salrio), AVG(salrio) FROM Empregado;


A funo de agregao COUNT pode ser usada de duas formas: COUNT(*) ou COUNT(coluna). Nos dois casos ser contado o nmero de tuplas. A diferena que no segundo caso se algum valor da coluna especificada for NULL, a tupla no ser computada. Alm disso, possvel utilizar a clusula DISTINCT em combinao com o COUNT para retornar apenas o nmero de valores diferentes (Exemplo 25). Exemplo 24 Retorne o nmero total de empregados do departamento 20.

SELECT COUNT(*) FROM Empregado WHERE codDepto = 20;


Exemplo 25 Retorne o nmero de valores diferentes de salrio no banco de dados.

SELECT COUNT( DISTINCT salrio ) FROM Empregado;

4.6

Clusula GROUP BY

As funes de agregao (vistas na seo 4.5) podem ser aplicadas a grupos de linhas de uma tabela, ou invs de a todo o conjunto que satisfaa a condio. Por exemplo, suponha que se deseje encontrar o salrio mdio dos empregados para cada um dos departamentos. Neste casos, necessrio agrupar as tuplas que possuem o mesmo valor para o atributo cdigo de departamento (atributo de agrupamento) e, ento, aplicar a funo de agregao para cada um desses grupos, independentemente. A SQL possui a clusula GROUP BY para esta finalidade. A clusula GROUP BY especifica os atributos de agrupamento. Apenas os atributos de agrupamento e funes de agregao podem aparecer na clusula SELECT. Exemplo 26 Para cada departamento, recupera mdia de salrios dos seus empregados.

SELECT codDepto, AVG(salrio) FROM Empregado GROUP BY codDepto;


A clusula GROUP BY pode ser utilizada em conjunto com a clusula HAVING, caso deseje-se recuperar apenas os grupos que satisfaam uma determinada condio. Enquanto a clusula WHERE utilizada na aplicao de condies para cada uma das linhas da tabela, a clusula HAVING utilizada para selecionar grupos de linhas que satisfaam a condio especificada.

Exemplo 27

Recupere a mdia de salrio dos departamentos que possuem mais 10 empregados.

SELECT codDepto, AVG(salrio) FROM Empregrado GROUP BY codDepto HAVING COUNT(*) > 10;

4.7

Operador IN

O operador IN possibilita a utilizao de conjuntos explcitos de valores. Exemplo 28 Recupere o nome d os empregados cujo estado civil casado, solteiro ou vivo.

SELECT nome FROM empregado WHERE estaoCivil IN (C,S,V)

4.8
4.8.1

Tabelas como conjuntos


UNION

O operador UNION o mecanismo disponibilizado pela SLQ para fazer a unio de conjuntos. Diferentemente do que acontece com o comando SELECT, linhas duplicadas so eliminadas do resultado de uma unio a no ser que o operador UNION inclua explicitamente o quantificador ALL. Qualquer nmero de SELECTs pode ser unido pelo UNION.

Exemplo 29 O cdigo dos departamentos com oramento maior que R$ 10.000,00 juntamente com o cdigo 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 cdigos de departamento que satisfazem as duas condies.

( 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 condies foi atendida para a incluso do elemento no resultado final.

( SELECT codDepto, Oramento maior AS comentario FROM Departamento WHERE orcamento > 10000 ) UNION ( SELECT codDepto, Salrio menor AS comentario FROM Empregado WHERE salario < 1000 ) 4.8.2 INTERSECT
O operador INTERSECT o mecanismo disponibilizado pela SLQ para fazer a interseo de conjuntos. De forma semelhante ao UNION, por default as linhas semelhantes so eliminadas. Para obter todas as repeties deve-se usar INTERSECT ALL.

Exemplo 32 O cdigo dos departamentos com oramento 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 operao de diferena de conjuntos. No esquecendo que, para manter todas as repeties, deve-se usar EXCEPT ALL.

Exemplo 33 O cdigo dos departamentos com oramento maior que R$ 10.000,00 mas que possuem no 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 sero feitos sobre as seguintes tabelas:


Vendedor ( codVendedor, nome, idade, comisso ) Produto ( codProduto, nome, preo ) Venda ( codVendedor, codProduto, data, qtd )

4.9.1 Subconsultas
Algumas consultas requerem que valores existentes no banco de dados sejam recuperados e, em seguida, utilizados numa condio de comparao. Essas consultas podem ser formuladas utilizando subconsultas. Subconsultas so blocos completos SELECT...FROM...WHERE dentro da clusula WHERE de outra consulta (chamada de consulta externa).

Exemplo 34

O nome dos vendedores que esto acima da mdia de idade dos vendedores

SELECT nome FROM Vendedores WHERE idade > (SELECT AVG(idade) FROM Vendedores)
Exemplo 35 O nmero dos vendedores que venderam os mesmos produtos que o vendedor de cdigo 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')
Observao: Alm do operador IN, outros operadores de comparao 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 idntico a IN, porm <> SOME NO a mesma coisa que NOT IN. A palavra-chave ALL tambm pode ser combinada com cada um desses operadores (=, <, >, <=, >=, <>). Por exemplo, a condio de comparao 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 comisso 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 comisso igual a 8

SELECT nome FROM Vendedores WHERE idade > ALL (SELECT idade FROM Vendedores WHERE comissao = 8) 4.9.2 Subconsultas correlacionadas e Funo EXISTS
Sempre que uma condio na clusula WHERE de uma subconsulta faz referncia a algum atributo de uma relao declarada na consulta externa, diz-se que as duas consultas so correlacionadas. Assim, a subconsulta avaliada uma vez para cada tupla da consulta externa. A funo EXISTS utilizada para verificar se o resultado de uma subconsulta correlacionada vazio (no possui nenhuma tupla) ou no. Observao: Em geral, uma subconsulta pode ser expressa como uma consulta de um nico bloco.

10

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 = 1010
Exemplo 40 O nome dos produtos que no 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 no 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)
ATENO: 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 no foram vendidos no dia 02/08/2003, o que inclui os produtos que no foram vendidos em dia nenhum. J a consulta Exemplo 41 no satisfaz o que foi pedido. Ela NO retornar os produtos que no foram vendidos em dia nenhum. Alm disso, sero retornados os produtos que tiverem sido vendidos em outro dia alm do dia 02/08/2003. Exemplo 42 Os produtos que no 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 ));

Vises (views)

Vises (ou views) so tabelas virtuais derivadas de outras tabelas ou vises. Uma viso possui um nome, uma lista de nomes de atributos e uma consulta para especificar o contedo da viso. Uma viso est sempre atualizada. Se as tuplas nas tabelas de base nas quais a viso definida forem modificadas, a viso reflete automaticamente estas atualizaes. Isso porque a viso no, necessariamente, armazena os dados fisicamente.

11

Pode-se imaginar uma viso como um modo de especificar uma tabela qual precisa-se para fazer referncias com freqncia, embora ela possa no existir fisicamente. Por exemplo, supondo que freqentemente seja necessrio recuperar o nome do empregado e os nomes do departamento em que ele trabalha. Ento pode-se criar uma viso sobre estes dados, ou invs de escrever a juno toda vez que ela for necessria. O comando para criao de uma viso o CREATE VIEW. Exemplo 44 Criar uma viso que retorne o cdigo e o nome do empregados com o nome dos departamentos a que eles esto alocados.

CREATE VIEW TrabalhaEm AS SELECT codEmpr, Empregado.nome, Departamento.nome FROM Empregado, Departamento WHERE Empregado.codDepto = Departamento.codDepto
Depois de criada uma viso, ela pode ser usada, por exemplo, em um comando SQL como se fosse uma tabela.

SELECT * FROM TrabalhaEm WHERE codEmpr = 1;

12

S-ar putea să vă placă și