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)

Anônimo 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