0% au considerat acest document util (0 voturi)
9 vizualizări200 pagini

MySQL Book - Academia Programatorilor

Încărcat de

Anamaria BARBU
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
9 vizualizări200 pagini

MySQL Book - Academia Programatorilor

Încărcat de

Anamaria BARBU
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

Primii pasi in lumea

programarii
Baze de date mySql.

Invata limbajul SQL de la zero

1
Prefata.
Cum am devenit programator.

Salut, eu sunt Tudor. Lucrez ca programator din anul 2018 si in randurile urmatoare iti voi
povesti cum am reusit pe cont propriu sa intru in industria IT sis a obtin jobul mult visat.

Scriu aceste randuri in speranta de a-mi impartasi povestea cu alte personae care probabil ar
vrea sa faca acest pas, si nu stiu de unde sa inceapa.

Este ceva ce cred ca oricine ar putea face si cred de asemenea ca povestea mea v-ar putea ajuta
sa ajungeti unde doriti.

Sa incepem inca de la [Link] terminat Liceul si am mers la o facultate doar de gura alor
[Link] mers sa fac ceva ce stiam ca nu imi place. Din moment ce nu mi-a placut, efectiv nu mi-am
canalizat energia in terminarea acestei facultati, sip ana la urma am renuntat inca din anul 1, din a doua
sesiune.

De-a lungul timpulu, am ajuns sa cred ca pana sa gasesti cee ace iti place trebuie sa incerci mai
multe lucruri, cee ace am si facut. Am lucrat pe parcursul a 4 ani de zile ca barman, ospatar, consultant
financiar si in cele din urma, ceasornicar. Simteam ca desi fac ceva cu timpul meu ca sa produc ceva, nu
era cee ace imi place si banii castigati nu ma ajutau. De asemenea, nici nu m-as fi vazut facand acele
lucruri pe viitor, pe termen lung.

Toate astea, pana sa ies intr-o seara cu niste prieteni la o bere, sis a-mi spuna unul dintre ei “Stii
ce?Ar trebui sa te faci programator. Sunt sigur ca te-ai descurca super!”.

Prima mea reactive a fost sa rad. Nici nu-mi trecea prin cap ca as putea face asa ceva
[Link] de parere ca programatorii sunt niste oameni super educati, tehnici, extraterestrii
excelenti la matematica, cee ace eu nu am fost niciodata. Dar mi-a zis “Nu. Chiar cred ca te-ai descurca
foarte bine.”.

Eu l-am luat pe nu in brate. SI mi-a spus “Ok. In cazul asta o sa-ti trimit niste materiale peste care
poti sa te uiti. In cel mai bun caz or sa iti placa, iar in cel mai rau caz, o sa pierzi jumatate de ora.”.

Am acceptat, mi-a trimis materialele, iar eu, care la momentul respectiv eram o persoana care
tot cee ace stia sa faca era sa lucreze aceeasi rutina, sa iasa in weekenduri sis a se uite la seriale, m-am
trezit pe langa cele 8 ore de munca zilnice, stand inca 2-3 citind si luand notite. Eu, care nu mai pusesem

2
mana pe un caiet si un pix de cel putin 3 ani de zile ! Si m-am gandit “Wow! Chiari mi [Link] ceva ce
chiar m-as vedea facand”.

Si am luat toate masurile necesare pentru a realiza acest nou tel.

M-am inscris la un curs de Java Development si de SQL la o academie din bucuresti si mi-am
stability un program de invatare. Mi-am notat pana si pe perete, intr-un calendar, numarul de ore
lucrate zilnic.

Mi-am propus ca in urmatoarele 6 luni sa lucrez in domeniu, cee ace, atat prin munca cat si prin
putin noroc, am reusit.

In decursul celor 6 luni, bazandu-ma pe ce am invat din materialele de la curs si din materialele
de pe internet, mi-am facut un portofoliu de 4 proiecte in Java si de SQL pentru a le putea in CV.

Undeva pe la a cincea luna, am decis ca este momentul sa incep sa [Link] aveam facultate in
domeniu si nici nu mi-as fi permis din punct de vedere al timpului si nici financiar sa ma inscriu la o
facultate in domeniul informaticii.

Tot ce aveam era un curs de Java si de SQL si un mic numar de proiecte ca sa vada recruiterii ca
nu am efectiv zero experienta in domeniul in care doream sa intru.

Am inceput sa aplic la aproximativ 30 de companii diferite si nu am primit inapoi nici un


raspuns.A fost descurajator.

Mi-am dat seama ca ceva nu era ok in cee ace facem. Asa ca am apelat din nou la acel prieten de
la care a pornit toata initiativa, pe care in acest punct, il consideram un mentor. In acel moment am lasat
totul deoparte si am refacut cu ajutorul lui CV-ul, iar atunci am invatat ca nu conteaza atat de mult
backgroundul tau, cat felul in care stii sa te vinzi. Nici macar nu am mai aplicat pe BestJobs, eJobs sau
alte siteuri in care trebuie sa iti completezi CV-ul, iar in momentul in care aplici pentru o anumita pozitie
esti automat aruncat in cosul de gunoi deoarece CV_ul tau nu respecta anumite criterii: cum ar fi licenta,
masterat, doctorat, rocket science, 20 de ani de munca in domeniu si asa mai departe.

Asa ca mi-am pus la punct CV-ul si pagina de LinkedIn, apoi am inceput sa adaug in lista mea de
contacte recruiter efectiv cu galeata.

Am aplicat la toate joburile de internship si de junior developer posibile. Pe langa asta, nu a fost
un singur recruiter in lista mea care sa nu fi deschis LinkedIn-ul intr-o zi sis a nu vada un mesaj de la
mine sub forma “Salut!Eu sunt Tudor. Aceasta este situatia mea, am vazut ca lucrezi la compania X si ma
intrebam daca exista o oportunitate pentru mine in cadrul acestei companii.

Din 500 de recruiter, nu. Nu am avut 500 de oportunitati. Am avut doar 5. Nu am fost acceptat
la primul job, nu am fost acceptat nici la al doilea, iar in momentele acestea, primele ganduri care iti trec
prin cap sunt ca nu esti pregatit si ca nu esti indeajuns de bun.

Pe de alta parte, stiam cat de mult am tras timp de aproape sase luni de zile si nu aveam de
gand ca toata munca mea sa fie degeaba.

3
Asa ca in timp ce imi cautam in continuare interviuri, continuam sa invat in paralel. Tot timpul
meu era ocupat numai cu asta. Am renuntat de asemenea si la anumite lucruri pentru a putea ajunge in
punctul in care doream sa ajung. Asa ca am picat si al treilea, si al patrulea interviu.

In schimb,a venit al 5-lea interviu, la care am facut o impresie buna si am fost acceptat.

Am fost acceptat la un proiect de internship in care timp de o luna de zile ni s-au pus la
dispozitie toate materialele necesare si am avut ajutor din partea unor mentori pentru a realiza un
proiect.

Am facut acel proiect, au fost multumiti, si prin urmare au vrut sa colaboram in continuare. Iar
acum, dupa 2 ani de zile, lucrez in continuare cu ei si sunt super multumit pe toate [Link]
professional, si personal, si financiar.

In acest moment, pe langa jobul full time, lucrez la Academia Programatorilor, unde predau
cursuri de programare Java si SQL.

Care este scopul meu aici? Sa ajut personae ca tine, daca inca citesti aceste linii, sa ajunga pana
la nivelul la care eram in momentul in care am inceput sa aplic la toate cele 500 de joburi posibile,
totodata, umpland si golurile pe care in timp am realizat ca le aveam la momentul respectiv.

Din povestea mea, sunt anumite lucruri care merita scoase in evidenta:

[Link] decizi ca vrei sa faci aceasta schimbare, este foarte important sa ai un timeline. Adica o
data limita setata a momentului in care vrei sa incepi sa aplici la diverse joburi. Acest timeline depinde
de ritmul fiecaruia si de intensitatea dorintei sale de a ajunge la acel punct. Pentru mine, acel deadline a
fost de 6 luni. Pentru tine poate fi de 3, poate fi de 6, poate fi de un an. Aceasta carte te va ajuta sa iti
dai seama, desi in cursurile pe care le predau la Academia Programatorilor, 6 luni este termenul ideal.

Cu ce te ajuta setarea acestui termen limita?

Avandu-l in fata zi de zi, vei avea un plan de actiune lunar, saptamanal si zilnic. Daca il respecti,
te vei simtii pregatit.

Una din greselile pe care le fac majoritatea in acest prim pas este ca nu isi seteaza un termen
[Link] acea zi de angajare se poate extinde la un an, doi ani, trei, patru, si asa mai departe. Ani si ani
la rand. Nu au nici un sens de urgenta de a ajunge la punctul final, lucru care poate fi corectat de
asemenea si prin inscrierea la un curs professional, unde vei avea parte de indrumare din partea unui
instructor.

[Link] doilea lucru pe care ar trebui sa il consideri este facultatea. Si cand spun sa il consideri, ma
refer sa te gandesti daca facultatea in domeniu este ceva ce ar fi util pentru tine.

Neavand facultate si ajungand in punctul in care sunt in acest moment, nu cred ca as face nimic
diferit. Pentru mine, la momentul respectiv, sa pierd 4 ani si zeci de mii de lei nu a fost o optiune.

Este utila o facultate? Absolut. Vei invata atatea lucruri utile acolo. Insa domeniul informaticii
este unul atat de vast si de cautat, incat, de cativa ani, facultatea in acest domeniu nu mai este o
necesitate peste tot, iar cei 4 ani de facultate pot fi comprimati in numai cateva luni de zile, avand un
plan concret si disciplina.

4
Al treilea lucru care vreau sa reiasa din povestea mea este realizarea CV-ului si modul in care te
vinzi. Neavand nici o experienta in domeniu, este important sa ai un miniporfoliu de proiecte personale,
pentru a atrage privirea recruiterilor. De a le indrepta atentia de la faptul ca nu ai nici o experienta in
domeniu, la faptul ca ai bazele stapanite si esti in stare sa le aplici cu success in cadrul unor proiecte
propuse de tine.

Daca ai un curs de programare absolvit, trece-l de asemenea in cv, cum am facut si eu. Trece-ti
de asemenea si tehnologiile [Link] iti scrie un bio sau o descriere sub forma “Looking for a job”.
Scrie ceva care sa te scoata in [Link] care arata recruiterilor ca esti pasionat de acel domeniu si
ca esti dispus sa muncesti. Asta este tot ce ai nevoie.

In acest fel, oportunitatile nu vor veni inspre tine. Dar toate aceste lucruri te vor ajuta enorm in
momentul in care vei decide sa mergi tu spree le.

Inainte sa facem impreuna primii pasi in lumea programarii in aceasta carte, mai vreau sa iti
spun un lucru:

[Link] displicinat. Atat cu parere de rau, cat si de bine, iti spun ca nu exista nici o alta
modalitate in care acest lucru se va intampla si pentru tine. Nu o sa poti ajunge de la a nu sti sa
programezi, la a sti programare, decat daca esti disciplinat, metodic si dedicate planului pe care, daca
inca citesti cee ace am de spus, sunt convins ca o sa ti-l asumi.

Prin toate punctele acestea, tot cee ace faci este sa iti cresti [Link] este un lucru
essential. Datorita muncii am fost extrem de norocos si am ajuns in punctul pe care mi l-am propus.

Asadar, daca te aflii in situatia in care am fost si eu, fii optimist, pentru ca posibilitatile sunt mult mai
mari decat realizezi in acest moment. Iar daca vrei sa o iei pe acest drum, aceasta carte este un prim pas
frumos.

Spor la invatat

5
1.
De ce SQL? 7 motive

Limbajul de interogare structurat, sau ceea ce este mai cunoscut sub numele de SQL, este un
limbaj de programare special folosit pentru interacțiunea cu bazele de date. Funcționează prin
analizarea și înțelegerea bazelor de date formate din câmpuri de date din tabele.

SQL are rădăcini care datează de la începutul anilor 1970, timp în care inginerii IBM Donald Chamberlin
și Raymond Boyce au proiectat versiunea inițială pentru manipularea și recuperarea datelor stocate în
sistemul de baze de date al companiei. Cei doi pionieri ai SQL și-au numit noul limbaj SEQUEL, deși mai
târziu au fost obligați să-l schimbe din cauza problemelor legate de mărci comerciale. SQL a devenit de
atunci un standard oficial pentru Institutul Național de Standardizare American (ANSI) și Organizația
Internațională pentru Standardizare (ISO).

# 1) Exploatarea datelor

Învățarea SQL vă va permite să extrageți datele cu o eficiență mai mare. Folosind interogări de
bază puteți identifica date specifice, vizualiza evenimente de actualizare, monitoriza activitatea tabelului
și multe altele. Numai acesta ar trebui să fie un motiv suficient pentru a lua inițiativa și a învăța SQL.

# 2) Programatori SQL în mare cerere

Nu ar trebui să aveți probleme la găsirea unui loc de muncă ca programator SQLSQL este un
limbaj de programare lafel de cautat ca si Java, JavaScript, C #, Python, C ++ și PHP.

# 3) Manipularea datelor

SQL este deosebit de eficient la manipularea datelor. Deoarece vă permite să vedeți datele
exacte și cum funcționează, veți avea un timp mai ușor de testat și manipulat datele. În plus, datele
stocate în SQL sunt dinamice, ceea ce înseamnă că pot fi modificate și manipulate în orice moment
folosind unele interogări de bază.

# 4) Combinați date din mai multe surse

6
Combinarea datelor din două sau mai multe surse poate fi o sarcină care necesită mult timp și
de-a dreptul descurajantă. Cu toate acestea, SQL face ca procesul să fie ușor, susținând „fuziuni” simple
în care sunt combinate câmpurile specificate sau baze de date întregi.

# 5) Gestionați grupuri mari de date

Căutați în continuare o modalitate practică de a gestiona seturi de date mari? Foi de calcul
tradiționale pot fi utilizate pentru a gestiona grupuri de date de dimensiuni mici până la mijlocii, dar veți
avea nevoie de o soluție diferită atunci când gestionați înregistrări excesiv de mari. Din fericire, acesta
este un domeniu în care SQL strălucește: indiferent dacă este vorba de 1.000 de înregistrări sau de 100
de milioane, SQL este complet echipat pentru a gestiona date-unelte de aproape toate dimensiunile.

# 6) Servere și baze de date

Dacă intenționați să gestionați serverele sau să vă creați propriul server, limbajul de programare
SQL se va dovedi cu siguranță util. Multe servere folosesc baze de date precum MySQL sau SQL Server
pentru a păstra, bine, date. Familiarizându-vă cu SQL și cu interogările respective, puteți naviga cu
ușurință prin rețeaua de date setată altfel confuză.

# 7) Avantaj in fata tuturor celor care vor sa devina programatori.

Domeniul programarii este unul foarte cautat. Cererea de pe piata este mult mai mare decat oferta de
munca. Multe personae, mai ales in ultimii ani, au decis sa faca o reconversie profesionala in aceasta
directive.

Acesta nu este un lucru [Link] munca si dedicatie, dar daca vrei o viata de care sa fii multumit,
acest lucru nu se poate considera un sacrificiu.

