You are on page 1of 57

SQL

 Structured Query Language


 Linguagem de Consulta Estruturada
 Além de realizar consultas ao BD,
possui muitos outros recursos como:
 Definição da estrutura de dados
 Modificação de dados no BD
 Especificação de restrições de segurança
Linguagens de consulta
 SQL
 Combina álgebra relacional e cálculo
relacional
 QBE (Query-by-Example)
 Baseada no cálculo relacional de domínio
 QUEL
 Baseada no cálculo relacional de tuplas
SQL

 Versão original desenvolvida pela IBM, no


início dos anos 70
 Originalmente denominada Sequel
 Structured English Query Language

 Linguagem de Consulta Estruturada em Inglês
SQL
 É composta de:
 Linguagem de definição de dados

 Linguagem de manipulação de dados

 Incorporação DML

 Definição de visões

 Autorização

 Integridade

 Controle de transações
SQL
 A estrutura básica de uma expressão em
SQL é composta de três cláusulas:
 Select

Corresponde à operação de PROJEÇÃO da
álgebra relacional
 From
 Corresponde à operação de produto cartesiano
da álgebra relacional
 Where
 Corresponde à seleção do predicado da álgebra
relacional
Cláusula select
 Encontre os nomes de todas as
agencias da relação emprestimo
 select agencia_nome
 from emprestimo; (omissão de where ⇒ predicado é
TRUE)

 Encontre os nomes de todas as


agencias da relação emprestimo,
eliminando duplicidades
 select distinct agencia_nome
 from emprestimo;
 
Cláusula select
 Encontre os nomes de todas as
agencias da relação emprestimo,
especificando explicitamente que as
duplicidades não serão eliminadas
 select all agencia_nome
 from emprestimo;

 Multiplicar os totais da relação


emprestimo por 100
 select agencia_nome, emprestimo_numero,
total*100
 from emprestimo;
Cláusula where
 Encontre todos os números de
emprestimos feitos na agencia
“Monteiro Lobato” com totais acima
de R$1200
 select emprestimo_numero
 from emprestimo
 where agencia_nome= "Monteiro Lobato" and
total>1200;
Cláusula where
 Encontrar os números de emprestimo cujos
totais estejam entre R$500 e R$1000
inclusive
 select emprestimo_numero

 from emprestimo

 where total between 500 and 1000;

ou
 
 select emprestimo_numero
 from emprestimo
 where total >= 500 and total <= 1000;
Cláusula from
 Encontre os nomes, números de
emprestimo e total de todos os clientes
que tenham um emprestimo no banco
 select cliente_nome,
devedor.emprestimo_numero, total
 from devedor, emprestimo
 where
devedor.emprestimo_numero=emprestimo.empr
estimo_numero;
Cláusula from
 Encontre os nomes e os números de
emprestimo de todos os clientes que
tenham um emprestimo na agencia
“Independência”
 select cliente_nome,
devedor.emprestimo_numero
 from devedor, emprestimo
 where devedor.emprestimo_numero =
emprestimo.emprestimo_numero and
agencia_nome = "Independência";
Operação Rename
 Encontre os nomes e os números de
emprestimo de todos os clientes que
tenham um emprestimo na agencia
“Independência”, substituindo o
atributo emprestimo_numero por
emprestimo_id
 select cliente_nome,
devedor.emprestimo_numero as emprestimo_id
 from devedor, emprestimo

 where devedor.emprestimo_numero =

emprestimo.emprestimo_numero and
agencia_nome
•AS não é opcional = "Independência";
•Não funciona substituir os campos emprestimo_numero, por emprestimo_id
Variáveis Tuplas
 Para todos os clientes que possuem um
emprestimo, encontre seus nomes e
respectivos números de emprestimo e totais
 select distinct cliente_nome,

d.emprestimo_numero, total
 from devedor as d, emprestimo as e

 where d.emprestimo_numero =

e.emprestimo_numero;
 
 Encontre os nomes das agencias que tenham
fundos maiores que ao menos uma agencia
localizada em Taubaté
a palavra
 select distinct a.agencia_nome chave AS é
opcional
 from agencia a, agencia g


Operações com strings
 Encontre os nomes de agencias que
comecem pela letra c
 select agencia_nome
 from agencia
 where agencia_nome like "C%";
Obs: no access usa-se *.

 Encontre os nomes de agencias que


