Sie sind auf Seite 1von 15

Curso de Ciência da Computação - UNIFOR-MG

Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia


____________________________________________________________________________________

SQL (Strutured Query Language)

1. A Linguagem SQL

Embora se fale que a linguagem SQL é uma linguagem de consulta, essa linguagem
possui outras capacidades além de realizar consultas em um banco de dados. A
linguagem SQL possui recursos para definição da estrutura de dados, para modificar
dados no banco de dados e recursos para especificar restrições de segurança e
integridade.
A versão original da linguagem SQL foi desenvolvida no Laboratório de Pesquisa da
IBM. Esta linguagem, originalmente chamada SEQUEL., foi implementada como parte
do projeto System R no início dos anos 70. A linguagem SEQUEL evoluiu e seu nome
foi mudado para SQL (Strutured Query Language). Numerosos Sistemas Gerenciadores
de Banco de Dados suportam a linguagem SQL. A SQL estabeleceu-se como a
linguagem padrão de banco de dados relacional. Embora existam diversas versões, com
algumas diferenças entre elas, a estrutura da SQL se mantém inalterada desde a sua
criação. Atualmente a versão do padrão SQL utilizada é a SQL-99.
Como a especificação do padrão SQL está em expansão, o último padrão SQL-99 foi
dividido em uma especificação de núcleo (core) mais pacotes (packages) opcionais. O
núcleo deve ser implementado por todos os vendedores de SGBDs relacionais
compatíveis com o padrão. Os pacotes podem ser implementados como módulos
opcionais, que podem ser adquiridos independentemente para as aplicações específicas
de um banco de dados, como datamining, dados espaciais, dados temporais, data
warehousing, OLAP, dados multimídia, e assim por diante.

As partes da linguagem SQL


A linguagem SQL pode ser dividida nas seguintes partes:

Data Definition Language (DDL) (Linguagem de Definição de Dados). A SQL


DDL fornece comandos para definição e modificação de esquemas de relação,
remoção de relações e criação de índices. Os principais comandos que fazem parte
da DDL são: CREATE, ALTER, DROP.

Data Manipulation Language (DML) (Linguagem de Manipulação de Dados). A


SQL DML inclui uma linguagem de consulta baseada na álgebra relacional e no
cálculo relacional. Compreende também comandos para inserir, remover e
modificar informações em um banco de dados. Os comandos básicos da DML
são: SELECT, INSERT, UPDATE, DELETE

Data Control Language (Linguagem de Controle de Dados). É o conjunto de


comandos que fazem o cadastramento de usuários e determina seu nível de
privilégio para os objetos do banco de dados. Os principais comandos são:
GRANT, REVOKE.

Transactions control (Controle de Transações). A SQL inclui comandos para


especificação do início e fim das transações. Diversas implementações permitem
o trancamento explícito de dados para o controle de concorrência. (COMMIT,
ROLLBACK, SAVEPOINT)

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

A Linguagem de Definição de Dados (SQL-DDL)

A Linguagem de Definição de Dados da SQL (SQL-DDL) é um conjunto específico de


instruções SQL que fornece meios para a definição e modificação de esquemas de
relação, remoção de relações e criação de índices.

Criando tabelas
Uma tabela (ou relação) SQL é definida usando o comando create table:
create table r (A1 D1, A2 D2,...,An Dn)
onde r é o nome da relação, Ai é o nome de um atributo no esquema da relação r
e Di é o tipo do atributo Ai.

create table cliente


(nome char(30),
sexo char(1),
CPF number(11),
endereco char(30),
cidade char(30) )

Uma relação é criada inicialmente vazia. O comando insert pode ser usado para
carregar os dados para a relação. Muitos produtos de banco de dados relacionais
possuem um grande volume de utilitários para carregar um conjunto inicial de tuplas em
uma relação.

Tipos de domínios em SQL


