SlideShare une entreprise Scribd logo
1  sur  12
Télécharger pour lire hors ligne
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 (codEmpr, nome, salário, sexo, estadoCivil, codDepto)


                         Departamento (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.




                                                                                                                          1
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 (codDepto) );

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


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




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

                                                                                                                                           4
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çõ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 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     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 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.

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




                                                                                                                           6
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 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), 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á 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.



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



                                                                                                                            8
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 ( codVendedor, nome, idade, comissão )

                                    Produto ( codProduto, nome, preço )

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




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




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




                                                                                                                       11
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.nome
         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;




                                                                                                                      12

Contenu connexe

Tendances

Comandos DDL para o MySQL
Comandos DDL para o MySQLComandos DDL para o MySQL
Comandos DDL para o MySQLArley Rodrigues
 
Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Marco Pinheiro
 
Fundamentos de SQL - Parte 5 de 8
Fundamentos de SQL - Parte 5 de 8Fundamentos de SQL - Parte 5 de 8
Fundamentos de SQL - Parte 5 de 8Emiliano Barbosa
 
Fundamentos de SQL - Parte 4 de 8
Fundamentos de SQL - Parte 4 de 8Fundamentos de SQL - Parte 4 de 8
Fundamentos de SQL - Parte 4 de 8Emiliano Barbosa
 
Fundamentos de SQL - Parte 6 de 8
Fundamentos de SQL - Parte 6 de 8Fundamentos de SQL - Parte 6 de 8
Fundamentos de SQL - Parte 6 de 8Emiliano Barbosa
 
Principais instruções em sql
Principais instruções em sqlPrincipais instruções em sql
Principais instruções em sqlCharleston Anjos
 
Fundamentos de SQL - Parte 1 de 8
Fundamentos de SQL - Parte 1 de 8Fundamentos de SQL - Parte 1 de 8
Fundamentos de SQL - Parte 1 de 8Emiliano Barbosa
 
Normalização de Banco de Dados
Normalização de Banco de DadosNormalização de Banco de Dados
Normalização de Banco de Dadoselliando dias
 
Banco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLBanco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLDaniel Brandão
 
Aula5 normalização
Aula5   normalizaçãoAula5   normalização
Aula5 normalizaçãoMatias Silva
 
Banco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoBanco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoRangel Javier
 
Fundamentos de SQL - Parte 2 de 8
Fundamentos de SQL - Parte 2 de 8Fundamentos de SQL - Parte 2 de 8
Fundamentos de SQL - Parte 2 de 8Emiliano Barbosa
 
Banco de dados comandos sql
Banco de dados   comandos sqlBanco de dados   comandos sql
Banco de dados comandos sqlNilson Augustini
 
Junções e subconsultas
Junções e subconsultasJunções e subconsultas
Junções e subconsultasjulianaveregue
 

Tendances (20)

Comandos DDL para o MySQL
Comandos DDL para o MySQLComandos DDL para o MySQL
Comandos DDL para o MySQL
 
Aula 12 banco de dados
Aula 12   banco de dadosAula 12   banco de dados
Aula 12 banco de dados
 
Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)Linguagem SQL (com MySQL)
Linguagem SQL (com MySQL)
 
Fundamentos de SQL - Parte 5 de 8
Fundamentos de SQL - Parte 5 de 8Fundamentos de SQL - Parte 5 de 8
Fundamentos de SQL - Parte 5 de 8
 
Aula 10 banco de dados
Aula 10   banco de dadosAula 10   banco de dados
Aula 10 banco de dados
 
Hands on Labs - SQL Server 2008
Hands on Labs - SQL Server 2008Hands on Labs - SQL Server 2008
Hands on Labs - SQL Server 2008
 
Fundamentos de SQL - Parte 4 de 8
Fundamentos de SQL - Parte 4 de 8Fundamentos de SQL - Parte 4 de 8
Fundamentos de SQL - Parte 4 de 8
 
Aula 11 banco de dados
Aula 11   banco de dadosAula 11   banco de dados
Aula 11 banco de dados
 
Aula 10 banco de dados
Aula 10   banco de dadosAula 10   banco de dados
Aula 10 banco de dados
 
Fundamentos de SQL - Parte 6 de 8
Fundamentos de SQL - Parte 6 de 8Fundamentos de SQL - Parte 6 de 8
Fundamentos de SQL - Parte 6 de 8
 
Principais instruções em sql
Principais instruções em sqlPrincipais instruções em sql
Principais instruções em sql
 
Fundamentos de SQL - Parte 1 de 8
Fundamentos de SQL - Parte 1 de 8Fundamentos de SQL - Parte 1 de 8
Fundamentos de SQL - Parte 1 de 8
 
Normalização de Banco de Dados
Normalização de Banco de DadosNormalização de Banco de Dados
Normalização de Banco de Dados
 
Aprofundamento de DDL e DML
Aprofundamento de DDL e DMLAprofundamento de DDL e DML
Aprofundamento de DDL e DML
 
Banco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQLBanco de dados - Aula 1 SQL
Banco de dados - Aula 1 SQL
 
Aula5 normalização
Aula5   normalizaçãoAula5   normalização
Aula5 normalização
 
Banco de Dados - MySQL Basico
Banco de Dados - MySQL BasicoBanco de Dados - MySQL Basico
Banco de Dados - MySQL Basico
 
Fundamentos de SQL - Parte 2 de 8
Fundamentos de SQL - Parte 2 de 8Fundamentos de SQL - Parte 2 de 8
Fundamentos de SQL - Parte 2 de 8
 
Banco de dados comandos sql
Banco de dados   comandos sqlBanco de dados   comandos sql
Banco de dados comandos sql
 