possuam a substring “ça” em seus
nomes
 select agencia_nome
 from agencia
 where agencia_nome like "%ça%";
Operações com strings
 Encontre os nomes de agencias que
não comecem pela letra c
 select agencia_nome
 from agencia
 where agencia_nome not like "C%";
Operações com strings
 Encontre os nomes de agencias que
possuam pelo menos 4 caracteres na
string do seu nome
 select agencia_nome
 from agencia
 where agencia_nome like "____%";
Ordenação
 Classificar em ordem alfabética os
nomes de todos os clientes que
tenham um emprestimo na agencia
“Monteiro Lobato”
 select cliente_nome
 from devedor, emprestimo
 where
devedor.emprestimo_numero=emprestimo.empr
estimo_numero and agencia_nome= "Monteiro
Lobato"
 order by cliente_nome;
Ordenação
 Listar a relação emprestimo inteira em
ordem decrescente de Total. Se
emprestimos possuírem totais iguais,
organizar os números de emprestimo
em ordem ascendente
 select *
 from emprestimo
 order by total desc, emprestimo_numero asc;
Operação de União
 Encontre os nomes de todos os clientes
que tenham um emprestimo, uma
conta ou ambos no banco
 select cliente_nome Como na Álgebra
relacional, as
 from depositante relações
participantes da
 union operação de união
precisam ser
 select cliente_nome compatíveis

 from devedor;

 Exercício: obter o resultado da consulta


anterior com todas as repetições
Operação Interseção
 Encontre os nomes de todos os clientes que
tenham emprestimo e conta no banco
Como na Álgebra
relacional, as
relações
participantes da
operação de
interseção precisam
ser compatíveis

 select distinct depositante.cliente_nome


 from depositante, devedor
 where depositante.cliente_nome=devedor.cliente_nome;

Exercício: obter o resultado da consulta anterior com


todas as repetições
Operação Diferença
 Encontre os nomes de todos os clientes que
tenham uma conta e nenhum emprestimo no
banco
Como na Álgebra
relacional, as
relações
participantes da
operação Diferença
precisam ser
compatíveis

 select distinct cliente_nome


 from depositante
 where cliente_nome not in (select cliente_nome from
devedor);

 Exercício: obter o resultado da consulta anterior


com todas as repetições
Funções Agregadas
 Funções que tomam um conjunto ou
subconjunto de valores como entrada
e retornam um valor simples
 Existem cinco funções agregadas:
 Média (average): avg
 Mínimo (minimum): min
 Máximo (maximum): max
 Total (total): sum
 Contagem (count): count
Funções Agregadas
 A entrada para sum e avg precisa ser
um conjunto de números
 As outras operações podem operar
com dados não numéricos como
strings
Funções Agregadas - Avg
 Encontre a média dos saldos em contas
na agencia “Monteiro Lobato”
 select avg(saldo)

 from conta

 where agencia_nome="Monteiro Lobato";


Funções Agregadas - Avg
 É possível aplicar funções agregadas
não somente a um conjunto de tuplas,
mas também a um grupo de conjunto
de tuplas utilizando a cláusula Group
by
 Encontre a média dos saldos nas
contas de cada uma das agencias do
banco
 select agencia_nome, avg(saldo)

 from conta


Funções Agregadas -
Count
 Encontre o número de depositantes de
cada agencia

select agencia_nome, count(distinct
cliente_nome)
 from conta, depositante
 where conta.conta_numero =
depositante.conta_numero
 group by agencia_nome;
Não é
permitido o
uso do distinct
com o count
Funções Agregadas - Avg
 Quando a condição não se aplica a
uma única tupla, mas a cada grupo
determinado pela cláusula group by
utiliza-se a cláusula Having
 Encontre quais agencias possuem
média dos saldos aplicados em conta
maior que 600
 select agencia_nome, avg(saldo)

 from conta

 group by agencia_nome

 having avg(saldo)>600;
Funções Agregadas - Avg
 Encontre a média dos saldos de todas
as contas
 select avg(saldo)
 from conta;
Funções Agregadas -
Count
 Encontre o número de tuplas da
relação cliente
 select count(*)
 from cliente; Não é
permitido o
uso do distinct
com o
count(*)
Funções Agregadas - Avg
 Encontre o saldo médio para cada
cliente que mora em Mairiporã e tenha
ao menos uma conta
 select depositante.cliente_nome, avg(saldo)
 from cliente, depositante, conta

 where cliente_cidade= "Mairiporã" and