Cand esti la inceput de drum, primul pas pe care trbeuie sa il faci este sa iti alegi un limaj de programare.

Oricare ar fi acesta, simplul fapt ca vei cunoaste SQL te va avantaja enorm in fata persoanelor care vor sa
se angajeze in industria it, nestiind acest limbaj.

7
2.
Introducere in SQL si mySQL
Termenul de SQL vine de la Structured Query Language.

Un query language este un tip de limbaj de programare care a fost conceput să faciliteze

comunicarea și preluarea informațiilor din bazele de date. Într-un concept simplu, SQL este

limbajul bazelor de date.

• Majoritatea companiilor își stochează informatiile în baze de date, iar acestea sunt impartite in 2
categorii. Baze de date Relaționale si Nerelaționale, MySql fiind un tip de baze de date relațional.

• Bazele de date relationale pot fi de mai multe feluri: Cum spuneam, avem MySql, si mai putem avea
PostgreSql, Microsoft SQL, OracleDb, samd.

• Majoritatea acestor baze de date folosesc limbajul SQL, deci odată ce ne punem la punct bazele
acestui limbaj, vom putea lucra cu aproape oricare tip de bază de date.

O bază de date relațională este o bază de date care stochează informații înrudite între ele în

mai multe tabele și permite parcurgerea informațiilor în mai mult de un singur tabel în cadrul

aceleiași căutări.

Este mai ușor să înțelegem cum funcționează acest concept gândindu-ne la un exemplu.

8
Să ne imaginăm că suntem o companie care vrea să țină track-ul vânzărilor. Am putea să creăm

un spreadsheet în Excel cu toate informațiile pe care vrem să le urmărim sub forma diverselor

coloane: Numărul comenzii, data comenzii, valoarea, tracking number, numele clientului,

adresa clientului, numarul său de telefon, și așa mai departe.

Putem vedea ca in acest fel, in spreadsheetul nostru de excel avem trecute datele a doua
entitati.

Avem atat datele comenzii noastre, cat si datele clientilor nostrii. Atunci cand un client va plasa
mai mult de o singura comanda, datele lui vor fi repetate pentru fiecare comanda in [Link] ce este
costisitor atat din punct de vedere al memoriei, cat si al unei eventuale viteze de procesare a
informatiilor.

Cu o bază de date relațională, ca cea din diagrama de jos, vom evita toate

aceste posibile probleme. Vom putea seta doua tabele, una pentru comenzi și una pentru

clienții noștri.

Tabela clienților noștri va conține un id, un identificator unic pentru fiecare client,

laolaltă cu numele, adresa și numărul de telefon ale acestuia.

9
Comenzile noastre vor include un identificator unic al comenzii, data, valoarea, tracking
numberul, și în loc să avem un field separat pentru fiecare tip de date al clientului nostru, vom avea id-
ul unic al acestuia, acesta fiind o referință către tabelul de client.

Pentru a putea rula local o bază de date, avem nevoie de 2 lucruri: Instalarea locală a unui server
mySql și de instalarea unui tool pentru a parcurge bazele noastre de date: MySqlWorkbench.

10
3
Ce sunt bazele de date?
O baza de date este alcatuita din mai multe tabele. Tabelele sunt locurile in care noi ne vom
stoca [Link] tabel va stoca in el un anumit tip de [Link] avea tabele in care sa
stocam datele produselor noastre, ale clientilor, ale angajatilor, si asa mai departe.

Cand ne-am instalat mysql server si mysql workbench, am instalat, asa cum sugereaza si numele,
un server in care bazele noastre de date vor fi stocate. Iar orice server, intotdeauna ruleaza pe un host si
un port. In cariera voastra, veti ajunge in punctul in care serverele pe care o sa lucrati nu or sa fie ale
voastre. Vor fi ale companiei sau ale clientului, iar acestea vor fi pe calculatoarele lor.

Acum, pentru a invata limbajul sql, am pornit un server local. Iar orice server local, va rula
intotdeauna pe hostul “localhost”. De asemenea, bazele de date mySql, indifferent daca sunt bazele
voastre de date locale, sau bazele altcuiva, vor rula intotdeauna pe portul 3306. Aceasta esta valoarea
universala a portului mysql.

De asemenea, pentru a intra intr-o baza de date, exista posibilitatea autentificarii. Te poti
autentifica, sau nu. Nu exista nici un caz in industrie in care bazele de date sa nu aiba credentiale de
[Link] ar putea sa nu, acest lucru este [Link] de aceea, serverul nostru local a
fost instalat cu username-ul root si cu parola pe care fiecare si-a ales-o, si fara de care conexiunea
noastra la serverul de mySql va fi imposibila.

Pana acum, am specificat doi termeni: SQL si mySql. SQL este limbajul bazelor de date, pe cand
mySql reprezinta serverul.

11
4.
Tabele

In acest capitol vom vorbi despre tabele. Cum am spus in capitolul anterior, tabelele sunt
locurile in care noi ne vom stoca informatii specifice, associate obiectelor ,persoanelor si domeniilor din
viata reala.

Un tabel este alcătuit din rânduri și coloane. Fiecare coloana reprezinta o anumita proprietate a
intrarilor noastre din tabelul respective. In modelul din imagine, putem observa coloanele id name
designation salary si skills, Fiecare dintre acestea reprezinta proprietatiile angajatilor nostrii.

Un rand dintr-un tabel reprezinta un entry. In imagine putem observa 5 entry-uri in tabelul
nostru, primul avand idul 1001, numele john, designation 2, salariul 2000 si skillurile .net si sql.

1001, john, 2, 2000, .net si sql sunt date. Iar in capitolul urmator vom vorbi despre tipurile de date din
SQL.

12
5.
Tipuri de date in SQL

Lafel ca si in Java, si in orice alt limbaj de programare orientat pe obiect, am vazut ca in SQL , noi
vom lucra cu informatii. Iar aceste informatii pot avea tipuri diferite de [Link] cele despre care vom
vorbi acum sunt cele mai folosite tipuri de date din SQL.

In primul rand avem INT. INT-ul poate stoca, asemenea intului din java, valori de tip numeric
intregi.

Avem VARCHAR, care stocheaza informatii de tip text. Acest VARCHAR, poate fi asociat cu
Stringul din Java. In schimb, in momentul in care ne definim o coloana de tip VARCHAR, mai trebuie sa
specificam inca ceva. Puteti vedea in imagine ca dupa textul VARCHAR, avem un numar intre paranteze.
Acel numar, reprezinta numarul caracterelor pe care tabelul nostru le va aloca coloanei [Link]
este recomandat sa ne definim coloane de tip VARCHAR de o dimensiune mai mare decat informatia pe
care urmeaza sa o stocam, deoarece acest lucru este costisitor din punct de vedere al memoriei.

13
Daca stim ca urmeaza sa ne creem o coloanal in care vom stoca un email, putem aloca orientativ
un numar de 30 de caractere [Link] stim ca intr-o coloana vom stoca sexul unei persoane, indicat
ar fi sa ne declaram o coloanal VARCHAR(1), din moment ce in ea vom introduce fie litera M, fie F.

Daca intr-o coloana de tip varchar care are alocat 20 de pozitii vom incerca sa introducem un
text care are 30 de caractere( cu spatiile goale incluse), textul pe care noi incercam sa il introducem va fi
decupat, si vor fi introduce doar primele 20 de caractere din acesta.

Urmatorul tip de date este [Link] poate fi asociat cu tipurile de date double si float
din java. Acesta stocheaza numere cu virgula. Acest decimal, spre deosebire de VARCHAR, va astepta
intre paranteze 2 numere, despartite de [Link] numar reprezinta numarul total de cifre alocat
pentru entry, iar al doilea reprezinta numarul de cifre de dupa virgula.

Ca un exemplu, daca noi intr-o coloanal de tip Decimal am vrea sa introducem numere de la 0 la
9 cu doua cifre dupa virgula, cum ar fi 4.56 , primul numar declarant in paranteza ar trebui sa fie egal cu
3 , adica numarul total de cifre, iar al doilea, ar trebui sa fie egal cu 2. Adica numarul de cifre de dupa
virgula.

Tipul de date Blob, va stoca imagini, insa nu ne vom axa pe el in acest curs.

De asemenea, vom avea tipul de date DATE, care va stoca date [Link] date
temporale, in java, vor fi reprezentate de obiecte de tip LocalDateTime sau Date, despre care vom vorbi
in cursul nostru de java avansati

Tipul de date TIMESTAMP, poate stoca de asemenea un anumit punct in timp. Acest punct este
reprezentat de un numar care reprezinta numarul total de secunde care au trecut la data de 01. 01.1970
la secunda 1 de dupa miezul noptii.

Acum ca am vorbit despre cele mai folosite tipuri de date din SQL, in capitolul urmator vom
invata sa creem propria noastra baza de date, sa ne conectam la ea, si vom invata sa creem tabele

14
6.
Crearea bazelor de date si a tabelelor.
Acum ca ne-am legat la conexiunea noastra, vom crea prima noastra baza de date.

Crearea unei baze de date se realizează prin instrucțiunea CREATE DATABASE db_name;

Prin instructiunea SHOW DATABASES, putem vedea toate bazele noastre de date create.

Pentru a putea lucre in baza respectiva de date, va trebui sa ne folosim inainte de ea. Acest lucru
se realizeaza prin instructiunea USE numeleBazeiDeDate;

Putem vedea ca daca incercam sa ne folosim de o baza de date inexistenta, vom avea o eroare.

Acum ca suntem conectati la baza noastra de date, urmeaza sa cream un tabel.

Crearea unui tabel se realizeaza prin instructiunea CREATE TABLE, dupa care vom specifica
numele tabelului nostru. Dupa ce am ales un nume, vom deschide si vom inchide doua paranteze
rotunde, iar la final, vom pune punct si virgula.

In interiorul acestor paranteze rotunde, vom specifica, la virgula, coloanele tabelului nostru.

Acestea vor fi specificate sub forma NUMELE COLOANEI, care va fi un nume ales de noi, PAUZA,
TIPUL DE DATE. Care poate fi un tip de date despre care am discutat in videoul anterior.

O instructiune in SQL se mai numeste si QUERY. Query-ul de mai sus ne va crea un tabel de
persoane, care vor avea proprietatile id, nume si prenume.

15
6.1
Exercitii
1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si un pret de tip double [Link]

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume, un numar de telefon, o data a nasterii si o inaltime.

16
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o
memorie ram, un procesor si un pret

17
7.
STERGEREA SI MODIFICAREA TABELELOR

Stergerea unui tabel se realeaza prin comanda DROP TABLE, dupa care vom specifica numele
tabelului pe care dorim sa il stergem

Modificarea structurii unui tabel, poate consta in doua lucruri. Adaugarea si Stergerea
[Link] lucruri se realizeaza prin comanda ALTER TABLE, dupa care vom specifica numele
tabelului a carui structura vrem sa o modificam.

Dupa numele tabelului, vom alege ce anume vrem sa facem. Com specifica daca vrem sa
adaugam o coloanal, sau daca vrem sa stergem o coloana.

Instructiunea ADD va adauga o noua coloanal in tabela noastra. Ea este urmata de numale noii
coloane, si de tipul ei de date.

Instructiunea ALTER TABLE persoana ADD column_name DECIMAL(3,2), va adauga o noua


coloanal tabelului nostru, care va fi numita column_name, si care va avea tipul de date decimal, in care
vom putea stoca numere compuse din 3 cifre, dintre care doua vor fi dupa virgula.

Instructiunea DROP COLUMN va sterge o coloanal deja existenta din tabelul nostru. Ea este
urmata de numele coloanei pe care dorim sa o stergem.

Query-ul ALTER TABLE persoana DROP COLUMN column_Name, va sterge din tabelul nostru de
persoane coloana numita column_name, doar daca aceasta exista. Daca nu exista, queryul nostru va da
o eroare.

18
7.1
Exercitii
1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si un pret de tip double [Link] Stergeti coloana pretului din tabel.

2. Creati tabelul people, care sa stocheze [Link] vor avea un id si un nume.

Adaugati o coloana care sa reprezinte sexul persoanei ( M sau F ) si o coloana care sa reprezinte iq-ul
persoanei.

19
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o
memorie ram, un procesor si un pret

Stergeti coloanele memorie si processor.

Adaugati coloanele culoare si descriere.

20
8.
Inserarea datelor in tabel.
Acum ca stim cum sa cream tabele, cum sa le stergem si cum sa le modificam structura, a venit
momentul sa invatam cum putem introduce date in ele.

Inserarea datelor in tabel se realizeaza prin Instructiunea INSERT INTO , dupa care vom specifica
numele tabelului in care dorim sa introducem un entry. Dup ace specificam numele tabelului , com scrie
VALUES si vom deschide si inchide paranteze rotunde, in interiorul carora vom specifica, la virgula, valori
pentru toate coloanele la care tabelul nostru se asteapta.

Numarul valorilor specific in paranteze trebuie sa fie 1 la 1 cu numarul coloanelor tabelului, si de


asemenea, trebuie sa fie de tipul de date respective, Daca nu indeplinim aceste conditii, queryul nostru
va arunca o eroare.

Sa presupunem ca avem tabelul student, iar fiecare student va avea un id de tip INT , si un
nume, un email si o situatie de tip VARCHAR.

In instructiunea noastra de inserare a unui entry, va trebui sa specificam pe rand idul, numele
emailul si situatia. Pentru id, din moment ce este de tip INT, vom trece direct numarul, iar la virgula, vom
trece valori pentru urmatoarele coloane. Urmatoare coloane in cazul nostru sunt de tip VARCHAR. Prin
urmare noi va trebui sa le introducem sub forma de text. Spre deosebire de Java, unde textul, si mai
exact valorile de tip String trebuiesc trecute intre ghilimele double, in SQL, valorile de tip VARCHAR
trebuiesc trecute intre ghilimele simple.

Aceasta a fost o inserare completa a unui entry dintr-un tabel.

21
Inserarea partiala in tabel

Inserarea mai poate fi realizata si doar pentru anumite coloane, alese de [Link] trebuiesc
specificate in paranteze dupa numele tabelului, iar valorile introduce in paranteze dupa keywordul
VALUES, trebuiesc specificate in ordinea respectiva.

Prin aceasta isntructiune, un nou entry va fi adaugat in tabelul nostru de student, cu valori
pentru fiecare coloanal specificata in [Link] schimb, toate coloanele existente in tabelul meu care nu
au fost specificate, vor avea valoarea default, care este NULL.

22
8.1
Exercitii
1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si o descriere

Adaugati 3 produse in tabel.

2. Creati tabelul elev, care sa stocheze elevi. Elevii vor avea un id de tip numeric, un nume si o
medie [Link]

Adaugati 5 elevi.

23
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o
memorie ram, un procesor si un pret

Adaugati 3 calculatoare, specificandu-le doar marca si ramul.

Adaugati 3 calculatoare, specificandu-le doar marca si procesorul.