- char(n). É uma cadeia de caracter de tamanho fixo, com o tamanho n definido pelo
usuário.
- varchar(n). É uma cadeia de caracter de tamanho variável, como tamanho máximo
n definido pelo usuário.
- int. É um inteiro (um subconjunto finito dos inteiros que depende do equipamento).
- smallint. É um inteiro pequeno (um subconjunto do domínio dos tipos inteiros
dependente do equipamento).
- numeric(p,d). É um numero de ponto fixo cuja precisão é definida pelo usuário. O
numero consiste de p dígitos(mais o sinal), sendo que d dos p dígitos estão à direita
do ponto decimal.
- real, double precision. São numeros de ponto flutuante e ponto flutuante de
precisão dupla cuja precisão é dependente do equipamento.
- float(n). É um numero de ponto flutuante com a precisão definida pelo usuário em
pelo menos n dígitos.
- date. Datas, contém um ano (com quatro dígitos), mês e dia do mês.
- time. Representa horário, em horas, minutos e segundos.
Valor nulo é um membro de todos os tipos de domínios. Declarando um domínio de
atributo como sendo not null proibi-se, assim, a inserção de valores nulos para esse tipo
de atributo.

Removendo uma Tabela

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

Para remover uma relação de um banco de dados SQL, usa-se o comando drop table. O
comando drop table remove todas as informações sobre a relação. O comando drop
table r onde r é o nome de uma relação (tabela) existente.

Alterando uma Tabela


O comando alter table é usado para adicionar, excluir ou alterar atributos em uma
relação existente. Para inserir um novo atributo em uma tabela é usada a cláusula add.
Todas as tuplas na relação são assinaladas como null para o valor do novo atributo.

alter table r
add ( A1 D1, A2 D2, ... )
onde r é o nome de uma relação existente e A1 D1, A2 D2, ... é uma lista contendo nome
do atributo (A) a ser adicionado e o tipo do atributo (D), respectivamente.

Para excluir colunas de uma tabela utiliza-se a cláusula drop.


alter table r
drop A1, A2, ...
onde r é o nome de uma relação existente e A1, A2, ... é uma lista dos atributos a serem
removidos.

Para alterar o nome de um atributo de uma tabela utiliza-se a cláusula rename.


alter table r
rename A NA
onde r é o nome de uma relação existente, A é o nome do atributo a ter o seu nome
alterado para NA.

Para alterar o tipo de um atributo utiliza-se a cláusula modify.


alter table r
modify A1 D1, A2 D2, ...
onde r é o nome de uma relação existente, A1 D1, A2 D2,... é uma lista contendo o nome
do atributo (An) a ter o seu tipo alterado para (Dn).

Restrições de Integridade
As restrições de integridade servem para garantir as regras inerentes ao sistema que
está sendo implementado, prevenindo a entrada de informações inválidas pelos usuários
desse sistema. Para isso, o SGBD deve prover ferramentas para a definição de regras de
integridade, a fim de evitar a inconsistência dos dados que nele serão armazenados.

Evitando valores nulos


É muito comum definirmos atributos que não podem conter valores nulos. Isto é, o seu
preenchimento é obrigatório para que se mantenha a integridade dos dados no sistema.
Para evitar que em algum momento uma coluna de uma tabela possa conter valor nulo
(ou não conter valor algum) deve-se utilizar a cláusula NOT NULL após a definição da
coluna.

create table cliente


(nome char(30) NOT NULL,
sexo char(1),
CPF number(11),

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

endereco char(40),
cidade char(20) )

No exemplo acima, a atribuição de um valor à coluna nome é obrigatório. Caso o


usuário se esqueça de preenche-lo, o SGBD apresentará uma mensagem de erro.

Evitando valores duplicados


Podem existir situações onde o valor armazenado em um atributo de um registro deve
ser único em relação a todos os registros da tabela. Isto é, não pode haver dois registros
com o mesmo valor para um determinado atributo.
Para implementar esta restrição de integridade deve-se utilizar a cláusula UNIQUE
após a especificação de uma coluna.

create table cliente


(nome char(30) NOT NULL,
sexo char(1),
CPF number(11) UNIQUE,
endereco char(40),
cidade char(20) )

No exemplo acima, caso o usuário atribua ao campo CPF um valor já existente em


outro registro desta tabela o SGBD apresentará uma mensagem de erro.

Definindo valores default