cliente.cliente_nome=depositante.cliente_nome
And
depositante.conta_numero=conta.conta_numero
 group by depositante.cliente_nome

 having count(depositante.cliente_nome) >= 1;


Se uma cláusula Where e uma cláusula Having aparecem na mesma consulta, o
predicado de Where é aplicado primeiro. As tuplas que satisfazem a Where são
agrupadas pela cláusula Group by. Somente então Having é aplicada a cada grupo.
Funções Agregadas - Avg
 Encontre o saldo mais alto em
uma conta do banco
 select max(saldo)
 from conta
Valores Nulos
 Encontrar todos os números de
emprestimo que aparecem na relação
emprestimo com valores nulos para
total
 select emprestimo_numero

 from emprestimo

 where total is null;

O predicado IS NOT NULL testa a ausência de valores nulos.


Valores Nulos
 Totalize o montante de todos os
emprestimos
 select sum(total)

 from emprestimo;
Subconsultas Aninhadas
– Membros de Conjuntos
 Encontre todos os clientes que tenham
tanto conta quanto emprestimo no
banco
 select distinct cliente_nome
 from devedor
 where cliente_nome in (select cliente_nome from
depositante);

O conectivo NOT IN verifica a ausência de membros de um conjunto


Subconsultas Aninhadas –
Membros de Conjuntos
 Encontre todos os clientes que tenham
tanto conta quanto um emprestimo na
agencia “Monteiro Lobato”
 select distinct cliente_nome
 from depositante, conta
 where depositante.conta_numero = conta.conta_numero
and agencia_nome = "Monteiro Lobato" and cliente_nome
in
 (select cliente_nome
 from devedor, emprestimo
 where devedor.emprestimo_numero =
emprestimo.emprestimo_numero and agencia_nome =
"Monteiro Lobato" );
Subconsultas Aninhadas
– Membros de Conjuntos
 Selecione os nomes do clientes que
tenham um emprestimo no banco e
cujos nomes não sejam nem Silvio nem
João
 select distinct cliente_nome

 from devedor

 where cliente_nome not in

("Silvio","João");
– Comparação de
Conjuntos
 Encontre os nomes das agencias que
tenham fundos maiores que ao menos
uma agencia localizada em Taubaté
 select agencia_nome
 from agencia
 where fundos > some (select fundos from
agencia
 where agencia_cidade =
 "Taubaté" )

A SQL permite também comparações < some, <= some, >= some, = some
e <> some. Obs: = some é idêntico a in, e <> some não é idêntico a not in.
Remoção
 Remova todos os registros de conta do
cliente Silvio
 delete
 from depositante
 where cliente_nome="Silvio";
 
 Remova todos os emprestimos com
total entre R$1300 e R$1500
 delete
 from emprestimo
 where total between 1300 and 1500;
Inserção
 Inserir na agencia Caçapava, a conta
de número A-307, com um saldo de
R$1200
 insert into conta
 values ("A-307", "Caçapava " ,1200);
Atualização
 Aumentar todos os saldos em 5%

update conta

set saldo = saldo * 1.05;

 Alterar o dado de um atributo


 update conta
 set saldo = 580
 where saldo=525;
Tipos de Domínio em SQL
 char(n) ou character(n) – cadeia de
caracteres de tamanho fixo n
 varchar(n) ou character varying(n) –
cadeia de caracteres de tamanho
variável
 Tamanho máximo n
 int ou integer – subconjunto finito dos
inteiros
 Depende do equipamento
 smallint – inteiro pequeno
 Subconjunto dos inteiros que depende do
equipamento
Tipos de Domínio em SQL
 numeric(p,d) – número de ponto fixo,
cuja precisão é definida pelo usuário
 onde p é a quantidade de dígitos do
número e
 d é o número de casas decimais
 Exemplo:
 numeric(3,1) permite 44,5
 não permite 444,5
 não permite 0,32
Tipos de Domínio em SQL
 real - número de ponto flutuante, cuja
precisão depende do equipamento
 double precision – número de ponto
flutuante de precisão dupla, cuja
precisão depende do equipamento
 float(n) – número de ponto flutuante,
com precisão definida pelo usuário em
pelo menos n dígitos
Tipos de Domínio em SQL
 date – data contendo ano com quatro
dígitos, mês e dia do mês
 time – horário em horas, minutos e
