Sari la conținut
EduCamp

Tematică științifică · 6.6

Comenzi de bază SQL

Comenzile SQL SELECT, INSERT, UPDATE și DELETE: selecția coloanelor și a înregistrărilor, sortarea, funcțiile agregate, gruparea, interogările pe mai multe tabele, subinterogările, adăugarea, modificarea și ștergerea datelor, cu tiparele cerute la examen.

SQL este limbajul prin care se lucrează cu o bază de date relațională. Comanda SELECT regăsește date, iar comenzile INSERT, UPDATE și DELETE adaugă, modifică și șterg înregistrări. Comenzile se termină cu ;, iar cuvintele cheie se pot scrie cu litere mari sau mici. Șirurile de caractere și datele calendaristice se scriu între apostrofuri.

Exemplele sunt scrise pentru MySQL și folosesc baza de date a bibliotecii, a cărei structură este dată în subcapitolul Modelul fizic relațional. Rezultatele afișate au fost obținute pe datele de probă.

Datele de probă

cititori

cod_cititornumeprenumetelefon
1PopescuAna0741000111
2IonescuDanNULL
3MarinIoana0722333444
4DobreMihaiNULL

carti

isbntitluedituraan_aparitie
…001IonLitera2019
…002Enigma OtilieiArt2020
…003MoromețiiLitera2017
…004MaitreyiHumanitas2012
…005Amintiri din copilărieLitera2021
…006BaltagulLitera2018

exemplare

nr_inventarisbn
101…001
102…001
103…002
104…003
105…004
106…005
107…006

imprumuturi

codcititorexemplarîmprumutscadențărestituire
121012026-03-022026-03-162026-03-14
211032026-03-052026-03-192026-03-18
321042026-03-092026-03-23NULL
431052026-03-102026-03-242026-03-20
521022026-04-012026-04-15NULL
611062026-04-032026-04-17NULL

ISBN-urile sunt prescurtate: …001 înseamnă 9789734600001. În tabelul imprumuturi, coloanele sunt cod_imprumut, cod_cititor, nr_inventar, data_imprumut, data_scadenta și data_restituire.

Comanda SELECT

Comanda SELECT extrage date din unul sau mai multe tabele și afișează rezultatul sub forma unui tabel. Forma generală, cu clauzele în ordinea în care se scriu, este:

SELECT [DISTINCT] lista_de_coloane_sau_expresii
FROM tabel [INNER JOIN alt_tabel ON conditie_de_legatura]
[WHERE conditie_pentru_inregistrari]
[GROUP BY coloane_de_grupare]
[HAVING conditie_pentru_grupuri]
[ORDER BY coloane_de_sortare [ASC | DESC]]
[LIMIT numar_de_randuri];

Numai SELECT și FROM sunt obligatorii, iar clauzele folosite se scriu în această ordine.

Selecția coloanelor

* înseamnă toate coloanele tabelului, în ordinea din structura lui. O listă de coloane afișează numai coloanele cerute, în ordinea scrisă.

AS dă unei coloane din rezultat un alt nume, numit alias. O coloană poate fi și o expresie calculată din alte coloane.

SELECT * FROM cititori;

SELECT nume, prenume FROM cititori;

SELECT titlu,
       2026 - an_aparitie AS vechime
FROM carti;

Cuvântul DISTINCT elimină rândurile identice din rezultat. SELECT DISTINCT editura FROM carti ORDER BY editura; afișează fiecare editură o singură dată: Art, Humanitas, Litera.

Selecția înregistrărilor: WHERE

Clauza WHERE păstrează numai înregistrările care îndeplinesc condiția. În condiție se folosesc:

OperatorulSemnificațiaExemplu
=, <>, <, <=, >, >=comparațiian_aparitie >= 2018
AND, OR, NOToperatori logicieditura = 'Litera' AND an_aparitie > 2018
BETWEEN a AND bvaloare cuprinsă între a și b, inclusiv capetelean_aparitie BETWEEN 2018 AND 2021
IN (…)valoare aflată în listăeditura IN ('Art', 'Humanitas')
LIKEșir care respectă un șablon: % înlocuiește oricâte caractere, _ un singur caractertitlu LIKE 'M%'
IS NULL, IS NOT NULLcâmp fără valoare, respectiv cu valoaretelefon IS NULL

Cărțile editurii Litera apărute între 2018 și 2021, în ordinea anului:

