Cum funcționează
Maximul se calculează pe o valoare care nu există în tabel
Până acum, „maximul" era valoarea unei coloane (salariu, scor, durată). Aici e lungimea unui text —
o valoare calculată, care nu e stocată nicăieri. Tiparul rămâne identic; se schimbă doar ce se pune în
MAX:
(SELECT MAX(LENGTH(denumire)) FROM Jocuri) -> 21
WHERE LENGTH(denumire) = 21
Se compară lungime cu lungime, nu denumire cu denumire. O greșeală ușoară de făcut:
WHERE denumire = (SELECT MAX(denumire) FROM Jocuri) -- GREȘIT
MAX pe un text întoarce ultima valoare în ordine alfabetică (Valorant), nu cea mai lungă. Nu dă
nicio eroare și întoarce un rând perfect plauzibil.
Tiparul de bază, cu toate variantele lui greșite, e explicat la
problema #127.
LENGTH și numele ei în alte sisteme
| Sistem |
Funcția |
| SQL standard, Oracle, SQLite, MySQL |
LENGTH(text) |
| Access, SQL Server |
LEN(text) |
LENGTH numără caractere, inclusiv spațiile: 'Red Dead Redemption 2' are 21 de caractere, nu 19.
Spațiile contează, și e exact motivul pentru care denumirea cu cele mai multe cuvinte câștigă de obicei.
Într-o coloană varchar2, LENGTH dă lungimea textului efectiv, nu dimensiunea declarată a coloanei —
varchar2(100) cu 'Minecraft' înăuntru dă 9. (Într-un câmp char(100), fix, valoarea ar fi
completată cu spații până la 100, iar LENGTH ar da 100. Încă un motiv pentru care textele variabile
se declară varchar2.)
Pluralul din enunț
„Jocul/jocurile" — două jocuri pot avea denumiri de exact aceeași lungime, caz deloc improbabil.
Subinterogarea le întoarce pe amândouă; ORDER BY LENGTH(denumire) DESC + primul rând ar arăta unul
singur.
Am adăugat LENGTH(denumire) AS lungime în SELECT la a): fără ea, nu se vede de ce e acel joc în
rezultat.
Greșeli frecvente
MAX(denumire) în loc de MAX(LENGTH(denumire)) — întoarce ultimul joc în ordine alfabetică.
Un rând credibil, complet greșit.
LEN în loc de LENGTH (sau invers) — funcția nu există în sistemul respectiv: eroare.
ORDER BY LENGTH(denumire) DESC + primul rând — pierzi denumirile de lungime egală.
WHERE LENGTH(denumire) = 21 — ai calculat maximul cu ochii; se strică la primul joc adăugat.
MAX(LENGTH(g.denumire)) cu prefix în subinterogare — subinterogarea are propriul FROM Jocuri,
deci aliasul g din interogarea exterioară nu e necesar acolo (și în unele sisteme nici valid).
- Denumirea uitată din
SELECT — cerința cere „username și denumire".