segundos
 Obs.: a SQL permite que a declaração de
domínio de um atributo seja especificada
como NOT NULL
 A SQL92 permite a definição de domínios
usando a cláusula create domain
 Exemplo:
 create domain nome_pessoa char(20)
Definição de Esquema em
SQL
 Uma relação SQL é definida pelo
comando create table:
create table r (A1D1, ..., AnDn,
<regras de ibtegridade1>,
...,
<regras de integridadek>)
 Onde:
 r: nome da relação
 Ai: nome do atributo
 Di: tipo de domínio
Definição de Esquema em
SQL
 As regras de integridade, permitidas
pelo comando create table, englobam:
 primary key (Aj1, Aj2, ..., Ajm)
 diz que os atributos Aj1, Aj2, ..., Ajm formam a
chave primária da relação
 check (P)

especifica um predicado P que precisa ser
satisfeito por todas as tuplas em uma relação
Exemplo de Definição de
Esquema em SQL
create table cliente (
cliente_nome char(30) not null,
cliente_rg char(12),
cliente_rua char(30), Obs.: Os atributos
cliente_rua_numero smallint, declarados como
cliente_bairro char(20), chave primária são
cliente_cidade char(20), necessariamente not
cliente_estado char(2), null e unique
primary key (cliente_nome))

create table agencia (


agencia_nome char(20),
agencia_cidade char(20),
fundos integer,
primary key (agencia_nome),
check (fundos >= 0))
Exemplo de Definição de
Esquema em SQL – Cont.
create table conta (
conta_numero char(5),
agencia_nome char(20),
saldo integer,
primary key (conta_numero),
foreign key (agencia_nome) references agencia,
check (saldo >= 0))

create table depositante (


cliente_nome char(30),
conta_numero char(5),
primary key (cliente_nome, conta_numero),
foreign key (cliente_nome) references cliente,
foreign key (conta_numero) references conta)
Exemplo de Definição de
Esquema em SQL – Cont.
create table emprestimo (
agencia_nome char(20),
emprestimo_numero char(4),
total integer,
primary key (emprestimo_numero),
foreign key (agencia_nome) references agencia)