Pode-se definir um valor padrão para uma coluna acrescentando à sua definição a
cláusula DEFAULT. Esta cláusula permite substituir automaticamente os valores nulos
por um valor inicial desejado.

create table cliente


(nome char(30) NOT NULL,
sexo char(1),
CPF number(11) UNIQUE,
endereco char(40),
cidade char(20) DEFAULT ‘Maceio’ )

Evitando valores inválidos


Existem situações onde o valor de um atributo deve pertencer a um determinado
domínio. Para que o valor de um atributo fique restrito a um conjunto de valores,
utiliza-se a cláusula CHECK. A finalidade da cláusula CHECK é especificar uma
condição, isto é, uma limitação de integridade.

create table cliente


( nome char(30) NOT NULL,
sexo char(1) CHECK(sexo IN (‘M’, ‘F’)),
CPF number(11) UNIQUE,
endereco char(40),
cidade char(20) DEFAULT ‘Maceio’ )

Chave Primária

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

A função da chave primária é identificar univocamente uma linha da tabela. Cada tabela
deve possuir uma chave primária. Quando se define um atributo como chave primaria,
fica implícito as cláusulas UNIQUE e NOT NULL para este atributo, não sendo
necessário a especificação destas.

create table cliente


(codigo number(5) primary key,
nome char(30) not null,
sexo char(1) CHECK(sexo IN (‘M’, ‘F’)),
CPF number(11) UNIQUE,
endereco char(40),
cidade char(20) DEFAULT ‘Maceio’ )

Opcionalmente pode-se definir a chave primária após a especificação de todos os


atributos da tabela.
create table cliente
(codigo number(5),
nome char(30) not null,
sexo char(1) CHECK(sexo IN (‘M’, ‘F’)),
CPF number(11) UNIQUE,
endereco char(40),
cidade char(20) DEFAULT ‘Maceio’,
primary key (codigo) )

ATENÇÃO: Quando uma tabela possui uma chave primária composta por mais de um
atributo, esta forma é OBRIGATÓRIA.

create table movimento


(agencia number(5),
conta number(7),
valor number(16,2),
primary key (agencia, conta) )

Integridade referencial
Freqüentemente desejamos assegurar que o valor de um determinado campo de uma
tabela esteja presente na chave primária de outra tabela. Este campo é chamado chave
estrangeira (FOREIGN KEY).
A SQL original padrão não incluía instruções para especificar chaves estrangeiras. Um
aperfeiçoamento posterior foi aprovado como uma adição ao padrão. Este recurso
permite a especificação de chaves primárias e estrangeiras como parte da instrução
create table.

create table movimento


(agencia number(5) references agencias(codigo),
conta number(7) references contas(numero),
valor number(16,2),
primary key (agencia, conta) )

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

Assim como na definição da chave primária, pode-se definir a chave estrangeira após a
especificação de todos os campos (domínio) da tabela.

create table movimento


(agencia number(5)
conta number(7)
valor number(16,2),
primary key (agencia, conta)
foreign key (agencia) references agencias,
foreign key (conta) references contas)

2. Linguagem de Manipulação de Dados - DML

A principal estrutura da SQL DML consiste em três cláusulas: select, from e where.

select A1, A2, A3, ..., An


from r1, r2, ..., rm
where P

onde Ai representa um atributo


ri é uma tabela
P é um predicado (condição/critério de seleção).

select Fcodigo, status


from Fornecedor
where cidade = ‘Paris’

A condição (ou predicado) que segue where pode incluir operadores de comparação =,
<> (diferente), >, >=, < e <=; os operadores booleanos AND, OR e NOT.

Select Fcodigo, nome


from Fornecedor
where cidade = ‘Paris’
and status > 20

A lista A1, A2, ..., An de atributos pode ser substituída por um asterisco (*) para
selecionar todos os atributos de todas as relações presentes na cláusula from.

select *
from Fornecedor

O resultado da consulta acima será uma cópia da relação Fornecedor. O resultado de


uma consulta SQL é uma relação.

select status
from Fornecedor

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

Linguagens de consultas formais são baseadas em noções matemáticas de relação.


