Você está na página 1de 11

Claudio Vasconcelos Apostila de SQL página: 1

SQL – STRUCTURED QUERY LANGUAGE


Linguagem de consulta padrão para sistemas de BD relacionais. Uma consulta básica em
SQL é composta por 3 cláusulas:
Select A1, A2, . . . . An
From r1, r2 . . . . . rm
Where P
1) A cláusula Select contém a lista dos atributos (A1, . . . An) que devem aparecer na
tabela resultado.
2) A cláusula From contém as tabelas r1, . . . . rm, cujas tuplas serão combinadas para
resolver a consulta.
3) A cláusula Where contém um predicado (condições) que deve ser satisfeita para que
uma tupla apareça na tabela resultado.
Obs: A) Se a cláusula where for omitida, o predicado P é considerado verdadeiro e
todas as combinações de tuplas de r1, r2 . . . rm aparecem na tabela resultados.
B) A lista de atributos A1, A2, . . . An pode ser substituída por * caso todos os atributos
das relações envolvidas devam aparecer na tabela resultados.
C) O resultado de uma consulta em SQL é sempre uma tabela.
D) SQL permite a ocorrência de tuplas repetidas na tabela resultados, para evitar a
repetição de tuplas usa-se :
Select distinct A1, A2, . . . An
From r1, r2, . . . rm
Where P

Exemplos:
Forneça o código das agências onde há depósitos:
Select distinct Cod_Ag
From C_Depósitos;

1) Forneça o nome dos clientes que tenham empréstimos com valor maior que 10000.00 e
também o valor.
Select distinct Nome_Cli, Valor
From C_Empréstimos
Where Valor > 10000.00;

Conectivos lógicos: and --> e; or --> ou; not --> negação.


2) Forneça o código e nome das agências onde há empréstimos com valor maior que
10000.00.
Select distinct Agências.Cod_Ag, Nome_Ag.
From Agências, C_Empréstimos
Where Valor > 10000.00 and Agências.Cód_Ag. = C_Empréstimos.Cód_Ag;

3) Forneça o nome e endereço dos clientes com depósitos na agência 010 ou 034.
Select distinct Clientes.Nome_Cli, Endereco
From Clientes, C_Depósitos
Where Clientes.Nome_Cli = C_Depósitos.Nome_Cli and (Cód_Ag = 010 or Cód_Ag =
034).
Claudio Vasconcelos Apostila de SQL página: 2

OPERAÇÕES DE CONJUNTO

1) UNION: faz a união de tuplas de duas relações (equivalente a operação de U da A.R.)


As relações devem ser compatíveis para que a operação de união se complete com
sucesso, isto é, as relações devem ter o mesmo número de atributos e os atributos
correspondentes devem ser do mesmo domínio.
Exemplo: 5) Forneça o nome e a cidade dos clientes da agência 0052.

Select distinct Clientes.Nome_Cli, Cidade


From C_Empréstimos, Cliente
Where Cod_Ag = 0052 and Clientes.Nome_Cli = C_Empréstimos.Nome_Cli
Union
Select distinct Clientes.Nome_Cli, Cidade
From C_Depósitos, Clientes
Where Cod_Ag = 0052 and Cliente.Nome_Cli = C_Depósitos.Nome_Cli

Outra forma para a mesma consulta:

Select distinct Clientes.Nome_Cli


From C_Depósitos, C_Empréstimos, Clientes
Where (C_Depósitos.Cód_Ag = 0052 and Clientes.Nome_Cli = C_Depósitos.Nome_
Cli) or (C_Empréstimos.Nome_Cli = Cliente.Nome_Cli and C_Empréstimos.Cod_Ag
= 0052)

2) INTERSECT: faz a interseção de tuplas de 2 relações (equivale à ∩ da A.R.). As


relações devem ser compatíveis.
Exemplo: 6) Forneça o nome e cidade dos clientes que têm empréstimos e depósitos na
agência 0052.

Select distinct Clientes.Nome_Cli, Cidade


From C_Empréstimos, Cliente
Where Cod_Ag = 0052 anda Clientes.Nome_Cli = C_Empréstimos.Nome_Cli
Intersect
Select distinct Clientes.Nome_Cli, Cidade
From C_Depósitos, Clientes
Where Cod_Ag = 0052 and Cliente.Nome_Cli = C_Depósitos.Nome_Cli

