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
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
| 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
Î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.
Joncțiunea nu
se confundă cu reuniunea (UNION), care adaugă rândurile rezultatului unei interogări la
rândurile altei interogări.
Î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 joncțiune 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
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.
Te înscrii, alegi în cont când începe cursul și plătești prima lună prin transfer bancar. Pentru a vedea mai întâi cum este prezentată materia, poți reveni la primul subcapitol al capitolului.
Acces la suportul de curs
25 RON / lună, fără ședințe
Ce cuprinde:
- Acces la toate lecțiile disponibile
- Suport de curs pentru tematica științifică și metodică
- Exemple, explicații și exerciții
- Acces la materialele noi adăugate pe platformă
- Posibilitatea de a adresa întrebări
Poți alege și variante cu ședințe online, în grup sau individuale. Le vezi pe pagina cursului.
Ai întrebări sau o problemă? Scrie-mi pe WhatsApp, la 0745 874 576.
Surse (5)
- 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