Teorie
Baze de date şi SQL la atestatul de informatică
CREATE TABLE, INSERT, SELECT cu WHERE, UPDATE şi DELETE — structura în patru paşi a subiectului I de la atestat, cu toate problemele rezolvate.
6
minute de citit
9
secțiuni
81
probleme rezolvate legate
Actualizat pe .
Pe această pagină
Subiectul I de la atestat e cel mai previzibil din toată proba. Toate cele 40 de variante din sesiunea Dolj 2026 au exact aceeaşi structură în patru paşi:
| Cerinţa | Ce se cere | Instrucţiunea |
|---|---|---|
| a) | creează structura tabelului | CREATE TABLE |
| b) | introdu înregistrările | INSERT INTO |
| c) | afişează ceva filtrat | SELECT ... WHERE |
| d) | modifică sau şterge | UPDATE / DELETE |
Odată ce ştii scheletul, rămâne doar traducerea corectă a cerinţei în condiţii.
a) Traducerea structurii
Enunțul dă tipurile într-o notaţie prescurtată. Traducerea e mecanică:
| Notaţia din enunţ | Ce înseamnă | Tip SQL |
|---|---|---|
(N,5) |
numeric, 5 cifre | INTEGER |
(N,6.2) |
numeric, 6 cifre, 2 zecimale | DECIMAL(6,2) |
(T,80) |
text, 80 de caractere | VARCHAR(80) |
(T,1) |
un singur caracter | CHAR(1) |
(D) |
dată calendaristică | DATE |
(Y/N) |
da / nu | CHAR(1) |
CREATE TABLE Carti (
Nr_inventar INTEGER,
Titlu VARCHAR(80),
Pret DECIMAL(6,2),
Situatia VARCHAR(40)
);Ce se stochează ca text, deşi arată ca număr
Regula: dacă nu faci calcule cu el, e text.
- CNP, telefon, cod poştal — zerourile de la început s-ar pierde ca număr
- numere de cameră (
0301) — la fel, plus că din ele se extrag informaţii - numere de dosar (
4123/235/2011) — conţin bare oblice
b) Inserarea datelor
INSERT INTO Carti VALUES (18211, 'Ghid practic', '1/G33', 4.50, 'In biblioteca');Patru reguli:
- valorile se dau în ordinea coloanelor din
CREATE TABLE - textul între apostrofuri (
'), numerele fără - zecimalele cu punct, nu cu virgulă — virgula separă coloanele
- datele în format
'AAAA-LL-ZZ':12.mai.1998devine'1998-05-12'
Formatul ISO al datelor nu e o toană: scrise aşa, datele se sortează corect şi se compară cu
<, >, BETWEEN ca numerele.
Pentru valori lipsă se scrie NULL, fără apostrofuri. NULL nu e zero şi nu e şir gol — înseamnă
„nu se ştie". Orice comparaţie cu NULL e nici adevărată, nici falsă, deci rândul nu trece de
WHERE. Ca să-l cauţi explicit, foloseşti IS NULL, niciodată = NULL.
c) Filtrarea cu WHERE
SELECT * FROM Carti WHERE Situatia = 'Imprumutata';SELECT * ia toate coloanele. Dacă enunțul cere „afişaţi numele şi vechimea", listezi exact
acele coloane: SELECT Nume, Vechime.
Traducerea formulărilor
Aici se pierd cele mai multe puncte — nu la sintaxă, ci la citire:
| În enunț | În SQL |
|---|---|
| peste 2 / mai mult de 2 | > 2 |
| cel puţin 2 / mai mare sau egal | >= 2 |
| între 50 şi 100 inclusiv | BETWEEN 50 AND 100 |
intervalul [20, 50] |
BETWEEN 20 AND 50 |
| diferit de zero | <> 0 |
| anterioară datei de 20 | < '...-20' |
Operatori utili
WHERE Clasa = 11 AND Seria = 'B' -- ambele conditii
WHERE Nume LIKE 'C%' -- incepe cu C
WHERE LOWER(Descriere) LIKE '%poet%' -- contine cuvantul
WHERE Denumire IN ('Productie', 'Vanzari') -- una dintre valori
WHERE Data BETWEEN '2016-01-01' AND '2016-12-31' -- tot anul= vs LIKE: = pentru valoarea întreagă, LIKE pentru o bucată dintr-un text. % înseamnă
„orice şir". LIKE 'A+%' ar prinde şi A++ — atenţie când clasele diferă printr-un singur caracter.
Ordonarea
ORDER BY Pret DESC -- descrescator (ASC e implicit)
ORDER BY Nume ASC, Prenume ASC -- al doilea criteriu, la egalitateOrdinea clauzelor e fixă: SELECT → FROM → WHERE → GROUP BY → ORDER BY.
Agregare şi grupare
Când enunțul spune „pentru fiecare X", ai nevoie de GROUP BY X.
SELECT Gen, AVG(Durata) AS Durata_medie
FROM Filme
GROUP BY Gen;| Funcţie | Ce face |
|---|---|
COUNT(*) |
câte rânduri |
COUNT(DISTINCT col) |
câte valori diferite |
SUM(x) |
suma |
AVG(x) |
media |
MIN(x) / MAX(x) |
extremele |
Regula de aur: în SELECT pot apărea doar coloanele după care grupezi şi funcţii de agregare.
SELECT Titlu, AVG(Durata) ... GROUP BY Gen n-are sens — într-un gen sunt mai multe titluri.
Funcţiile acceptă orice expresie: SUM(Pret_buc * Nr_buc) calculează întâi pe rând, apoi adună.
Nu e acelaşi lucru cu SUM(Pret_buc) * SUM(Nr_buc).
Fără GROUP BY, agregarea se face pe tot tabelul şi întoarce un singur număr.
Când ai nevoie de subinterogare
| Enunțul cere | Soluţia |
|---|---|
| doar valoarea extremă | SELECT MAX(Pret) FROM t; |
| rândul care conţine extrema | subinterogare |
DELETE FROM Stocuri WHERE Pret = (SELECT MAX(Pret) FROM Stocuri);Motivul: MAX comprimă rândurile şi pierde informaţia despre care rând a produs valoarea. Şi
funcţiile de agregare nu se pot folosi direct în WHERE.
d) UPDATE şi DELETE
UPDATE Carti
SET Situatia = 'Pierduta'
WHERE Titlu = 'Coliba unchiului Tom';
DELETE FROM Autori
WHERE LOWER(Descriere) LIKE '%poet%';WHERE lipsă = toate rândurile modificate sau şterse. Nu apare nicio eroare; pur şi simplu
pierzi datele. E cea mai gravă greşeală din toată categoria.
La SET, mai multe coloane se despart prin virgulă, nu prin AND:
SET Clasa = 11,
Seria = 'A'DELETE şterge rânduri întregi — nu se specifică nicio coloană.
Calculul procentual
Partea dreaptă a lui SET poate folosi valoarea curentă a coloanei:
| Cerinţa | SQL |
|---|---|
| scade cu 7% | SET Pret = Pret * 0.93 |
| creşte cu 5% | SET Pret = Pret * 1.05 |
| scade 9 lei (fix) | SET Pret = Pret - 9 |
| creşte cu 1 | SET Nr = Nr + 1 |
| la jumătate | SET Credit = Credit / 2 |
| valoare fixă | SET Rating = 3 |
Scădere cu p% → * (1 - p/100); creştere → * (1 + p/100). Greşeala clasică e * 0.07 în loc
de * 0.93 — ar lăsa 7% din preţ.
Când coloana e întreagă, enunțul cere de obicei rotunjire: ROUND(Pret * 1.05).
Capcana împărţirii întregi
Compensare / 100 -- 5 / 100 = 0 (!!)
Compensare / 100.0 -- 5 / 100.0 = 0.05Între doi întregi, împărţirea e întreagă. Rezultatul e 0, formula pare că nu face nimic, şi nu
apare nicio eroare. Scrie mereu 100.0.
Identificarea unui singur rând
La UPDATE şi DELETE, ţinteşte prin cheia unică — cod, număr matricol, CNP — nu prin nume:
WHERE Cod_parafa_medic = 9813 -- sigur
WHERE Prenume = 'Mircea' -- doi medici se numesc asaDatele din subiecte sunt construite special cu omonime, ca să prindă exact această greşeală.
Greşeli care se repetă
UPDATE/DELETEfărăWHERE— cea mai costisitoare- Text fără apostrofuri —
WHERE Situatia = Imprumutatacaută o coloană cu acest nume - Zecimale cu virgulă —
4,50se citeşte ca două valori ==la comparaţie — în SQL egalitatea e cu un singur=- Data în format românesc —
'12.mai.1998'nu e recunoscută ANDîn loc de virgulă înSETGROUP BYuitat când enunțul cere „pentru fiecare"- Coloane care nu sunt în
GROUP BY = NULLîn loc deIS NULL- Împărţire întreagă la calcule procentuale
- Intervalul de lună terminat pe 30 în loc de 31
Unde se scriu
Instrucţiunile de mai sus sunt SQL standard. În Microsoft Access se lipesc în Create → Query Design → SQL View. Câteva echivalenţe:
| SQL standard | Access |
|---|---|
VARCHAR(80) |
TEXT(80) |
'1998-05-12' |
#05/12/1998# |
SUBSTR(x, 1, 2) |
Mid(x, 1, 2) |
CAST(x AS INTEGER) |
CInt(x) |
DATE(d, '+25 days') |
DateAdd("d", 25, d) |
LIMIT 1 |
SELECT TOP 1 |
Toate problemele din această categorie
Toate cele 40 de subiecte, cu rezolvări complete în SQL, verificate rulând efectiv instrucţiunile.
81Arată toate problemele rezolvateAscunde lista81 baze de date
- Baze de date — tabelul Abonati
- Baze de date — tabelul Autori
- Baze de date — tabelul Bilete
- Baze de date — tabelul Camere
- Baze de date — tabelul Carti
- Baze de date — tabelul Cititori
- Baze de date — tabelul Clase
- Baze de date — tabelul Clienti
- Baze de date — tabelul Comenzi
- Baze de date — tabelul Consultatii
- Baze de date — tabelul CursV
- Baze de date — tabelul Cursuri
- Baze de date — tabelul Date_meteo
- Baze de date — tabelul Departamente
- Baze de date — tabelul Dosare
- Baze de date — tabelul Edituri
- Baze de date — tabelul Elevi
- Baze de date — tabelul Filme
- Baze de date — tabelul Fructe
- Baze de date — tabelul Furnizori
- Baze de date — tabelul Locuinte
- Baze de date — tabelul Masini
- Baze de date — tabelul Materiale
- Baze de date — tabelul Mecanici
- Baze de date — tabelul Medicamente (compensare)
- Baze de date — tabelul Medicamente (interval de preţ)
- Baze de date — tabelul Medici
- Baze de date — tabelul Melodii
- Baze de date — tabelul Mese
- Baze de date — tabelul Orase
- Baze de date — tabelul Ore_curs
- Baze de date — tabelul Pacienti
- Baze de date — tabelul Piese
- Baze de date — tabelul Polite
- Baze de date — tabelul Premii
- Baze de date — tabelul Produse
- Baze de date — tabelul Profesori
- Baze de date — tabelul Reparatii
- Baze de date — tabelul Stocuri
- Baze de date — tabelul Studenti
- Oracle — abonați: abonații al căror nume începe cu A și cei din județul Teleorman
- Oracle — abonați: numele care încep cu „Pop” și abonații din afara județului Teleorman
- Oracle — agenție: biletele cu plecarea din București și reducerea prețului cu 2%
- Oracle — agenție: biletele cu plecarea din Craiova și majorarea prețului cu 5%
- Oracle — angajați: angajații din 2008–2019 și mărirea salariului cu 2%
- Oracle — angajați: vechime peste 10 ani și angajații în ordinea descrescătoare a salariului
- Oracle — biblioteca: cărțile de la editura All ordonate pe două criterii și cărțile cu id peste 100 grupate pe gen
- Oracle — biblioteca: editura Teora din 2013 și ștergerea poeziilor cu cod sub 200
- Oracle — concurs: elevii cu cea mai mare medie și cei cu nota la prima probă mai mare decât la a doua
- Oracle — concurs: elevii din Teleorman cu media între 7 și 9 și codurile de două cifre
- Oracle — cărți: cărțile apărute după 2000 și titlurile de la editura Nemira
- Oracle — cărți: cărțile din 1990–2010 și titlurile de la Polirom și Nemira
- Oracle — depozit: cantitate peste medie și preț peste 10, ștergerea produselor „B…” cu valoare peste 28000
- Oracle — depozit: produse cu preț între 3 și 10 lei și cantitate peste 100; produse intrate în ultimii 2 ani
- Oracle — farmacie: medicamentul cel mai scump și medicamentele cu prețul în [20, 50]
- Oracle — farmacie: prețul ținând cont de compensare și ștergerea medicamentelor fără compensare
- Oracle — filme: cel mai vechi film și filmele de acțiune în ordinea apariției
- Oracle — filme: filmele din 1990–2000 în ordine alfabetică și filmul cu cel mai mare buget
- Oracle — medici: medicii cardiologi și medicii al căror nume începe cu Pop
- Oracle — medici: medicii cu cel mai mic salariu și ultimul medic angajat
- Oracle — medici: ordinea descrescătoare a salariului și numărul de medici pe specializare
- Oracle — muzică: albume mai ieftine decât media apărute după 2018 și albumele cu cel puțin 16 melodii și „EUR” în cod
- Oracle — muzică: albume între 23 și 40 lei lansate înainte de 2018 și ștergerea albumelor scurte și scumpe
- Oracle — orașe: orașele din Spania și reducerea cu 10% pentru Franța
- Oracle — orașe: prețul biletului peste 900 și mărirea cu 10% pentru Spania
- Oracle — pasageri: călători la Roma cu litera A în loc și ștergerea celor din Paris cu bilet peste medie
- Oracle — pasageri: ștergerea biletelor de 250 de lei și pasagerii cu cel mai mic preț
- Oracle — persoană: nume, prenume și localitate; salariul mărit cu 10%
- Oracle — persoană: ordinea alfabetică a localității și prenumele cu litera a pe poziția a doua
- Oracle — persoană: persoanele cu cel mai mare salariu și cele din București sau Sibiu cu salariul peste 1000
- Oracle — persoană: persoanele din Brașov sau București și prenumele care conțin litera a
- Oracle — produse: prețul peste 4 lei în ordine alfabetică și produsele care se vând la kg
- Oracle — produse: produsele expirate în ordinea expirării și valoarea totală a zahărului
- Oracle — salariați: ordinea datei de angajare și salariul mediu
- Oracle — salariați: salariul minim și cel mai tânăr salariat
- Oracle — stoc: materialele ordonate după cantitate și cele cu cantitatea cu cel puțin 20% peste stocul necesar
- Oracle — stoc: valoarea totală a mărfurilor și materialele în ordinea descrescătoare a prețului
- Oracle — zboruri: zborurile companiei TAROM și cele cu destinația Madrid
- Oracle — zboruri: zborurile din luna curentă și zborurile ordonate după dată
- Oracle — zboruri: zborurile din weekend și zborurile ordonate după preț
- Organizare evenimente — model entitate-relație și adăugarea coloanei email
Alte pagini de teorie