Linguagem SQL
Introdução



SQL
(Structured
Query
Language):
desenvolvida pela IBM (70) como parte do
sistema System R. A SQL foi inicialmente
chamada de SEQUEL
É a linguagem de consulta padrão para os
SGBDR's
Já existem padrões propostos:
ANSISQL(SQL-89), SQL-92 e padrões mais
recentes: SQL:1999 e SQL:2003.
Introdução

O padrão SQL define precisamente uma
interface para a definição de tabelas, para as
operações sobre as mesmas (seleção,
projeção, junção, e outras) e para a definição
de regras de integridade de bancos de
dados.
Introdução

Categorias



DDL: Linguagem de Definição de Dados. Usada para
definir os esquemas, atributos, visões, regras de
integridade, índices, etc.
DML: Linguagem de Manipulação de Dados. Usada
para se ter acesso aos dados armazenados no BD.
DCL: Linguagem de controle dos dados. Usada para
garantir ou negar o acesso aos dados.
Banco WorldJanu
Modelo Relacional







Banco (codigo, nome, endereco)
Agencia_Bancaria (numagencia, banco_fk,
endereco)
Conta (numconta, saldo, tipo, numagencia_fk,
banco_fk)
Emprestimo (numempr, valor, tipo, numagencia_fk,
banco_fk)
Cliente (codigo, nome, telefone, endereco)
Conta_cliente (cliente_fk, conta_fk)
Emprestimo_cliente (cliente_fk, conta_fk)
DDL
DDL

Os comandos SQL para definição de dados
são:



CREATE: criação de novas estruturas
DROP: remoção de estruturas
ALTER: alteração de estruturas
CREATE TABLE - DDL

CREATE TABLE: especifica uma nova tabela
(relação), dando o seu nome e especificando
as colunas(atributos) (cada uma com seu
nome, tipo e restrições)

Sintaxe:

CREATE TABLE nome_tabela

(coluna tipo_dado)
CREATE TABLE - DDL




create table banco (
codigo int,
nome varchar(50),
endereco varchar(100))
Interbase - Tipos de dados

Tipos em SQL:1999


Numéricos exatos:
 INTEGER (INT) e SMALLINT para representar inteiros
 NUMERIC(p,s): tem uma precisão e uma escala(número
de dígitos na parte fracionária). A escala não pode ser
maior que a precisão. Muito usado para representar
dinheiro
 DECIMAL: também tem precisão e escala. A precisão é
fornecida pela implementação (SGBD).
Numéricos aproximados:
 REAL: ponto flutuante de precisão simples
 DOUBLE: ponto flutuante com precisão dupla
 FLOAT(p): permite especificar a precisão que se quer.
Usado para tranportar (portability) aplicações
Interbase - Tipos de dados

Tipos em SQL:1999

Character
 CHARACTER(x) (CHAR): representa um string de tamanho
x. Se x for omitido então é equivalente a CHAR(1). Se um
string a ser armazenado é menor do que x, então o
restante é preenchido com brancos.
 VARCHAR(N): representa um string de tamanho x.
Armazena exatamente o tamanho do string (tam <= x) sem
preencher o resto com brancos. Neste caso x é obrigatório.
 OBS.: Existem os National character data types: NCHAR,
NVARCHAR, NCLOB que permitem implementar
internacionalização
Interbase - Tipos de dados

Tipos em SQL:1999

Binary Strings (BLOB)

BINARY LARGE OBJECT (BLOB): para armazenar
grande quantidades de bytes como fotos, vídeo,
áudio, gráficos, mapas, etc.
Interbase - Tipos de dados

Tipos em SQL:1999

DATETIMES



DATE: armazena ano (4 digitos), mês (2 digitos) e
dia(2 digitos).
TIME: armazena hora(2digitos), minuto(2 digitos) e
segundo(2digitos, podendo ter frações 0 a 61.9999)
TIMESTAMP: DATE + TIME
Interbase - Tipos de dados

Tipos em SQL:1999

Intervals
 Um intervalo é a diferença entre duas datas e tempos.
