Pe scurt
SQL este limbajul folosit pentru definirea și interogarea bazelor de date relaționale. SELECT alege coloane, FROM precizează tabelul, iar WHERE filtrează rânduri. Pentru elevii cu note 8, 10 și 6, condiția nota >= 8 alege primele două rânduri.
În detaliu
SQL este limbajul folosit pentru definirea, modificarea și interogarea bazelor de date relaționale. Interogarea de bază are forma SELECT (ce coloane), FROM (din ce tabel) și WHERE (ce rânduri). SELECT nume FROM elevi WHERE clasa_id = 9 face selecția înregistrărilor prin WHERE și proiecția câmpului nume prin lista de după SELECT. ORDER BY ordonează rezultatul, crescător implicit, descrescător cu DESC. Condiția WHERE doar filtrează, nu sortează, iar SELECT citește datele fără să le schimbe. Asocierea a două tabele se face cu JOIN, folosind condiția dintre cheia externă și cheia referită.
Exemplul 1 — selecție, proiecție și sortare. Tabelul elevi are rândurile (Ana, 8), (Dan, 10) și (Mara, 6), iar clasele sunt 9 (IX A) și 10 (IX B):
CREATE TABLE clase (id integer PRIMARY KEY, denumire text NOT NULL);
CREATE TABLE elevi (id integer PRIMARY KEY, nume text NOT NULL,
clasa_id integer REFERENCES clase(id), nota integer);
INSERT INTO clase VALUES (9, 'IX A'), (10, 'IX B');
INSERT INTO elevi VALUES (1, 'Ana', 9, 8), (2, 'Dan', 9, 10), (3, 'Mara', 10, 6);
SELECT nume, nota FROM elevi WHERE nota >= 8 ORDER BY nota DESC;
Rezultatul este (Dan, 10), apoi (Ana, 8). WHERE elimină rândul Marei, care are nota 6, iar ORDER BY nota DESC ordonează descrescător toate rândurile rămase, nu alege doar nota maximă.
Exemplul 2 — modificarea datelor. Comenzile elementare sunt INSERT, UPDATE și DELETE:
INSERT INTO elevi (id, nume, clasa_id) VALUES (4, 'Radu', 10);
UPDATE elevi SET nume = 'Anca' WHERE id = 1;
DELETE FROM elevi WHERE id = 4;
SELECT id, nume FROM elevi ORDER BY id;
După inserare, rândul lui Radu există (nota lui este NULL, fiindcă nu a fost dată); după actualizare, numele din rândul 1 este Anca; după ștergere, rândul 4 nu mai există. Interogarea finală întoarce (1, Anca), (2, Dan) și (3, Mara). Fără WHERE, UPDATE modifică toate rândurile, iar DELETE le șterge pe toate. Coloanele nespecificate la INSERT primesc valoarea implicită, de obicei NULL, iar un rând nou trebuie să respecte cheile și celelalte constrângeri ale tabelului.
Exemplul 3 — JOIN cu și fără condiție. Pentru numele clasei, tabelele se asociază prin cheia externă. Fără condiția corectă apar combinații nedorite:
SELECT COUNT(*) FROM elevi, clase;
SELECT elevi.nume, clase.denumire
FROM elevi JOIN clase ON elevi.clasa_id = clase.id
ORDER BY elevi.id;
Prima interogare nu are condiție și combină fiecare elev cu fiecare clasă: rânduri, dintre care numai trei sunt asocieri corecte. A doua întoarce , și : fiecare elev apare o singură dată, cu clasa sa.
Exemplul 4 — grupare și funcții de agregare. Cu datele din primul exemplu (Ana 8 și Dan 10 în clasa 9, Mara 6 în clasa 10), cererea
SELECT clasa_id, COUNT(*) AS elevi, AVG(nota) AS media
FROM elevi
GROUP BY clasa_id
HAVING AVG(nota) >= 8
ORDER BY clasa_id;
formează câte un grup pentru fiecare valoare a lui clasa_id. Grupul clasei 9 are 2 elevi și media , iar grupul clasei 10 are un elev și media 6. Condiția HAVING se aplică grupurilor, după calculul mediei, deci rămâne un singur rând: (9, 2, 9). Condiția WHERE se aplică rândurilor înaintea grupării și nu poate folosi AVG. Ordinea evaluării este: FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY.
Exemplul 5 — valoarea NULL. Dacă se inserează un elev fără notă, de pildă Radu din clasa 10, atunci NULL înseamnă „valoare necunoscută”, nu 0. Cererea SELECT nume FROM elevi WHERE nota < 8; întoarce numai pe Mara: pentru Radu comparația NULL < 8 nu este adevărată, deci rândul lui este omis. Elevii fără notă se aleg cu WHERE nota IS NULL, nu cu nota = NULL. Funcțiile de agregare diferă și ele: COUNT(*) numără toate cele 4 rânduri, iar COUNT(nota) numără doar cele 3 rânduri cu notă.
Valori repetate. Cererea SELECT clasa_id FROM elevi; întoarce câte un rând pentru fiecare elev, deci valorile 9, 9 și 10. Cu SELECT DISTINCT clasa_id FROM elevi; fiecare valoare apare o singură dată: 9 și 10. DISTINCT elimină duplicatele din rezultat, nu din tabel.
Greșeli frecvente
- Greșit:
WHERE nota >= 8sortează rezultatul.Corect: doar filtrează. - Greșit:
ORDER BY nota DESCalege numai nota maximă.Corect: ordonează toate rândurile selectate. - Greșit:
SELECT numeschimbă numele în tabel.Corect: îl citește.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- OMECI 5099/2009, anexa 5, Informatică, p. 3–4, 7, clasa XII; rocnee.eu
- OMECI 5099/2009, anexa 5, Informatică, p. 3, 7, clasa XII; plan de încadrare: OMEC 7723/2024, anexa 2, tabelele 1–25, legislatie.just.ro; filiera tehnologică: OMEC 7724/2024, anexa 4, tabelul calificării, legislatie.just.ro
- OMECI 5099/2009, anexa 5, Informatică, p. 3–4, 7–8, clasa XII; rocnee.eu
- OMECI 5099/2009, anexa 5, Informatică, p. 3–4, 9, clasa XII; rocnee.eu
Documente consultate
- Programa școlară de informatică, clasa a XII-a (OMECI 5099/2009, anexa 5), CNCE, modulul opțional SGBD, p. 3–4 și 7–8; rocnee.eu
- PostgreSQL, Documentation 18, capitolul „The SQL Language”, postgresql.org/docs/18/sql.html
Desene: Redactare proprie (desen original)
