Sei sulla pagina 1di 16

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

No semestre anterior foram vistas as operações da Álgebra Relacional, importantes para


o entendimento dos tipos de requisitos que podem ser especificados em um banco de
dados relacional. Entretanto, os operações da álgebra relacional são consideradas muito
técnicas para a maioria dos usuários dos SGBDs relacionais, porque uma consulta em
álgebra relacional é escrita como uma seqüência de operações que, quando executadas,
produzem o resultado desejado. Assim, o usuário precisa especificar como - ou melhor,
em qual ordem - as operações de uma consulta devem ser executadas. Já a linguagem
SQL proporciona uma interface declarativa de alto nível, então, o usuário somente
especifica qual será o resultado, deixando com o SGBD a otimização e a decisão de
como, de fato, executar a consulta.
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

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

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)

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.

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

- 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


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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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.

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

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

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

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 (ou de Agrupamento)

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

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

Agrupamentos

As funções de grupo operam sobre grupos de tuplas (linhas). Retornam resultados


baseados em grupos de tuplas em vez de resultados de funções por tupla individual. A
cláusula "goup by" do comando "select" é utilizada para dividir tuplas em grupos
menores.

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

A cláusula "GROUP BY" pode ser usada para dividir as tuplas de uma tabela em
grupos menores. As funções de grupo devolvem uma informação sumarizada para cada
grupo.

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

Encontre o saldo médio de cada agência.


select nome_agencia, avg (saldo)
from conta
group by nome_agencia;

Nota: Qualquer coluna ou expressão na lista de seleção, que não for uma função
agregada, deverá constar da cláusula "group by". Portanto é errado tentar impor uma
restrição do tipo agregada na cláusula "where".

Having

A cláusula "having" pode ser utilizada para especificar quais os grupos deverão ser
exibidos, portanto restringindo-os.

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 cláusula
group by.

A cláusula where não pode ser utilizada para restringir grupos que deverão ser
exibidos. Como exemplificado abaixo:

select nome_agencia, avg (saldo)


from conta Esta seleção está errada
where avg (saldo) > 1200
group by nome_agencia;

Seqüência no comando select

SELECT coluna(s)
FROM tabela(s)
WHERE condição(ões) da(s) tupla(s)
GROUP BY condição(ões) do(s) grupo(s) de tupla(s)
HAVING condição(ões) do(s) grupo(s) de tupla(s)

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

ORDER BY coluna(s)

A "sql" fará a seguinte avaliação:


a) Where, para estabelecer tuplas individuais candidatas (não pode conter funções de
grupo);
b) Group by, para fixar grupos;
c) Having, para selecionar grupos para exibição.

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

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

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

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

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

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

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

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

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/

16

Potrebbero piacerti anche