Intervalos do tipo year-month ou day-time.
 Year-month interval: contém apenas um valor de ano, ou
de mês ou ambos. YEAR(p), MONTH(p), INTERVAL
YEAR TO MONTH(p)
 Day-Time interval: contém apenas um dia, uma hora, um
minuto e/ou um segundo. INTERVAL DAY(p), INTERVAL
DAY TO HOUR, INTERVAL DAY(6) TO MINUTE,
INTERVAL SECOND(7), etc.

Booleans: lógica de três valores (TRUE, FALSE e
UNKNOWN)
DROP TABLE - DDL

DROP TABLE: remove uma tabela-base do
BD. Remove tanto os dados quanto a
definição da tabela

Sintaxe: DROP TABLE <nomeTabela>

Ex.: DROP TABLE Peca
Restrições - DDL
Not null - DDL

Algumas restrições



NOT NULL: Uma restrição de não-nulo simplesmente
especifica que uma coluna não pode conter o valor nulo.
create table banco (
codigo int not null, nome varchar(50) not null,
endereco varchar(100))
Default - DDL - DDL

Algumas restrições

DEFAULT: indica um valor padrão para a coluna

CREATE TABLE "CLIENTE"
(
"CPF"
INTEGER NOT NULL,
"NOME"
VARCHAR(50),
"TELEFONE"
VARCHAR(13),
"ENDERECO"
VARCHAR(50) default 'Januaria'
);






ALTER TABLE - DDL

Com o comando Alter Table podemos:


Incluir / Alterar / Excluir coluna
Incluir / Excluir restrições
ALTER TABLE - DDL

Incluir uma coluna


Excluir uma coluna


ALTER TABLE banco ADD estado varchar(40)
ALTER TABLE banco DROP estado
Alterar o tipo do campo

ALTER TABLE banco ALTER nome TYPE
varchar(60)
ALTER TABLE - DDL

Adicionar a restrição default



ALTER TABLE banco
ALTER endereco SET DEFAULT ‘Januaria’
Excluir a restrição default


ALTER TABLE banco
ALTER endereco DROP DEFAULT
UNIQUE - DDL

Algumas restrições


UNIQUE: indica que o atributo tem valor único na tabela.
Qualquer tentativa de se introduzir uma linha na tabela
contendo um valor igual ao do atributo será rejeitada.
Serve para indicar chaves secundárias. Nomear as
restrições (CONSTRAINTS)
Deve ser definido primeiramente como NOT NULL




CREATE TABLE BANCO(
CODIGO INT NOT NULL CONSTRAINT
U_BANCOCODIGO UNIQUE,
NOME VARCHAR (40),
ENDERECO VARCHAR(40))
ALTER TABLE - DDL

Adicionar uma restrição Unique


ALTER TABLE banco ADD CONSTRAINT u_bu
UNIQUE(nome)
Remover uma restrição

ALTER TABLE banco DROP CONSTRAINT u_bu
Check - DDL

Algumas restrições

CHECK: Permite especificar que os valores de uma
determinada coluna devem estar de acordo com uma
expressão arbitrária.
 create table conta (
 numconta int not null unique,
 saldo numeric constraint ch_saldo
check(saldo>1000),
 tipo int,
 num_agencia int,
 cod_banco int)
ALTER TABLE - DDL

Adicionar restrição Check

ALTER TABLE conta ADD CONSTRAINT
c_saldo CHECK (saldo>1000)
ALTER TABLE - DDL

Remover constraint

ALTER TABLE BANCO DROP CONSTRAINT
U_BU
Primary key - DDL

Primary key: Indica que a coluna pode ser utilizado como
identificador único para as linhas da tabela. Pode ser
composta por um ou dois campos. Deve ser definida como
not null.









create table banco (
codigo int primary key,
nome varchar (40),
endereco varchar (60))
create table agencia_bancaria (
numagencia int,
codbanco int,
endereco varchar(50),
primary key(numagencia,codbanco))
ALTER TABLE - DDL

Adicionar Chave Primária

alter table agencia_bancaria add primary key
(codbanco,numagencia)
Foreign key - DDL

