Banco de Dados Multimídia - cleiane.com.br · Introdução Categorias DDL: Linguagem de...

104
Linguagem SQL

Transcript of Banco de Dados Multimídia - cleiane.com.br · Introdução Categorias DDL: Linguagem de...

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

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

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

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

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.

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

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

ALTER TABLE banco ADD estado varchar(40)

Excluir uma coluna

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

C1 C2

10 15

20 25

C3 C4

10 BB

15 DD

T1 T2 Junção left outer de T1 com T2

Select * from T1 left outer join T2 on T1.C1 = T2.C3

C1 C2 C3 C4

10 15 10 BB

20 25 Null Null

Junções Exemplos: Right Outer Join

C1 C2

10 15

20 25

C3 C4

10 BB

15 DD

T1 T2 Junção right outer de T1 com T2

Select * from T1 right outer join T2 on T1.C1 = T2.C3

C1 C2 C3 C4

10 15 10 BB

Null Null 15 DD

Junções Exemplos: Full Outer Join

C1 C2

10 15

20 25

C3 C4

10 BB

15 DD

T1 T2 Junção full outer de T1 com T2

Select * from T1 full outer join T2 on T1.C1 = T2.C3

C1 C2 C3 C4

10 15 10 BB

20 25 Null Null

Null Null 15 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 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 vende VALUES ('Bar X', 'Primus', 1.50);

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