24
Citirea tuturor datelor din tabel
Citirea tuturor datelor din tabel se realizeaza prin instructiunea SELECT. Dupa ea. Vom specifica
caracterul * (steluta), care indica faptul ca vom selecta toate coloanele din tabelul nostru. Steluta, se
poate traduce ca “all”. Mai departe vom specifica keywordul FROM, urmat de numele tabelului din care
vrem sa citim informatiile

Queryul

va returna toate entry-urile din tabelul nostru

Practica
Scrieti 3 query-uri in care sa cititi toate elementele introduse in tabelele de produse, elevi si
calculatoare inserate in capitolul precedent.

25
Keyworduri specifice coloanelor in SQL

9.
PRIMARY KEY
Ca good practice, orice tabel are nevoie de un identificator unic, pentru a acorda fiecărui

entry o proprietate unică după care va putea fi ulterior găsit .De asemenea, acest identificator unic, nu
va mai permite existenta elementelor [Link] as fi avut un tabel de persoane, cu coloanele nume
de tip VARCHAR si varsta de tip INT, eu mi-as fi putut trece toate cunostiintele mele in acel [Link] eu
as fi avut doua cunostiinte cu acelasi nume si aceeasi varsta, nu as fi avut nici o modalitate sa ii
diferentiez intre [Link] urmare, pentru a rezolva aceasta problema, voi introduce un identificator unic..
Acest identificator unic poartă numele de PRIMARY KEY, și se va specifica încă de la crearea tabelului,
imediat dupa coloana pe care noi vrem sa o desemnam ca fiind un identificator unic.

Un tabel poate avea un singur primary key, iar acesta poate fi de orice tip de date dorim,

deși, recomandat este să îl facem de tip INT.

Singura condiție este ca odată ce introducem un entry în tabelul nostru, niciun alt entry nu

va mai putea avea acea valoare deja existentă în tabelul nostru pe post de id.

26
Vom introduce 2 entry-uri in tabelul noastru de persoane, fiecare cu un id unic. In momentul in
care vom citii elementele din tabelul nostru, vom putea vedea cele doua persoane

In schimb, in momentul in care vom incerca sa introducem un nou entry in tabel caruia ii vom
specifica un id deja existent in tabelul nostru,

vom intampina o eroare :

27
9.1
Exercitii

1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si un pret de tip double [Link].

Setati un identificator unic si introduceti 3 entry-uri

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume, un numar de telefon, un hobby si o inaltime.

Setati un identificator unic si introduceti 3 entry-uri, specificand doar idul si numele

28
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o memorie
ram, un procesor si un pret

Setati un identifacator unic de tip text si introduceti 3 calculatoare, specificand doar idul, marca si
pretul.

29
10.
AUTO_INCREMENT
In acest capitol vom vorbi despre keywordul AUTO_INCREMENT – Când o coloană de tip primary
key are această proprietate, valorile nu trebuiesc introduse manual. Ele vor fi incrementate automat.

Sa presupunem ca avem tabelul nostru de studenti, in care urmeaza sa inseram 500 de entryuri
Pe noi, tot ce ne intereseasa legat de identificatorul unic al studentilor, este ca el trebuie sa fie unic.
Fiind primary key, sql ul nu ne va permite elemente duplicat

Noi nu ar trebui sa ne batem capul sa introducem de fiecare data un id unic, care sa nu fie deja
existent in tabelul nostru. Pentru asta, avem keywordul AUTO_INCREMENT.Acesta trebuie specificat
imediat dupa declararea primary key-ului nostru.

In acest fel, pentru a introduce studenti in tabelul nostru, nu va mai trebui sa specificam de
fiecare data un id, si nu va mai trebui sa ne asiguram ca acel id este unic inainte de a executa query-ul.
Vom avea pur si simplu un insert in care vom specifica numele, emailul si descrierea.

Citind toate entry-urile din tabelul nostru prin instructiunea

vom avea returnate randurile noastre, fiecare elev avand propriul id auto-incrementat

30
10.1
Exercitii
1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si un pret de tip double [Link].

Setati un identificatory unic auto incrementat, apoi adaugati 3 produse in tabel.

2. Creati tabelul person, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume, un numar de telefon, un sex si o inaltime.

Setati un identificator unic auto incrementat, apoi daugati 3 produse in tabel.

31
11.
NOT NULL
In acest capitol vom vorbi despre keywordul NOT_NULL – acest keyword indică faptul că
coloana specifică nu va avea niciodată permisiunea sa fie null, sau sa nu fie specificata. În momentul în
care noi vom încerca să inserăm în tabela noastră un entry care are valoarea null pentru coloana
respectivă, sau care nici macar nu este specificata, ne vom lovi de o eroare.

Keywordul NOT_NULL trebuie specificat in dreptul coloanei care dorim sa fie obligatoriu
introdusa in cadrul entry-ului, imediat dupa tipul de date.

Tabelul nostrum ne va permite sa inseram student, specificand atat numele si varsta, cat si
numele individual.

In schimb, daca vom incerca sa introducem un entry specificand doar varsta

query-ul nostru va arunca o eroare

32
11.1
Exercitii
1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si un pret de tip decimal [Link]. Numele va trebui intotdeauna specificat.

Introduceti in tabel un entry, fara a-I specifica numele.

Introduceti in tabel un entry, specificandu-I doar numele si pretul.

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume, un sex si o inaltime. Numele si sexul vor trebui intotdeauna specificate.

Introduceti in tabel un entry A) fara a-i specifica numele.

B) specificandu-i toate datele necesare.

Scrieti in dreptul fiecarui query de insert, daca executia lui va arunca sau nu o eroare.

33
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o
memorie ram, un procesor si un pret. Toate datele trebuiesc specificate.

Introduceti 3 entry-uri in tabel.

34
12.
UNIQUE
In acest capitol vom vorbi despre keywordul UNIQUE.

Acest keyword indică faptul că, odată având un entry în tabela noastră care va avea o valoare în
coloana marcată UNIQUE, niciun alt entry nu va mai putea avea aceeași valoare pentru coloana
respectivă. Atentie in schimb, acesta coloana nu trebuie sa fie confundata cu PRIMARY KEY-UL. In
limbajul bazelor de date SQL, PRIMARY KEY-ul identifica in mod unic un entry din tabelul nostru. O
coloana marcata UNIQUE, pur si simplu marcheaza faptul ca nici o alta coloana nu va avea voie sa aiba
aceeasi valoare ca una deja existanta.

Cand ne gandim la un student, acesta poate avea un id, care identifica in mod unic persoana
respectiva in tabelul nostru. Poate avea de asemenea un nume si o descriere. Exista totusi anumite
cazuri in care in baza noastra de date, o alta coloanal va trebuie sa nu aiba valori duplicat, cum ar fi
emailul. Niciodata , in nici o baza de date, nu vor exista doua persoane care au acelasi email, acelasi cnp,
iban, si asa mai departe.

Maria si ana vor putea fi introduse in tabelul nostru fara nici o problema.

In schimb, odata ce incercam sa introducem orice alt student in tabelul nostru, specificandu-i un
email care este deja existent , vom intampina o problema:

35
12.1
Exercitii

1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si numele clientului.

Un client poate detine un singur produs din tabelul nostru. Introduceti un entry cu success, apoi
incalcati constraintul setat tabelului.

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume, un numar de telefon si un email. Setati un primary key.

Niciodata doi utilizatori nu vor putea avea acelasi email.

Introduceti 2 entryuri cu success, apoi incalcati constraintul setat tabelului.

36
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o
memorie ram, un procesor si un ip.

Doua calculatoare nu vor putea avea niciodata acelasi ip.

Introduceti 2 entryuri cu success, apoi incalcati constraintul setat tabelului.

37
13.
DEFAULT
In acest video vom vorbi despre keywordul default – acest keyword este urmat de valoarea
setata coloanei respective în cazul în care utilizatorul nu o specifică la inserarea entry-ului în tabel.

In momentul in care noi vom face un insert in tabelul student in care nu specificam o valoare
pentru coloana descriere, acea coloana nu va mai avea valoarea default null. Textul “Descrierea nu a
fost specificata “ va fi introdus in coloana respectiva.

Daca coloana respectiva este de tip VARCHAR, defaultul va avea o valoare scrisa in ghilimele
simple.

Daca ar fi de tip int, am avea pur si simplu numele coloanei noastre INT DEFAULT 100.

Com insera in tabel 2 stutenti carora le vom specifica numele si descrierea si un student caruia ii
vom specifica doar numele.

In momentul in care vom face un select din tabelul nostru

vom vedea ca Ana va avea textul setat de noi ca DEFAULT inca din momentul crearii tabelului :

38
13.1
Exercitii
1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si numele clientului. Setati un identificator unic.

Daca numele clientului nu este specificat, se va introduce textul “IN STOCK”

Introduceti un entry specificand toate valorile, si un entry nespecificand numele clientului.

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume, un numar de telefon si un email. Setati un primary key.

Daca o persoana nu isi specifica numarul de telefon sau emailul, se va introduce textul
“Nespecificat”.

Introduceti un entry specificand toate valorile, si un entry emailul si un entry nespecificand


numarul de telefon

39
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o
memorie ram si un ip.

Orice coloana nespecificata va primii valoarea default a tipului de date respectiv

Introduceti un entry specificand toate valorile, si cate un entry nespecificand fiecare coloana.

40
14.
SELECT - Citirea datelor din tabel.
Din cate am vazut pana acum, datele din tabelele noastre pot fi citite prin keywordul SELECT.

Daca executam queryul

vom returna toate entryurile din tabelul nostru, iar fiecare entry va avea toate coloanele prezente.

Mai exista si o alta optiune. Putem face un select mai restrans, in care putem returna doar
anumite detalii ale entryurilor noastre.

Vom avea un tabel de elevi , care au un id, un nume, un prenume, o inaltime si un varsta.

Daca executam queryul “ SELECT * FROM elev; ”, ni se vor returna toti elevii , iar fiecare elev
va avea numele, prenumele,inaltimea si varsta returnate.

Sa presupunem ca pe noi ne intereseaza doar numele si varsta elevilor nostrii. Nu si prenumele.

Pentru asta, voi putea executa query-ul:

Acest query, va returna toate entryurile din tabelul meu, insa voi avea afisat doar numele si
[Link] si prenumele.

Asemenea putem proceda pentru citirea tuturor datelor de care noi avem stricta nevoie. Facand
un SELECT, dupa care in loc de * (steluta), vom specifica, la virgula, numele coloanelor dorite.

41
14.1
Exercitii
1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si numele clientului.

Introduceti 2 entry-uri in tabel.

A) Cititi toate datele produselor. B) Cititi doar idul si numele produselor.

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume, un numar de telefon si un email.

Introduceti 2 entry-uri in tabel.

A)Cititi toate datele persoanelor. B) Cititi doar numarul de telefon si emailul persoanelor.

42
3. Creati tabelul calculator, care sa stocheze [Link] vor avea un id, o marca,
o memorie ram, un procesor si un ip.

Introduceti 3 entry-uri in tabel.

A) Cititi toate datele calculatoarelor.


B) Cititi doar marca, memoria, ramul si procesorul calculatoarelor.

43
15.
WHERE
In acest capitol vom vorbi despre keywordul WHERE. In citirea entryurilor nostre, noi avem
posibilitate de a filtra entryurile returnate in functie de anumite criterii. Aceste criterii vor fi specificate
in selectul nostru, imediat dupa keywordul WHERE.

Sa presupunem ca avem un tabel de studenti, cu coloanele id de tip primary key, nume si varsta

Daca aplicatia mea ne cere sa returnez toti studentii mei din tabel care au numele “andrei’, noi
vom putea executa queryul

De asemenea, voi putea face si queryuri in care rezultatele obtinute sa depinda de o comparatie.

Daca vreau sa returnez toti studentii majori din lista mea, voi putea executa query-ul

Operatorii matematici din SQL sunt aceeasi ca si cei din matematica si programare:

= (egal) > (mai mare) < (mai mic) >= (mai mare sau egal) <= (mai mic sau egal)

Daca dorim citirea unui singur entry specific, aceasta se va face pe baza primary keyului - A
identificatorului unic al entry-ului nostru.

44
15.1
Exercitii

1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si numele clientului.

Introduceti 3 entry-uri, dupa care cititi toate datele produselor cumparate de catre “Andrei”.

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume si un numar de telefon. Daca un utilizator nu va specifica numarul de telefon, pe coloana
respectiva se va introduce “Nespecificat”.

Introduceti 3 entry-uri si cititi toate datele persoanelor care au numarul “Nespecificat”.

45
3. Creati tabelul calculator, care sa stocheze calculatoare.

Calculatoarele vor avea o marca, o memorie ram, un procesor si un ip.

Introduceti 5 entry-uri in tabel.

A) Cititi toate datele calculatoarelor de marca Samsung.

B) Cititi toate datele calculatoarelor care au o memorie de 12 ram.

46
16.
AND & OR.
Intr-un query de tip SELECT, si cum vom vedea si in capitolele urmatoare, de tip UPDATE, putem
avea mai multe criterii de filtrare.

Sa ne amintim de operatorii logici din Java: “SI” logic si “SAU” logic. In SQL, acesti operatori sunt
asociati keywordurilor AND si OR.

Sa presupunem ca avem un tabel de animale, iar acestea au un id, un nume, o rasa si o varsta.

Putem executa SELECT-uri care sa respecte maim ult de o singura conditie.

Daca din tabelul nostru de animale ne intereseaza toate animalele de rasa leu care de asemenea
sunt mai tinere de 5 ani, vom executa query-ul urmator:

Acest query ne va returna toate entryurile care au atat rasa Leu , cat si varsta mai mica de 5 ani.

De asemenea, putem face si un SELECT filtrat, care sa indeplineasca cel putin una din mai multe
conditii.

Daca sa presupunem ca ne intereseaza datele animalelor care fie au rasa Caine , fie au varsta
mai mica sau egala ca 7, vom putea executa un query de forma

Acest query ne va returna toate datele entryurilor noastre care fie sunt de rasa Caine,fie sunt mai tinere
de 7 ani inclusiv.

47
16.1
Exercitii
1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si numele clientului.

Introduceti 3 entry-uri in tabel.

Cititi toate datele produselor cumparate de catre “Andrei” sau de “Rares”.

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume, un numar de telefon si un email.

Introduceti 3 entry-uri in tabel.

Cititi toate datele persoanelor care au id-ul 1, 2 sau 3.

48
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o
memorie ram si un pret

Introduceti 3 entry-uri in tabel.

Cititi marcile calculatoarelor care au pretul sub 2000 de lei si memorie de 8 ram.

49
17.
IN
In capitolul anterior am observat ca queryurile noastre de tip SELECT pot fi filtrate in functie de
una sau mai multe conditii.

Sa presupunem ca avem tabelul car, cu coloanele marca, model si an.

Putem avea un context care ne va cere sa returnam toate masinile noastre de tip Audi,
Mercedes, Bmw, Dacia si asa mai departe.

Am putea scrie queryurile noastre, adaugand mai multe conditii OR in lant.

Am putea face un

Acest query ne va aduce ceea ce avem nevoie, insa putem vedea ca vom avea un query foarte
lung, care va deveni dificil de citit – Iar acestea sunt doar 3 valori dorite dintr-un numar nelimitat de
posibilitati.