Foreign key: Especifica que o valor da coluna
deve corresponder a algum valor que existe
em uma linha de outra tabela. Mantém a
integridade referencial entre as tabelas
relacionadas.





create table agencia_bancaria (
numagencia int not null,
codbanco int references banco,
endereco varchar(40),
primary key(numagencia, codbanco))
ALTER TABLE - DDL

Adicionar chave estrangeira

alter table conta add foreign key
(cod_banco,num_agencia) references
agencia_bancaria
Recomendação

É recomendado definir constraints e nomeálas para que o sistema não crie nomes
automáticos que geralmente não são
ilegíveis.
FOREIGN KEY - DDL

Uma cláusula FOREIGN KEY inclui
regras de remoção/atualização:


FOREIGN KEY (coluna)
REFERENCES
tabela [ON DELETE
{RESTRICT|CASCADE|SET NULL| SET
DEFAULT}]
[ON
UPDATE {RESTRICT|CASCADE|SET NULL|
SET DEFAULT}]
Supondo que T2 tem uma chave
estrangeira para T1, vejamos as
cláusulas ON DELETE e ON UPDATE
FOREIGN KEY - DDL

ON DELETE:




RESTRICT: (default) significa que uma tentativa de se
remover uma linha de T1 falhará se alguma linha em T2
combina com a chave
CASCADE: remoção de uma linha de T1 implica em
remoção de todas as linhas de T2 que combina com a
chave de T1
SET NULL: remoção de T1 implica em colocar NULL em
todos os atributos da chave estrangeira de cada linha de T2
que combina.
SET DEFAULT: remoção de linha em T1 implica em
colocar valores DEFAULT nos atributos da chave
estrangeira de cada linha de T2 que combina.
FOREIGN KEY - DDL

ON UPDATE:
-
-


RESTRICT: (default) update de um atributo de T1
falha se existem linhas em T2 combinando
CASCADE: update de atributo em T1 implica que
linhas que combinam em T2 também serão
atualizadas
SET NULL: update de T1 implica que valores da
chave estrangeira em T2 nas linhas que combinam
são postos par NULL.
SET DEFAULT: update de T1 implica que valores da
chave estrangeira de T2 nas linhas que combinam
terão valores default aplicados.
FOREIGN KEY - DDL


As restrições de integridade podem ter um nome e
serem especificadas com a cláusula CONSTRAINT.
Isto permite que possamos no futuro eliminar (DROP)
ou alterar (ALTER) o constraint.
DML
DML

Linguagem de manipulação dos dados




INSERT: inserção de registros
DELETE: deleção de registros
UPDATE: atualização de registros
SELECT: seleção de registros
INSERT - DML


Ao ser criada a tabela não contém nenhum dado.
Os dados são inseridos uma linha por vez.
Os valores dos dados são colocados na mesma
ordem que as colunas aparecem na tabela,
separados por vírgula.


INSERT INTO banco VALUES (1,’Banco 1’,’End 1‘)
Quando não se sabe a ordem das colunas:

INSER INTO banco (nome, endereco, codigo) VALUES
(‘Banco 1’, ‘End 1’, 1)
UPDATE - DML

O comando UPDATE



Modifica o valor de atributos de uma ou mais
tuplas.
Sintaxe:
UPDATE tabela SET lista_atributos com
atribuições de valores [WHERE condição]
Obs.: omitir a cláusula WHERE implica que o
UPDATE deve ser aplicado a todas as tuplas da
relação
DELETE - DML

O comando DELETE


Remove tuplas de uma relação
Sintaxe:
DELETE
FROM tabela
[WHERE condição]

Obs.: Se omitirmos a cláusula WHERE, então o
DELETE deve ser aplicado a todas as tuplas
da relação. Porém, a relação permanece no BD
como uma relação vazia.
DML
DML

Esquemas do BD Empresa:

Empregado(matricula, nome, endereco, salario,
supervisor, depto)
Departamento(coddep, nome, gerente, dataini)
Projeto(codproj, nome, local, depart)
Alocacao(matric,codigop, horas)



