Sunteți pe pagina 1din 13

Primul tabel pe care il vom crea va fi tabelul GRUPE deoarece este nevoie de

el in celelalte tabele. El are 4 campuri: Primul camp IdGrupa va fi de tip intreg


(INT), auto incrementabil (AUTO_INCREMENT) si va fi cheia primara
(Primary Key) a tabelului. Campul auto incrementabil este o valoare numerica
care este introdusa automat la fiecare noua inregistrare care se adauga in tabel.
Cheia primara (Primary Key) reprezinta o componenta esentiala a oricarei baze
de date relationale. Orice tabel trebuie sa aiba un camp cu valoare unica pentru
fiecare inregistrare (campul principal). Atunci cand se alege un camp drept
cheie primara, trebuie avute in vedere urmatoarele aspecte:
Un camp cheie primara trebuie sa contina date unice;
Nu se permit intr-un camp cheie primara articole duplicate sau valori nule

Urmatorul camp, Grupa (Ex 112C) contine si litere si cifre si va fi de tip sir de
caractere cu maxim 5 caractere, deci VARCHAR(5).
Campul Facultate va fi de tip VARCHAR cu lungimea 25, la fel si Specialitate.
Vom scrie in editorul de text comenzile ce realizeaza ce am spus pana acum,
adica creeaza tabelul GRUPE (Observatie: comenzile se vor scrie la tastatura si
nu le copiati folosind COPY si PASTE, astfel le veti retine mai usor pentru
test):
create table GRUPE(
IdGrupa INT AUTO_INCREMENT NOT NULL,
Grupa VARCHAR(5),
Facultate VARCHAR(25),
Specialitate VARCHAR(25),
PRIMARY KEY (IdGrupa)
);

Salvati fisierul si mergeti in "terminalul client MySQL" deschis anterior si


executati comanda:
source script.sql;

Urmatorul tabel pe care il vom crea va fi STUDENTI si va avea in structura sa


6 campuri.
Primul camp IdStudent va fi auto incrementabil si cheie primara. Urmatorul
camp este Nume. El este de tip sir de caractere de lungime 25, deci va fi
VARCHAR(25). Tot asa se defineste si campul Prenume.
Campul AnNastere va fi de tip intreg mic (SMALLINT), campul CNP va fi de
tip sir de caractere de lungime 13, deci va fi VARCHAR(13).
Ultimul camp IDGrupa va fi evident INT, cheie straina deoarece trebuie sa fie
corelat cu un camp cheie primara din tabelul GRUPE.
Pentru a descrie tabelul STUDENTI scriem in editorul de text in continuare in
fisierul script.sql:
create table STUDENTI(
IdStudent INT AUTO_INCREMENT NOT NULL,
Nume VARCHAR(25),
Prenume VARCHAR(25),
AnNastere SMALLINT,
CNP VARCHAR(13),
IdGrupa INT NOT NULL,
PRIMARY KEY (IdStudent),
FOREIGN KEY (IdGrupa) REFERENCES GRUPE
);

Salvati acum fisierul si mergeti in "terminalul client MySQL" deschis anterior


si executati comanda:
source script.sql;

Cel de al treilea tabel CURSURI contine si el 4 campuri


Ca mai sus, campul IdCurs va fi de tip auto incrementabil si cheie primara.
Campurile NumeCurs si Profesor vor fi de tip Varchar cu lungimea 25, in timp
ce IdGrupa va fi INT, cheie straina corelata cu cheia primara din tabelul
GRUPE.
Scrieti urmatoarele comenzi:

create table CURSURI(


IdCurs INT AUTO_INCREMENT NOT NULL,
NumeCurs VARCHAR(25),
Profesor VARCHAR(25),
IdGrupa INT,
PRIMARY KEY (IdCurs),
FOREIGN KEY (IdGrupa) REFERENCES GRUPE
);

Salvati fisierul si mergeti in "terminalul client MySQL" deschis anterior si


executati comanda:
source script.sql;