Outra forma para a essa mesma consulta:

Select distinct Clientes.Nome_Cli


From C_Depósitos, C_Empréstimos, Clientes
Where (C_Depósitos.Cod_Ag = 0052 and Clientes.Nome_Cli = C_Depósitos.Nome_
Cli) and (C_Empréstimos.Nome_Cli = Cliente.Nome_Cli and
(C_Empréstimos.Cod_Ag = 0052)
Claudio Vasconcelos Apostila de SQL página: 3

3) MINUS: faz a diferença de duas relações, isto é, apresenta as tuplas que estão na
primeira relação mas não estão na Segunda relação (equivale à – de A.R.).
As relações devem ser compatíveis.
Exemplo: 7) Forneça o nome dos clientes que possuem empréstimos na ag. 0052, mas que
não têm depósitos nesta agência.

Select distinct Nome_Cli


From C_Empréstimos
Where Cód_Ag = 0052
Minus
Select distinct Nome_Cli
From C_Depósitos
Where Cod_Ag = 0052

Conectivo in: verifica se uma tupla pertence à (está dentro de) uma tabela. Se a tupla
pertencer à tabela o in retorna verdadeiro, senão retorna falso.
Not-in: testa se uma tupla não pertence a uma tabela.

Exemplo: 8) Forneça o nome das agências onde não há nenhum empréstimo com valor
maior que 20.000,00.
Select Nome_ag
From C_Empréstimo, Agência
Where C_Empréstimo.Cód_Ag = Agência.Cód_Ag and valor ≤ 20.000,00

A consulta acima não resolve a questão, pois mostra o nome da agencia se existir um
empréstimo com valor menor do que 20.000,00. Para mostrar se não há nenhum
empréstimos com valor maior que 20.000,00 devemos usar:

Select Nome_Ag.
From Agências
Where Cod_Ag not in (Select Cód_Ag
From C_Empréstimo
Where Valor > 20.000,00)

Exemplo: 9) Forneça o nome do clientes que têm depósitos e empréstimos na agência 0052
(usando in)

Select distinct Nome_Cli


From C_Empréstimos
Where Cód_Ag = 0052 and Nome_Cli in (Select distinct Nome_Cli
From C_Depósitos
Where Cód_Ag = 0052)
Claudio Vasconcelos Apostila de SQL página: 4

VARIÁVEIS DE TUPLAS: usados para associar nomes alternativos (mais simples) às


relações.
Objetivo:
• Simplificar a referência às tabelas;
• Possibilitar a comparação de 2 tuplas da mesma tabela.

Exemplo: 10A) Encontre o nome e código das agências onde clientes de Itatiba tenham
empréstimos.

Select Nome_Ag, A.Cód_Ag


From Agência A, Clientes C, C_Empréstimos E
Where A.Cód_Ag = E.Cód_Ag and C.Nome_Cli = E.Nome_Cli and C.Cidade = ‘Itatiba’;

10B) Forneça o nome dos clientes que têm conta de deposito na mesma agência que o
Cliente José, mas com saldo maior que o dele (José).
Select nome_cli
From c_depositos D1, c_depositos D2
Where D1.nome_cli = “ José” and D2.nome_cli <> “José” and D1.cod_ag = D2.cod_ag
and D2.saldo > D1.saldo;

CONECTIVO > ANY (OU > SOME): usado para verificar se um valor é maior que algum
dos valores armazenados em uma tabela.
Conectivos análogos: < ANY (ou < some), ≤ ANY (ou ≤ some), ≥ ANY (ou ≥ some),
=ANY (ou = some), ≠ ANY (ou ≠ some).

Exemplo: 11) Forneça o nome e endereço dos clientes que tenham saldos (de depósitos)
maior que algum dos saldos do clientes Carlos.

Select distinct C.Nome_Cli, Endereco


From Clientes C, Depósitos D
Where C.Nome_Cli = D.Nome_Cli and C.Nome_Cli ≠ ‘Carlos’ and Saldo > any
(Select Saldo
From C_Depósitos
Where Nome_Cli = ‘Carlos’);

CONECTIVO > all: usado para verificar se um valor é maior que todos os valores
armazenados em uma tabela. Análogos: > all, ≤ all, ≥ all.
Exemplo: 12) Forneça o código e nome das agências que fizeram empréstimos com valores
maiores que todos os empréstimos da agência 0052.