SELECT

O comando Select:

A forma básica do comando Select é:
SELECT <lista atributos>
FROM <lista tabelas>
WHERE <condição>
SELECT

Obtenha todos os nomes dos empregados
Select nome
from Empregado

Obtenha o salário de José
Select salario
From Empregado
Where nome = ‘José’

Obs.: Podemos renomear o nome da coluna no resultado
select salario as SalarioJose
from empregado
where nome = ‘José’
SELECT

Obs2: Podemos usar colunas como expressões
select mat as matricula, salario, 0.15 * salario as IR
from empregado

Podemos inserir constantes na cláusula select se
necessário
select nome, ‘marajá’ as Marajá
from empregado
where salario > 10.000,00
SELECT

Selecione todos os atributos de todos os
empregados do departamento Pesquisa
Select *
From Empregado
Where depto = ‘Pesquisa’
SELECT

Obter os nomes dos empregados e o nome
do departamento que ele trabalha

Obter os nomes dos departamentos

Obter os nomes dos projetos e o local de
realização
SELECT

Obter os nomes dos projetos e o nome dos
departamentos que o controlam

Obter o nome do gerente de cada
departamento, com o nome do departamento
SELECT

Selecione o nome e o endereço de todos
os empregados que trabalham no
departamento de produção
Select e.nome, e.endereco
From empregado e join departamento d
Where d.nome = ‘Produção’
SELECT

Obter o nome do empregado, nome do
projeto e as horas trabalhadas
SELECT

Para cada projeto em ‘Fortaleza’, liste o
código do projeto, o departamento que
controla o projeto e o nome do gerente
com endereço e salário
Select p.codigo, d.nome, e.nome, e.endereco,
e.salario
From Projeto p join Departamento d on p.depart
= d.codigo join Empregado e on d.gerente =
e.matricula
Where p.local = ‘Fortaleza’
SELECT

Para cada empregado, recupere seu nome
e o nome do seu supervisor
Select e.nome, s.nome
From Empregado e join Empregado s on
e.matricula = s.supervisor
SELECT

Selecione todos os atributos de todos os
empregados do departamento
Administração



Select e.*
from Empregado e join Departamento d on
e.depto = d.codigo
Where d.nome = ‘Administração’
SELECT - DISTINCT

Algumas vezes surgem duplicatas como
resposta a uma query. Podemos eliminálas usando o comando DISTINCT na
cláusula SELECT

Selecione os diferentes salários pagos pela
empresa aos empregados
Select distinct salario
From empregado
SELECT – ORDER BY

Ordenação


O operador ORDER BY permite ordenar o resultado de
uma query por um ou mais atributos.
Obter uma lista de empregados e seus respectivos
departamentos, listando ordenado pelo nome do
departamento
SELECT d.nome, e.nome
FROM departamento d join empregado e
On d.codigo = e.depto
ORDER BY d.nome, e.nome
SELECT – ORDER BY

Ordenação


A ordem default é ascendente (ASC) caso
queiramos ordem decrescente usamos
DESC
Ex. ORDER BY d.nome DESC, e.nome
ASC
SELECT

Selecione os nomes dos empregados que
ganham mais de 1000 e menos de 10000
reais
SELECT - BETWEEN

BETWEEN:

Sintaxe: expressão [NOT] BETWEEN
expressão AND expressão

Ex.: y BETWEEN x AND Z equivale a x <= y
<= z
Selecione os nomes dos empregados
que ganham mais de 1000 e menos de
10000 reais
SELECT nome
FROM Empregado
WHERE salario BETWEEN 1000 AND 10000

SELECT

Obter os nomes de empregados cujos
endereços estão em Natal, RN
SELECT - LIKE

LIKE:

Permite comparações de substrings. Usa dois
caracteres reservados ‘%’ (substitui um número
arbitrário de caracteres) e ‘_‘ (substitui um único
caracter).
Obter os nomes de empregados cujos
endereços estão em Natal, RN
SELECT nome
FROM empregado
WHERE endereco LIKE ‘%Natal%’