titluan_aparitie
Baltagul2018
Ion2019
Amintiri din copilărie2021
SELECT titlu, an_aparitie
FROM carti
WHERE editura = 'Litera'
  AND an_aparitie BETWEEN 2018 AND 2021
ORDER BY an_aparitie;

Sortarea: ORDER BY

ORDER BY sortează rezultatul crescător (ASC, forma implicită) sau descrescător (DESC). La sortarea după mai multe coloane, a doua coloană decide ordinea numai între rândurile egale după prima. ORDER BY editura, an_aparitie DESC sortează cărțile după editură, iar cărțile aceleiași edituri de la cea mai nouă la cea mai veche.

Clauza LIMIT n, scrisă la sfârșit, păstrează primele n rânduri ale rezultatului. În Access și în SQL Server se scrie în schimb SELECT TOP n ….

Funcțiile agregate

O funcție agregată calculează o singură valoare dintr-o coloană a mai multor înregistrări:

FuncțiaRezultatul
COUNT(*)numărul de înregistrări
COUNT(coloana)numărul de valori diferite de NULL din coloană
COUNT(DISTINCT coloana)numărul de valori distincte, diferite de NULL
SUM(coloana)suma valorilor
AVG(coloana)media aritmetică a valorilor
MIN(coloana), MAX(coloana)cea mai mică, respectiv cea mai mare valoare

Valorile NULL nu intră în calcul. SELECT COUNT(*), COUNT(telefon) FROM cititori; afișează 4 și 2: sunt patru cititori, dar numai doi au telefon.

Gruparea: GROUP BY și HAVING

GROUP BY împarte înregistrările în grupuri cu aceeași valoare a coloanelor de grupare, iar funcțiile agregate se calculează separat pentru fiecare grup. În lista SELECT pot apărea numai coloanele de grupare și funcții agregate.

Numărul de cărți al fiecărei edituri:

edituranr_carti
Litera4
Art1
Humanitas1
SELECT editura, COUNT(*) AS nr_carti
FROM carti
GROUP BY editura
ORDER BY nr_carti DESC, editura;

WHERE filtrează înregistrările înainte de grupare, iar HAVING filtrează grupurile după grupare. De aceea o condiție cu o funcție agregată, cum este COUNT(*) >= 2, se scrie în HAVING, nu în WHERE.

SELECT editura, COUNT(*) AS nr_carti
FROM carti
WHERE an_aparitie >= 2015
GROUP BY editura
HAVING COUNT(*) >= 2;

Comanda păstrează cărțile apărute din 2015 încoace, le grupează pe edituri și afișează editurile cu cel puțin două astfel de cărți. Rezultatul este un singur rând: Litera, cu 4 cărți.

Interogări pe mai multe tabele: JOIN

Datele unei interogări se află adesea în mai multe tabele legate prin chei. Uniunea tabelelor se face prin INNER JOIN … ON, cu condiția care leagă cheia străină de cheia primară:

Împrumuturile nerestituite, cu numele cititorului și titlul cărții. Titlul se află în carti, dar împrumutul păstrează numărul exemplarului, deci legătura trece prin exemplare.

Literele i, ci, e, ca sunt alias-uri ale tabelelor: ci.nume este câmpul nume din cititori.

SELECT ci.nume, ci.prenume, ca.titlu,
       i.data_imprumut
FROM imprumuturi i
     INNER JOIN cititori ci
       ON i.cod_cititor = ci.cod_cititor
     INNER JOIN exemplare e
       ON i.nr_inventar = e.nr_inventar
     INNER JOIN carti ca
       ON e.isbn = ca.isbn
WHERE i.data_restituire IS NULL
ORDER BY i.data_imprumut;
numeprenumetitludata_imprumut
IonescuDanMoromeții2026-03-09
IonescuDanIon2026-04-01
PopescuAnaAmintiri din copilărie2026-04-03

Aceeași uniune se poate scrie și cu tabelele despărțite prin virgulă în FROM și cu condițiile de legătură în WHERE: FROM imprumuturi i, cititori ci WHERE i.cod_cititor = ci.cod_cititor.

INNER JOIN păstrează numai perechile de rânduri care îndeplinesc condiția din ON. LEFT JOIN păstrează toate rândurile tabelului din stânga, iar acolo unde tabelul din dreapta nu are corespondent pune NULL. RIGHT JOIN face același lucru pentru tabelul din dreapta.

Numărul de împrumuturi al fiecărui cititor, inclusiv al celor care nu au împrumutat nimic. Cu INNER JOIN, Dobre Mihai nu ar apărea deloc.