Assim, nunca deveriam aparecem tuplas duplicadas nas relações. Na prática, a
eliminação de duplicação é uma relativa perda de tempo. Todavia, a SQL permite
duplicações em relações.
Nos casos em que queremos forçar a eliminação de duplicações, inserimos a palavra
distinct depois de select.

select distinct status


from Fornecedor

Considere a seguinte relação:

agencia (nome_agencia, cidade_agencia, fundos)


cliente (nome_cliente, rua_cliente, cidade_cliente)
conta (nome_agencia, numero_conta, saldo)
emprestimo (nome_agencia, numero_emprestimo, total)
depositante (nome_cliente, numero_conta)
devedor (nome_cliente, numero_emprestimo)

SQL é baseada em operações em conjuntos e relações com algumas modificações e


melhorias. Uma consulta típica da SQL tem a forma:
select A1, A2, ..., An
from r1, r2, ..., rm
where P

Esta consulta é equivalente à expressão da álgebra relacional:


π A1, A2 , ..., An (σ P (r1 X r2 X ... X rm))
O resultado de uma consulta SQL também é uma relação.

A cláusula select corresponde à operação de projeção da álgebra relacional. Ela é usada


para listar os atributos desejados no resultado de uma consulta.

Achar os nomes de todas as agências na relação empréstimo


select nome_agencia
from emprestimo

Na sintaxe da álgebra relacional “pura”, esta consulta poderia ser:


π nome_agencia (emprestimo)

SQL permite duplicatas nas relações, bem como nos resultados das consultas. Para
forçar a eliminação de duplicatas, deve-se inserir declaração distinct depois do select.

Exemplo: Achar os nomes de todas as agências na relação empréstimo e remover as


duplicatas
select distinct nome_agencia
from emprestimo

A declaração all especifica que duplicatas não devem ser removidas.


select all nome_agencia

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

from emprestimo

A cláusula select pode conter expressões aritméticas envolvendo os operadores +, - , * ,


e /, e operações em constantes ou atributos de tuplas.
A consulta:
select nome_agencia, numero_emprestimo, total * 100
from emprestimo
retornaria uma relação a qual é a igual a relação empréstimo, exceto que o atributo total
é multiplicado por 100.

A cláusula where corresponde ao predicado de seleção da álgebra relacional. Ele


consiste de um predicado envolvendo atributos das relações que aparecem na cláusula
from.
Exemplo: Achar todos os números de empréstimos de empréstimos feitos na agência
Perryridge com totais maiores que $1200.
select numero_empustimo
from emprestimo
where nome_agencia = 'Perryridge' and total > 1200

SQL inclui um operador de comparação between para simplificar cláusulas where que
especificam que um valor deva ser menos ou igual a algum valor e maior ou igual que
algum outro valor.
Exemplo: Achar o número do empréstimo dos empréstimos com total entre $90,000 e
$100,000 (isto é, ≥ $90,000 and ≤ $100,000)
select numero_emprestimo
from emprestimo
where total between 90000 and 100000

A cláusula from corresponde ao produto cartesiano da álgebra relacional . Lista as


relações que serão mapeadas na avaliação da expressão.
Exemplo: Encontre o produto cartesiano devedor × emprestimo
select *
from devedor,emprestimo

Exemplo: Encontre o nome e o número de empréstimo de todos os clientes que possuem


um empréstimo na agência Perryridge.
select distinct nome_cliente,devedor.numero_emprestimo
from devedor,emprestimo
where devedor.numero_emprestimo = emprestimo.numero_emprestimo
and nome_agencia = 'Perryridge'

A SQL possui um mecanismo para renomear tanto relações quanto atributos através da
cláusula as, da seguinte forma nome_antigo as novo_nome

Exemplo: Encontre o nome e o número do empréstimo dos clientes que possuem um


empréstimo na agência Perryridge; substitua o nome da coluna numero_empréstimo por
“numero_do_emprestimo_do_devedor”.

select distinct nome_cliente, devedor.numero_emprestimo as

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

numero_do_emprestimo_do_devedor
from devedor, emprestimo
where devedor.numero_emprestimo = emprestimo.numero_emprestimo
and nome_agencia = 'Perryridge'

