Tabele si campuri (Lectia 2)
O tabela este componenta fundamentala a oricarei baze de date. Ea stocheaza date despre un singur tip de entitate (elevi, note, produse, etc.).
Fiecare coloana din tabela se numeste camp (field) si are un tip de date specific: text, numar, data, autonumerotare.
Fiecare rand din tabela se numeste inregistrare (record) si reprezinta o entitate individuala (un elev, o nota).
| Camp | Tip Date | Exemplu Valoare | De ce acest tip? |
|---|---|---|---|
| ID_Elev | AutoNumber | 1, 2, 3... | Unic, automat - identificator perfect |
| Nume | Short Text | Popescu | Text scurt - sub 255 caractere |
| Prenume | Short Text | Andrei | Text scurt - sub 255 caractere |
| DataNasterii | Date/Time | 15/03/2012 | Permite calcule cu date (varsta, etc.) |
| Clasa | Short Text | 8A | Text, nu numar (contine si litera) |
Cheia primara: ce este si de ce conteaza
Cheia primara (Primary Key, prescurtat PK) este un camp care identifica unic fiecare inregistrare din tabela. Nu pot exista doua randuri cu aceeasi valoare a cheii primare.
In proiectul nostru:
- ID_Elev este PK in tabela Elevi - fiecare elev are un numar unic
- ID_Nota este PK in tabela Note - fiecare nota are un numar unic
Cheia primara functioneaza ca un cod unic de identificare. Gandeste-te la CNP-ul (Codul Numeric Personal): fiecare persoana din Romania are un CNP diferit, deci chiar daca doua persoane se numesc "Ion Popescu", le deosebesti dupa CNP. La fel, cheia primara deosebeste inregistrarile din baza de date chiar daca au date similare.
Atentie: In aplicatii reale, CNP-ul este o data personala sensibila si nu se stocheaza fara un motiv legal justificat. In bazele de date scolare se folosesc ID-uri generate automat (AutoNumber), nu CNP-uri reale.
Cheie straina si relatia intre tabele
Cand un camp dintr-o tabela "arata" catre cheia primara a altei tabele, ii spunem cheie straina (Foreign Key, prescurtat FK).
In proiectul nostru, ID_Elev din tabela Note este o cheie straina care face legatura cu ID_Elev din tabela Elevi. Asa stie Access ca nota "Matematica 9" apartine lui "Popescu Andrei".
Relationship Diagram
Un elev poate avea mai multe note (la diferite materii). Dar fiecare nota apartine unui singur elev. Aceasta relatie se numeste "unu la multi" (one-to-many) si este cel mai frecvent tip de relatie in bazele de date.
Cele 3 interogari din proiect
O interogare (query) pune o intrebare bazei de date si obtine un raspuns. In proiectul nostru am creat 3 interogari care demonstreaza diferite tehnici:
| Interogare | Tehnica folosita | Concept din lectie |
|---|---|---|
| Elevi_Alfabetic | ORDER BY (sortare) | L5: Sortare Ascending |
| Elevi_Media_Peste_8 | GROUP BY + AVG + HAVING | Concept nou — explicat in Atomul 5 al acestei lectii |
| Note_Elev_Specific | WHERE (filtrare) | L4: Criterii de selectie + L5: Filtrare |
Interogarea cu media (Avg) — GROUP BY, AVG, HAVING
Aceasta este cea mai complexa interogare din proiect si introduce trei concepte noi. Le explicam pe rand, cu exemple simple.
Tabelul Note arata asa (simplificat):
| ID_Elev | Nota |
|---|---|
| 1 (Popescu) | 9 |
| 1 (Popescu) | 8 |
| 2 (Ionescu) | 10 |
| 2 (Ionescu) | 7 |
Vrei rezultatul: Popescu = media 8.5, Ionescu = media 8.5. Cum?
GROUP BY Elevi.Nume, Elevi.Prenume instruieste Access sa adune toate notele unui elev intr-un singur grup. Astfel, in loc de 4 randuri, obtii 2 grupuri: un grup Popescu cu notele {9, 8} si un grup Ionescu cu notele {10, 7}.
Avg(Note.Nota) calculeaza media aritmetica pentru fiecare grup. Pentru Popescu: (9+8)/2 = 8.5. Pentru Ionescu: (10+7)/2 = 8.5.
Alte functii de agregare pe care le vei intalni: SUM (suma), COUNT (numara), MAX (maximul), MIN (minimul).
HAVING Avg(Note.Nota) > 8 pastreaza doar grupurile unde media depaseste 8.
De ce nu WHERE? WHERE filtreaza randuri inainte de grupare — nu poti folosi WHERE cu o valoare calculata (media nu exista inca). HAVING filtreaza dupa ce media a fost calculata pentru fiecare grup.
| Componenta SQL | Ce face | Exemplu cu date reale |
|---|---|---|
| SELECT Nume, Prenume | Alege coloanele de afisat | Popescu, Andrei |
| Avg(Nota) AS MediaNota | Calculeaza media si o numeste MediaNota | (9+8)/2 = 8.5 |
| INNER JOIN ... ON | Leaga tabelele prin ID_Elev | Elevi.ID_Elev = Note.ID_Elev |
| GROUP BY Nume, Prenume | Grupeaza notele per elev | Toate notele lui Popescu intr-un grup |
| HAVING Avg(Nota) > 8 | Pastreaza doar grupurile cu media > 8 | 8.5 > 8 → Popescu apare in rezultat |
Diferenta dintre sortare si filtrare
Sortarea schimba ordinea in care vezi datele, dar le pastreaza pe toate. Ca si cum ai rearanja cartile dintr-un sertar dupa marime.
Filtrarea ascunde datele care nu corespund criteriului. Ca si cum ai scoate din sertar doar cartile rosii si le-ai pune pe masa.
| Actiune | Ce face | In proiect |
|---|---|---|
| Sortare Ascending | Ordoneaza A → Z sau 1 → 9 | Elevii in ordine alfabetica |
| Sortare Descending | Ordoneaza Z → A sau 9 → 1 | Notele de la cea mai mare |
| Filtrare | Afiseaza doar randurile care indeplinesc o conditie | Doar notele la "Matematica" |
| Combinare | Filtrare + Sortare impreuna | Doar Matematica, sortate descrescator |
Cum poti face proiectul si mai bun
Baza de date pe care ai construit-o poate fi extinsa cu:
Campuri: ID_Absenta (AutoNumber, PK), ID_Elev (Number, FK), DataAbsenta (Date), Motivata (Yes/No). Apoi poti face o interogare care numara absentele nemotivate ale fiecarui elev!
Access poate genera rapoarte printabile bazate pe interogari. Imaginati-va un raport "Situatia scolara" cu numele elevului, media la fiecare materie si numarul de absente - totul formatat frumos pentru print!
In loc sa introduci datele direct in tabela, poti crea un formular cu campuri frumos aranjate, etichete clare si butoane. E ca diferenta intre a scrie intr-un Excel vs. a completa un formular web.