create table devedor (


cliente_nome char(30),
emprestimo_numero char(4),
primary key (cliente_nome, emprestimo_numero),
foreign key (cliente_nome) references cliente,
foreign key (emprestimo_numero) references
emprestimo)
Inserção de Dados
INSERT INTO cliente VALUES('ADEMAR','31-326-028-3','RUA JORGE WINTER',
11,'CENTRO','TAUBATÉ','SP');
INSERT INTO cliente VALUES('ANDRÉ','32-326-028-3','RUA JAQUES FELIX',
12,'CENTRO','TAUBATÉ','SP');
INSERT INTO cliente VALUES('BRUNA','33-326-028-3','AV. GETÚLIO VARGAS',
13,'CENTRO','PINDAMONHANGABA','SP');
INSERT INTO cliente VALUES('CARLOS','34-326-028-3','RUA GENERAL CANA BARROS',
14,'CENTRO','CAÇAPAVA','SP');
INSERT INTO cliente VALUES('GLENDA','35-326-028-3','AV. ADEMAR DE BARROS', 15,'CENTRO','SÃO
JOSÉ DOS CAMPOS','SP');
INSERT INTO cliente VALUES('HELENA','36-326-028-3', 'AV. PRESIDENTE DUTRA',
16,'CENTRO','GUARATINGUETÁ','SP');
INSERT INTO cliente VALUES('JOANA','37-326-028-3','RUA BARÃO DE MESQUITA', 17,'CENTRO','RIO
DE JANEIRO','RJ');
INSERT INTO cliente VALUES('JOÃO','38-326-028-3','AV. PRESIDENTE DUTRA',
18,'CENTRO','GUARATINGUETÁ','SP');
INSERT INTO cliente VALUES('LILIANE','39-326-028-3','RUA JORGE WINTER',
19,'CENTRO','TAUBATÉ','SP');
INSERT INTO cliente VALUES('SILVIO','40-326-028-3','RUA GENERAL CANA BARROS',
20,'CENTRO','CAÇAPAVA','SP');
INSERT INTO cliente VALUES('TIAGO','41-326-028-3','AV. VOLUNTÁRIOS DA PÁTRIA',
21,'CENTRO','MAIRIPORÃ','SP');
INSERT INTO cliente VALUES('VIVIAN','42-326-028-3','AV. VOLUNTÁRIOS DA PÁTRIA',
22,'CENTRO','MAIRIPORÃ','SP');
INSERT INTO cliente VALUES('WILLIAM','43-326-028-3','AV. PAULISTA', 23,'CENTRO','SÃO
PAULO','SP');
Inserção de Dados
INSERT INTO agencia VALUES('CAÇAPAVA','CAÇAPAVA',16000000);
INSERT INTO agencia VALUES('CENTRAL', 'GUARATINGUETÁ',8300000);
INSERT INTO agencia VALUES('CENTRO', 'MAIRIPORÃ',15000000);
INSERT INTO agencia VALUES('CTA','SÃO JOSÉ DOS CAMPOS',24000000);
INSERT INTO agencia VALUES('INDEPENDÊNCIA',
'GUARATINGUETÁ',47000000);
INSERT INTO agencia VALUES('JUSTIÇA FEDERAL','SÃO JOSÉ DOS
CAMPOS',52000000);
INSERT INTO agencia VALUES('MONTE CASTELO','TAUBATÉ',4000000);
INSERT INTO agencia VALUES('MONTEIRO LOBATO','TAUBATÉ',9000000);
INSERT INTO agencia VALUES('SILVA BARROS',
'GUARATINGUETÁ',68000000);
Inserção de Dados

INSERT INTO CONTA VALUES('A-306', 'CAÇAPAVA',500);


INSERT INTO CONTA VALUES('A-305', 'CENTRO',350);
INSERT INTO CONTA VALUES('A-222', 'CENTRO', 700);
INSERT INTO CONTA VALUES('A-101', 'CTA', 500);
INSERT INTO CONTA VALUES('A-217', 'CTA', 750);
INSERT INTO CONTA VALUES('A-201', 'JUSTIÇA FEDERAL', 900);
INSERT INTO CONTA VALUES('A-215', 'MONTEIRO LOBATO',
700);
INSERT INTO CONTA VALUES('A-102', 'MONTEIRO LOBATO',
400);
Inserção de Dados
INSERT INTO emprestimo VALUES('CAÇAPAVA', 'L-17',750);
INSERT INTO emprestimo VALUES('CENTRAL', 'L-93',500);
INSERT INTO emprestimo VALUES('CENTRO', 'L-16',3000);
INSERT INTO emprestimo VALUES('INDEPENDÊNCIA', 'L-
15',1500);
INSERT INTO emprestimo VALUES('JUSTIÇA FEDERAL', 'L-
23',2000);
INSERT INTO emprestimo VALUES('MONTEIRO LOBATO', 'L-
14',1500);
INSERT INTO emprestimo VALUES('SILVA BARROS', 'L-
11',900);
Inserção de Dados
INSERT INTO devedor VALUES('ADEMAR', 'L-16');
INSERT INTO devedor VALUES('CARLOS', 'L-93');
INSERT INTO devedor VALUES('HELENA', 'L-15');
INSERT INTO devedor VALUES('JOANA', 'L-14');
INSERT INTO devedor VALUES('JOÃO', 'L-17');
INSERT INTO devedor VALUES('SILVIO', 'L-11');
INSERT INTO devedor VALUES('SILVIO', 'L-23');
INSERT INTO devedor VALUES('WILLIAM', 'L-17');
Exercícios
 Inserir dados nas demais tabelas
 Realizar consultas sobre as tabelas
 Execute as mesmas consultas
realizadas no Database Desktop
 Salve o banco de dados
Outros Comandos
 Drop table – remove todas as tuplas e o
esquema de uma relação
 Drop table r
 Exemplo: drop table devedor
 Delete from - remove todas as tuplas de
uma relação
 delete from r
 Exemplo: delete from devedor
 Alter table – adiciona atributos a uma
relação existente
 Alter table r add A D
 Exemplo: Alter table conta add conta_codigo int
Outros Comandos
 Alter table r drop A – remove atributos de
uma relação
 Exemplo: Alter table conta drop conta_codigo
 Alter table r
 add column nacionalidade char(15)

comando para adicionar o atributo nacionalidade à uma
relação

Exemplo:Alter table cliente add column nacionalidade
char(15)
 drop column nacionalidade

comando para eliminar o atributo nacionalidade de
uma relação

Exemplo: Alter table cliente drop column nacionalidade