Select distinct A.Cod_Ag, Nome_Ag


From Agências A, C_Empréstimos E
Where A.Cog_Ag = E.Cód_Ag and valor > all
(Select Valor
From C_Empréstimos
Where Cod_Ag = 0052;
Claudio Vasconcelos Apostila de SQL página: 5

Para obter resultados em SQL usamos a cláusula Order by A1, A2 . . . . . An

- As tuplas são ordenadas primeiro pelo atributo A1, onde há valores iguais, a
ordenação é feita por A2 e assim sucessivamente.
- O padrão de ordenação é ordem crescente (Asc), para obter ordem decrescente
usaremos um desc após o nome do atributo.
- A ordenação de um grande número de tuplas é uma operação de alto custo, portanto
deve ser feito quando estritamente necessária.

Exemplo: 14) Forneça o nome dos clientes que têm depósitos maiores que 1000 em ordem
alfabética.

Select distinct Nome_Cli


From C_Depósitos D
Where Saldo > 1000
Order by Nome_Cli;

15) Forneça o valor dos empréstimos e o nome e o endereço dos clientes que os fizeram em
ordem decrescente de valor e crescente de nome.

Select Valor, C.Nome_Cli, Endereço


From C_Empréstimos E, Clientes C
Where C.Nome_Cli = E.Nome_Cli
Order by Valor desc, C.Nome_Cli asc;

FUNÇÕES DE GRUPO:

Funções que são aplicadas em um conjunto de tuplas de uma tabela. Opções:


- Média --> AVG (Ai)
- Mínimo --> MIN (Ai)
- Máximo --> MAX (Ai)
- Soma (total) --> SUM (Ai)
- Quantidade (Contar) --> COUNT (A1) ou COUNT (*)

As funções de grupo podem ser aplicadas a todas as tuplas relacionadas pela


consulta ou em grupos de tuplas selecionadas. Para aplicar a função de grupo em grupos de
tuplas é necessário o agrupamento das tuplas usando a cláusula Group by A1, A2 . . . .
Exemplo 16: forneça o nome dos clientes de Campinas e o saldo médio de suas contas.

Select C.Nome_Cli, avg(Saldo)


From C_Depósitos D, Clientes C
Where C.Nome_Cli = D.Nome_Cli and Cidade = ‘Campinas’
Group by C.Nome_Cli;
Claudio Vasconcelos Apostila de SQL página: 6

Exemplo 17: Forneça o total de empréstimos da agência 0052.

Select Sum (Valor)


From C_Empréstimos
Where Cod_Ag = 0052;

As condições da cláusula where são testadas antes de fazer os


agrupamentos das tuplas. Assim sendo, condições envolvendo as funções de grupo não
podem ser testadas na cláusula where. Para essas condições usaremos a cláusula having P.

Exemplo: 18) Encontre o nome das agências e a quantidade de empréstimos feitas em cada
agência (mostrar só o nome das agências onde há mais do que 10 empréstimos).

Select Nome_Ag, count (n_empr)


From Agências A, C_Empréstimos E
WhereA.Cod._Ag = E.Cod_Ag
Group by Nome_Ag
Having count (n_empr) > 10;

Exemplo: 19) Forneça o nome e endereço do cliente com o maior total de depósitos na
agência 010.

Select C.Nome_Cli, Endereço


From Clientes C, C_Depósitos D
Where C.Nome_Cli = D.Nome_Cli and Cod_Ag = 010
Group by C.Nome_Cli, Endereço
Having Sum (Saldo) ≥ all
(Select Sum (Saldo)
From C_Depósitos
Where Cód._Ag. = 010
Group by Nome_Cli);

Exemplo: Forneça o nome dos clientes que têm depósitos nas mesmas agências que o
Carlos, mas com saldo maior que o dele nessa agência.

Select D2.Nome_Cli
From C_Depósitos D1, C_Depósitos D2
Where D1.Nome_Cli = ‘Carlos’ and D2.Nome_Cli ≠ ‘Carlos’ and D1.Cod_Ag =
D2.Cód_Ag and D2.Saldo > D1.Saldo;
Claudio Vasconcelos Apostila de SQL página: 7

CONECTIVO EXISTS (E NOT EXISTS)

Usados para testar se existe (ou não) pelo menos uma tupla em uma tabela.
Exists --> retorna verdadeiro se a tabela está vazia.