Variáveis tuplas são definidas na cláusula from através do uso da cláusula as .

Exemplo: Encontre o nome dos clientes e seus números de empréstimo para todos os
clientes que possuem um empréstimo em alguma agência.
select distinct nome_cliente, T.numero_emprestimo
from devedor as T, emprestimo as S
where T.numero_emprestimo =S.numero_emprestimo

2.1. Operações com Strings

SQL inclui operadores de comparação de strings. Padrões são descritos usando dois
caracteres especiais:
% combina com qualquer substring, independente do tamanho;
– combina caractere a caractere .
Exemplo: Encontre o nome de todos os clientes cuja rua contenha o substring ‘Main’.
select nome_cliente
from cliente
where rua_cliente like '%Main%'

Combine com o substring 'Main%'


like 'Main \ %' escape ' \ '

Características:
- É sensível ao tamanho das letras (case sensitive);
- Permite encontrar diferenças, e não coincidências, através do uso de not like;
- Possui operações de concatenação, extração de substrings, indicação de tamanhos,
conversão de maiúsculas para minúsculas e vice-versa, etc.

2.2. Ordenando o resultado de uma consulta

A linguagem SQL oferece uma maneira de controlar a ordem que as tuplas de uma
relação serão dispostas. A cláusula ORDER BY ocasiona o aparecimento de tuplas no
resultado de uma consulta em uma ordem determinada.

SELECT A1, A2, ..., An


FROM ...r1, r2, ..., rn
WHERE ...p
ORDER BY A1 [ASC/DESC]
A2 [ASC/DESC]
...
An [ASC/DESC]

Onde An são nomes de atributos que servirão como parâmetro de ordenamento da


consulta. A cláusula ORDER BY permite ordenar as linhas do resultado da consulta

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

segundo algum(s) atributo(s) indicado, em ordem crescentes ou decrescente. Quando for


necessário utilizar esta cláusula ela sempre deve aparecer na última linha da consulta.
Não há limite quanto ao número de atributos utilizados para ordenação.
As palavras ASC e DESC determinam se a ordenação será ascendente ou descendente.
Caso nada seja especificado, é assumido a ordenação ascendente (ASC).

select distinct nome_cliente


from devedor, emprestimo
where devedor.numero_emprestimo = emprestimo.numero_emprestimo
and nome_agencia = 'Perryridge'
order by nome_cliente

SQL pode executar uma ordenação por diversos atributos.


select *
from emprestimo
order by total desc, numero_emprestimo asc

Uma vez que a classificação de um grande número de tuplas pode ser custoso, é
aconselhável classificar apenas quando necessário.

2.3. Duplicatas

Em relações com duplicidades, SQL pode definir quantas cópias da tupla aparecem no
resultado.
Em versões multiconjuntos dos operadores da álgebra relacional - dadas as relações r1 e
r2:
1. Se existe c1 cópias da tupla t1 em r1, e t1 satisfaz a seleção σθ, então existem c1
cópias de t1 em σθ(r1);
2. Para cada cópia da tupla t1 em r1, em que existe uma cópia da tupla π A(t1) em
π A(r1), onde π A(t1) denota a projeção de uma tupla única t1;
3. Se existe c1 cópias da tupla t1 em r1 e c2 cópias da tupla t2 em r2, existe c1 × c2
cópias da tupla t1.t2 em r1 × r2.

Suponhas que as relações r1 com o esquema (A,B) e r2 com esquema (C) sejam os
seguintes multiconjuntos:
r1 = {(1,a),(2,a)} r2 = {(2),(3),(3)}
Então π B(r1) poderia ser {(a),( a)}, enquanto π B(r1) × r2 poderia ser
{(a,2),(a,2),(a,3),(a,3),(a,3),(a,3)}
A cláusula SQL
select A1, A2, ..., An
from r1, r2, ..., rm
where P

é equivalente à expressão em álgebra relacional:


π A1, A2, ..., An (σ P (r1 × r2 × ... × rm))

2.4. Funções Agregadas