Junções e subconsultas
Junções e subconsultasJunções e subconsultas
Junções e subconsultas
 

En vedette (7)

Ddl e dml básicos
Ddl e dml básicosDdl e dml básicos
Ddl e dml básicos
 
Ddl e dml básicos
Ddl e dml básicosDdl e dml básicos
Ddl e dml básicos
 
Ddl com dml básico
Ddl com dml básicoDdl com dml básico
Ddl com dml básico
 
Primeira lista sql
Primeira lista sqlPrimeira lista sql
Primeira lista sql
 
Ddl com dml básico
Ddl com dml básicoDdl com dml básico
Ddl com dml básico
 
Exercícios
ExercíciosExercícios
Exercícios
 
Banco de Dados II - Aula1
Banco de Dados II - Aula1Banco de Dados II - Aula1
Banco de Dados II - Aula1
 

Similaire à Apostila de sql

introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptxintroduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptxSaraR49
 
Bdm aula 9 - operações sql - ticianne darin
Bdm   aula 9 - operações sql - ticianne darinBdm   aula 9 - operações sql - ticianne darin
Bdm aula 9 - operações sql - ticianne darinTicianne Darin
 
3º Fast Show - SQL Analytics
3º Fast Show - SQL Analytics3º Fast Show - SQL Analytics
3º Fast Show - SQL Analyticsqualidatavix
 
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdfQuitriaSilva550
 
Html - capitulo 11
Html - capitulo 11Html - capitulo 11
Html - capitulo 11Alvaro Gomes
 
Revisao_SQL_Parte_I.ppt
Revisao_SQL_Parte_I.pptRevisao_SQL_Parte_I.ppt
Revisao_SQL_Parte_I.ppta08008
 
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6Wagner Bianchi
 
Banco de dados aula 4
Banco de dados aula 4Banco de dados aula 4
Banco de dados aula 4Ed W. Jr
 
Aula 6 sql - introdução
Aula 6   sql - introduçãoAula 6   sql - introdução
Aula 6 sql - introduçãoHélio Martins
 
wepik-introducao-aos-conceitos-de-sql-20230620200232U48s.pdf
wepik-introducao-aos-conceitos-de-sql-20230620200232U48s.pdfwepik-introducao-aos-conceitos-de-sql-20230620200232U48s.pdf
wepik-introducao-aos-conceitos-de-sql-20230620200232U48s.pdfJOSIMARMENEGATT2
 

Similaire à Apostila de sql (20)

Basesdedados
BasesdedadosBasesdedados
Basesdedados
 
Modulo 15 PSI
Modulo 15 PSIModulo 15 PSI
Modulo 15 PSI
 
Agbd aula4 sql_ddl
Agbd aula4 sql_ddlAgbd aula4 sql_ddl
Agbd aula4 sql_ddl
 
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptxintroduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
introduao-a-sql-prof-anderson-cavalcanti-ufrn-ct-dca.pptx
 
Bdm aula 9 - operações sql - ticianne darin
Bdm   aula 9 - operações sql - ticianne darinBdm   aula 9 - operações sql - ticianne darin
Bdm aula 9 - operações sql - ticianne darin
 
Aula1
Aula1Aula1
Aula1
 
Aula 11 banco de dados
Aula 11   banco de dadosAula 11   banco de dados
Aula 11 banco de dados
 
3º Fast Show - SQL Analytics
3º Fast Show - SQL Analytics3º Fast Show - SQL Analytics
3º Fast Show - SQL Analytics
 
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
 
Aulas_SQL.pdf
Aulas_SQL.pdfAulas_SQL.pdf
Aulas_SQL.pdf
 
Html - capitulo 11
Html - capitulo 11Html - capitulo 11
Html - capitulo 11
 
Revisao_SQL_Parte_I.ppt
Revisao_SQL_Parte_I.pptRevisao_SQL_Parte_I.ppt
Revisao_SQL_Parte_I.ppt
 
Aula 05 acessando o mysql
Aula 05   acessando o mysqlAula 05   acessando o mysql
Aula 05 acessando o mysql
 
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
 
Banco de dados aula 4
Banco de dados aula 4Banco de dados aula 4
Banco de dados aula 4
 
Aula 6 sql - introdução
Aula 6   sql - introduçãoAula 6   sql - introdução
Aula 6 sql - introdução
 
Aula10 sql-ddl
Aula10 sql-ddlAula10 sql-ddl
Aula10 sql-ddl
 
Um pouco sobre sql
Um pouco sobre sqlUm pouco sobre sql
Um pouco sobre sql
 
Introdução ao BD Postgre
Introdução ao BD PostgreIntrodução ao BD Postgre
Introdução ao BD Postgre
 
wepik-introducao-aos-conceitos-de-sql-20230620200232U48s.pdf
wepik-introducao-aos-conceitos-de-sql-20230620200232U48s.pdfwepik-introducao-aos-conceitos-de-sql-20230620200232U48s.pdf
wepik-introducao-aos-conceitos-de-sql-20230620200232U48s.pdf
 

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 (codEmpr, nome, salário, sexo, estadoCivil, codDepto) Departamento (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. 1
  • 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 (codDepto) ); 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 (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 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). 2
  • 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. 3
  • 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|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 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. 4
  • 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çõ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 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 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 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. 5
  • 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. 6
  • 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 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), 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á 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. 7
  • 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. 8
  • 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 ( codVendedor, nome, idade, comissão ) Produto ( codProduto, nome, preço ) 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 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). 9
  • 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. 10
  • 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 = 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.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 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.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 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. 11
  • 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.nome 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; 12