Din aceasta cauza, in SQL a fost inventat keywordul IN.

Daca dorim sa returnam toate elementele din tabelul nostru ale carei coloane, sa o numim
COLOANA_A au niste valori cunoscute de noi de dinainte, noi putem face un query de forma

Intorcandu-ne la exemplul nostrum, un query mai optim, atat din punct de vedere al
performantei, cat si visual, ar arata in felul urmator:

Acest query ne va returna toate masinile ale caror marca va fi prezenta in parantezele IN ului nostru.

50
17.1
Exercitii

1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, si numele clientului.

Introduceti 3 entry-uri in tabel.

Cititi toate datele produselor cumparate de catre “Andrei, “Rares”,”Bogdan” sau “Ionut”.

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume si un numar de telefon.

Introduceti 2 entry-uri in tabel. Cititi datele persoanelor care au idurile cuprinse intre 2 si 6.

51
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o
memorie ram, un procesor si un ip.

Introduceti 3 entry-uri in tabel.

Cititi marcile calculatoarelor care au procesorul “i3” si memorie fie de 8, fie 12, fie 24 de ram.

52
18.
BETWEEN

In SQL, mai avem de asemenea un alt criteriu de filtrare. si anume BETWEEN.

Acesta, este folosit in cadrul unei conditii specificate dupa keywordul WHERE

Sa presupunem ca avem un tabel de persoane, si ca dorim sa ne returnam toate datele


persoanelor noastre cu varste cuprinse intre 18 si 90 de ani.

Ne-am putea folosi de conditia WHERE coloana noastra “varsta” sa fie IN , iar in paranteze, sa
trecem toate valorile noastre. insa putem vedea ca acest lucru nu este foarte pratic, avand in vedere
cate valori trebuie sa specificam.

In cazul de fata, pe noi ne intereseaza un interval. iar acesta poate fi specificat in condie, prin
keywordul BETWEEN.

Vom avea un select * from person, iar dupa WHERE, vom trece conditia noastra. aceasta este ca
coloana noastra, “varsta”, sa fie cuprinsa intre (de unde si keywordul BETWEEN) valorile date de noi. 18
si 90, separate de keywordul AND.

53
18.1
Exercitii
1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, cantitatea din stoc.

Introduceti 2 entry-uri in tabel. Cititi toate datele produselor cumparate care au stoc limitat. Un
produs va avea stoc limitat daca cantitatea din stoc va fi cuprinsa intre 1 si 10

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume si o varsta.

Introduceti 3 entry-uri in tabel. Cititi toate datele persoanelor care sunt minore.

54
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o
memorie ram si un pret

Introduceti 3 entry-uri in tabel.

Cititi marcile calculatoarelor care au memoria ram cuprinsa intre 4 si 8 inclusiv.

55
19.
LIKE
In sql am vazut ca putem adauga conditii de comparatie, in care o anumita coloana poate fi mai
mica sau mai mare ca o anumita valoare, si de asemenea, conditii de egalitate. In care coloana
specificata de noi trebuie sa fie egala cu o anumita valoare.

In sql, mai avem un keyword de comparatie asemanator egalului, insa mult mai abstract si mai
permisiv. Acesta este keywordul LIKE.

Acesta este folosit in cadrul filtrarilor noastre atunci cand vrem ca valoarea unei anumite
coloane, sa respecte un pattern ales de noi.

Queryul va arata in felul urmator. vom avea un SELECT * from tabelul nostru, iar dupa conditia
WHERE, vom specifica coloana noastra si ne vom folosi de keywordul LIKE, dupa care vom da intre
ghilimele simple valoarea care vrem sa fie regasita in entryurile noastre, pe coloana1.

In toate cele 3 query-uri. X urile reprezinta un text pe care noi il putem [Link] sa returnam
toate entryurile care au in valoarea coloanei respective orice text am pune noi in locul X urilor

Putem vedea in schimb ca in cele 3 queryuri m-am folosit si de caracterele procent si underline.

Semnul procent indica faptul ca pe noi nu ne intereseaza ce valoare au entryurile noastre din
tabel pe acea pozitie.

Daca la primul query vreau ca coloana mea sa aiba valoarea XXXX%, atata timp cat valoarea mea
incepe cu XXXX, orice altceva ar mai avea mai departe, nu va mai [Link] va fi returnat
indiferent daca dupa XXXX va mai avea 0,1,2 sau 100 de caractere,indiferent de valoarea lor.

Underline-ul, in schimb, tine locul unui singur caracter, indiferent care ar fi acesta.

56
In al doilea query, vom avea returnate toate elementele care au coloana respectiva incepand cu
un caracter, INDIFERENT care ar fi acela, si care se termina in 4 de x. daca as fi avut *doua underlineuri
XXXX*, as fi avut returnate toate entryurile a caror valoare a coloanei1 care se termina in 4 de x, dar
care inainte de acestia mai au inca 2 caractere,indiferent de valoarea lor.

Ultimul query va returna toate elementelea caror coloana specificata incepe cu orice litera, are
imediat in structura ei 4 de X, iar dupa, poate avea orice.

Exemple:
A)

Se da tabelul:

Se executa query-ul:

Valoarile returnate:

- - Toate entry-urile a caror nume se termina in litera ‘a’.

Nu ne intereseaza ce litere pot sau nu sa fie inainte de aceasta – de unde vine patternul ‘%a’ - -

57
B) Se da tabelul:

Se executa query-ul:

Valorile returnate:

- - Toate persoanele a caror varsta incep in 1 si mai au inca un caracter, respectiv cifra dupa
- echivalent cu varsta BETWEEN 10 AND 19 - -

C) Se da tabelul:

Se executa query-ul:

Valorile returnate:

- - Toate elementele a caror model contin elementele 1)‘Seria’ 2)pauza 3)un caracter/cifra
4)pauza 5)orice - -

58
19.1
Exercitii

1. Creati tabelul filme, care sa stocheze filme. Filmele vor avea un id de tip numeric, un nume si
o coloanal de gen, care vor contine la virgula genul filmului (actiune,comedie,etc)

Introduceti 3 entry-uri in tabel.

A) Cititi toate numele filmelor de comedie. B) Cititi toate numele filmelor de actiune.

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume si un email.

Introduceti 3 entry-uri in tabel.

A) Cititi toate datele persoanelor au gmail. B) Cititi toate datele persoanelor au yahoo mail.

59
3. Creati tabelul student, care sa stocheze [Link] vor avea un id, un nume si o
specializare.

Introduceti 3 entry-uri in tabel.

A) Cititi toate datele studentilor care in specializarea lor, au trecut “Master”.

B) Cititi toate datele studentilor care in specializarea lor, au trecut “Licenta”.

60
20.
DISTINCT

In acest capitol vom vorbi despre keywordul DISTINCT.

Cand am facut selecturi din baza noastra de date, am vazut ca in valorile returnate, putem avea
elemente duplicat in cadrul unei anumite coloane.

Keywordul DISTINCT este folosit in cadrul instructiunilor noastre de citire SELECT, pentru a
returna doar elemente unice. In alte cuvinte, facand un query de tip SELECT DISTINCT, nu vom avea
niciodata elemente duplicat in lista noastra de rezultate.

Tot ce trebuie sa facem e sa specificam keywordul distinct in fata coloanei a caror valori unice dorim sa
le citim.

Revenind la exemplul din capitolul anterior:

Sa presupunem ca avem urmatoarele masini in baza noastra de date:

Executand queryul

vom avea

61
Executand in schimb query-ul

vom avea

Prin precizarea keywordului DISTINCT, inainte de numele coloanei pe care dorim sa o citim, vom scapa
automat de elementele duplicat.

62
20.1
Exercitii
1. Creati tabelul elev. Elevii vor avea un id de tip numeric, un nume si o varsta.

Introduceti 4 entry-uri in tabel. Cititi fiecare nume individual din tabelul nostru.

2. Creati tabelul borrow, care sa stocheze inchirieri de carti. Tabelul vo avea un id de tip
numeric, un nume al cartii care a fost imprumutata si numele persoanei care a imprumutat cartea.

Introduceti 4 entry-uri in tabel.

A) Cititi fiecare carte individuala care a fost imprumutata.

B) Cititi fiecare persoana care a imprumutat vreodata o carte.

63
3. Creati tabelul ticket, care sa stocheze bilete de [Link] vor avea un id, o clasa si un
pret.

Introduceti 5 entry-uri in tabel.

Afisati toate categoriile existente de bilete din tabelul nostru.

64
21.
COALESCE
In acest capitol vom invata o modalitate de a trata nullurile din tabelele noastre. Vom avea
situatii in care citirile noastre din baza de date vor returna coloane care nu au fost [Link] are au
valoare null. Ei bine, o aplicatie, spre exemplu java, care este conectata la o baza de date, nu ar trebui
niciodata sa lucreze cu nulluri.

In momentul in care citim o coloana dintr-un tabel, keywordul coalesce ne permite sa trecem in
parantezele sale mai multe lucruri. Primul lucru va fi intotdeauna coloana pe care noi dorim sa o citim,
iar al doilea parametru va fi valoarea aleasa de noi care vrem sa fie returnata in cazul in care citirea
coloanei noastre a returnat un null.

Sa presupunem ca avem urmatorul tabel, numit ‘produs’ :

Executand queryul

vom avea

65
Putem vedea ca in locul null-ului din descrierea noastra, ni s-a returnat textul pe care noi l-am
specificat in parametrii keywordului COALESCE.

In schimb, putem observa ca coloana noastra, nu se va mai numi ‘descriere’.Ea va lua numele
functiei apelate (COALESCE) si a valorilor cu care a fost apelata.

Acesta lucru este slab din punct de vedere estetic, iar ca sa corectam aceasta problema, ne
putem folosi de keywordul AS

Executand query-ul

vom avea

Orice coloana citita dintr-un tabel poate fi returnata in instructiunile SELECT sub un alt nume.

Tot ce trebuie sa facem este sa specificam coloana pe care dorim sa o citim, dupa care sa
specifican keywordul AS , urmat de numele sub care vrem sa fie returnata coloanal respective, intre
ghilimele simple.

66
21.1
Exercitii
1. Creati tabelul task, care sa stocheze [Link] vor avea un nume, o descriere si un
deadline (numarul de zile in care trebuie rezolvat). Introduceti 3 entry-uri in tabel.

Cititi toate elementele, iar daca descrierea taskurilor nu este specificata, tratati acest caz

2. Creati tabelul client_table, care sa stocheze clienti. Clientii vor avea un id de tip numeric, un
nume si un numar de telefon. Numele trebuie obligatoriu introdus. Introduceti 3 entry-uri in tabel.

Cititi toate datele din tabel, iar daca numarul de telefon nu este specificat, returnati “Numar
nespecificat”

67
3. Creati tabelul produse. Produsele vor avea un id, un nume si un pret.

Introduceti 5 entry-uri in tabel.

Cititi toate datele produselor. Daca produsul nu are pretul specificat, se va returna 1000.

68
22.
UPDATE

Am vazut ca datele din tabel pot fi inserate si citite. De asemenea, ele pot fi si modificate.

Modificarea tuturor datelor din tabel se realizeaza prin keywordul UPDATE.

Vom scrie UPDATE , numele tabelului, dupa care vom scrie keywordul SET. Acesta este urmat de
numele coloanei a carei valori vrem sa fie modificata, egal cu noua valoare.

Acest query va seta tuturor entryurilor din tabelul nostru valoarea “newValue” in coloanal
column_name;

Fireste, in updatarea datelor nostre, nu vom vrea de fiecare data sa updatam coloana respectiva
pentru toate entryurile. Iar aici intervene, asemenea si instructiunii INSERT, keywordul WHERE, urmat de
conditia noastra.

De asemenea, conditia noastra poate fi multipla. Ceea ce inseamna ca dupa WHERE, ne putem
folosi de keywordurile AND si OR, pe care le-am invatat deja in capitolele anterioare.

69
Avand tabelul nostru din capitolele anterioare,

daca executam queryul

tabelul va arata in felul urmator

Nespecificand nici o conditie in queryul nostrum de update, toate coloanele vor fi modificate.

Query-ul

va modifica structura tabelului in felul urmator:

70
22.1
Exercitii

1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume, un pret.

Introduceti 3 entry-uri in tabel. Modificati pretul tuturor produselor numite “Pantaloni”.

2. Creati tabelul people, care sa stocheze persoane. Persoanele vor avea un id de tip numeric, un
nume si un email.

Introduceti 3 entry-uri in tabel. Modificati emailul persoanei cu idul 3.

71
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca, o
memorie ram, un procesor si un ip.

Introduceti 5 entry-uri in tabel.

Toate calculatoarele de marca Samsung, Asus si Apple au primit un upgrade. Vor avea 24 de
ram.

72
23.
DELETE vs. TRUNCATE

Pana acum invatat sa introducem date in tabel, sa le citim si sa le modificam.

Toate aceste operatii fac parte dintr-un concept general SQL, care poarta numere de operatii
CRUD. Acesta este un termen peste care o sa va mai loviti , si care este o prescurtare de la operatiile
Create, Read, Update si Delete.

Am facut Create-ul, am facut Readul, am facut Updateul, iar acum, vom invata ultima operatie
din CRUD. Si anume delete-ul.

Stergerea entry-urilor dintr-un tabel se realizeaza prin instructiunea DELETE FROM, dupa care
vom specifica numele tabelului nostru.

Acest query va Sterge toate entryurile din tabelul nostru.

Daca dorim doar stergerea unor entryuri specifice, ne vom folosi de keywordul WHERE, urmat
de una sau mai multe conditii.

Daca dorim stergerea tuturor studentilor nostrii care au numele ‘Alex’, vom avea

73
Sa presupunem ca avem urmatorul tabel de masini, cu coloana id PRIMARY KEY AUTO-INCREMENT:

Golirea tabelului se poate realiza prin executia query-ului

In acest moment, tabelul nostrum este gol. Haideti sa insertam doua masini

Facand un SELECT pe tabelul nostrum de masini, vom putea vedea rezultatul

Observati valorile idurilor. Putem vedea ca desi dupa stergerea tuturor elementelor din tabel ,
acesta a fost gol, inserarea noilor entry-uri a generat idurile de la numarul la care a ramas initial.

Acest lucru se intampla deoarece instructiunea DELETE FROM numeleTabelului, sterge doar
entry-urile din tabel – Nu si metadata acestuia.

Metadata consta in datele interne ale tabelului nostrum, printre care se afla si cursorul idului
auto incrementat, pe baza caruia noi valori incrementate sunt acordate fiecarui nou entry la inserare.

Instructiunea TRUNCATE va sterge atat entryurile din tabelul nostru, lafel ca si instructiunea
DELETE FROM, cat si metadata acestuia.

Query-ul va arata in felul urmator:

74
23.1
Exercitii

1. Creati tabelul product. Produsele vor avea un id de tip numeric, un nume, si numele clientului.

Introduceti 3 entry-uri in tabel. Stergeti primele doua produse

2. Creati tabelul people. Persoanele vor avea un id, un nume, un numar de telefon si un email.