Exemplo: Encontre o nome dos clientes que tenham depósitos na agência 0052 que não
estão cadastrados na tabela de clientes.

Select distinct D.Nome_Cli


From C_Depósitos D
Where Cod_Ag = 0052 and not exists (Select *
From Clientes C
Where D.Nome_Cli = C.Nome_Cli);

Exemplo: Forneça o nome dos clientes que possuem empréstimos em todas as agências de
Campinas.

Select
From Clientes C
Where not exists (Select Cód._Ag.
From Agências
Where Cidade = ‘Campinas’ and Cod_Ag not in
(Select Cod._Ag
From C_Empréstimos E
Where C.Nome_Cli = E.Nome_Cli ) ) ;
Claudio Vasconcelos Apostila de SQL página: 8

MODIFICANDO INFORMAÇÕES DO B.D.

Linguagens de consulta comerciais oferecem mecanismos para modificar as


informações armazenadas no B.D. incluindo comandos para inserir e remover tuplas e
atualizar valores de campos de uma tabela. Para que essas operações sejam realizadas com
sucesso elas não podem violar nenhuma restrição de integridade e o usuário que as solicitar
deve ter as devidas permissões.

1) EXCLUSÃO: delete r ou delete from r


where p where p
Todas as tuplas da relação (tabela) “r” que satisfazem o predicado “p” são excluídas
integralmente dessa tabela. Cada comando delete opera em uma única tabela. Para excluir
tuplas de várias tabelas é necessário usar um comando para cada tabela.
A cláusula where pode ser omitida, nesse caso todas as tuplas da relação “r” serão
excluídas (a tabela “r” fica vazia). A cláusula where pode ser tão complexa quanto nos
comandos de seleção (select – from – where).
A ordem das exclusões é muito importante.
Exemplos:
1) Exclua todas as contas de empréstimos.

Delete C_Empréstimos;

2) Exclua as agências de Itatiba bem como as contas de depósitos dessas agências.

Delete from C_Depósitos


Where Cod_Ag in (Select Cod_Ag
From Agências
Where cidade = ‘Itatiba’);
Delete from Agências
Where Cidade = ‘Itatiba’;

2) INSERÇÃO: Há duas maneiras de inserir tuplas em tabelas usando SQL.


a) Especificando valor a valor à tupla a ser inserida.
Insert Into r
values (V1, V2, V3, . . . . . Vn)
Os valores V1, V2, V3, . . . . . Vn devem pertencer ao domínio dos atributos
correspondentes em “r”. Campos para o quais não temos valores a inserir devem ser
preenchidos com “null”. (A inserção não será permitida se o campo não tiver sido definido
como “not-null”).
Exempto: Cadastre o cliente Rodrigo de Itatiba que abriu uma conta de depósitos
com o n.º 1520-1 na agência 010, com saldo inicial de 50,00.
Insert into Clientes
Values (‘Rodrigo’, null, ‘Itatiba’);

Insert into C_Depósitos


Values (010, 1520-1, ‘Rodrigo’, 50.00);
Claudio Vasconcelos Apostila de SQL página: 9

b) Faz-se uma consulta cujo resultado é um conjunto de tuplas que será inserido na
tabela “r”.
Insert into r
Select A1, A2, . . . . . An
From r1, r2, . . . . . . rm
Where p
Os valores dos atributos A1, A2, . . . . . An, serão cadastrados nos atributos
correspondentes de r (devem pertencer aos domínios dos mesmos).
Exemplo: Abra uma conta de depósito para cada cliente que tem um empréstimo na agência
0052. Essa nova conta terá o mesmo número que o empréstimo e saldo inicial de 20,00.
Insert into C_Depósitos
Select 0052, n_empr, nome_cli, 20,00
From C_Empréstimo
Where Cod_Ag = 0052

3) ATUALIZAÇÃO:
Update r
Set Ai = Vi
Where p
As tuplas da tabela “r” que satisfazem o predicado “p” tem o atributo Ai atualizado.
A ordem de atualização é importante !!!!!

Exemplo:
1) Atualize o saldo das contas de depósitos da agência 010 com 3% de juros.
Update C_Depósitos
Set Saldo = Saldo*1,03
Where Cod_Ag = 010;
2) Aplique os requisitos taxas de juros nas contas da agência 0052:
- 3% para contas com até 1.000,00
- 5% para as demais