SQL
Funções Agregadas
Funções agregadas

SQL fornece 5 funções embutidas:





COUNT: retorna o número de tuplas ou valores
especificados numa query
SUM: retorna a soma os valores de uma coluna
AVG: retorna a média dos valores de uma
coluna
MAX: retorna o maior valor de uma coluna
MIN: identifica o menor valor de uma coluna

Estas funções só podem ser usadas numa cláusula
select ou numa cláusula HAVING (a ser vista depois)
Funções agregadas

Encontre o total de salários, o maior
salário, o menor salário e a média salarial
da relação empregados


SELECT SUM(salario), MAX(salario), MIN(salario),
AVG(salario)
FROM Empregado
Encontre o maior e menor salário do
departamento de Produção

SELECT MAX(salario), MIN(salario)
FROM Empregado e join Departamento d
on e.depto = d.codigo
WHERE d.nome = ‘Produção’
Funções agregadas


Obtenha o número de empregados da empresa
 SELECT COUNT(*)
FROM empregado
Obter o número de salários distintos do
departamento de Pesquisa
 SELECT COUNT(DISTINCT salario) FROM
empregado e join departamento d on
e.depto=d.codigo
WHERE d.nome =
‘Pesquisa’
 O que aconteceria se escrevêssemos
COUNT(salario) ao invés de COUNT(DISTINCT
salario))?
GROUP BY, HAVING

Cláusula GROUP BY, HAVING

Usadas para lidar com grupos.
Para cada departamento, obter o código do
departamento, o número de empregados e a média
salarial
SELECT depto, COUNT(*), AVG(salario)
FROM Empregado
GROUP BY depto
 as tuplas de empregados são separadas em grupos
(departamento) e as funções COUNT e AVG são
aplicadas a cada grupo separadamente.

GROUP BY, HAVING

Para cada projeto, obter o código do projeto,
seu nome e o número de empregados que
trabalham naquele projeto
SELECT codigop, nome, COUNT(*)
FROM Projeto p join Alocacao a
On p.codigo = a.projeto
GROUP BY p.codproj, p.nome

o agrupamento e as funções são aplicadas após a
junção.
HAVING

HAVING
usada em conjunto com GROUP BY para permitir a
inclusão de condições nos grupos
Para cada projeto que possui mais de 2 empregados
trabalhando, obter o código do projeto, nome do projeto
e número de empregados que trabalha neste projeto
SELECT p.codproj, p.nome, COUNT(*)
FROM Projeto p join Alocacao a
ON p.codigo = a.projeto
GROUP BY codigop, nome
HAVING COUNT(*) > 2
 Uma query é avaliada primeiro aplicando a cláusula
WHERE e depois GROUP BY HAVING


JUNÇÕES
Junções

O padrão SQL:1999 (e o 92) especifica
vários tipos de junções:






Clássica (tabelas separadas por vírgulas como
vimos)
cross-joins
natural joins
conditions joins
column name join
outer joins (left, right, ou full)
Condition Join

Exemplos: Condition Join

usa a cláusula ON para especificar a condição de
junção
Select *
from T1 JOIN T2
ON T1.C1 = T2.C1
é equivalente a:
select *
from T1, T2
where T1.C1 = T2.C1
Junções

Exemplos: Left Outer Join
Select * from T1 left outer join T2 on T1.C1 = T2.C3
T1
T2
Junção left outer de T1 com T2
C1
C2
C3
C4
10
20
15
25
10
15
BB
DD
C1
10
C2
15
C3
10
C4
BB
20
25
Null
Null
Junções

Exemplos: Right Outer Join
Select * from T1 right outer join T2 on T1.C1 = T2.C3
T1
T2
Junção right outer de T1 com T2
C1
C2
C3
C4
10
20
15
25
10
15
BB
DD
C1
10
C2 C3
15 10
C4
BB
Null Null 15
DD
Junções