Introduceti 4 entry-uri in tabel. Stergeti toate persoanele numite “Mihai”.

75
3. Creati tabelul laptop. Laptopurile vor avea o marca, o memorie ram, un procesor si un ip.

Introduceti 5 entry-uri in tabel.

Stergeti toate calculatoarele de marca Samsung care au sub 12 ram.

76
24.
LIMIT & OFFSET
In momentul in care noi ne folosim de instructiunea SELECT, noi vom aduce din tabelul nostru
toate datele care respecta eventuala filtrare specificata dupa keywordul WHERE. Daca nu avem nici o
filtrare, atunci vom returna toate entryurile din tabelul nostru.

In anumite contexte, vom avea nevoie sa ne aducem un doar un anumit numar de entryuri.

Ganditi-va ce se intampla cand intr-un magazin online intrati pe sectiunea de pantaloni.


Magazinul poate avea sute, daca nu mii de pantaloni in stoc. Pantaloni, care sunt persistati intr-o baza
de date.

Voua niciodata nu o sa vi se returneze toti cei 10 000 de pantaloni din stoc. Vi se va returna doar
prima pagina, pe care veti avea sa zicem 10 elemente. Daca vreti sa vedeti urmatoarea pagina, apasati
pe pagina doi, unde vi se vor afisa urmatoarele 10. Si tot asa.

In cadrul bazelor de date, paginarea se realizeaza prin intermediul keywordurilor LIMIT si


OFFSET.

Acestea sunt specificate la finalul query-urilor noastre de SELECT, unde LIMIT reprezinta
numarul de elemente care vrem sa fie returnate, iar offset reprezinta numarul entry-ului de la care vrem
sa se faca citirea. LIMIT-ul trebuie specificat intotdeauna inaintea OFFSET-ului. In caz contrar, query-ul
nu va functiona

Sa presupunem ca avem un tabel de pantaloni, in care avem 500 de entry-uri

Pentru a realiza o paginare in care ne vom aduce 10 pantaloni pe fiecare pagina, vom avea
urmatoarele query-uri:

Fiecare query este executat in cadrul fiecarei pagini returnate.

Primul query ne va returna 10 pantaloni, incepand de la pozitia 0 din tabelul nostru.

Al doilea query ne va returna 10 pantaloni, incepand de la pozitia 10 din tabelul [Link]


continuarea - de unde am ramas.

Lafel si al treilea query, 10 pantaloni incepand de unde a ramas query-ul anterior, si tot asa.

77
24.1
Exercitii

1. Creati tabelul product. Produsele vor avea un id de tip numeric, un nume, si numele clientului.

Introduceti 3 entry-uri in [Link] primele 2 produse.

2. Creati tabelul people. Persoanele vor avea un id de tip numeric, un nume si o meserie.

Introduceti 4 entry-uri in tabel. Cititi persoanele dintre pozitiile 2 si 4 inclusiv.

78
3. Creati tabelul laptop. Laptopurile vor avea o marca, o memorie ram si un procesor.

Introduceti 8 entry-uri in tabel.

Cititi toate produsele noastre in pagini de cate 3 elemente

79
25.
ORDER BY

Selectarea datelor noastre din tabel poate fi de asemenea si ordonata in functie de un anumit
criteriu.

Selectarea unor date din tabel, ordonate dupa o anumita coloana se realizeaza folosind
keywordul ORDER BY, urmat de numele coloanei si de modul in care vrem sa se faca ordonarea noastra.

Ordonarea poate fi fie crescatoare, ceea ce este reprezentat prin keywordul ASC, fie
descrescatoare, reprezentata prin keywordul DESC

Cu aceasta ocazie, putem vedea ca citirea selectiva a anumitor coloane dintr-un tabel se poate
realiza atat prin specificarea numelui coloanelor, cat si prin prefixarea lor cu numele tabelului.

Acest lucru ne va ajuta in capitolele ulterioare, cand vom vorbi despre FOREIGN KEYS si JOINURI.

Revenind insa la ordonare, aceasta se realizeaza in urmatoarele moduri:

Alfabetic pentru valorile de tip text VARCHAR, de la mai mic la mai mare pentru valorile numeric
INT si DECIMAL, si chronologic pentru valorile de timp DATE si TIMESTAMP.

Daca nu specificam niciunul dintre keywordurile ASC sau DESC, ordonarea va fi by default
crescatoare.

80
25.1
Exercitii
1. Creati tabelul product. Produsele vor avea un id de tip numeric, un nume, si numele clientului.

Introduceti 3 entry-uri in tabel. Cititi primele 2 produse, sortate dupa nume.

2. Creati tabelul people. Persoanele vor avea un id de tip numeric, un nume si o varsta

Introduceti 3 entry-uri in tabel. Cititi toate persoanele ordonate descrescator dupa varsta.

81
3. Creati tabelul calculator. Calculatoarele vor avea o marca, o memorie ram si un pret.

Introduceti 5 entry-uri in tabel.

Cititi toate calculatoarele sortate: A) Descrescator dupa pret.

B) Crescator dupa memoria ram

Cititi entry-urile in pagini a cate 3 elemente, ordonate crescator dupa nume.

82
26.
Foreign Keys.

La inceputul acestei carti am facut o paralela intre modalitatea de stocare a informatiilor in


spreadsheeturi excel si bazele de date. Am vazut ca in contextul in care aplicatia noastra s-ar ocupa de
niste comenzi, comenzi care sunt strans legate de clientii nostrii, reprezentarea noastra in
spreadsheeturi excel ar fi fost o modalitate de lucru impractica, deoarece in contextul in care un singur
client ar fi plasat mai multe comenzi, datele acestuia ar fi fost duplicate, ceea ce ar fi fost costisitor si din
punct de vedere al memoriei, si al vitezei de [Link] spus ca bazele de date relationale mySql pot
rezolva aceasta problema, iar in acest video vom afla cum.

In bazele de date mysql, un foreign key este o coloana care reprezinta o referinta catre un alt
tabel.

Aceasta reprezinta un camp care face referire catre primary key-ul unui alt tabel.

Revenind la schema noastra de la inceputul cursului, putem vedea ca in tabela de orders avem o
coloana customer_id, care reprezinta id-ul unui entry din tabela noastra de customers.

Foreign key-urile se pot specifica atat in crearea initiala a tabelelor, cat si in modificarea lor, in
momentul in care vrem sa adaugam o constrangere catre un alt tabel.

83
Sa presupunem ca trebuie sa stocam in baza noastra de date toate persoanele dintr- o scoala.
Vom avea profesori, si de asemenea vom avea si studenti.

Toti studentii vor avea un profesor. Acest professor poate fi reprezentat intr-un tabel, avand un
id identificator unic, si un departament,care reprezinta materia predata.

Elevii nostrii vor fi reprezentati in tabele avand un identificator unic, un nume si numele clasei.
De asemenea, vom adauga si o coloana de tip int, care va reprezenta idul profesorului de care apartine.

Nu este de ajuns doar sa numim coloana noastra identic cu cea a id-ului profesorului.

In paranteze, la sfarsitul declararii tuturor coloanelor tabelului nostru de student (coloane care
includ si teacher_id ul nostru, cu tipul de date specific primary key-ului tabelului nostru de profesori) va
trebui, la virgula, sa specificam relatia dintre tabele.

Prin keywordul FOREIGN KEY, in parantezele caruia vom trece numele coloanei din tabelul
nostru student, vom indica faptul ca acea coloana reprezinta o referinta catre tabelul nostru de profesori
- de unde urmeaza si keywordul REFERENCES, urmat de tabelul referentiat, in parantezele caruia vom
specifica coloana la care foreign key-ul nostru face referinta.

In acest fel, odata creat tabelul nostru de profesori, ne vom putea crea orice tabel avem nevoie
in care ne putem trece o coloana care sa reprezinte o referinta catre tabelul nostru.

Ca o paranteza- Daca sa presupunem ca tabelul nostru teacher nu ar fi fost creat in momentul in


care ne cream tabelul de student, queryul pe care il vedeti ar fi aruncat o eroare, deoarece am fi
declarant un foreign key a carui referinta nu a fost gasita.

84
Sa presupunem ca avem 3 profesori.

Vom introduce 2 elevi, specificand teacher_id-ul unui profesor existent in tabela noastra Teacher

Executand un

vom putea vedea cei doi studenti.

Cei doi vor avea profesorul specificat. Andrei va avea profesorul de matematica iar Sorin cel de Engleza.

Daca vom vrea in schimb sa introducem un student caruia ii vom specifica idul unui profesor inexistent

vom intampina o eroare

85
26.1
Exercitii
1. Creati tabelele copil, cu coloanele id nume si varsta, si laptop, cu proprietatile id marca si
culoare. Fiecare copil va avea un laptop.

2. Creati tabelele masina, cu proprietatile id, marca, cai_putere , si sofer, cu proprietatile id,
nume si varsta. Fiecare sofer va avea o masina

86
3. Creati tabelele comenzi, cu proprietatile id, descriere, pret, si clienti, cu proprietatile id,
nume, si numar_telefon .

Fiecare comanda va avea un client.

87
27.
Foreign Keys - ON DELETE.
Haideti sa ne uitam la ultimul exercitiu pe care l-am rezolvat in capitolul precedent. Ne-am creat
un tabel de clienti si un un tabel de comenzi. Fiecare comanda, are clientul ei. Deci are o coloana care
face referinta catre tabelul nostru de clienti.

Haideti sa introducem 3 clienti in tabelul nostru

Vom introduce de asemenea si 3 comenzi

Prima comanda este a lui Alex, iar a doua si a treia a lui Mihai

In momentul in care incercam sa stergem comanda 1

vom avea o problema

SQL-ul nu ne-a lasat sa facem acest lucru, deoarece in tabelul nostru de comenzi, avem comenzi
care depind de acel entry pe care noi tocmai am incercat sa il stergem. Daca noi am vrea sa il stergem,
sql-ul nu ar sti ce sa faca cu coloana nostra client_id din tabelul de comenzi, odata ce clientul nostru
referentiat va fi sters.

Aceasta problema poate fi in schimb rezolvata.

88
Specificarea foreign key-urilor poate veni de asemenea si cu instructiuni aditionale, pentru a
decide ce se va intampla cu valorile noastre in momentul in care entry-ul referentiat va fi sters din
tabelul respectiv.

Totate comenzile noastre au o coloana care reprezenta idul unui client existent.

Daca am fi incercat sa stergem clientul respectiv din tabelul sau, nu am fi avut voie. Deoarece
baza noastra de date nu ar fi stiut ce sa faca cu coloana client_id a comenzilor noastre existente, in care
clientul era deja specificat.

Mysql ul ne permite sa reparam aceasta problema, specificand inca de la declararea foreign key-
ului nostru ce anume dorim sa se intample cu comanda noastra in cazul in care clientul referentiat va fi
sters.

Aici apar keywordurile ON DELETE SET NULL, si ON DELETE CASCADE.

In momentul in care specificam foreign key-ul nostru, daca sufixul nostru va fi ON DELETE SET
NULL, la stergerea clientului nostru, campul client_id din tabela noastra de comenzi va lua valoarea null
pentru toate comenzile clientului nostru care tocmai a fost sters.

In momentul in care specificam foreign key-ul nostru, daca sufixul nostru va fi ON DELETE
CASCADE, la stergerea clientului nostru, toate comenzile sale vor fi de asemenea sterse COMPLET din
baza noastra de date.

89
27.1
Exercitii
1. Creati tabelele copil, cu coloanele id nume si varsta, si laptop, cu proprietatile id marca si
culoare.

Fiecare copil va avea un laptop.

Cand un laptop va fi sters, studentul nu va mai avea nici un laptop specificat.

2. Creati tabelele masina, cu proprietatile id, marca, cai_putere , si sofer, cu proprietatile id,
nume si varsta.

Fiecare sofer va avea o masina. Cand masina va fi stearsa, se va sterge de asemenea si soferul.

90
3. Creati tabelele comenzi, cu proprietatile id, descriere, pret, si clienti, cu proprietatile id,
nume, si numar_telefon_number .

Fiecare comanda va avea un client.

Cand un client va fi sters, se va sterge de asemenea si comanda.

91
28.
JOINS – INNER JOIN
Am aflat cum putem face citiri dintr-un tabel. Am aflat de asemenea ca in mysql, tabelele
noastre pot relationa intre ele- de unde vine si termenul de “baze de date relationale”.

Acum a venit momentul sa aflam cum putem face citiri din mai multe tabele in acelasi timp.

Acest lucru este posibil in contextul in care tabelele din care incercam sa citim informatii sunt
legate intre ele printr-un foreign key.

Luand ca exemplu profesorii si studentii din capitolele anterioare: Cerintele aplicatiei mele imi
pot cere sa returnez atat datele studentilor mei, cat si datele profesorului fiecarui student, in acelasi
query.

Acest lucru se poate realiza printr-un query de tip JOIN.

Acesta arata in felul urmator:

Vom avea, lafel cum stiam si pana acum, instructiunea SELECT * from Student, dar acum vom
face ceva diferit. Vom da un nume studentilor nostrii returnati. Ii vom numi “s”. La virgula, vom specifica
al doilea tabel din care vrem sa citim, si anume Teacher. Asemenea studentilor, fiecare professor va
primi un nume in query-ul nostru. Il vom numi T.

Dupa specificarea tabelelor din care citim, si numirea fiecarui tip de date, vom specifica imediat
dupa keywordul WHERE, relatia dintre cele doua obiecte.

Daca vrem sa ne aducem toti studentii care au profesori, laolalta cu profesorii lor, vom pune
conditia ca foreign key-ul studentului, reprezentat prin numele dat de noi, s.teacher_id, sa fie egal cu
primary key-ul profesorului. Profesorul nostru numit t, punct, primary-key-ul sau. Adica t.teacher_id.

Acest query ne va aduce toate datele studentilor nostrii, laolalta cu toate datele profesorului
fiecarui student.

92
Avand studentii si profesorii

daca executam joinul

rezultatul va fi

Vom avea returnate toate datele studentilor care au de asemenea un profesor, laolalta cu
datele acestuia

Avem posibilitatea sa facem si un query mai selectiv.

Executand acest query, raspunsul nostru va consta exact in valorile coloanelor pe care le-am
selectat din cele doua tabele:

Probabil pe noi ne intereseaza doar idul studentului, first_name ul lui, si departamentul


profesorului.

Putem face acest lucru prin specificarea coloanelor respective, in loc de folosirea stelutei.
Steluta va returna toate coloanele, dupa cum stim. Daca specificam doar coloanele dorite, vor fi
returnate doar coloanele respective. Singura conditie e ca fiecare coloanal trebuie sa fie prefixata de
numele dat de noi obiectului de care apartine. Student_id ul, apartinand studentului, va fi prefixat de
numele pe care noi l-am dat studentului – adica “s”. Lafel si first_nameul. Department-ul, apartinand
profesorului, va fi prefixat de numele pe care l-am dat profesorilor. Adica “t”.

93
28.1
Exercitii
1. Creati tabelele copil, cu coloanele id, nume si varsta, si laptop, cu id, marca si culoare.