A linguagem SQL possui algumas função específicas para cálculos em grupos de tuplas:

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

média: avg
mínimo: min
máximo: max
total: sum
contar: count

As operações como a avg são chamadas funções agregadas porque operam em


agregações de tuplas. O resultado de uma função agregada é um valor único. Para
ilustrar, considere os exemplos abaixo:

Encontre a média dos saldos em contas na agência Perryridge.


select avg (saldo)
from contas
where nome_agencia = 'Perryridge'

Encontre o número de tuplas na relação clientes:


select count (*)
from cliente

Encontre o número de depositantes no banco:


select count (distinct nome_cliente)
from depositante

Encontre o número de depositantes em cada agência.


select nome_agencia, count (distinct nome_cliente )
from depositante,conta
where depositante.numero_conta =conta.numero_conta
group by nome_agencia

Nota: Atributos na cláusula select fora das funções agregadas devem aparecer na lista
group by.

Encontre o nome de todas as agências onde a média do saldo das contas seja maior que
$1,200
select nome_agencia, avg (saldo)
from conta
group by nome_agencia
having avg (saldo) > 1200

Nota: predicados na cláusula having são aplicados após a formação dos grupos.

2.5. Valores Null e os Três valores lógicos

É possível para as tuplas ter valor nulo, denotados por null, para alguns de seus
atributos. Significa valor desconhecido ou inexistente. O resultado de uma expressão
aritmética envolvendo null é null. As operações envolvendo null retornam false

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

Em geral, cada NULL é considerado diferente de outro NULL dentro do banco de


dados. Quando um NULL é comparado em uma operação, o resultado é considerado
UNKNOWN (desconhecido - pode ser tanto TRUE (verdadeiro) quanto FALSE
(falso)). Assim, a SQL usa três valores lógicos TRUE, FALSE e UNKNOWN em vez
dos dois valores lógicos-padrão. É necessário, portanto, definir as expressões para os
resultados com os três valores lógicos quando se usam conectivos lógicos como AND,
OR e NOT.

AND TRUE FALSE UNKNOWN


TRUE TRUE FALSE UNKNOWN
FALSE FALSE FALSE FALSE
UNKNOWN UNKNOWN FALSE UNKNOWN

OR TRUE FALSE UNKNOWN


TRUE TRUE TRUE TRUE
FALSE TRUE FALSE UNKNOWN
UNKNOWN TRUE UNKNOWN UNKNOWN

NOT
TRUE FALSE
FALSE TRUE
UNKNOWN UNKNOWN

Resultado da cláusula where é tratado como false se a sua avaliação é desconhecida


– “P is unknown” é true se a avaliação do predicado P é = unknown.

Encontre todos os números de empréstimo que aparecem na relação empréstimo com


valores null para o total.
select numero_emprestimo
from emprestimo
where total is null

Total de todos os empréstimos


select sum (total)
from emprestimo

A declaração acima ignora valores null no total; o resultado será null somente se não
existir nenhuma tupla com o atributo total diferente de null
Todas as operações agregadas, exceto count(*) ignoram tuplas com valores null nos
atributos agregados .

2.6. Subconsultas Aninhadas

SQL provê um mecanismo para aninhamento de subconsultas. Uma subconsulta é uma


expressão select from where que é aninhada dentro de uma outra consulta. As
aplicações mais comuns para as subconsultas são testes para membros de conjuntos,
comparação de conjuntos e cardinalidade de conjuntos.

F in r ⇔ ∃ t ∈ r (t =F)

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

(5 in 0 4 5 ) = TRUE

(5 in 0 4 6 ) = FALSE

(5 not in 0 4 5 ) = FALSE

Exemplos

Encontrar todos os clientes que possuem uma conta e um empréstimo no banco.


select distinct nome_cliente
from devedor
where nome_cliente in (select nome_cliente
from depositante)

Encontrar todos os clientes que tenham um empréstimo no banco mas não tenham uma
conta neste banco.
select distinct nome_cliente
from devedor
where nome_cliente not in (select nome_cliente
from depositante)

Encontrar todos os clientes que tenham uma conta e um empréstimo na agência