Update C_Depósitos
Set Saldo = Saldo * 1,05
Where Cod_Ag = 0052 and Saldo > 1000,00

Update C_Depósitos
Set Saldo = Saldo * 1,03
Where Cod_Ag = 0052 and saldo <= 1000,00
Claudio Vasconcelos Apostila de SQL página: 10

VISÕES:

VISÃO é uma relação (tabela) virtual montada a partir das relações (tabelas) reais. O
objetivo do uso das visões é restringir o acesso de usuários a apenas parte dos dados de
uma ou mais tabelas ou por comodidade (para o usuário acessar apenas os dados que
lhe são de interesse).
Definição:
Create view V as
From r1, r2, . . . . rn
Where p
Um conjunto de tabelas de um BD pode suportar várias visões diferentes. Os dados
apresentados na visão não são salvos (na visão). Então, toda vez que uma visão for
referenciada, seus dados são acessados nas tabelas originais (isto porque os dados das
tabelas originais podem estar sofrendo alteração e a visão deve refletir essas mudanças).
Exemplo:

1) Crie uma visão com nome e endereço de todos clientes da agência 010.
Creat view Clientes_010 as
Select distinct C.Nome_cli, endereço
From C_Depósitos D, Clientes C
Where C.Nome_cli = D.Nome_cli and Cod_ag = 010
UNION
Select distinct C.Nome_cli, endereço
From C_Empréstimos E, Clientes C
Where C.Nome_cli = E.Nome_cli and Cod_ag = 010

2) Crie uma visão com nome e saldo dos clientes da agência 010.
Create view Depósitos_010 as
Select Nome_cli, saldo
From C_Depósitos
Where Cód_Ag = 010

3) Mostre o nome e endereço dos clientes da agência 010 com o saldo menos que 500,00
(use a visão do exercício 2)
Select C.Nome_cli, endereço
From Depósitos_010 D, Clientes C
Where C.Nome_cli = D.Nome_cli and saldo < 500,00.

Para eliminar uma visão usaremos.


Drop view V;

Pode-se alterar os nomes de campos apresentados na visão. Deve-se usar isso


principalmente quando a visão apresentar resultados calculados (por função de grupo).
Claudio Vasconcelos Apostila de SQL página: 11

Exemplos:
4) Crie uma visão para apresentar o nome dos clientes com empréstimos na agência 010, a
quantidade de empréstimos que eles fizeram e o total emprestado.
Create view Total_Empr (Nome_cli, Quant_Empr, Total) as
Select Nome_cli, count (*), sum (Valor)
From C_Empréstimo
Where Cod_Ag. = 010
Group by Nome_cli;

5) Mostre o nome dos clientes com mais do que 5 empréstimos na agência 010 e o total
emprestado.
Select Nome_cli
From Total_Empr
Where Quant_Empr > 5;

Uma visão pode ser referenciada por qualquer comando (no lugar que apareceria a
referência a uma tabela). Obs: visões são ótimas em consultas, mas apresentam restrições
em operações que modificam dados na base de dados.
Modificações via visão devem ser refletidas nas tabelas originais. A maioria dos
sistemas comerciais só permite modificações nas visões montadas a partir de uma única
tabela real (mesmo assim para que a modificação se complete nenhuma regra de
integridade da tabela original pode ser violada. Por exemplo, em inserções não podem faltar
campos que compõem a chave primária nem campos obrigatório).
Exemplo:
6) Crie uma visão com número da conta, saldo, nome do cliente e endereço para os
clientes com saldo maior que 1000,00.
Create view Visão6 as
Select n_conta, Saldo, C.Nome_cli, Endereço
From Clientes C, C_Depósitos D
Where C.Nome_cli = D.Nome_cli and Saldo > 1000,00

Supondo que fosse possível inserir dados via essa visão mostre o comando para inserir
o cliente João de endereço Rua X, n.º 10 com conta 1214-6, de saldo 2.000,00. Mostre
também como ficariam esses dados nas tabelas originais.

Insert into Visão6


Values (1214-6, 2000,00, ‘João’, ‘Rua X, n.º 10’);

< Clientes (‘João’, ‘Rua X, nº 10’, null)


C_Depósitos (null, 1214-6, null, 2000,00)
RECUSADO