Fiecare copil va avea un laptop. Cititi toate datele studentilor care au laptopuri.

2. Creati tabelele masina, cu proprietatile id, marca, cai_putere , si sofer, cu id, nume si varsta.

Fiecare sofer va avea o [Link] marca masinii, caii putere si numele soferului.

94
3. Creati tabelele comenzi, cu proprietatile id, descriere, pret, si clienti, cu proprietatile id,
nume, si telephone_numar_teleon .

Fiecare comanda va avea un client. Cititi descrierea si pretul comenzii, numele si numarul de
telefon al soferilor pentru comenzile mai scumpe de 100

95
29.
JOINS - LEFT JOIN
In sql, joinurile pot fi de mai multe tipuri. Ele pot fi de tip Inner join, left join, right join si full join.

Joinul pe care l-am invatat in capitolul anterioarr este un inner join. Acesta returneaza entryuri
care au valori egale de la un tabel la altul - o coloana primary key si una foreign key.

Am vazut ca daca facem un inner join pe doua tabele, ni se vor returna doar valorile entryurilor
care sunt in relatie de la un tabel la altul. Daca avem un element in tabelul 1, care nu are un
corespondent in tabelul 2, acest element nu va fi returnat. De asemenea, daca avem un element in
tabelul 2 care nu are un corespondent in tabelul 1, nu va fi nici el [Link] joinul returneaza doar
valorile elementelor care sunt intr-o relatie de tip foreign key intre cele doua tabele

In acest capitol, vom vorbi despre LEFT JOIN.

Sa presupunem ca avem un tabel A si un tabel B, iar tabelul A are un foreign key care face
referinta catre tabelul B. LEFT JOIN-ul, sau cum i se mai zice, LEFT OUTER JOIN-ul, este joinul care
returneaza toate elementele tabelului din stanga, adica A, laolalta cu coloanele specificate in SELECT
apartinand tabelului B(dreapta), fie daca acestea au sau nu valori corespunzatoare entry-ului nostru din
tabelul 1.

LEFT JOIN-ul are sintaxa urmatoare:

Asemenea inner joinului, ambele tabele table1 si table2 din care se va face citirea vor primi un
nume. le vom numi “a” si “b”.

Vom avea un select, dupa care vom specifica numele coloanelor pe care vrem sa le citim, fiecare
fiind prefixate de numele dat de noi tabelului corespunzator. Dupa ce am specificat toate coloanele, va
urma keywordul FROM, dupa care specificam tabelul din stanga, iar aici vom face ceva diferit. Nu vom
mai trece la virgula tabelul din dreapta, ci ne vom folosi de keywordurile LEFT JOIN, dupa care vom
specifica al doilea tabel. Conditia de egalitate a coloanelor celor doua tabele nu va mai fi specificata
dupa keywordul WHERE, ci de data asta, vom avea keywordul ON.

96
Avand studentii si profesorii

daca executam joinul

rezultatul va fi

Putem vedea ca in aceasta situatie toti studentii nostrii, apartinand tabelului din stanga (primul
table specificat inquery) vor fi returnati, laolalta cu datele din tabelul de profesori corespunzatori.

Studentul 4, neavand nici un profesor asociat, va avea departamentul profesorului “null”.

97
29.1
Exercitii

1. Creati tabelele student, cu student id nume si varsta, si major, cu id nume si durata in ani.
Orice student poate avea un major.

Cititi toate datele studentilor si ale domeniilor de studiu corespunzatoare ( existente sau nu)

2. Creati tabelele masina, cu proprietatile id, marca, cai_putere , si sofer, cu proprietatile id,
nume si varsta. Orice sofer poate avea o masina

Cititi numele tuturor soferilor, si eventualele corespondende din tabelul de masini: marca
masinii si caii putere.

98
3. Creati tabelele order_table, cu proprietatile id, o_description, o_price, si customer, cu
proprietatile id, c_name, si telephone_number .

Fiecare order va avea un customer.

Cititi toate datele comenzilor plasate, laolalta cu eventualele date corespunzatoare din tabelul
de clienti

99
30.
JOINS - RIGHT JOIN

In acest capitol vom vorbi despre RIGHT JOIN, sau cum i se mai spune, RIGHT OUTER JOIN.

Cand am explicat left joinul, am dat ca exemple doua tabele. Tabelul a si b. Am aflat ca un left
join este cel care aduce toate elementele din tabelul din stanga, A, dar si cele corespondente din tabelul
B, fie ca ele sunt sau nu existente.

Ei bine, un right join este exact oglinda left joinului.

Luand acelasi exemplu, avand tabelele A si B, A-ul avand un foreign key cu referinta la B, RIGHT
JOINul va returna toate valorile coloanelor cerute din B, laolalta cu posibilele corespondente din tabelul
din stanga, A, care pot fi existente, sau nu. Daca nu, valorile returnate vor fi null.

Sintaxa query-ului este aproape identica cu cea a left [Link] ca, in loc sa ne folosim de
keywordurile LEFT JOIN, ne vom folosi de RIGHT join.

100
Avand studentii si profesorii

daca executam joinul

rezultatul va fi

Putem vedea ca in aceasta toate datele selectate ale profesorilor nostrii, apartinand tabelului
din dreapta (al doilea tabel specificat inquery) vor fi returnate, laolalta cu eventualele date
corespondente din tabelul de student..

Profesorul 3, care preda chimie, neavand nici un corespondend in tabelul de student, a fost
returnat cu toate coloanele studentului “null”.

101
30.1
Exercitii
1. Creati tabelele elev, cu student id nume si varsta,si laptop, cu proprietatile id marca si ram.

Orice student poate avea un laptop. Cititi datele laptopurilor si ale eventualilor elevi posesori

2. Creati tabelele masina, cu proprietatile id, marca, cai_putere , si sofer, cu proprietatile id,
nume si varsta. Orice sofer poate avea o masina

Cititi datele tuturor masinilor, laolalta cu eventualii soferi posesori

102
3. Creati tabelele order_table, cu proprietatile id, o_description, o_price, si customer_table, cu
proprietatile id, c_name, si c_telephone_number .

Fiecare order va avea un customer.

Cititi toate datele clientiilor individuali, laolalta cu comenzile lor

103
31.
JOINS - FULL JOIN & UNION
Am aflat ca inner joinul va aduce doar valorile elementelor comune in cadrul a doua tabele.

Left joinul va aduce toate elementele tabelului din stanga, laolalta cu eventualele
corespondente din tabelul din dreapta, care pot fi existente sau nu.

Right joinul, fix pe dos. Va aduce toate elementele tabelului din dreapta, laolalta cu eventualele
corespondente din tabelul din stanga, care fie pot fi existente sau nu.

In acest capitol, vom vorbi despre FULL JOIN.

FULL JOIN ul, este o combinatie a tuturor celor 3 joinuri anterioare, executata in cadrul unui
singur query.

Acesta va aduce atat elementele comune, cat si toate elementele din tabelul A, cu sau fara
corespondenti, s toate elementele din tabelul B, cu sau fara corespondenti.

Pentru LEFT JOIN si RIGHT JOIN, ne-am folosit de keywordurile LEFT JOIN si RIGHT JOIN.

Intuitiv, la FULL JOIN, am crede ca va trebui sa ne folosim de keywordurile FULL JOIN. Insa
treaba sta putin diferit in acest caz. De ce spun asta? Deoarece in cadrul bazelor de date mySql, full
joinul nu este aplicabil. Keywordurile FULL JOIN nu vor functiona.

In schimb, avem la dispozitie o alta modalitate. Ne putem declara doua queryuri. unul de tip
LEFT JOIN, si al doilea de tip RIGHT JOIN, ambele returnand exact aceleasi coloane, si putem face o
uniune intre ele. Aceasta, se realizeaza prin keywordul UNION, care va fi plasat intre cele doua joinuri.

In alte baze de date, folosirea keywordurilor FULL JOIN este permisa, insa nu si in mySql. Acest
query pe care il vedeti, ca face in schimb exact acelasi lucru.

104
Avand studentii si profesorii

daca executam joinul

rezultatul va fi

Putem vedea ca vom avea returnate atat datele studentilor(tabelul din stanga) cu eventualele
date ale profesorilor corespondenti (tabelul din dreapta), cat si toate datele profesorilor (tabelul din
dreapta) cu eventualele date corespondente ale elevilor (tabelul din stanga)

Am returnat datele elevului 3, care nu are nici un profesor, a fost returnat cu coloanal
“department” a profesorului “null”.

De asemenea, profesorul 3, care preda chimie, neavand nici un corespondend in tabelul de


student, a fost returnat cu toate coloanele studentului “null”.

Pentru full joinuri nu vom mai avea un video separate de exercitii, deoarece am scrie acelasi lucru ca la
videoclipurile [Link] aici, vine si urmatorul exercitiu practice:

Reluati videoclipurile de exercitii de la sectiunea JOIN, LEFT JOIN si RIGHT JOIN, se faceti cate un full join
pentru fiecare exercitiu.

105
31.1
Exercitii
1. Creati tabelele elev, cu student id nume si varsta,si laptop, cu proprietatile id marca si ram.

Orice student poate avea un laptop.

Introduceti 2 studenti si 2 laptopuri.

Cititi datele laptopurilor si ale eventualilor elevi posesori, laolalta cu toate datele elevilor si ale
laptopurilor posedate.

106
2. Creati tabelele masina, cu proprietatile id, marca, cai_putere , si sofer, cu proprietatile id,
nume si varsta. Orice sofer poate avea o masina

Cititi datele tuturor masinilor, si aleeventualilor soferi posesori, laolalta cu toate datele soferilor
si ale eventualelor masini posedate.

107
3. Creati tabelele order_table, cu proprietatile id, o_description, o_price, si customer_table, cu
proprietatile id, name, si telephone_number .

Fiecare order va avea un customer.

Cititi toate datele clientiilor individualisi ale eventualelor comenzi, laolalta cu datele tuturor
comenzilor si ale eventualilor clienti corespunzatori.

108
32.
SQL Aggregate Functions
In sql, am vazut ca putem citi din tabelele noastre individual orice coloana dorim.

De asemenea, cerintele aplicatiei noastre ne vor putea cere sa facem si anumite operatii
matematice pe baza datelor noastre.

Vom putea afla numarul total de elemente pe baza unui criteriu specificat de noi. Acest lucru se
realizeaza prin keywordul COUNT.

Vom putea calcula suma tuturor valorilor unei coloane care apartine unor entryuri returnate de
[Link] lucru, se realizeaza prin keywordul SUM.

Fom putea afla valoarea maxima sau minima a unei coloane care apartine unor entryuri
returnate de noi. Acest lucru se realizeaza prin keywordurile MIN si MAX

De asemenea, vom putea calcula media aritmetica a anumitor coloane care apartin entryurilor
returnate de noi. Acest lucru se realizeaza prin keywordul AVG.

Vom putea agrega coloane pe baza unei anumite [Link] lucru se realizeaza prin
keywordurile GROUP BY.

109
33.
COUNT
In acest capitol vom vorbi despre keywordul COUNT.

Cum spuneam, count poate fi folosit atunci cand dorim sa aflam fie numarul total de elemente
dintr-un tabel, fie numarul total de elemente care respecta o anumita conditie.

Instructiunea noastra count va numara o anumita coloana. Dupa cum stim,


fiecare tabel din mysql este recomandat sa aiba o coloanal primary key.
Prin urmare, pentru a afla numarul total de elemente dintr-un tabel vom putea
scrie SELECT COUNT(acel primary key) FROM numele tabelului nostru.

Daca dorim sa aflam numarul de entry-uri care respecta o anumita conditie, vom
putea adauga de asemenea conditia, sau chiar conditiile noastre separate de AND si
OR, dupa keywordul WHERE,

Avand tabelul

Query-ul va returna

110
33.1
Exercitii
1. Creati tabelul product, care sa stocheze produse. Produsele vor avea un id de tip numeric, un
nume si un pret.

Introduceti 5 entry-uri in tabel. Aflati numarul total de produse din stoc.

2. Creati tabelul teenager, care sa stocheze adolescenti. Adolescentii vor avea un id de tip
numeric, un nume si un hobby

Introduceti 4 entry-uri in tabel. Aflati cate entry-uri sunt prezente in tabel care au hobby-ul
“programare”.

111
3. Creati tabelul calculator, care sa stocheze [Link] vor avea o marca si o
memorie ram.

Introduceti 8 entry-uri in tabel.

Aflati cate laptopuri de marca Dell cu memoria ram mai mare de 4 GB exista in tabel.

112
34.
SUM
Asemenea COUNT-ului, SUM este o functie de agregare, care ne permite sa
returnam suma tuturor valorilor unei anumite coloane, in cadrul unui select.

Vom selecta suma unei anumite coloane, prin instructiunea SELECT SUM, in
parantezele careia vom trece numele coloanei noastre a caror valori vrem sa fie
adunate si returnate. Mai departe, puteam specifica pur si simplu din ce tabel dorim sa
se faca citirea, si de asemenea, putem adauga si una sau mai multe conditii

Avand urmatoarele produse in tabelul nostru de alimente

Daca dorim sa aflam care este suma tuturor preturilor alimentelor noastre, putem rula

Rezultatul va fi

113
34.1
Exercitii
1. Creati tabelul angajat, care sa stocheze angajati. Angajatii vor avea un id de tip numeric, un
nume si un salariu.

Introduceti 5 entry-uri in tabel.

Aflati cati bani trebuie sa plateasca firma lunar tuturor angajatilor.

114
2. Creati tabelul ticket, care sa stocheze bilete de tren. Fiecare va avea in id, o clasa si un pret.

Introduceti 8 entry-uri in tabel. Clasele vor putea fi FirstClass, SecondClass si ThirdClass.

Aflati suma incasata tuturor biletelor de tip FirstClass

Aflati suma incasata tuturor biletelor de tip SecondClass

Aflati suma incasata tuturor biletelor de tip ThirdClass

115
3. Creati tabelul cursant, care sa stocheze cursantii Academiei [Link] vor
avea un id, un nume, curs la care participa.

Creati tabelul curs, care sa stocheze cursurile Academiei Programatorilor. Cursurile vor avea un
nume si un pret.

Introduceti 4 entry-uri in tabelul de cursuri.

Introduceti 4 entry-uri in tabelul de cursanti.

Aflati suma incasata de Academie pentru toate cursurile de Incepatori si Intermediari.

116
35.
MIN & MAX

Intr-un tabel mysql, avem posibilitatea de a returna valoarea maxima sau minima
a unei anumite coloane din tabelul nostru. Acest lucru se poate realiza prin folosirea
keywordurilor specifice MIN si MAX.

Deja v-ati familiarizat cu modalitatea de apelare a functiilor de agregare din


mysql, deci nu va fi nici o surpriza cand vom vedea ca atunci cand vrem sa aflam
valoarea minima a unei coloane, vom avea select MIN, in parantezele careia vom trece
coloana a carei valoare minima existenta in tabelul nostru vrem sa fie returnata, FROM
numele tabelului nostru. De asemenea, in continuare, putem sau nu sa avem filtrari in
cadrul keywordului WHERE.

117
Sa presupunem ca avem urmatorul table de alimente:

Executand queryul

Rezultatul va fi

Executand queryul

Rezultatul va fi

118
35.1
Exercitii
1. Creati tabelul angajat, care sa stocheze angajati. Angajatii vor avea un id de tip numeric, un
nume si un salariu. Introduceti 5 entry-uri in tabel.

Aflati care este cel mai mare salariu acordat unui angajat de catre firma noastra.

2. Creati tabelul haina, care sa stocheze haine. Fiecare haina va avea un nume , un material si un
pret. Introduceti 5 entry-uri in tabel.

Aflati care este cel mai mic si cel mai mare pret al produselor din baza noastra de date.

119
3. Creati tabelul geniu, care sa stocheze persoane. Fiecare va avea un id, un nume si un iq.

Introduceti 5 entry-uri in tabelul nostru.

Aflati care este cel mai mare si cel mai mic iq din tabela noastra.

120
36.
AVG

Intr-un tabel mySql, avem de asemenea posibilitatea de a calcula si returna


media aritmetica a unei anumite coloane. Acest lucru se realizeaza prin keywordul
AVG, care va fi folosit asemenea keywordurilor COUNT, SUM, MIN, SI MAX, pe care
deja le-am invatat.

Sa presupunem ca avem urmatorul table de alimente:

Executand queryul

Rezultatul va fi

121
36.1
Exercitii

1. Creati tabelul angajat, care sa stocheze angajati. Angajatii vor avea un id de tip numeric, un
nume si un o productivitate, care poate avea valori cuprinse intre 1 si 100.

Introduceti 3 entry-uri in tabel. Aflati care este media de productivitate a firmei.

2. Creati tabelul turist, care sa stocheze turisti. Turistii vor avea un Id, un nume, o tara de origine
si o varsta.

Introduceti 3 entry-uri in [Link] care este media de varsta a turistilori romani.

122
3. Creati tabelul elev, care sa stocheze elevi. Fiecare elev va avea un id, un nume si o medie
generala.

Introduceti 5 entry-uri in tabelul nostru.

Aflati media generala a intregii scoli.

123
37.
GROUP BY

In acest capitol vom invata cum putem grupa informatiile din tabelele noastre. Vom vorbi
despre keywordurile GROUP BY , folosite in cadrul agregarii informatiilor noastre.

Instructiunea group by ne permite sa agregam coloane pe o anumite categorie.

Sa presupunem ca avem un tabel cu doua coloane. O coloana poate reprezenta o anumita


categorie. O categorie, poate fi orice. Poate fi o firma, un elev, si asa mai departe. De asemenea, vom
avea si o alta coloana, care reprezinta o anumita informatie specifica categoriei noastre. Pentru firme,
poate reprezenta vanzarile lunare. Pentru elevi, poate reprezenta o nota.

Ideea este ca firma A, poate fi trecuta in tabelul nostru de doua sau mai multe ori, de fiecare
data avand o valoare diferita pentru coloana de vanzari lunare.

In desen, firma A a vandut intr-o luna 10 produse, in alta luna 5. Firma B a vandut intr-o luna 2
produse, in alta luna 4. Si asa mai departe.

Ce ar trebui sa facem noi in momentul in care ne intereseaza totalul produselor vandute ale unei
anumite firme? Ei bine, aici ne va ajuta instructiunea GROUP BY.

Aceasta se foloseste impreuna cu una dintre functiile de agregare despre care am vorbit in
videoclipurile anterioare : COUNT,SUM,MIN,MAX si AVG.

124
Sa presupunem ca vom vrea sa aflam pentru fiecare firma totalul produselor vandute. Atunci
vom avea queryul urmator.

Pe noi ne intereseaza sa avem returnate rezultatele in doua categorii: vom vrea numele firmei, si
vom vrea de asemenea inca o coloana care sa reprezinte totalul vanzarilor acelei firme.

Vom avea un SELECT firma, adica prima noastra coloana, iar al doilea element selectat, va fi o
agregare a tuturor [Link] anume suma acestora.

Vom specifica din ce tabel vrem sa citim, adica din statistica_firme, iar dupa aceea, ne vom
folosi de keywordurile GROUP BY, dupa care o sa specificam categoria dupa care suma vanzorilor
noastre va fi calculata. Avand GROUP BY firma, suma vanzarilor pe care noi vrem sa o returnam, se va
face individual pentru fiecare firma in parte.

Tabelul nostru initial va avea valori duplicat pentru coloanal firmei, si valori specifice pentru vanzarile
lunare ale acestora.

Dupa executarea query-ului

Tabelul returnat

va consta intr-o coloana in care fiecare firma va fi prezenta o singura data, iar corespondenta vanzarilor
va reprezenta suma tuturor vanzarilor gasite in tabelul nostru initial pentru firma respectiva.

125
37.1
Exercitii

1. Creati tabelul filme, care sa stocheze filme. Filmele vor avea un id de tip numeric, un nume ,
un nume_reviewer si o nota.

Pentru un anumit film, un reviewer poate acorda o nota filmului.

Introduceti 10 entry-uri in tabel.

Ciiti media ratingurilor pentru toate filmele

126
2. Creati tabelul borrow, care sa stocheze inchirieri de carti. Tabelul va avea un id de tip
numeric, un nume al cartii care a fost imprumutata si numele persoanei care a imprumutat cartea
respectiva

Introduceti 7 entry-uri in tabel.

Cititi de cate ori au fost inchiriate fiecare carte.

127
3. Creati tabelul product, care sa stocheze [Link] vor avea un id, un nume si o
cantitate.

Introduceti 5 entry-uri in tabel.

Cititi cantitatea totala a fiecarui produs din tabel.

128
38.
TRIGGERS

In acest capitol vom vorbi despre triggere. Mai specific, ce sunt ele,cand ar trebui sa le folosim,
de ce ar trebui sa le folosim, si cum sa le folosim.

Conceptual, triggerele sunt simple. Ele constau in una sau mai multe queryuri sql care ruleaza
automat ca raspuns al unui eveniment.

In mySql, tipurile de evenimente pot fi de 6 tipuri :

A) BEFORE INSERT
B) BEFORE UPDATE
C) BEFORE DELETE
D) AFTER INSERT
E) AFTER UPDATE
F) AFTER DELETE

De exemplu, putem crea un trigger care spune ca in momentul In care se face un update in
tabelul A, vrem de asemenea sa se execute automat si un alt query scris de noi si stocat in triggerul
nostru.

129
Ganditi-va ca avem un tabel de likeuri si un tabel de [Link] pot fi bazele noastre de
date integrate in cadrul unui proiect social media. Postari pot fi create, iar persoanele pot da like acelui
post.

In cadrul unui social media application, ne asteptam la un traffic destul de mare. O postare
poate avea intre 1 si 1 milion de likeuri. In structura postului, am vrea de asemenea sa avem si numarul
de likeuri corespunzatoare.

O solutie simpla dar ineficienta pentru a sti cate likeuri are o postare este sa cautam postul
nostru specific si sa facem o agregare in tabelul de likeuri, care va calcula suma tuturor likeurilor
specifice postului [Link] spuneam, o postare poate primi intre 1 si 1 milion de likeuri. Prin urmare
o suma agregata pe atatea entryuri poate fi costisitoare din punct de vedere al memoriei si al
[Link] problema s-ar multiplica de 10 ori daca sa spunem ca am incerca sa citim 10 postari,
fiecare cu cate 1 milion de likeuri

Ei bine, ne putem folosi de triggere. In tabelul nostru de postari avem aceasta coloana
like_count. Ce ar fi, in loc sa numaram toate entry-urile din tabelul de likeuri specifice postului meu, sa
imi creez doua triggere rulate dupa fiecare insert si fiecare delete. In fiecare trigger, un query se va
executa automat in care like_countul postului meu va fi [Link] triggerul de insert, valoarea likeurilor
va lua valoarea ei plus unu, iar in triggerul de delete, valoarea likeurilor va lua valoarea ei minus 1.

In acest fel, putem garanta ca like countul postarilor mele este egal cu suma tuturor likeurilor din tabelul
de likes, fara a mai face la fiecare citire cate o agregare costisitoare.

130
Vom incepe prin a crea insert triggerul.

Sintaxa pentru a crea un trigger incepe cu keywordurile CREATE TRIGGER, dupa care vom da un
nume triggerului nostru. Din moment ce triggerul nostru se va executa la inserarea likeurilor, il voi numi
like-insert.

Mai departe va trebui sa specific cand trebuie rulat, si pe ce tabel. Vom vrea sa fie rulat dupa
fiecare insert al unui nou entry in tabelul de likes. De aici avem sintaxa AFTER INSERT ON tabelul
noastru likes.

Aceste sintaxe pot varia in functie de toate cele 6 usecaseuri ale triggerelor. BEFORE INSERT,
BEFORE UPDATE, BEFORE DELETE, AFTER INSERT, AFTER UPDATE si AFTER DELETE. La final , specificam
ON numele tabelului.

In continuare, va trebui sa specificam ca dorim ca acest trigger sa fie executat pentru fiecare
rand nou introdus. De aici vine sintaxa FOR EACH ROW, iar ultimele doua lucruri sunt keywordurile
BEGIN si END.

Ceea ce noi vrem sa se execute in momentul in care un nou like este introdus in baza de date,
vom trece intre aceste keyworduri. BEGIN si END.

Ce vrem sa facem noi aici e simplu. Vrem pur si simplu sa updatam coloana likes_count din
tabela de postari, incrementand-o cu 1.

Pentru asta vom scrie Query-ul pe care dela il stim: UPDATE posts SET likes = likes+1 WHERE
unde post_id ul este egal cu… ce anume? De unde ne putem lua noi post idul?

Aici ne vom putea folosi de un nou keyword: ne putem folosi fie de keywordul OLD, fie NEW. Din
moment ce facem un insert, singurul keyword la care vom avea access va fi NEW. Acest NEW, semnifica
exact recordul care tocmai a fost inserat in tabel. In acest fel, queryul dintre BEGIN si END se va traduce
ca “la fiecare insert de like, vreau sa incrementez cu 1 likeurile fiecarei postari cu idul egal cu post_id-ul
likeului care tocmai a fost inserat in baza noastra de date. A doua sau a treia oara cand o sa cititi aceasta
fraza, va promit ca o sa faca sens.

131
Acum, singurul lucru de care vom mai avea nevoie, va fi un delimiter. Daca ar fi sa selectez tot
acest query si sa il execut, voi avea o eroare si triggerul meu nu se va crea.

Problema este ca daca incerc sa rulez acest query, queryul vazut de catre compilator va fi doar
pana la linia 4, la final. Unde am trecut acel punct si virgula. Stim ca in sql, punct si virgula indica finalul
unui query.

Eu trebuie sa gasesc o modalitate de a schimba caracterul de incheiere a unui query, si anume punct si
virgula, in altceva. Pentru asta ma voi folosi de DELIMITER.

Inainte de queryul nostru, com scrie keywordul DELIMITER, dupa care vom specifica noul ”punct
si virgula” vazut de catre compilator. Noi voi vrea ca fiecare query se se incheie in $$.

Setand acest delimiter, daca hasuram tot cu mouse ul si executam, queryul nostru nu se va mai
opri la punct si virgula de la sfarsitul liniei 5. Se va opri la cei doi dolari de la linia 6. Dupa END.

La final, vom schimba inapoi delimieterul nostrum inapoi in punct si virgula.

132
Tabelul nostru de likeuri va fi gol. Sa presupunem ca avem urmatoarele postari:

Odata create triggerul meu, in momentul in care voi introduce likeuri specificand idul postului nostru,

Putem observa ca valoarea like_count-ului din tabelul nostrum de postari a fost automat incrementat
pentru postarea care a primit likeuri.

Acest lucru se datoreaza triggerului nostru. Dupa fiecare insert in tabelul de likeuri, queryul nostru de
update din trigger a fost executat, incrementand cu 1 like_countul postarii noastre.

Pentru a vedea toate triggerele noastre ne putem folosi de instructiunea

Aceasta va returna un table cu toate triggerele noastre existente

Pentru a sterge un trigger, ne putem folosi de instructiunea

133
38.1
Exercitii
[Link] un tabel youtube_channel, care sa stocheze canaluri de youtube. Canalurile vor avea un
id, un nume si un numar de subscriberi.

Creati tabelul subscriber, care va avea un id, un nume si canalul pe care il urmareste.

La fiecare insert si delete de subscriber, updatati constant numarul de subscriber din structura
canalului de youtube.

134
[Link] tabelul teams, care va stoca echipe de playeri. Echipele vor avea un id, un joc current si
un numar de jucatori. Creati tabelul player, care sa aiba coloanele id, nume, un numar de telefon si o
echipa.

Creati tabelul player_history, care va stoca datele tuturor jucatorilor din programul
[Link] acestea vor persista pe veci.

La fiecare insert si delete din player, updatati constant numarul de jucatori al fiecarei echipe.

De asemenea, fiecare jucator va trebui persistat in player_history.

135
39.
FUNCTII STOCATE

In acest capitol vom vorbi despre functii stocate.

Daca ati trecut deja prin cursul nostru de programare Java pentru incepatori, de la zero
( [Link] ) sau daca ati mai
interactionat pana acum cu un limbaj de programare pana in punctul in care ai ajuns sa lucrezi cu functii
sau cu metode, aceasta lectie va fi familiara pentru voi.

Ce este o functie? Este o functionalitate existenta in serverul nostru de mySql, careia ii putem
pasa informatii, care poate prelucra aceste informatii, si apoi poate returna o valoare.

Daca gasiti ceva in queryurile executate de tine pe care il vei intalni in mod repetitiv, probabil
acesta este un semn bun ca te-ai putea folosi de o functie.

Vom putea crea o functie pe care sa o salvam pe server, iar apoi, o vom putea apela cu oricate
valori avem avea nevoie sa fie prelucarate.

Sa presupunem ca avem un tabel de persoane, iar acestea au un id, un nume, un prenume si o


varsta.

Pe noi ne intereseaza sa citim idul , varsta, iar numele si prenumele persoanelor vrem sa fie
returnate concatenate in cadrul aceleiasi coloane. Pentru cei care nu sunt familiari cu acest termen,
concatenare inseamna lipire.

136
Ne vom putea crea functia in felul urmator:

Prima data ne vom folosi de keywordurile CREATE function, dupa care vom da un nume functiei
noastre. Functia noastra va lipi un nume si un prenume, prin urmare, se va numi full_name. Vom
deschide parantezele, iar in interiorul acestora, vom trece parametrii care vor fi concatenati in interiorul
metodei noastre. Functia noastra va astepta ca parametru un first_name, care obligatoriu trebuie sa fie
de tip VARCHAR, si de asemenea, un last_name, care va fi tot de tip VARCHAR.

Imediat ce inchidem parantezele parametrilor, va trebui sa specificam ce anume returneaza


functia noastra. Acest lucru se semnaleaza prin folosirea keywordului RETURNS (atentie, RETURNS, nu
RETURN), dupa care vom specifica tipul de date returnat. Care poate sa fie VARCHAR, INT, DECIMAL, si
asa mai departe.

