Cum funcționează
Tiparul de bază e la tabelul Carti. Această problemă e cea mai
subtilă din categorie, pentru că datele conţin valori lipsă.
NULL — valoarea care lipseşte
Doi clienţi nu au dată scadentă: celula e goală în enunț. În SQL asta se scrie NULL — fără
apostrofuri, pentru că nu e text, ci absența oricărei valori.
NULL nu înseamnă zero şi nu înseamnă şir gol. Înseamnă „nu se ştie".
Consecința care surprinde: orice comparație cu NULL dă tot NULL, adică nici adevărat, nici
fals. Deci rândul nu trece de WHERE:
WHERE Data_scadenta < '2016-01-20' -- clientii cu NULL nu apar
Aici comportamentul e exact cel dorit: dacă nu ştim scadența, nu putem afirma că a expirat.
Pentru a căuta explicit valorile lipsă se foloseşte IS NULL, nu = NULL:
WHERE Data_scadenta IS NULL -- corect
WHERE Data_scadenta = NULL -- nu returneaza niciodata nimic
= NULL e greşit pentru că NULL nu e egal nici măcar cu el însuşi.
c) „Au debite" înseamnă strict pozitiv
WHERE Debit > 0
Enunțul precizează „câmpul Debit să fie pozitiv", şi e important:
- Seculici Alina are
−7.80 — debit negativ, adică firma îi datorează ei bani
- Stoica Anton are
0 — nu datorează nimic
Niciunul nu „are debite". Cu >= 0 l-ai include greşit pe Stoica Anton. Rezultat: Tuca Patricia,
Minca Vlad, SC Indacris SRL, Ungureanu Xenia.
d) Două condiții simultan
Enunțul cere debit pozitiv şi scadență anterioară datei de 20 ianuarie 2016:
WHERE Debit > 0 AND Data_scadenta < '2016-01-20'
„Anterioară" înseamnă strict mai mic, deci <, nu <=.
Se modifică doar Minca Vlad (scadent 16 ianuarie): 171.95 * 1.02 = 175.389. SC Indacris are
scadența pe 25 ianuarie, deci după limită. Seculici Alina are NULL şi debit negativ — exclusă de
ambele condiții.
Greșeli frecvente
Debit >= 0 — îl include pe clientul cu debit zero.
- Uitarea debitului negativ —
Debit <> 0 l-ar include pe cel cu −7.80.
Data_scadenta = NULL — nu returnează niciodată nimic; se foloseşte IS NULL.
NULL scris ca 'NULL' — devine textul „NULL", nu valoarea lipsă.
<= în loc de < — „anterioară datei de 20" nu include ziua de 20.
- Uitarea condiției
Debit > 0 la UPDATE — s-ar majora şi debitul negativ.