Cel de al patrulea tabel, ORAR are 4 campuri. Acum trebuie sa scrieti voi
singuri comenzile pentru descrierea lui. Ce trebuie mentioat este ca campul
Ziua va avea maxim 8 caractere iar IntervalOrar maxim 11 caractere. De
exemplu 12.00-15.00 va fi o inregistrare corecta pentru campul IntervalOrar.
Cateva cuvinte referitoare la relatiile dintre tabele:
O corelatie (relationship) este o asociere (legatura) intre doua campuri similare,
aflate in tabele diferite. (poate exista o corelatie intre doua tabele care
partajeaza aceleasi date.
De exemplu in tabelul GRUPE din baza de date se atribuie fiecarai grupe un
numar (identificator), atunci se va folosi acel numar si pentru a identifica grupa
in care este un student din tabelul STUDENTI.
O relatie intre doua tabele functioneaza pe baza concordantei datelor din
campuri cheie de obicei un camp cu acelasi nume in ambele tabele.
Campurile prin intermediul carora se creeaza legatura reprezinta cheia primara
(primary key) dintr-un tabel (care furnizeaza un identificator unic pentru fiecare
inregistrare) si o cheie straina (foreign key) in al doilea tabel (un camp dintr-un
tabel care refera cheia primara din alt tabel).
Exista 3 tipuri de corelatii. Cele mai folosite sunt:
Corelatia 1-n (one-to-many relationship) (cea mai folosita) o inregistrare din tabelul
A poate avea 0, 1 sau mai multe inregistrari corespondente in tabelul B, in timp ce
fiecarei inregistrari din tabelul B ii corespunde cel mult o inregistrare din tabelul A. De
exemplu legatura dintre tabelele CURSURI si ORAR.
Corelatia n-m (many-to-many relationship) in care o inregistrare din tabelul A poate
avea 0, 1 au mai multe inregistrari corespondente in tabelul A. Acest tip de relatie este
posibil numai prin definirea unui al treilea tabel (numit tabel de jonctiune) a carui cheie

primara consta din doua campuri cheile straine ale tabelelor A si B. O astfel de relatie
este reprezentata de doua relatii one-to-many. In cazul nostru, tabelele Studenti si Cursuri
sunt legate printr-o relatie many-to-many mediata prin tabelul de jonctiune Grupe.

Un student poate participa la mai multe cursuri iar un curs poate fi audiat de
mai multi studenti. Se observa astfel ca intre obiectele STUDENTI si
CURSURI avem o relatie mai multi la mai multi (many-to-many). O astfel de
relatie se modeleaza printr-un obiect intermediar si doua relatii unul la mai
multi (one-to-many). Acest obiect il reprezinta grupele. Astfel o grupa contine
mai multi studenti iar un student nu poate face parte decat dintr-o singura grupa
(avem relatia one-to-many). Deasemenea o grupa poate audia mai multe cursuri
dar in general (si in cazul exemplului nostru) un curs nu este predat decat la o
singura grupa.
Noi am pus deja relatiile dintre tabele atunci cand am definit structura lor
(adica am spus care sunt cheile primare si care sunt cheile straine.
Vom completa acum scriptul cu popularea tabelelor, adica introducerea datelor.
Se vor introduce mai intai 5 inregistrari in tabelul GRUPE care trebuie
completat primul deoarece datele vor fi necesare in formularul STUDENTI si
CURSURI. Trei sunt date ca exemplu mai jos, iar doua le veti introduce voi:
insert into GRUPE (Grupa,Facultate,Specialitate) values
("111A","Inginerie Electrica","Electrotehnica"),
("411A","ETTI","Comunicatii"),
("311CC","Automatica si Calculatoare","Calculatoare");

De observat ca nu se introduc cheile primare. Ele sunt de tip auto_increment si


se genereaza automat.
Vom scrie 5 inregistrari in tabelul STUDENTI (5 le veti introduce voi in mod
similar).
insert into STUDENTI (Nume, Prenume, AnNastere, CNP, IdGrupa) values
("Ionescu", "Mihai",1990,"1900812892345",1),
("Popescu", "Liviu",1989,"1890812892323",2),
("Dornescu", "Titi",1990,"1900812892356",3),
("Georgescu", "Ionel",1990,"1900709892786",3),
("Petrescu", "Mihnea",1989,"1890812892341",1);

Vom scrie 3 inregistrari in tabelul CURSURI (2 le veti introduce voi in mod


similar):
insert into CURSURI (NumeCurs, Profesor, IdGrupa) values
("Algebra","A. Nita",2),
("Metode numerice","M. Rebican",1),

("Analiza","I. Popescu",3);

Vom scrie 3 inregistrari in tabelul ORAR (2 le veti introduce voi in mod


similar):
insert into ORAR(Ziua, IntervalOrar, IdCurs) values
("Luni","10.00-12.00",1),
("Miercuri","12.00-14.00",2),
("Vineri","08.00-12.00",3);

Interogari
Interogari simple
Scopul instructiunii SELECT este de a regasi si afisa datele din unul sau mai
multe tabele ale bazei de date.
Secventa de prelucrare dintr-o instructiune SELECT poate contine urmatoarele
optiuni:

FROM - specifica tabelul sau tabelele care vor fi utlizate;


WHERE - filtreaza randurile supuse unei anumite conditii;
GROUP BY - formeaza grupuri de randuri cu aceeasi valoare a
coloanei;
HAVING - filtreaza grupurile supuse unei anumite conditii;
ORDER BY - specifica ordinea iesirii.

Ordinea clauzelor din instructiunea SELECT nu poate fi schimbata. Singurele


clauze obligatorii sunt primele doua: SELECT si FROM; restul sunt optionale.
Operatiunea SELECT este inchisa: rezultatul unei interogari dintr-un tabel este
un alt tabel.
Exemplul 1 - Regasirea tuturor randurile si tuturor coloanelor
Listarea detaliilor complete referitoare la toti studentii:
SELECT * FROM STUDENTI;

Tabelul de mai sus are doar 5 inregistrari. Al vostru ar trebui sa aiba 10


inregistrari.
sau in loc de * se scriu toate campurile din tabelul STUDENTI:
SELECT IdSudent, Nume, Prenume, AnNastere, CNP, IdGrupa
FROM STUDENTI;

Evident, prima varianta este mai simpla.


Exemplul 2 - Regasirea anumitor coloane si a tuturor randurilor
Se doreste realizarea unui tabel cu numele cursurilor. Pentru aceasta se
introduce comanda:
SELECT NumeCurs
FROM CURSURI;

Clauza WHERE
Exemplele anterioare au prezentat utilizarea instructiunii SELECT pentru
regasirea tuturor randurilor dintr-un tabel. Dar adesea este necesara
restrangerea randurilor gasite. Acest lucru se poate realiza cu ajutorul clauzei
WHERE formata din cuvantul cheie WHERE urmat de o conditie de cautare
care specifica randurile ce urmeaza a fi regasite. Conditii de cautare pot fi:

compararea - se compara valoarea unei expresii cu valoarea altei


expresii;
domeniul - se verifica daca valoarea unei expresii se incadreaza intr-un
anumit domeniu de valori;
stabilirea apartenentei - se verifica daca valoarea unei expresii este
egala cu una dintr-o multime de valori;
corespondenta de modele - se verifica daca un sir corespunde unui
anumit model;

null - se verifica daca o coloana are valoare necunoscuta.

Exemplul 3 - Conditia de cautare prin comparare


Urmarim listarea studentilor nascuti incepand cu anul 1990:
SELECT Nume, Prenume
FROM STUDENTI
WHERE AnNastere>=1990;

Prin selectie, este creat un nou tabel care contine numai acele randuri ce
indeplinesc conditia precizata prin clauza WHERE.
In limbajul SQL sunt disponibili urmatorii operatori de comparare: = (egal), <
(mai mic), > (mai mare), <= (mai mic sau egal), >= (mai mare sau egal), <>
(diferit), != (nu este egal cu). Se pot utiliza deasemenea operatorii
logici AND, OR si NOT. Regulile de evaluare a unei expresii conditionale
sunt:

O expresie este evaluata de la stanga la dreapta;


Expresiile din paranteze sunt evaluate primele;
Ordinea evaluarii operatorilor logici este: NOT, AND, OR.

Se recomanda utilizarea parantezelor pentru a elimina orice ambiguitate.


Exemplul 4 - Conditia de cautare prin comparare compusa
Urmarim listarea studnetilor nascuti in anii 1989 si 1990.
SELECT Nume, Prenume, AnNastere
FROM STUDENTI
WHERE AnNastere=1989 OR AnNastere=1990;

Sa listam cursurile tinute de profesorii "A. Nita" si "M. Rebican":


SELECT NumeCurs, Profesor
FROM CURSURI
WHERE Profesor="A. Nita" OR Profesor="M. Rebican";

Exemplul 5: Conditia de cautare null (IS NULL / IS NOT NULL)


Listarea studentilor pentru care nu s-a scris CNP-ul:
SELECT Nume, Prenume
FROM STUDENTI
WHERE CNP IS NULL;

SORTAREA REZULTATELOR (clauza ORDER BY)


In general randurile unui tabel rezultat in urma unei interogari SQL nu sunt
aranjate intr-o anumita ordine. Totusi, rezultatele unei interogari pot fi sortate
prin utilizarea clauzei ORDER BY in instructiunea SELECT.
Clauza ORDER BY este formata dintr-o lista de identificatori de coloana,
separati prin virgula, dupa care va fi sortat rezultatul. Un identificator de
coloana poate fi ori denumirea, ori numarul unei coloane care identifica un
element al lstei SELECT prin pozitia sa in cadrul listei; 1 este primul element al
listei.
Exemplul 6 - Ordonarea dupa o singura coloana
Realizam o lista a tuturor studentilor sortare in ordine alfabetica:

SELECT Nume, Prenume, AnNastere


FROM STUDENTI
ORDER BY Nume ASC;

Daca dorim in ordine invers alfabetica, se pune in loc de DESC in loc de ASC.
SELECT Nume, Prenume, AnNastere
FROM STUDENTI
ORDER BY Nume DESC;

Exemplul 7 - Ordonarea dupa mai multe coloane


Realizam o lista ce grupeaza studentii in ordine alfabetica dupa Nume si
Prenume
SELECT Nume, Prenume, AnNastere
FROM STUDENTI
ORDER BY Nume, Prenume;

Tabelul contine ordonarea dupa Nume si Prenume realizata crescator deoarece


optiunea prestabilita este ascendent ASC (nu mai este nevoie sa fie precizata).

Un alt exemplu ar fi realizarea unei liste ce grupeaza studentii dupa Nume


ascendent si dupa AnNastere descendent.
SELECT Nume, Prenume, AnNastere
FROM STUDENTI
ORDER BY Nume, AnNastere DESC;

Utilizarea functiilor SQL de grup


Sunt definite 5 functii de grup din care utilizam doar prima:

count - returneaza numarul de valori dintr-o coloana specificata;


sum
avg
min
max

count(*) reprezinta o utilizare speciala a functiei count. Scopul sau este de a


numara toate randurile unui tabel, indiferent de faptul ca apar au nu null-uri sau
valori duble.
Exemplul 8 - utilizarea functiei count(*)
Dorim sa vedem cati studenti sunt nascuti in anul 1989.

SELECT count(IdStudent)
FROM STUDENTI
WHERE AnNastere =1989;

Dorim sa vedem cate cursuri tine un profesor.


SELECT count(IdCurs)
FROM CURSURI
WHERE Profesor="M. Rebican";

Interogari din tabele multiple


In exemplele anterioare, toate coloanele tabelului rezultant proveneau dintr-un
singur tabel. Pentru a combina coloane din mai multe tabele intr-un tabel
rezultant, este necesar sa se utilizeze operatia de uniune. In limbajul SQL
operatia de uniune combina informatiile din doua tabele prin formarea de
perechi de randuri asociate din acestea.
Ca prim exemplul luam mai multe campuri din tabelele STUDENTI si
GRUPE:
SELECT Nume, Prenume, Grupa, Facultate
FROM STUDENTI, GRUPE
WHERE STUDENTI.IdGrupa=GRUPE.IdGrupa;

Un alt exemplu: toti studentii din grupa 311CC.

SELECT Nume, Prenume, Grupa, Facultate


FROM STUDENTI, GRUPE
WHERE STUDENTI.IdGrupa=GRUPE.IdGrupa AND Grupa="311CC";

Sa vedem acum cati studenti are fiecare grupa.


SELECT Grupa, count(IdStudent)
FROM STUDENTI, GRUPE
WHERE STUDENTI.IdGrupa=GRUPE.IdGrupa GROUP BY Grupa;

Daca dorim sa dam un nume coloanei cu numarul de studenti, scriem:


SELECT Grupa, count(IdStudent) AS "Numar Studenti"
FROM STUDENTI, GRUPE
WHERE STUDENTI.IdGrupa=GRUPE.IdGrupa GROUP BY Grupa;

Daca dorim ca interogarea anterioara sa aiba datele ordonate dupa grupa,


scriem:
SELECT Grupa, count(IdStudent) AS "Numar Studenti"
FROM STUDENTI, GRUPE
WHERE STUDENTI.IdGrupa=GRUPE.IdGrupa GROUP BY Grupa ORDER BY Grupa;

O intergoare care cuprinde clauza GROUP BY se numeste interogare


grupata deoarece grupeaza datele din tabelul SELECT si produce un singur
rand sumator pentru fiecare grup.

In SQL este permisa atribuirea unei denumiri pentru coloana rezultata din
calcul folosind cuvantul rezervat AS.

Un alt exemplu: cate ore are studentul "Popescu"?


SELECT Nume, Prenume, Grupa, Facultate, Ziua, count(CURSURI.IdCurs) AS
"NR_CURSURI"
FROM STUDENTI, GRUPE, CURSURI, ORAR
WHERE STUDENTI.IdGrupa=GRUPE.IdGrupa AND GRUPE.IdGrupa=CURSURI.IdGrupa
AND CURSURI.IdCurs=ORAR.IdCurs AND Nume="Popescu" GROUP BY Nume;