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_cititor | nume | prenume | telefon |
|---|---|---|---|
| 1 | Popescu | Ana | 0741000111 |
| 2 | Ionescu | Dan | NULL |
| 3 | Marin | Ioana | 0722333444 |
| 4 | Dobre | Mihai | NULL |
carti
| isbn | titlu | editura | an_aparitie |
|---|---|---|---|
| …001 | Ion | Litera | 2019 |
| …002 | Enigma Otiliei | Art | 2020 |
| …003 | Moromeții | Litera | 2017 |
| …004 | Maitreyi | Humanitas | 2012 |
| …005 | Amintiri din copilărie | Litera | 2021 |
| …006 | Baltagul | Litera | 2018 |
exemplare
| nr_inventar | isbn |
|---|---|
| 101 | …001 |
| 102 | …001 |
| 103 | …002 |
| 104 | …003 |
| 105 | …004 |
| 106 | …005 |
| 107 | …006 |
imprumuturi
| cod | cititor | exemplar | împrumut | scadență | restituire |
|---|---|---|---|---|---|
| 1 | 2 | 101 | 2026-03-02 | 2026-03-16 | 2026-03-14 |
| 2 | 1 | 103 | 2026-03-05 | 2026-03-19 | 2026-03-18 |
| 3 | 2 | 104 | 2026-03-09 | 2026-03-23 | NULL |
| 4 | 3 | 105 | 2026-03-10 | 2026-03-24 | 2026-03-20 |
| 5 | 2 | 102 | 2026-04-01 | 2026-04-15 | NULL |
| 6 | 1 | 106 | 2026-04-03 | 2026-04-17 | NULL |
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:
| Operatorul | Semnificația | Exemplu |
|---|---|---|
=, <>, <, <=, >, >= | comparații | an_aparitie >= 2018 |
AND, OR, NOT | operatori logici | editura = 'Litera' AND an_aparitie > 2018 |
BETWEEN a AND b | valoare cuprinsă între a și b, inclusiv capetele | an_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 caracter | titlu LIKE 'M%' |
IS NULL, IS NOT NULL | câmp fără valoare, respectiv cu valoare | telefon IS NULL |
Cărțile editurii Litera apărute între 2018 și 2021, în ordinea anului:
| titlu | an_aparitie |
|---|---|
| Baltagul | 2018 |
| Ion | 2019 |
| Amintiri din copilărie | 2021 |
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ția | Rezultatul |
|---|---|
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:
| editura | nr_carti |
|---|---|
| Litera | 4 |
| Art | 1 |
| Humanitas | 1 |
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;
| nume | prenume | titlu | data_imprumut |
|---|---|---|---|
| Ionescu | Dan | Moromeții | 2026-03-09 |
| Ionescu | Dan | Ion | 2026-04-01 |
| Popescu | Ana | Amintiri din copilărie | 2026-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.
| nume | prenume | nr_imprumuturi |
|---|---|---|
| Dobre | Mihai | 0 |
| Ionescu | Dan | 3 |
| Marin | Ioana | 1 |
| Popescu | Ana | 2 |
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.
S-a încheiat minutul de citit liber.
Ce cuprinde subcapitolul
- Datele de probă
- Comanda SELECT
- Comanda INSERT
- Comanda UPDATE
- Comanda DELETE
- Cerințe frecvente la examen
- 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ă.
Nu am putut înregistra adresa. Verifică e-mailul și materia aleasă, apoi încearcă din nou.
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