Perryridge.
select distinct nome_cliente
from devedor D, emprestimo E
where D.numero_emprestimo = E.numero_emprestimo and
nome_agencia = ‘Perryridge’ and (nome_agencia, nome_cliente) in
(select nome_agencia, nome_cliente
from depositante, conta
where depositante.numero_conta = conta.numero_conta)

Exemplo (Operador not in) - Conjuntos enumerados:


select distinct nome_cliente
from devedor
where nome_cliente not in (‘Smith’, ‘Jones’)

3. Modificando o Banco de Dados

Até agora utilizamos a SQL para extrair informações de um Banco de Dados.


Mostraremos agora como inserir remover ou alterar informações usando a SQL.

3.1. Inserção de registros

Para inserir um dado em uma relação, ou especificamos uma tupla para ser inserida ou
escrevemos uma consulta cujo resultado seja um conjunto de tuplas a serem inseridas.

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

Obviamente, os valores dos atributos para tuplas inseridas precisam ser membros do
domínio do atributo. Da mesma forma, as tuplas inseridas precisam ser do mesmo tipo.
A instrução insert mais simples é uma requisição para inserir uma tupla. Suponha que
desejamos inserir o fato de que Paulo Coelho Farias tem 1.200 na conta 9732 da agência
Pajuçara.

insert into contas


values (‘Pajucara’,9732,’Paulo Coelho Farias’,1200)

No exemplo acima, os valores são especificados na ordem na qual os atributos


correspondentes estão listados no esquema da relação. Para facilitar os usuários que
podem não se lembrar da ordem dos atributos, a SQL permite que os atributos sejam
especificados como parte da instrução insert.

insert into contas(numero_conta, nome_agencia, saldo,


nome_cliente)
values (9732,’Pajucara’,1200,’Paulo Coelho Farias’)

3.2. Remoção de registros

Uma remoção é expressa da mesma forma que uma consulta. Pode-se remover apenas
tuplas inteiras, não podemos remover atributos particulares.

delete from r
where P

P representa um predicado e r representa uma relação.

O comando delete opera em apenas uma relação. Se desejarmos remover tuplas de


diversas relações, devemos usar um comando delete para cada relação. O predicado na
cláusula where pode ser tão complexo quanto uma cláusula where do comando select.
Num outro extremo, podemos ter uma cláusula where vazia.

delete from emprestimos


remove todas as tuplas da relação empréstimos.

"Remova todos os registros da conta de Paulo Coelho Farias"


delete from contas
where nome_cliente = ‘Paulo Coelho Farias’

"Remova todos os empréstimos com números entre 1300 e 1500"


delete from emprestimos
where numero between 1300 and 1500

3.3. Alteração de registros

15
Curso de Ciência da Computação - UNIFOR-MG
Projeto de Banco de Dados (SQL) - Profª. Denise Ferreira Garcia
____________________________________________________________________________________

Em certas situações, podemos desejar mudar um valor em uma tupla sem mudar todos
os valores da tupla. Para isto, a instrução update pode ser usada. Como era o caso para
insert e delete, podemos escolher as tuplas que serão atualizadas usando uma consulta.
Suponha que esteja sendo feito um pagamento de juros, e que em todos os saldos sejam
acrescidos 5%.

update contas
set saldo = saldo * 1.05

A instrução acima é aplicada uma vez para cada tupla em contas. Suponhamos agora
que contas com saldos superiores a 10.000 recebam 6% de juros e todas as outras
recebam 5%.
update contas
set saldo = saldo * 1.06
where saldo > 10000

update contas
set saldo = saldo * 1.05
where saldo <= 10000

A ordem na qual as duas instruções update são escritas é importante. Se mudarmos a


ordem das duas instruções, uma conta cujo saldo esteja abaixo de 10.000 poderá receber
juros de 11.3%.

Referências
Banco de Dados - Elmarsi e Navathe
Apostila da Profª. Adriana Pereira Cocco http://main.unicruz.edu.br/~adriana
Slides do Prof. Murilo Silva de Camargo disponível em
http://www.inf.ufsc.br/~mario/

15

Das könnte Ihnen auch gefallen