numeprenumenr_imprumuturi
DobreMihai0
IonescuDan3
MarinIoana1
PopescuAna2
SELECT ci.nume, ci.prenume,
       COUNT(i.cod_imprumut) AS nr_imprumuturi
FROM cititori ci
     LEFT JOIN imprumuturi i
       ON ci.cod_cititor = i.cod_cititor
GROUP BY ci.cod_cititor, ci.nume, ci.prenume
ORDER BY ci.nume;

Aici se numără COUNT(i.cod_imprumut), nu COUNT(*): pentru Dobre Mihai, rândul are NULL în coloanele din imprumuturi, iar COUNT(*) l-ar număra ca pe un împrumut.

Subinterogări

O subinterogare este o comandă SELECT scrisă în interiorul altei comenzi, între paranteze. Rezultatul ei se folosește în comanda exterioară.

Subinterogarea întoarce o singură valoare, anul celei mai vechi cărți, iar comanda exterioară afișează cartea din acel an: Maitreyi, 2012.

SELECT titlu, an_aparitie
FROM carti
WHERE an_aparitie =
      (SELECT MIN(an_aparitie) FROM carti);

Subinterogarea întoarce o coloană, codurile cititorilor care au împrumuturi, iar NOT IN păstrează cititorii al căror cod nu se află printre ele: Dobre Mihai.

SELECT nume, prenume
FROM cititori
WHERE cod_cititor NOT IN
      (SELECT cod_cititor FROM imprumuturi);

NOT EXISTS este adevărat când subinterogarea nu întoarce niciun rând. Pentru fiecare carte, subinterogarea caută împrumuturile exemplarelor ei. Rezultatul este Baltagul, singura carte care n-a fost împrumutată.

SELECT c.titlu
FROM carti c
WHERE NOT EXISTS
      (SELECT 1
       FROM exemplare e
            INNER JOIN imprumuturi i
              ON e.nr_inventar = i.nr_inventar
       WHERE e.isbn = c.isbn);

O subinterogare poate apărea și în FROM. Tabelul pe care îl produce trebuie să primească un nume, prin AS, ca în exemplul de numărare de la secțiunea despre cerințele de examen.

Materialul acesta se citește pe educamp.ro și nu se tipărește.

Ce cuprinde subcapitolul

  1. Datele de probă
  2. Comanda SELECT
  3. Comanda INSERT
  4. Comanda UPDATE
  5. Comanda DELETE
  6. Cerințe frecvente la examen
  7. Apariții la examen

Continuă lectura ca și cursant

Cel puțin un subcapitol din fiecare capitol este disponibil gratuit și integral. Pentru a citi toate celelalte subcapitole ale disciplinei, te înscrii la cursul de pregătire.

Prima săptămână este gratuită, fără plată și fără card. Dacă vrei să vezi mai întâi cum este prezentată materia, poți reveni la primul subcapitol al capitolului.

100 RON / lună, pentru o disciplină

Ce cuprinde:

  • Două întâlniri de câte două ore, în fiecare lună
  • Tot suportul de curs publicat până acum la disciplina aleasă
  • Capitole noi în fiecare săptămână, cuprinse în luna plătită, fără costuri suplimentare
  • Material organizat după structura programei de examen
  • Acces de pe orice dispozitiv, folosind același cont
  • Prima săptămână gratuită, fără card și fără reînnoire automată

Începe săptămâna gratuită Sunt cursant — login

Află când publicăm materiale noi

Materia este publicată treptat, capitol cu capitol. Înscrie-te pentru a primi un e-mail atunci când apare un capitol nou de informatică.

Vei primi mesaje numai despre materia selectată și despre cursul de pregătire. Te poți dezabona oricând, dintr-o singură apăsare.

Surse

  • Huțanu, V. T., Popescu, C., „Manual de informatică pentru clasa a XII-a”, Editura L&S Info-mat, București, 2007
  • Gremalschi, A., Corlat, S., Braicov, A., „Informatică. Manual pentru clasa a 12-a”, Editura Știința, Chișinău, 2015
  • Programa pentru concursul de ocupare a posturilor didactice, disciplina Informatică, cap. 6 „Baze de date”
  • Programa pentru examenul de definitivare în învățământ, disciplina Informatică, cap. 6 „Baze de date”
  • Subiecte și bareme publicate, Definitivat, informatică, 2017–2026
Actualizat: 13 septembrie 2026