domingo, fevereiro 25, 2007

Exists e Not Exists

Uma das funções mais úteis em um SGBD é poder
fazer pesquisas excluíndo ou incluíndo certos
elementos (registros) pertecentes a um grupo ou
outro. Isso pode ser feito no MySQL também
usando o EXISTS e o NOT EXISTS existente em ou-
tros inúmeros SGBDS.

Usando a base de dados TESTE e a tabela Contato
que já havíamos criado vamos criar uma tabela
para guardar uma lista de códigos de contatos
indesejados, a lista negra:

CREATE TABLE LISTANEGRA (
CODCONTATO INT NOT NULL
) ENGINE = INNODB;

Agora em contatos vamos inserir dois indesejá-
veis contatos:

INSERT INTO Contato(CODCONTATO, NOMECONTATO) VALUES(0, 'Spammer');
INSERT INTO Contato(CODCONTATO, NOMECONTATO) VALUES(0, 'Hacker');

Agora como selecionamos somente os contatos que
não estão dentre os indesejáveis?
Usando NOT EXIST:

SELECT co.CodContato, co.NomeContato
FROM Contato co
WHERE NOT EXISTS (SELECT ln.CodContato
FROM ListaNegra ln
WHERE ln.CodContato =
co.CodContato)
ORDER BY co.NomeContato;

+------------+-------------+
| CodContato | NomeContato |
+------------+-------------+
| 1 | Joao |
| 2 | Maria |
+------------+-------------+
2 rows in set (0.00 sec)

Simplesmente estamos trabalhando com operações
de conjuntos.

Agora vamos selecionar o nome dos contatos que
constam entre os barrados:

SELECT co.CodContato, co.NomeContato
FROM Contato co
WHERE EXISTS (SELECT ln.CodContato
FROM ListaNegra ln
WHERE ln.CodContato =
co.CodContato)
ORDER BY co.NomeContato;

+------------+-------------+
| CodContato | NomeContato |
+------------+-------------+
| 4 | Hacker |
| 3 | Spammer |
+------------+-------------+
2 rows in set (0.00 sec)

Aí estão eles.

Bom por hora é isso, ainda estou vendo exemplos
de subqueries mas me parece que o que eu pre-
tendia fazer no MySQL não é válido.

Outra coisa que me deixou meio desmotivado é o
fato de somente o MySQL 5.1.x aceitar o agenda-
mento de tarefas. Por exemplo eu agendar que
um procedimento que gere um script de carga de
dados rode durante a madrugada quando meu sis-
tema estiver ocioso. Essa função somente seria
possível com a versão beta do SGBD.

2 comentários:

Raphael disse...

aee lega!!! Nao conhecia o EXISTS eu sempre uso o "IN" negado "NO INT".
A diferença entre os dois comandos que notei foi q eu no IN vc preciza especificar qual campo esta querendo verificar (hehehe espero nao ter falado boboeira)

Floris Jr 13 = Insanidade Obliqua disse...

bom artigo meu querido! parabéns, esta me ajudando muito em minha iniciação com BDs hehe, agora preciso apreder a jogar td isso com o Java, rs mas isso é outro problema rsrsrs parabéns novamente....

abraços Floris