Ce face EXISTS și NOT EXISTS
EXISTS nu se uită la valori, doar la existența rândurilor. De aceea în subinterogare se scrie adesea SELECT 1. Subinterogarea este de obicei legată de rândul curent (corelată).
NOT EXISTS găsește rândurile care nu au corespondent, de exemplu clienții fără comenzi. Spre deosebire de NOT IN, funcționează corect și când apar NULL-uri.
Parametri
| Parametru | Descriere |
|---|---|
subinterogare |
Interogarea verificată. |
Ce returnează
1 sau 0.
Exemple
Exemplul 1: Clienți cu și fără comenzi
CREATE TABLE clienti (id INT, nume VARCHAR(20));
CREATE TABLE comenzi (id INT, client_id INT);
INSERT INTO clienti VALUES (1, 'Ana'), (2, 'Dan'), (3, 'Ioana');
INSERT INTO comenzi VALUES (10, 1), (11, 1), (12, 3);
SELECT nume,
EXISTS (SELECT 1 FROM comenzi WHERE comenzi.client_id = clienti.id) AS are_comenzi
FROM clienti;
SELECT nume AS fara_comenzi
FROM clienti
WHERE NOT EXISTS (SELECT 1 FROM comenzi WHERE comenzi.client_id = clienti.id);
Rezultat
+-------+-------------+
| nume | are_comenzi |
+-------+-------------+
| Ana | 1 |
| Dan | 0 |
| Ioana | 1 |
+-------+-------------+
+--------------+
| fara_comenzi |
+--------------+
| Dan |
+--------------+
Greșeli frecvente
- Folosești
NOT IN (SELECT client_id FROM comenzi)când subinterogarea poate conțineNULL. Rezultatul devine gol.NOT EXISTSnu are această problemă.
Comenzi înrudite
IN: Verifică dacă o valoare se află într-o listă. Înlocuiește mai multe condiții OR.LEFT JOIN: Leagă două tabele și păstrează toate rândurile din primul, chiar dacă nu au pereche în al doilea.INNER JOIN: Combină rândurile din două tabele care au o valoare comună, de exemplu comenzile cu clienții lor.