Exemplos: Full Outer Join
Select * from T1 full outer join T2 on T1.C1 = T2.C3
T1
T2
Junção full outer de T1 com T2
C1
C2
C3
C4
10
20
15
25
10
15
BB
DD
C1
10
C2 C3
15 10
20 25 Null
Null Null 15
C4
BB
Null
DD
Subconsultas
(consultas aninhadas)
Subconsultas


São comandos SELECT aninhados em
outros comandos SELECT, INSERT,
UPDATE ou DELETE ou outras subconsultas
Podem ser utilizadas


Retornando valores únicos e testando-os com
operadores de comparação
Como listas de linhas, através dos operadores IN,
ANY, SOME ou ALL e EXISTS
Subconsultas



Coloque as subconsultas entre parenteses
Elas devem ficar a direita dos operadores
Não use ORDER BY em uma subconsulta
Operadores de comparação
SELECT descricao , preco FROM comida
WHERE preco <
( SELECT AVG(preco) FROM comida)
Operadores de comparação



Select prod.titulo
From produtos prod
Where prod.preco >



(select prod1.preco
From produtos prod1
Where prod1.cod_produto = 142);
Operadores de comparação



Select prod.titulo
From produtos prod
Where prod.importado = ‘N’ and prod.preco >



(select max(prod1.preco)
From produtos prod1
Where prod1.importado = ‘S’);
Operadores de comparação





Select prod.ano_lancamento,
avg(prod.preco)
from produtos prod
group by prod.ano_lancamento
having avg(prod.preco) >




(select avg(prod1.preco)
from produtos prod1
where prod1.ano_lancamento =
trunc(sysdate,'yyyy'));
Exemplo
Script cerveja
CREATE TABLE cerveja (
nome VARCHAR(45),
fabricante VARCHAR(45),
PRIMARY KEY (nome)
);
CREATE TABLE bebe (
pessoa VARCHAR(45),
cerveja VARCHAR(45),
PRIMARY KEY (pessoa, cerveja)
);
CREATE TABLE vende (
bar VARCHAR(45),
cerveja VARCHAR(45),
preco NUMERIC(4,2),
PRIMARY KEY (bar, cerveja)
);
CREATE TABLE frequenta (
pessoa VARCHAR(45),
bar VARCHAR(45),
PRIMARY KEY (pessoa, bar)
);
ALTER TABLE bebe ADD CONSTRAINT bebe_cerveja_fk
FOREIGN KEY (cerveja) REFERENCES cerveja(nome);
ALTER TABLE vende ADD CONSTRAINT
vende_cerveja_fk FOREIGN KEY (cerveja) REFERENCES
cerveja(nome);
INSERT INTO vende VALUES ('Bar X', 'Primus', 1.50);
INSERT INTO cerveja VALUES ('Antarctica Original', 'Ambev');
INSERT INTO cerveja VALUES ('Bohemia Weiss', 'Ambev');
INSERT INTO cerveja VALUES ('Brahma Extra', 'Ambev');
INSERT INTO cerveja VALUES ('Skol', 'Ambev');
INSERT INTO cerveja VALUES ('Budweiser', 'Ambev');
INSERT INTO cerveja VALUES ('Eisenbahn Dunkel',
'Sudbrack');
INSERT INTO cerveja VALUES ('Colonia Pilsen', 'Colonia');
INSERT INTO cerveja VALUES ('Nova Schin Pilsen',
'Schincariol');
INSERT INTO cerveja VALUES ('Primus', 'Schincariol');
INSERT INTO bebe VALUES ('Fulano','Brahma Extra');
INSERT INTO bebe VALUES ('Joao','Skol');
INSERT INTO bebe VALUES ('Joao','Brahma Extra');
INSERT INTO bebe VALUES ('Joao','Primus');
INSERT INTO bebe VALUES ('Joao','Nova Schin Pilsen');
INSERT INTO bebe VALUES ('Amadeu','Eisenbahn Dunkel');
INSERT INTO bebe VALUES ('Joana','Budweiser');
INSERT INTO bebe VALUES ('Timoteo','Antarctica Original');
INSERT INTO vende VALUES ('Bar BQ', 'Nova Schin Pilsen',
1.00);
INSERT INTO vende VALUES ('Bar BQ', 'Skol', 2.00);
INSERT INTO vende VALUES ('Bar BQ', 'Colonia Pilsen', 1.50);
INSERT INTO vende VALUES ('Bar BQ', 'Budweiser', 2.00);
INSERT INTO vende VALUES ('Bar BQ', 'Brahma Extra', 2.00);
INSERT INTO frequenta VALUES ('Fulano','Bar BQ');
INSERT INTO frequenta VALUES ('Joao','Bar Bada');
INSERT INTO frequenta VALUES ('Amadeu','Bar X');
INSERT INTO frequenta VALUES ('Joana','Bar BQ');
Exemplo