Dupa ce spcificam return type-ul functiei noastre, vom specifica keywordul DETERMINISTIC.
Dupa el, va trebui sa returnam o valoare concreta.

In cazul nostru, acea valoare concreta va fi concatenarea, lipirea celor doi parametrii pasati: Si
anume first_name ul si last_name ul. Concatenarea textelor se realizeaza prin keywordul CONCAT, in
parantezele caruia vom trece, la virgula, elementela care vrem sa fie lipite. Vom vrea sa lipim first_name
ul de un spatiu gol, si apoi de last_name.

Dupa ce vom executa acest query, functia noastra va fi creata in server.

137
Am presupus la inceput ca avem un tabel de persoane, cu un id, un nume, un prenume si varsta,
si ca ceea ce noi vrem sa returnam din el sunt 3 coloane. o coloana a id-ului persoanei, o coloana a
numelui complet al persoanei, si o coloana a varstei persoanei.

Pentru asta, ne vom putea folosi de functia noastra.

Vom avea un SELECT, dupa care vom specifica coloanele care vrem sa fie returnate, si anume
idul si varsta. A treia coloana returnata, nu va mai fi citita direct din tabelul nostru. Va fi compusa prin
intermediul functiei noastre pe care am declarat-o. Apeland functia full_name, careia ii pasam cele doua
coloane din tabelul nostru de persoane, acesta va returna o noua coloana, in interiorul careia vom avea
cele doua coloane din persoana, care au fost concatenate in interiorul functiei.

Putem vedea in schimb ca coloanal noastra este returnata sub forma semnaturii functiei
noastre, cee ace nu este un lucru extrem de estetic. Pentru asta, ne putem folosi de keywordul AS.

AS “full_name:D” indica doar numele sub care coloana noastra rezultata prin apelarea functii va
fi returnata. Mai departe, specificam doar tabelul din care vrem sa citim.

138
39.1
Exercitii
[Link] tabelul placuta_inmatriculare, care va avea urmatoarele coloane: id, judet, numar si
trei_litere. Introduceti 5 elemente in tabel.

Creati o functie care sa returneze un tabel de doua coloane: prima coloana va reprezenta idul
placutei de inmatriculare, iar a doua va reprezenta un singur text alcatuit din cele trei elemente ale
tabelului nostru: judet, numar si cele trei litere.

Cititi datele din tabel prin intermediul functiei.

139
[Link] tabelul product, care sa stocheze produse. Produsele noastre vor avea un id, un nume,
si un pret in lei.

Creati doua functii, care sa returneze numele produsului si pretul in euro, respectiv dolari

Cititi datele produselor in cele trei variante: in lei, euro si dolari. (1 leu = 0.20 E 1 leu= 0.24 $)

140
40.
CASE
In acest apitol vom invata noi keyworduri, prin rezolvarea unui exercitiu de functii stocate.

Creati tabelul persoana, care are urmatoarele coloane: id, nume si varsta;

Creati o functie care returneaza numele persoanelor din tabel, si o stare.

Starea poate avea 3 valori: ADULT, daca varsta este peste 18, ADOLESCENT, daca este peste 12
si COPIL in caz contrar.

Aici, putem vedea ca va trebui sa returnam o anumita valoare in functie de verificarea unor
decizii.

Cei care au mai interactionat cu programarea sunt familiari cu instructiunile decizionale. In SQL,
avem un process care respecta acelasi concept, insa SCRIS DIFERIT

Functia noastra poate returna valori in functie de anumite conditii. Sintaxa de mai sus este
asemanatoare instructiunii IF - ELSE IF – ELSE. Daca parametrul pasat functiei va fi mai mare sau egal ca
18, functia noastra va returna textul “ADULT”. In caz contrar, daca este mai mare ca 12, va returna
“ADOLESCENT”. Daca nu, va returna “COPIL.

Dupa keywordul CASE, vom specifica inlantuite ramurile noastre WHEN THEN.

In momentul in care conditia scrisa dupa WHEN este adevarata, se va returna valoarea scrisa
dupa THEN.

141
Avand urmatoarele personae in tabelul nostru

si executand apelarea functiei noastre

vom avea returnata situatia fiecarei personae in functie de criteriul stocat de noi in functie.

142
41.
PROCEDURI STOCATE
In acest ultim capitol vom vorbi despre un feature puternic al bazelor de date. Si anume despre
proceduri stocate. Acestea, sunt foarte asemanatoare functiilor stocate pe care tocmai le-am invatat.

Am aflat ca functiile pot sau nu sa primeasca parametrii, si sa returneze o valoare inapoi.

Procedurile stocate pe de alta parte, ne permit sa rulam mai multe queryuri. Putem combina
executarea unuia sau mai multor queryuri in cadrul aceleiasi proceduri.

In loc sa scriem si sa executam combinatiile noastre de queryuri de oricate ori vom avea nevoie,
prin intermediul procedurilor stocate, vom defini doar o singura data structura query-urilor noastre,
dupa care, de fiecare data cand o sa vrem sa ne folosim de ele, vom apela procedura noastra, careia ii
vom pasa doar valorile de care queryurile noastre au nevoie.

Sa presupunem ca avem un tabel de produse, care are trei coloane. Un id, un nume si un pret.
Sa presupunem ca de fiecare data cand o sa introducem un nou produs in tabelul nostru, vom vrea
imediat dupa sa citim toate entryurile din tabel. Iar pentru asta vom crea o procedura stocata

Pentru a crea o procedura stocata, ne vom folosi de keywordurile CREATE PROCEDURE, dupa
care vom da un nume procedurii nostre.

Aceasta procedura, se va astepta la parametrii care vor fi folositi in interiorul ei.

Spre deosebire de functii, aici, parametrii vor trebui prefixati de keywordul IN. Dupa acesta, vom
da un nume parametrilor pasati, si le vom specifica tipul de date.

Ceea ce va face procedura noastra cu datele pasate, se va executa intre keywordurile BEGIN si
END. Insa acest query, daca il selectam si executam, nu va functiona. Incercati sa va dati seama de ce.

Ca un hint, amintiti-va de TRIGGERE.

143
Exact cum am specificat si in cadrul triggerelor, queryurile nostre sunt interpretate de catre
compilator pana la punct si virgula.

Din cauza caracterelor punct si virgula de la finalul queryurilor executate, a trebuit sa ne folosim
de un DELIMITER. Acelasi lucru vom face si aici.

In momentul in care eu imi voi crea o procedura stocata care are queryuri intre keywordurile
BEGIN si END, o voi prefixa de schimbarea DELIMITER ului, ma voi folosi de noul DELIMITER imediat dupa
keywordul END ( in cazul meu, de $$ ), iar la final, voi schimba DELIMITER ul meu inapoi in punct si
virgula.

Procedura nostra a fost creata. Tot ce mai ramane este sa o apelam. Acest lucru se realizeaza
prin sintaxa CALL.

Vom avea

Apelarea acestei proceduri va executa queryurile din structura ei, pasand valorile Car si 1200. Prima data
se va executa INSERT ul in tabel, iar imediat dupa, se va face o citire complete din tabelul nostru, care va
afisa

Apeland din nou procedura noastra,

Vom avea

144
41.1
Exercitii
[Link] un tabel de carti, care sa aiba colanele id, nume si numar_pagini, si de studenti, care sa
aiba proprietatile id si nume. Orice student va putea avea o carte.

Introduceti in tabelul de studenti entryuri noi, specificand doar numele.

De fiecare data cand se va face un insert in tabelul nostru de studenti, se vor afisa de asemenea
toate cartile disponibile care nu sunt deja in posesia unui student

Apelati procedura de 3 ori.

145
[Link] tabelul masina, cu proprietatile id, marca si an. Creati tabelul sofer, cu proprietatile
nume si varsta. Orice sofer va putea avea o masina.

Creati o procedura in care de fiecare data cand se introduce un nou sofer cu o masina
specificata, sa fie printate la consola numele, varsta, masina si anul masinii tuturor soferilor care au
aceeasi varsta, plus sau minus 5 ani.

Apelati procedura de 3 ori.

146
REZOLVARI

147
6.1
------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

Desi un numar de telefon continue doar cifre, daca noi vom salva un numar in table care incepe
cu cifra 0, aceasta va fi ignorata. Exp: numarul 0738473824 va fi salvat sub forma 738473824

------------------------------------------------------------ 3--------------------------------------------------------------

148
7.1
------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

149
8.1
------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

150
------------------------------------------------------------ 3 --------------------------------------------------------------

9.1
------------------------------------------------------------ 1 --------------------------------------------------------------

151
------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

152
10.1
------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

153
11.1
------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

154
12.1
------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

155
13.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

De asemenea, se putea si fara a specifica coloanele.

156
14.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

157
15.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

158
------------------------------------------------------------ 3 --------------------------------------------------------------

16.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

159
------------------------------------------------------------ 3 --------------------------------------------------------------

17.1

------------------------------------------------------------ 1 --------------------------------------------------------------

160
------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

161
18.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

162
------------------------------------------------------------ 3 --------------------------------------------------------------

19.1

------------------------------------------------------------ 1 --------------------------------------------------------------

163
------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

164
20.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

165
------------------------------------------------------------ 3 --------------------------------------------------------------

21.1

------------------------------------------------------------ 1 --------------------------------------------------------------

166
------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

167
22.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

168
------------------------------------------------------------ 3 --------------------------------------------------------------

23.1

------------------------------------------------------------ 1 --------------------------------------------------------------

169
------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

170
24.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

171
------------------------------------------------------------ 3 --------------------------------------------------------------

25.1

------------------------------------------------------------ 1 --------------------------------------------------------------

172
------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

173
26.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

174
------------------------------------------------------------ 3 --------------------------------------------------------------

27.1

------------------------------------------------------------ 1 --------------------------------------------------------------

175
------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

176
28.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

177
------------------------------------------------------------ 3 --------------------------------------------------------------

29.1

------------------------------------------------------------ 1 --------------------------------------------------------------

178
------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

179
30.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

180
------------------------------------------------------------ 3 --------------------------------------------------------------

181
31.1

------------------------------------------------------------ 1 --------------------------------------------------------------

182
------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

183
33.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

184
------------------------------------------------------------ 3 --------------------------------------------------------------

34.1

------------------------------------------------------------ 1 --------------------------------------------------------------

185
------------------------------------------------------------ 2 --------------------------------------------------------------

186
------------------------------------------------------------ 3 --------------------------------------------------------------

187
35.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

188
------------------------------------------------------------ 3 --------------------------------------------------------------

36.1

------------------------------------------------------------ 1 --------------------------------------------------------------

189
------------------------------------------------------------ 2 --------------------------------------------------------------

------------------------------------------------------------ 3 --------------------------------------------------------------

190
37.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

191
------------------------------------------------------------ 3 --------------------------------------------------------------

192
38.1

------------------------------------------------------------ 1 --------------------------------------------------------------

193
------------------------------------------------------------ 2 --------------------------------------------------------------

194
39.1

------------------------------------------------------------ 1 --------------------------------------------------------------

------------------------------------------------------------ 2 --------------------------------------------------------------

195
41.1

------------------------------------------------------------ 1 --------------------------------------------------------------

In acest exercitiu putem vedea conceptul de Subquery ( sau cum I se mai zice, SELECT in SELECT)

Avand in vedere ca idurile de care noi avem nevoie se afla tot intr-unul din tabelele noastre,
acestea pot fi returnate printr-un alt query de select. Rezultatul va fi o lista de iduri care va fi introdusa
in parantezele keywordului nostru IN.

196
------------------------------------------------------------ 2 --------------------------------------------------------------

197
Esti cu un pas mai aproape de a incepe
cariera in domeniul IT. Felicitari !

Pentru consultanta gratuita in cariera nu


ezitati sa ne contactati pe pagina de facebook
Academia Programatorilor
sau pe siteul
[Link]

198
CUPRINS
Cum am devenit programator ………………………………………………………………………………………………….. 2

1. De ce SQL? 7 motive ……………………………………………………………………………………………………………… 6

2. Introducere in SQL si mySQL ……………………………………………………………………………………………….... 8

3. Ce sunt bazele de date? ………………….…………………………………………………………………………………….. 11

4. Tabele………………………………………………………………………………………..………………………………………….. 12

5. Tipuri de date ……………………………………………………………………………………………………………………….. 13

6. Crearea bazelor de date si a tabelelor …………………………………………………………………………………… 15

[Link] si modificarea tabelelor ……………………………………………………………………………………….... 17

8. Inserarea datelor in tabel …………………………………………………………………………………………….……….. 21

9. PRIMARY KEY …………………………………………………………………………………………………………….………….. 26

10. AUTO_INCREMENT ……………………………………………………………………………………………….…………….. 30

11. NOT NULL ………………………………………………………………………………………………………….…………….….. 32

12. UNIQUE ………………………………………………………………………………….…………………….…….……………….. 35

13. DEFAULT …………………………………………………………………………….…………………………………………….….. 38

14. SELECT - Citirea datelor din tabel ………………………………………………………………………………………….. 41

15. WHERE …………………………………………………………………………………………………………………….….……….. 44

16. AND & OR ……………………………………………………………………………………………………….………..………….. 47

17. IN ……………………………………………………………………………………………………………………………………..….. 50

18. BETWEEN ……………………………………………………………………………………………………………………….…….. 53

19. LIKE …………………………………………………………………………………………………………………….….…………….. 56

20. DISTINCT ……………………………………………………………………………………………..…………..……….………….. 61

[Link] ……………………………………………………………………………………………………………….………….…. 65

[Link] …………………………………………………………………………………………………………………………..…….. 69

23. DELETE vs. TRUNCATE ……………………………………………………………………………………….………………….. 73

24. LIMIT & OFFSET …………………………………………………………………………………………………………………….. 76

25. ORDER BY ………………………………………………………………………………………………………………………….….. 80

199
26. FOREIGN KEYS …………………………………………………………………………………………...………………………….. 83

27. ON DELETE …………………………………………………………………………………………………………………………….. 88

28. INNER JOIN ………………………………………………………………………………………………………..………………….. 91

29. LEFT JOIN …………………………………………………………………………………………………………..………………….. 96

30. RIGHT JOIN ……………………………………………………………………………………………..…………………………….. 100

31. FULL JOIN & UNION ………………………………………………………………………………….…………………………... 104

32. SQL Aggregate Functions ……………………………………………………………………………………..……………….. 109

33. COUNT ………………………………………………………………………………………………………………………………….. 110

34. SUM ……………………………………………………………………………………………………………………………..…..….. 113

35. MIN & MAX ………………………………………………………………………………………………………..…………..…….. 117

36. AVG ………………………………………………………………………………………………………………………………...…….. 121

37. GROUP BY ……………………………………………………………………………………………………..……………………….. 124

38. TRIGGERS ………………………………………………………………………………………………..………………………….….. 129

39. FUNCTII STOCATE ……………………………………………………………………………………………………………….….. 136

40. CASE ……………………………………………………………………………………………………………………..……………….. 141

41. PROCEDURI STOCATE …………………………………………………………………………………………….……………….. 143

REZOLVARI ………………………………………………………………………………………………………………………..………….. 147

200

S-ar putea să vă placă și