EXISTS și NOT EXISTS în MySQL

Verifică dacă o subinterogare returnează măcar un rând (sau niciunul, cu NOT EXISTS).

Sintaxă
EXISTS (subinterogare)
NOT EXISTS (subinterogare)

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ține NULL. Rezultatul devine gol. NOT EXISTS nu 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.