Encontrar cervejas vendidas abaixo do
preço médio.

select cerveja from vende where preco <
(select avg(preco) from vende)
Exemplo

Encontrar as cervejas vendidas pelo mais
baixo preço.

select cerveja from vende where preco =
(select min(preco) from vende)
Operador IN




Retorna as linhas iguais a qualquer linha da
subconsulta
Podemos usar NOT IN
Equivalente a =ANY
O operador IN aceita a comparação
simultânea de mais de uma coluna
Operador IN



Select ped.num_pedido
From pedidos ped
Where ped.cod_cliente in


(select adm.cod_administrador
From administradores adm);
Operador IN







select ped.num_pedido
from pedidos ped
where (ped.cod_cliente, ped.cod_endereco)
in
(select end.cod_cliente, end.cod_endereco
from enderecos
where end.cod_cidade = 20);
Operadores ANY e SOME


Compara um valor com cada linha da subconsulta,
utilizando um operador de comparação
ANY e SOME são sinonimos







select prod.titulo
from produtos prod
where prod.importado = 'N' and prod.preco
> ANY
(select prod1.preco
from produtos prod1
where prod1.importado = 'S');
Operador ALL

Compara um valor com todas as linhas da
subconsulta, utilizando um operador







select prod.titulo
from produtos prod
where prod.importado = 'N' and prod.preco
> ALL
(select prod1.preco
from produtos prod1
where prod1.importado = 'S');
Is null

Podemos verificar valores nulos
através de IS NULL e IS NOT NULL:

Selecione os nomes de todos os
empregados que não têm supervisores
SELECT nome
FROM empregado
WHERE supervisor IS NULL
Exemplo

Encontrar nomes de cervejas que nenhuma
pessoa bebe.

select nome from cerveja where nome not
in (select cerveja from bebe)
Exemplo

Encontrar pessoas que bebem cerveja mas
não freqüentam bares.

select pessoa from bebe where pessoa not in
(select pessoa from frequenta)
Exemplo

Encontrar bares que vendem pelo menos
uma cerveja que 'Fulano' bebe.

select distinct bar from vende where cerveja
= any(select cerveja from bebe where pessoa
= 'Fulano')
Exemplo

Encontrar nomes de fabricantes de cada
cerveja que 'Fulano' bebe.

select fabricante from cerveja where nome in
(select cerveja from bebe where
pessoa='Joao')
Exemplo

Encontrar cervejas que são o único produto
de seu fabricante.

select nome from cerveja where fabricante in
( select fabricante from cerveja
group by fabricante having count(*)=1)

Exemplo

Encontrar bares que sao frequentados por
Fulano OU que vendem cerveja a menos de
R$ 2,00.

select bar from frequenta where pessoa =
'Fulano' or bar in (select bar from vende
where preco <2)
Exemplo

Encontrar pessoas e cervejas tal que: a
pessoa bebe a cerveja E a pessoa freqüenta
um bar que vende a cerveja.

select pessoa, cerveja from bebe
where pessoa in (
select pessoa from frequenta where bar in (
select bar from vende where vende.cerveja =
bebe.cerveja))



Exemplo

Encontrar cervejas do fabricante 'Ambev' que
NÃO são vendidas no bar 'Bar BQ'.

select nome from cerveja
where fabricante = 'Ambev'
and nome not in (select cerveja from vende
where bar='Bar BQ')


Download

SELECT