0% au considerat acest document util (0 voturi)
29 vizualizări32 pagini

SQL

Documentul prezintă principalele limbaje de manipulare și definire a datelor (DML și DDL) în MySQL, inclusiv comenzile și tipurile de date suportate.

Încărcat de

Serghiuta Steluta
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 DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
29 vizualizări32 pagini

SQL

Documentul prezintă principalele limbaje de manipulare și definire a datelor (DML și DDL) în MySQL, inclusiv comenzile și tipurile de date suportate.

Încărcat de

Serghiuta Steluta
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 DOCX, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 32

LMD - Limbajul de manipulare a datelor

- Când doriti sa adaugati, sa modificati sau sa stergeti date dintr-o baza de


date, executati o comanda DML. O colectie de comenzi DML care
formeaza o unitate logica de lucru se numeste tranzactie.

 INSERT – adaugarea de noi inregistrari in table INSERT INTO ….


VALUES

 SELECT – verificarea/redarea liniilor dintr-un tabel SELECT * FROM…

 UPDATE - modificarea datelor dintr-un tabel UPDATE tabel SET


coloana=valoare WHERE …

 DELETE – stergerea inregistrarilor dintr-un tabel DELETE FROM tabel


WHERE ….
LDD - Limbaj de definire a datelor

 CREATE – crearea unei BD sau a unei tabele

CREATE DATABASE masini;

USE masini;

CREATE TABLE denumire;

 ALTER – modificarea unei BD sau a unei tabele

 DROP – stergerea unei BD sau a unei tabele

DROP DATABASE masini;


DROP TABLE masini;

 RENAME – schimbarea numelui unei tabele

 TRUNCATE – stergerea continutului unei BD sau a unei tabele


Tipuri de constrângeri:
- NOT NULL – valorile nu pot fi nule;
- PRIMARY KEY – defineşte cheia primară;
- UNIQUE – defineşte uncitatea;
- FOREIGN KEY – defineşte o cheie externă;
- CHECK – introduce o condiţie (expresie logică).

LDD

Comanda care se foloseşte pentru crearea unei baze de date în MySQL este:
CREATE DATABASE nume_bd;
unde nume_bd reprzintă numele pe care vrem să îl aibă baza de date.
Denumirea bazei de date poate să conţină doar caractere alfanumerice şi semnul „_”.

Înapoi
 Mai departe
 Comanda care se foloseşte pentru crearea unei baze de date în MySQL este:
 DROP DATABASE nume_bd;

Comanda pentru stabilirea unei baze de date ca fiind curentă este următoarea:
USE nume_bd;

Această comandă specifică faptul că din momentul executării acestei instrucţiuni se foloseşte
baza de date specificată (se pot realiza operaţii pe această bază de date). Comanda este utilă
atunci când avem mai multe baze de date.
Fiecare instrucţiune MySQL se încheie cu caracterul „;”.

Comanda care se foloseşte pentru crearea unei tabele într-o bază de date este următoarea:
CREATE TABLE nume_tabelă(
nume_atribut1 tip_dată(dimensiune) [modificatori],
nume_atribut2 tip_dată(dimensiune) [modificatori],
...
nume_atributn tip_dată(dimensiune) [modificatori][,]
[restricții]
);

În comanda aceasta, nume_atribut reprezintă numele coloanelor (câmpurilor)


tabelei, tip_dată reprezintă tipul de dată al câmpului respectiv (de exemplu: numeric, șir de
caractere, dată calendaristică, etc.), modificatori este opţional la fel ca şi restricţiile ce se pot
aplica pe anumite câmpuri. Modificatorii reprezintă anumite opțiuni sau restricții ce se pot aplica
asupra coloanelor din tabelă.

Comanda care se foloseşte pentru a şterge o tabelă dintr-o bază de date este următoarea:
DROP TABLE nume_tabelă;
Comanda care se foloseşte pentru modificarea numelui unei tabele dintr-o bază de date este
următoarea:
ALTER TABLE nume_tabelă RENAME TO nume_nou_tabelă;
sau
RENAME TABLE nume_tabelă TO nume_nou_tabelă;

Comenzile folosite pentru modificarea structurii unei tabele sunt următoarele:


- pentru modificarea definiţiei unui câmp:
ALTER TABLE nume_tabelă CHANGE nume_câmp nume_câmp definiţie_câmp;
sau
ALTER TABLE nume_tabelă MODIFY nume_câmp definiţie_câmp;
- pentru adăugarea unui câmp într-o tabelă
ALTER TABLE nume_tabelă ADD nume_câmp definiţie_câmp;
- pentru ştergerea unui câmp dintr-o tabelă
ALTER TABLE nume_tabelă DROP nume_câmp;

În MySQL întâlnim următoarele tipuri de date:


- numerice
- şiruri de caractere
- binare
- date calendaristice
- text

Tipurile de date numerice sunt următoarele:


- pentru numere întregi:
· TINYINT – poate lua valori de la -128 până la 127 sau de la 0 la 255
unsigned
· SMALLINT – valori în intervalul -32 768 până la 32 767 sau de la 0 la 65 535
unsigned
· MEDIUMINT – de la -8 388 608 până la 8 388 607 sau de la 0 la 16 777 215
unsigned
· INT – de la -2 147 483 648 până la 2 147 483 647 sau de la 0 la 4 294 967
295 unsigned
· BIGINT – de la -9 223 372 036 854 775 808 până la 9 223 372 036 854 775
807 sau de la 0 la 18 446 744 073 709 551 615 unsigned

Cel mai folosit tip de date numeric întreg este INT, sau dacă avem valori numerice mici într-un
câmp putem folosi SMALLINT sau TINYINT care ocupă spaţiu mai puţin pe disc.

Fiecărui tip de dată i se specifică şi lungimea, de exemplu dacă avem valori de la 1 la 100 într-
un câmp putem aloca ca tip de dată INT(3), adică numere întregi cu lungimea maximă 3.
- pentru numere cu zecimală:
· FLOAT – folosit pentru numere mici cu virgulă;
· DOUBLE – folosit pentru numere mari cu virgulă;
· DECIMAL – permite alocarea unui număr fix de zecimale.

De exemplu, un câmp ce conţine preţul unui produs poate fi definit de tip DOUBLE(5,2).
În paranteză este trecut numărul total de cifre al preţului (5) respectiv numărul obligatoriu de
zecimale care va fi afişat (2). Prin urmare, datele introduse în câmpul preş definit de
tipul DOUBLE(5,2) poate lua valori cuprinse în intervalul închis [-999.99,999.99]. Delimitatorul
pentru un număr cu zecimale recunoscut de MySQL este „.”.

Tipurile de date folosite pentru şiruri de caractere sunt următoarele:


· CHAR – lungime fixă de la 0 la 255 de caractere
· VARCHAR – lungime variabilă de la 0 până la 65 535 de caractere. La versiunile
mai vechi de 5.0.3 ale MySQL lungimea era variabilă de la 0 la 255 de caractere.

În practică, tipul VARCHAR este cel mai folosit pentru definirea câmpurilor de tip şir de
caractere sau string. Într-o tabelă cu informaţii despre angajaţii unei companii, de exemplu,
numele angajaţilor poate fi ţinut într-un câmp nume de tip VARCHAR(70), între paranteze fiind
trecută dimensiunea maximă pe care o poate avea valoarea introdusă în acest câmp.

Aşadar, câmpul nume poate avea maxim 70 de caractere ceea ce considerăm a fi suficient
pentru a nu avea probleme de trunchiere a vreunui nume.

Putem defini, de asemenea, şi un câmp prenume de tip VARCHAR, de dimensiune 100 de


caractere, adică VARCHAR(100).

Tipurile de date CHAR şi VARCHAR acceptă şi definirea unei valori implicite (default) pe care o
va avea acel câmp în cazul în care nu se introduce nici o valoare în el.

Principala diferenţă între aceste două tipuri este că şirul dintr-un tip CHAR va fi stocat
întotdeauna ca un şir cu lungimea maximă a coloanei, folosind spaţii pentru completare, dacă
şirul introdus este mai mic decât lungimea coloanei.

Tipurile de date folosite pentru stocare text sunt următoarele:


· TINYTEXT – un şir cu lungime maximă de 255 de caractere;
· TEXT – un şir cu o lungime amximă de 65 535 de caractere;
· MEDIUMTEXT – un şir cu o lungime maximă de 16 777 215 de caractere;
· LONGTEXT – un şir cu o lungime maximă de 4 294 967 295 de caractere.

Pentru câmpuri în care este necesară stocarea unui text de mari dimensiuni, în general, se
foloseşte tipul TEXT. Unui câmp de tip text nu i se poate specifica lungimea.

De exemplu, într-o tabelă a unei baze de date în care sunt stocate articole, câmpul ce conţine
conţinutul (corpul) articolului poate fi de tip TEXT.

Spre deosebire de VARCHAR, tipul de date TEXT nu permite definirea unei valori implicite
(default) pentru acel câmp.

La ultimele versiuni de MySQL, a fost mărită dimensiunea maximă a tipului de date VARCHAR,
astfel încât poate fi folosit acesta şi pentru câmpurile cu texte lungi.

Tipurile de date binare întâlnite în cadrul MySQL sunt următoarele:


· TINYBLOB – stochează până la 255 bytes;
· BLOB (Binary Large Object) – stochează până la 64 KB;
· MEDIUMBLOB – stochează până la 16 MB;
· LONGBLOB – stochează până la 4 GB.
Aceste tipuri de date sunt folosite pentru stocarea obiectelor binare de mari dimensiuni cum ar fi
imaginile. Valorile din câmpurile de tip BLOB sunt tratate ca şiruri binare.

Ele nu au un set de caractere iar sortarea şi compararea lor se bazează pe valorile numerice
ale octeţilor din valoarea câmpului respectiv definit cu acest tip.

Tipurile de date folosite pentru stocarea datelor calendaristice sunt următoarele:


· DATE – stochează o dată calendaristică în formatul an-lună-zi;
· TIME – stochează ora în formatul oră-minut-secunda;
· DATETIME – stochează data şi ora în formatul an-lună-zi ora-minut-secundă;
· TIMESTAMP – este util la înregistrarea unor operaţii precum inserare sau
actualizare pentru că reţine implicit data efectuării ultimei operaţii.

Singurul format în care MySQL păstrează şi afişează datele calendaristice este formatul an-
lună-zi (AAAA-LL-ZZ), sau, mai cunoscut acest format după denumirea în limba engleză year-
month-day, sau prescurtarea YYYY-MM-DD.

Intervalul în care poate lua valori o dată calendaristică este foarte mare, de la '1000-01-01' pînă
la '9999-12-31'. Dacă avem într-o tabelă a unei baze de date stocată data naşterii unei
persoane care presupunem că este 20 martie 1981. Informația cu privire la data nașterii va fi
stocată în baza de date în următorul format '1981-03-20'.

Formatul în care se salvează un câmp de tip TIME, câmp care păstrează ora în baza de date,
este oră-minut-secundă (HH-MM-SS), format mult mai cunoscut după denumirea în limba
engleză, hour-minute-second sau după prescurtarea HH-MM-SS.

Formatul în care se salvează un câmp de tip DATETIME care stochează atât data cât şi ora
este year-month-day hour-minute-second (AAAA-LL-ZZ HH-MM-SS sau YYYY-MM-DD HH-
MM-SS).

Domeniul de valori este între '1970-01-01 00:00:00' până în ‘2037-01-01 00:00:00’. Formatul în
care păstrează valorile pentru TIMESTAMP este YYYYMMDDHHMMSS.

În cazul în care o dată calendaristică nu este introdusă în formatul corect sunt convertite la
valoarea zero, adică '0000-00-00' dacă este cu câmp de tip DATE sau, dacă este şi ora, de
exemplu, tipul de date DATETIME, '0000-00-00 00-00-00'.

Modificatorii sunt constrângeri ce pot fi definite pentru câmpurile tabelelor stocate în baza de
date. Modificatorii se definesc prin utilizarea unor cuvinte cheie şi a unei sintaxe specifice.

Modificatorii ce pot fi întâlniţi în definiţiile de descriere ale unui câmp sunt:


- NOT NULL – modificator sau constrângere care stabileşte pentru câmpul la care
este definit să nu permită valoarea NULL;
- DEFAULT – permite stabilirea unei valori implicite pentru acel câmp care are setat
acest modifcator;
- AUTO_INCREMENT – constrângere care este stabilită pentru un câmp care este
cheie primară, în general un id care este incrementat automat la fiecare inserare de
înregistrări în tabelă;
- PRIMARY KEY – constrângere care defineşte acel câmp ca fiind cheie primară a
unei tabele;
- FOREIGN KEY – constrângere care defineşte o cheie externă pentru o tabelă;
- UNIQUE – constrângere de unicitate care impune valori unice pentru cîmpurile care
au definit acest modificator;
- INDEX – constrângere care aplică un index pe un câmp al unei tabele.

În continuare prezentăm câteva exemple de folosire a instrucţiunilor prezentate în cadrul


limbajului de descriere a datelor (LDD). Aceste instrucţiuni se referă doar la structura unei baze
de date cu tabelele aferente şi nu au legătură cu valorile din baza de date (cu datele propriu
zise).

Considerăm crearea unei aplicaţii care gestionează cărţile aflate într-o bibliotecă. Primul pas
pentru realizarea acestei aplicaţii ar fi crearea bazei de date, bază de date care va primi
numele biblioteca.

Deci instrucţiunea de creare este următoarea:


CREATE DATABASE bibilioteca;

Prezentăm în continuare comanda de creare a unei tabele, autori ce conţine informaţii despre
autorii cărţilor din această bibliotecă.
CREATE TABLE autori(
id_autor INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
nume VARCHAR(200)
);
Aşadar, avem o instrucţiune de creare a unei tabele din baza de date, este vorba de o tabelă
simplă cu doar 2 câmpuri ce conţine numele autorilor cărţilor. Primul câmp, id_autor, conţine
valori care identifică în mod unic o înregistrare, deci acest câmp este utilizat drept cheie primară
a tabelei.

În descrierea definiţiei acestui câmp se aplică modificatorii pentru cheie primară, valori nenule şi
incrementare automată.

Al doilea câmp, nume, conţine un şir de caractere de lungime maximă 200 de caractere ce va
stoca numele şi prenumele fiecărui autor.

Instrucţiunea prin care se aplică restricţia de cheie externă este următoarea:


FOREIGN KEY (nume_câmp1) REFERENCES nume_tabelă(nume_câmp2)

FOREIGN KEY şi REFERENCES sunt cuvinte cheie în timp ce nume_câmp1 reprezintă câmpul
din tabelă care este cheie externă în tabelă, în timp nume_câmp2 reprezintă câmpul la care
face referire, adică cheia primară din tabela nume_tabelă.

Introducem în continuare noţiunea de index. Indecşii sunt folosiţi pentru sortarea logică a
datelor în vederea îmbunătăţirii vitezei operaţiilor de căutare şi sortare.
Indecşii dintr-o bază de date funcţionează în maniera următoare: datele din cheile primare sunt
întotdeauna sortate; este o operaţie pe care programul SGBD o execută. Deci, regăsirea
anumitor rânduri în funcţie de cheia primară este întotdeauna o operaţie rapidă şi eficientă.

Un index se poate definii pe una sau mai multe coloane. Indecşii îmbunătăţesc performanţele
operaţiilor de regăsire dar le degradează pe acelea ale operaţiilor de inserare, modificare şi
ştergere a datelor. Când sunt executate aceste operaţii, programul SGBD trebuie să actualizeze
indexul în mod dinamic. Datele din index pot ocupa o cantitate mare de spaţiu de stocare.

Atunci când se defineşte un index se creează un fişier de index, iar în momentul în care este
executată o instrucţiune de interogare pe câmpul indexat, se face practic o căutare în fişierul de
index, din acest motiv avem o viteză foarte mare de execuţie. Vom reveni, într-un capitol
separat care este special dedicat conceptului de indexare, pentru a discuta pe larg despre
conceptul de indexare și despre tipurile de indecși ce pot fi definiți pe coloanele din tabelele
bazelor de date.

Următoarea comandă modifică numele tabelei autori în autori_noi:


ALTER TABLE autori RENAME TO autori_noi;
Aceeaşi comandă poate fi scrisă şi în felul următor:
RENAME TABLE autori TO autori_noi;
Comanda de mai jos modifică lungimea maximă a câmpului nume:
ALTER TABLE autori CHANGE nume nume VARCHAR(70);
Iată şi o comandă care adaugă un nou câmp în această tabelă, câmpul prenume:
ALTER TABLE autori ADD prenume VARCHAR(100);
De asemenea, prezentă şi instrucţiunea pentru ştergerea unui cîmp:
ALTER TABLE autori DROP prenume;
Prezentăm în continuare alte exemple de utilizare a instrucţiunilor din limbajul de desciere a
datelor. Astfel, vom realiza o instrucţiune de creare a unei baze de date, apoi vom crea 2 tabele
în această bază de date şi vom aplica diverse constrângeri.

Presupunem crearea unei baze de date în care se păstrează informaţii despre angajaţii şi
departamentele unei companii. Aşadar, vom avea o bază de date pe care o vom denumi
companie şi în această bază de date vom crea două tabele pentru evidenţa departamentelor,
respectiv a angajaţilor.

Instrucţiunea pentru crearea bazei de date companie:


CREATE DATABASE companie;

Instrucţiunea pentru crearea tabelei departamente:


CREATE TABLE departamente(
id_departament INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
denumire VARCHAR(100),
manager VARCHAR (100)
);
Instrucţiunea pentru crearea tabelei angajati:
CREATE TABLE angajati(
id_angajat INT (6) NOT NULL AUTO_INCREMENT PRIMARY KEY,
nume VARCHAR (100),
prenume VARCHAR (100),
cnp VARCHAR (13),
data_nasterii DATE,
data_angajarii DATE,
id_departament INT (4),
FOREIGN KEY(id_departament) REFERENCES departamente(id_departament)
);

Observăm în definiţia de creare a tabelei angajati aplicarea unei constrângeri de tip FOREIGN
KEY pe câmpul id_departament cu referire la câmpul id_departament din tabela departamente,
câmp care este cheie primară în această tabelă.

Aşa cum am precizat anterior, o cheie externă poate fi definită în instrucţiunea de creare a unei
tabele, după ce au fost enumerate toate coloanele tabelei sau poate fi creată prin instrucţiuni de
modificare a structurii unei tabele din baza de date.

Pentru a prezenta şi cea de-a doua modalitate, mai întâi vom elimina (şterge) constrângerea de
cheie externă aplicată câmpului id_departament din tabela angajati.

Instrucţiunea pentru eliminarea unei constrângeri de tip FOREIGN KEY este următoarea:
ALTER TABLE angajati DROP FOREIGN KEY nume_cheie;

Fiecare FOREIGN KEY primeşte automat un nume dacă noi nu am asociat un nume în
definirea constrângerii. Pentru a defini un nume unei chei externe, în faţa instrucţiunii de creare
şi referire trebuie să mai avem cuvântul cheie CONSTRAINT urmat de numele dat cheii
externe. De exemplu, în cazul nostru, vom denumi cheia externă fk_deptAng. Deci am fi avut
următoarea instrucţiune:
CONSTRAINT fk_deptAng FOREIGN KEY(id_departament) REFERENCES departamente(id_departament)

Aşadar, instrucţiunea de ştergere a cheii externe, în cazul nostru concret, va fi:


ALTER TABLE angajati DROP FOREIGN KEY fk_deptAng;

În continuare, vom crea din nou, constrângerea de tip FOREIGN KEY pentru tabela angajati:
ALTER TABLE angajati ADD CONSTRAINT fk_deptAng FOREIGN
KEY(id_departament) REFERENCES departamente(id_departament);

De asemenea, avem şi forma în care nu atribuim un nume constrângerii, iar, în acest


caz, SGBD-ul va atribui un nume automat pentru constrângere:
ALTER TABLE angajati ADD FOREIGN
KEY(id_departament) REFERENCES departamente(id_departament);

Important de precizat este faptul că, dacă tabela departamente nu ar fi fost creată înaintea
tabelei angajati ar fi aparut o problemă de integritate a datelor în momentul în care încercam să
creăm o constrângere de tip cheie externă care ar fi făcut referire la un câmp dintr-o tabelă care
nu exista.

În continuare prezentăm alte câteva exemple de instrucţiuni de modificare a structurii unei


tabele din baza de date. De exemplu, eliminarea cheii primare din tabela departamente se face
cu instrucţiunea:
ALTER TABLE departamente DROP PRIMARY KEY;
Adăugarea unei chei primare la o tabelă deja creată se poate face cu instrucţiunea:
ALTER TABLE departamente ADD PRIMARY KEY (id_departament);
Schimbarea dimensiunii unui câmp dintr-o tabelă se face cu instrucţiunea:
ALTER TABLE angajati CHANGE prenume prenume VARCHAR(150);
Ştergerea unui câmp dintr-o tabelă se poate face cu următoarea instrucţiune:
ALTER TABLE departamente DROP manager;
Adăugarea unui câmp într-o tabelă se poate face cu următoarea instrucţiune:
ALTER TABLE departamente ADD manager VARCHAR(150) NOT NULL;
De asemenea, observăm în instrucţiunea anterioară şi stabilirea unei constrângeri de tip NOT
NULL pentru câmpul adăugat în tabelă.
Redenumirea unui câmp dintr-o tabelă se face astfel:
ALTER TABLE angajati CHANGE data_angajarii data_ang DATE;

Adăugarea unei constrângeri pe un câmp deja existent se face cu instrucţiunea:


ALTER TABLE angajati CHANGE cnp cnp VARCHAR(13) NOT NULL;

LMD

Limbajul de manipulare a datelor conţine comenzile de actualizare a datelor în interiorul


tabelelor dintr-o bază de date, precum şi comanda de regăsire a datelor. Aceste patru comenzi
de manipulare sunt cele mai folosite deoarece ele permit interacțiunea cu datele stocate efectiv
într-o bază de date.
Cele trei comenzi de actualizare a datelor dintr-o tabelă sunt: INSERT, UPDATE şi DELETE.

Iată în continuare prezentată sintaxa MySQL a acestor comenzi:


Comanda pentru inserarea (adăugarea/introducerea) datelor într-o tabelă a bazei de date
este INSERT şi are următoarea sintaxă:
INSERT INTO nume_tabelă (câmp1, câmp2, ..., câmpn) VALUES (valoare1, valoare2, ..., valoaren);

Instrucţiunea INSERT mai are şi alte forme în care poate fi utilizată. Una dintre ele este aceea
în care se vor insera valori în toate coloanele unei tabele și are sintaxa:
INSERT INTO nume_tabelă VALUES (valoare1, valoare2, ..., valoaren);

Următoarea formă a instrucţiunii de introducere date va insera valorile default (implicite) în toate
câmpurile. Această formă este foarte puțin folosită.
INSERT INTO nume_tabelă VALUES ();

Prezentăm și forma în care se inserează valori doar în anumite coloane specificate:


INSERT INTO nume_tabelă (câmp1, câmp3) VALUES (valoare1, valoare3);

Urmează o formă diferită de celelalte a comenzii INSERT, asemănătoare, vom vedea cu sintaxa
comenzii de actualizare UPDATE:
INSERT INTO nume_tabelă SET nume_câmp1 = valoare1, ..., nume_câmpn = valoaren;

Ultima formă permite inserearea mai multor înregistrări printr-o singură instrucţiune INSERT:
INSERT INTO nume_tabelă (câmp1, câmp2, ..., câmpn) VALUES (valoare11, valoare12, ..., valoare1n),
(valoare21, valoare22, ..., valoare2n), ..., (valoaren1, valoaren2, ..., valoarenn) ;

Comanda pentru actualizarea sau modificarea unei înregistrări este UPDATE.


Sintaxa comenzii de actualizare a datelor este următoarea:
UPDATE nume_tabelă SET nume_câmp1 = valoare1 [, ..., nume_câmpn = valoaren]
[WHERE condiții]
[ORDER BY coloane]
[LIMIT număr_rânduri];
Dacă lipseşte clauza WHERE înseamnă că se vor actualiza toate înregistrările din tabelă.

Comanda pentru ştergerea datelor dintr-o tabelă este DELETE.


Sintaxa comenzii de ştergere a datelor este următoarea:
DELETE FROM nume_tabelă
[WHERE condiții]
[ORDER BY coloane]
[LIMIT număr_rânduri];
Dacă lipseşte clauza WHERE se vor şterge toate înregistrările din tabelă.

Comanda de regăsire a datelor este SELECT. Aceasta este cea mai utilizată comandă a
limbajului SQL. Dacă pentru alte operații efectuate asupra bazei de date, nu toți utilizatorii
primesc drepturi (privilegii), pentru comanda de regăsire se dă acest privilegiu, deoarece ea nu
afectează datele stocate în tabele, ci doar le afișează potrivit condiționărilor impuse.
Sintaxa comenzii SELECT este următoarea:
SELECT [DISTINCT] câmp1, câmp2,...,câmpn [FROM nume_tabelă]
[WHERE condiţii]
[GROUP BY câmp1 [,câmp2 …]]
[HAVING condiţii]
[ORDER BY câmp1 [ASC | DESC] [,câmp2 [ASC | DESC], …] ]
[LIMIT nr_rânduri];

Aşadar, acestea sunt cele 4 instrucţiuni ce compun limbajul de manipulare a datelor. Ele au o
sintaxă relativ simplă şi uşor de înţeles. În continuare vom explica fiecare comandă în parte şi
vom prezenta câteva exemple de utilizare practică.

Reluăm, în continuare, sintaxa instrucţiunii de adăugare înregistrări într-o tabelă a unei baze de
date. Este vorba despre instrucțiunea INSERT. De asemenea, vom prezenta, mai departe, și
câteva exemple de utilizare:
INSERT INTO nume_tabelă (câmp1, câmp2, ..., câmpn) VALUES (valoare1, valoare2, ..., valoaren);

Instrucțiunea de adăugare de informaţii în baza de date mai are și alte forme pe care le-am
menționat anterior, dintre care reluăm aici două care au o frecvență mai mare de folosire
(formele în care se inserează date în toate coloanele unei tabele și, în această situație, nu mai
trebuie menționate coloanele tabelei, dar valorile trebuie inserate în ordinea în care se regăsesc
coloanele în tabelă și varianta asemănătoare comenzii UPDATE în care se face inserarea prin
specificarea explicită a coloanei și a valorii care se inserează în acea coloană):
INSERT INTO nume_tabelă VALUES (valoare1, valoare2, ..., valoaren);
INSERT INTO nume_tabelă SET nume_câmp1 = valoare1, ..., nume_câmpn = valoaren;

De asemenea, reluăm și sintaxa comenzii INSERT care permite inserarea mai multor
înregistrări printr-o singură instrucțiune:
INSERT INTO nume_tabelă (câmp1, câmp2, ..., câmpn) VALUES (valoare11, valoare12, ..., valoare1n),
(valoare21, valoare22, ..., valoare2n), ..., (valoaren1, valoaren2, ..., valoarenn) ;
În continuare, vom prezenta câteva exemple concrete de utilizare a comenzii INSERT, pentru a
înțelege mai clar modul în care funcționează.

După ce am creat o tabelă într-o bază de date, următorul pas pe care îl facem este să populăm
tabela respectivă cu date, deci vom insera înregistrări în tabelă. Aşa cum am prezentat mai sus,
comanda INSERT este folosită pentru acastă operaţie.

Considerăm tabela angajaţi ce conţine informaţii despre angajaţii unei companii (nume,
prenume, data naşterii, data angajării, salariul).
Comanda pentru crearea acestei tabele este următoarea:
CREATE TABLE angajati(
id INT (11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
nume VARCHAR (70),
prenume VARCHAR (100),
data_nasterii DATE,
data_angajarii DATE,
salariu DOUBLE(7,2)
);

În continuare vom introduce date în această tabelă:


INSERT INTO angajati (id, nume, prenume, data_nasterii, data_angajarii, salariu)
VALUES (null, 'Popescu', 'Maria' , '1981-06-08, '2010-02-15', 2000);

Se observă că în câmpul id care este definit cu restricţia AUTO_INCREMENT nu este introdusă


nici o valoare (apare null), deoarece se va insera automat pentru coloana id un număr întreg
care creşte la fiecare înregistrare (se auto incrementează). Altfel, dacă nu ar fi definită această
proprietate de auto incrementare, în coloana care este cheie primară nu ar fi permisă
inserearea de valori nule.

În cazul în care una din înregistrări este ştearsă nu se va aloca id-ul ei unei înregistrări nou
introdusă în tabelă. În memoria internă se păstează valorea la care a ajuns incrementul.

În câmpul nume şi în câmpul prenume se introduc şiruri de caractere, în


câmpurile data_nasterii şi data_angajarii se introduc valori de tip date, iar în
câmpul salariu valori de tip double (numere cu zecimală).

Însă, nu este obligatoriu ca toate câmpurile să fie prezente în instrucţiunea INSERT de


introducere a datelor în tabelă, mai ales că nu am aplicat restricţia NOT NULL pe câmpurile
tabelei (doar cîmpul id, care este cheie primară are această restricţie, dar acest câmp se şi auto
incrementează şi atunci nu trebuie specificat în comanda INSERT).

În continuare avem un exemplu în care introducem o înregistrare doar cu numele şi prenumele


unui angajat:
INSERT INTO angajati (nume, prenume)
VALUES ('Ionescu', 'George');

Iată şi o instrucţiune care inserează mai multe înregistrări în tabelă (este omisă specificarea
coloanelor, deci, se vor insera valori în toate coloanele tabelei, în ordinea corespunzătoare):
INSERT INTO angajati
VALUES
(null, 'Cristescu', 'Ionut' , '1991-11-28, '2014-01-10', 1500),
(null, 'Georgescu', 'Elena' , '1987-01-21', '2015-02-01', 1700),
(null, 'Popescu', 'Florin' , '1986-04-16', '2014-07-01', 2000);

Această instrucţiune va introduce 3 înregistrări în tabelă. Observăm faptul că lipseşte partea


instrucţiunii în care sunt specificate câmpurile în care se introduc date. Acest lucru este posibil
deoarece sunt inserate date în toate câmpurile tabelei. Atenţie, însă, în momentul în care sunt
completate valorile care se introduc, trebuie păstrată ordinea în care avem definite câmpurile
(coloanele) în tabelă. În caz contrar, putem să avem erori la execuţia comenzii (de exemplu,
dacă încercăm să introducem un şir de caractere într-un câmp de tip int, sau o dată într-un
câmp de tip double).

Dacă execuţia instrucţiunii va genera o eroare, datele nu sunt inserate în tabelă, chiar dacă o
parte din ele sunt date care corespund tipurilor specificate. Instrucţiunea este evaluată în
întregime, dacă ea generează o eroare atunci nu se inserează nimic.

Modificarea (editarea, actualizarea) datelor stocate într-o tabelă a unei baze de date se
realizează folosind instrucţiunea UPDATE.
Sintaxa unei instrucţiuni UPDATE este următoarea:
UPDATE nume_tabelă SET nume_câmp1 = valoare1 [, ..., nume_câmpn = valoaren]
[WHERE condiții]
[ORDER BY coloane]
[LIMIT număr_rânduri];

În continuare explicăm această instrucţiune folosită pentru actualizarea/modificarea datelor


dintr-o tabelă a unei baze de date, precum şi câteva exemple concrete de utilizare.

Considerând tabela angajati pe care am utilizat-o şi la exemplul precedent, pentru actualizarea


salariului angajatului cu id-ul 2 se va folosi comanda:
UPDATE angajati SET salariu = 2000
WHERE id = 2

În cazul în care, într-o instrucţiune de actualizare (modificare), lipseşte clauza WHERE se vor
modifica informaţiile din toate înregistrările tabelei. Deci, trebuie să fim atenţi atunci când
folosim această instrucţiune de actualizare deoarece, în cele mai multe din cazuri, nu se
doreşte actualizarea tuturor înregistrărilor dintr-o tabelă.

Pot fi actualizate valorile din mai multe câmpuri printr-o singură instrucţiune UPDATE. De
asemenea, pot exista mai multe condiţii care se doresc a fi îndeplinite pentru a realiza
actualizarea (deci, clauza WHERE va avea mai multe condiţii).

În comanda de actualizare UPDATE mai pot să apară clauzele ORDER BY și LIMIT care
determină ordonarea sau sortarea (ORDERR BY) ascendentă sau descendentă a înregistrărilor
din tabelă în funcție de una sau mai multe coloane și aplicarea instrucţiunii de modificare la un
număr limitat de înregistrări care este specificat în clauza LIMIT.

Astfel, considerând că tabela angajati conţine câteva sute de înregistrări, dacă dorim
actualizarea salariului la valoarea 2500 pentru primii 10 de angajaţi în funcție de vechimea lor
vom folosi în instrucţiunea UPDATE clauza ORDER BY pentru ordonare ascendentă după data
angajării și clauza LIMIT, după cum urmează:
UPDATE angajati SET salariu = 2500
ORDER BY data_angajarii
LIMIT 10;

Observăm că în instrucţiunea UPDATE nu mai există clauza WHERE, dar, totuşi actualizarea
nu se face pentru toate înregistrările tabelei, ci doar pentru primele 10 întrucât s-a specificat
această limită prin clauza LIMIT. Recomandarea este, însă, ca în majoritatea situațiilor să
utilizăm clauza WHERE într-o instrucțiune de actualizare, altfel, există riscul de a modifica
valorile din toată tabela.

Așadar, cu toate că avem şi această variantă de limitare la un anumit număr de înregistrări,


totuşi cea mai folosită formă a instrucţiunii UPDATE, este cea care conţine una sau mai multe
condiţii care trebuie să fie îndeplinite pentru a realiza actualizarea datelor. În acest mod vom şti
cu certitudine că nu au fost actualizate înregistrări care nu îndeplinesc condiţiile dorite pentru a
se realiza modificarea.

Instrucţiunea folosită pentru ştergerea înregistrărilor din baza de date este DELETE.
Sintaxa instrucţiunii de ştergere a înregistrărilor dintr-o tabelă este următoarea:
DELETE FROM nume_tabelă
[WHERE condiții]
[ORDER BY coloane]
[LIMIT număr_rânduri];

Iată un exemplu de folosire a acestei comenzi, considerăm că avem aceeaşi tabelă pe care am
utilizat-o mai înainte, angajati, ştergerea înregstrării cu id-ul 3 se face prin următoarea
comandă:
DELETE FROM angajati
WHERE id = 3;

La fel ca în cazul instrucţiunii UPDATE şi, într-o instrucţiunea DELETE, dacă lipseşte
clauza WHERE, care stabileşte condiţia ce trebuie să fie îndeplinită pentru a se executa
ştergerea înregistrărilor, se vor şterge toate înregistrările din tabelă. Deci, trebuie folosită cu
atenţie această instrucţiune, astfel încât să fim siguri că am stabilit condiţiile necesare a fi
îndeplinite pentru a şterge anumite înregistrări.

În general, se evită folosirea instrucţiunii de ştergere din tabelele unei baze de date a unei
aplicaţii aflată în utilizare. Comanda DELETE va fi utilizată atunci când ştim sigur că datele
respective nu ne mai sunt necesare în baza de date.
În concluzie, acestea sunt cele 3 instrucţiuni folosite pentru actualizarea datelor din tabelele
unei baze de date. Sunt instrucţiuni cu sintaxă destul de simplă şi cu o logică uşor de înţeles.
Dacă instrucţiunea INSERT are mai multe forme, în schimb,
instrucţiunile UPDATE şi DELETE au o singură formă asemănătoare şi uşor de înţeles şi de
utilizat.

Atenție, nu există o comandă care să anuleze rezultatul generat de executarea


instrucțiunilor INSERT, UPDATE și DELETE. Astfel, mai ales, în cazul
comenzilor UPDATE și DELETE trebuie să avem foarte mare grijă cum le utilizăm deoarece
putem altera baza de date. Deci, neexistând o operație de anulare (undo), singura variantă
pentru a reface baza de date dacă s-a executat greșit o comandă de actualizare sau de
ștergere este să se restaureze o copie de siguranță (cea mai recentă), dacă există o astfel de
copie de siguranță (backup) a bazei de date.

Comanda care se foloseşte pentru a şterge toate datele dintr-o tabelă este următoarea:
TRUNCATE TABLE nume_tabelă;

Această comandă, pe lângă ștergerea tuturor înregistrărilor din tabelă, va reseta şi valorile din
câmpul unei tabele care se incrementează automat. Astfel, în momentul în care se vor adăuga
din nou informații, câmpul care are definită proprietatea de auto incrementare va începe să ia
valori de la 1. Această instrucțiune poate fi utilă pentru curățarea datelor de test introduse într-o
tabelă, înainte de a porni aplicația cu date reale în tabelele bazei de date.

Deși nu face parte dintre instrucțiunile de manipulare, ea fiind instrucțiuni de descriere sau de
definire, deci face parte din LDD, se potrivește prezentarea ei, mult mai bine, în acest context,
alături de instrucțiunea de manipulare DELETE, tocmai pentru a sesiza diferența dintre cele
două – DELETE șterge înregistrările dar nu modifică alte valori care există definite pe anumite
coloane din tabele în urma aplicării unor constrângeri sau modificatori, în timp
ce TRUNCATE, pe lângă ștergere, va reseta și toate aceste valori.

Înapoi

Mai departe

 Cea de-a patra comandă care aparţine limbajului de manipulare a datelor este comanda
de regăsire a datelor din tabelele unei baze de date. Aceasta este
comanda SELECT care realizează o selecţie (regăsire) a datelor care îndeplinesc
anumite condiţii.

 Sintaxa acestei comenzi a fost prezentată în prima parte a lecţiei, dar o vom relua şi aici,
urmând ca apoi să explicăm fiecare clauză care poate să apară într-o astfel de
instrucţiune de interogare a tabelelor dintr-o bază de date.
 Aşadar, reluăm sintaxa instrucţiunii de regăsire a datelor, care a fost prezentată și în
prima parte a lecției:
 SELECT [DISTINCT] câmp1, câmp2,...,câmpn [FROM nume_tabelă]
 [WHERE condiţii]
 [GROUP BY câmp1 [,câmp2 …]]
 [HAVING condiţii]
 [ORDER BY câmp1 [ASC | DESC] [,câmp2 [ASC | DESC], …] ]
 [LIMIT nr_rânduri];

 După cum se observă din prezentarea completă a sintaxei, instrucţiunea SELECT are
mai multe clauze pe care le vom explica în continuare. Ordinea în care apar clauzele
este cea specificată în sintaxă, inversarea anumitor clauze va duce la apariția erorilor de
sintaxă. Pot să lipsească din clauze, întrucât mare parte sunt opționale, dar atunci când
apar în instrucțiune o parte dintre ele sau chiar toate, ele trebuie specificate, obligatoriu,
în această ordine.

 Clauzele care sunt plasate între paranteze drepte „[]” sunt opționale, pot sa lipsească
din instrucțiunea SELECT. Dacă aceste clauze sunt folosite ele sunt scrise fără
paranteze drepte. Deci, parantezele sunt folosite doar în prezentarea sintaxei
instrucțiunii cu înțelesul că acele clauze sunt opționale.

 Pentru a utiliza comanda de regăsire a datelor, SELECT, trebuie să precizăm cel puţin
două informaţii: ce anume dorim să selectăm şi locaţia de unde dorim să selectăm. Deci,
imediat după cuvântul cheie SELECT urmează enumerarea câmpurilor (coloanelor) din
tabela din care dorim să le extragem.

 Pentru extragerea datelor din toate câmpurile unei tabele se foloseşte caracterul asterisc
„*” care reprezintă selectarea tuturor coloanelor dintr-o tabelă.

 Instrucţiunea următoare va extrage şi va afişa toate înregistrările din tabela angajati:
 SELECT * FROM angajati;

 Continuăm cu o instrucţiune în care este selectat un singur câmp (doar numele
angajaţilor) dintr-o tabelă:
 SELECT nume FROM angajati;

 Specificarea mai multor coloane ale unei tabele într-o instrucţiune SELECT se face prin
separarea câmpurilor (coloanelor) tabelelor prin virgulă. Pentru a selecta numele,
prenumele şi salariul angajaţilor stocate în tabela angajati se va utiliza următoarea
instrucţiune SELECT:
 SELECT nume, prenume, salariu FROM angajati;

În continuare vom descrie clauza WHERE a instrucţiunii SELECT. Este o clauză opţională, dar
este foarte des folosită şi foarte importantă. În cazul în care lipseşte clauza WHERE dintr-o
interogare, atunci se vor afişa toate înregistrările din coloanele specificate în
instrucţiunea SELECT din tabela respectivă.

În cele mai multe situaţii însă nu avem nevoie de extragerea tuturor înregistrărilor din tabelă, ci
doar de acele înregistrări care îndeplinesc anumite condiţii. Aceste condiţii sunt specificate în
clauza WHERE în cadrul instrucţiunii de regăsire a datelor. După clauza WHERE, într-o
interogare sunt specficate diverse condiții ce se cer îndeplinite pentru a extrage anumite date.

În interiorul clauzei WHERE putem folosi următorii operatori:


· = este operatorul de egalitate, poate fi egalitate între două coloane sau între
valoarea dintr-o coloană şi o valoare specificată;
· != sau < > este operatorul diferit de, deci verifică dacă două coloane sunt
diferite sau o valoarea dintr-o coloană este diferită de o anumită valoare
specificată;
· < este operatorul mai mic, acest operator compară dacă valoarea dintr-o
coloană este strict mai mică decât o valoare din altă coloană sau decât o valoare
specificată;
· <= este operatorul mai mic sau egal, acest operator compară dacă valoarea
dintr-o coloană este mai mică sau egală cu o valoare din altă coloană sau cu o
valoare specificată;
· > este operatorul mai mare, acest operator compară dacă valoarea dintr-o
coloană este strict mai mare decât o valoare din altă coloană sau decât o valoare
specificată;
· >= este operatorul mai mare sau egal, acest operator compară dacă valoarea
dintr-o coloană este mai mare au egală cu o valoare din altă coloană sau cu o
valoare specificată;
· BETWEEN – compară dacă valoarea dintr-o coloană se află în intervalul
specificat în operatorul BETWEEN, practic, verifică dacă acea valoare din
coloană se află între valorile specificate în BETWEEN; forma în care se foloseşte
este BETWEEN valoare_minimă AND valoare_maximă;
· IN – acest operator testează dacă operandul se regăseşte printre lista de valori
care este specificată între paranteze; acest operator este folosit în forma
următoare: IN(valoare1, valoare2,...,valoaren); valorile testate cu
operatorul IN pot fi obţinute şi printr-o instrucţiune SELECT, deci poate fi folosit
în subinterogări;
· IS NULL – verifică dacă valoarea dintr-o coloană a tabelei este NULL;
· IS NOT NULL – verifică dacă valoarea dintr-o coloană a tabelei nu este NULL;

De asemenea, atunci când punem condiţii pe anumite câmpuri (coloane) ce conţin date de tip
şir de caractere, mai apare un operator, LIKE.
Acest operator este folosit pentru a verifica dacă valoarea de tip şir de caractere dintr-o coloană
corpespunde cu un şir de caractere specificat sau, putem folosi aici şi caractere de înlocuire.
Astfel avem caracterul de înlocuire „%” care are semnificaţia că găseşte orice caracter,
indiferent de câte ori apare.

De exemplu pentru a găsi toţi angajaţii al căror nume începe cu litera A se poate scrie
următoarea instrucțiune SELECT:
SELECT * FROM angajati WHERE nume LIKE 'A%';

Mai există un caracter de înlocuire a unui singur caracter de această dată. Este vorba de
caracterul „_”. Este mai rar folosit şi acest caracter înlocuieşte un singur caracter, nici mai mult,
nici mai puţin. În schimb caracterul de înlocuire „%” poate să substituie un caracter, nici un
caracter (zero caractere) sau oricât de multe caractere.

În continuare vom prezenta şi alţi operatori folosiţi în clauze WHERE mai complexe în care
punem mai multe condiţii, deci combinăm mai multe condiţii simple. Astfel, intervin operatorii
logici:
· AND (&&) – operatorul „şi” logic, va returna adevărat (1) dacă toţi operanzii sunt
adevăraţi, respectiv fals (0) dacă cel puţin unul dintre operanzii este fals;
· OR (||) – operatorul „sau” logic, va returna adevărat (1) dacă cel puţin unul
dintre operanzi este adevărat, respectiv fals (0) dacă toţi operanzii sunt falşi;
· NOT (!) – operatorul de negare, va returna adevărat (1) dacă expresia negată
este falsă, respectiv fals (0) dacă expresia negată este adevărată;
· XOR – operatorul „sau exclusiv” logic, dacă este folosit pentru compararea a
doi operanzi va returna adevărat (1) dacă unul şi numai unul din aceşti operanzi este adevărat
iar celălalt fals, dacă ambii operatori sunt la fel rezultatul returnat va fi fals (0); dacă avem mai
mulţi operanzi rezultatul returnat va fi adevărat (1) dacă avem un număr impar de operanzi a
căror valoare de adevăr este adevărat (1); în caz contrar rezultatul returnat va fi fals (0).
Clauza GROUP BY se foloseşte pentru a grupa datele din una sau mai multe coloane pe baza
unor criterii. Scopul grupării datelor este calcularea de valori statistice pentru fiecare grup în
parte. În acest caz rezultatul cererii va conţine câte o linie pentru fiecare grup identificat.

În cazul în care în clauza GROUP BY apar mai multe coloane, un grup va fi construit din toate
înregistrările care au valori comune pe toate coloanele specificate.

Datele dintr-o tabelă pot fi grupate în funcţie de valorile dintr-o anumită coloană. Astfel, toate
valorile egale dintr-o anumită coloană vor forma un grup. Prelucrările datelor din cadrul unui
grup se pot face cu ajutorul funcţiilor agregate (funcţii de grup), acestea acţionând asupra
datelor din fiecare grup.

Gruparea efectivă se realizează cu clauza GROUP BY, aplicată comenzii SELECT. În cazul în
care dorim filtrarea interogării rezultate în urma unei grupări, nu se mai foloseşte
clauza WHERE, ci există o nouă clauză, HAVING.

Datele din tabela rezultată în urma grupării după o anumită coloană, vor fi sortate după coloana
care realizează gruparea.
Într-o instrucţiune SELECT putem avea:
 nume de câmpuri (sau expresii în funcţie de acestea): în acest caz se va folosi valoarea
primei linii din fiecare grup;
 funcţii agregate: acestea vor acţiona asupra tuturor valorilor coloanei din grup asupra
cărora sunt aplicate;

În exemplul următor, dacă vrem să obţinem numărul de angajaţi din fiecare departament
(considerând că avem coloanele id_dept ce indică codul unui departament în care lucrează
fiecare angajat și id_angajat ce păstrează codul fiecărui angajat) vom executa următoarea
instrucţiune SELECT:
SELECT id_dept, COUNT(id_angajat) FROM angajati GROUP BY id_dept;

În acest exemplu am folosit şi funcţia COUNT() care numără toate înregistrările nenule din
coloana id_dept, coloană ce conţine id-ul fiecărui departament din baza de date.

 Înapoi
 Mai departe

Dacă într-o instrucţiune SELECT folosim funcţii de agregare şi avem nevoie să punem condiţii
pe rezultatul obţinut în urma utilizării acestor funcţii, atunci vom folosi clauza HAVING. Mai
simplu de reţinut, clauza HAVING se foloseşte atunci când avem în instrucțiunea de
regăsire SELECT funcţii de grup.

Deci, așa cum clauza GROUP BY se utilizează atunci când este folosită o funcție de grup
pentru a afișa rezultatul calculat (total, medie, minim, etc.) grupat în funcție de una sau mai
multe coloane (în general, coloanele asupra cărora nu s-a aplicat o funcție de de grup și care au
fost extrase în comanda SELECT), pentru impunerea de condiții asupra rezultatului returnat de
o astfel de funcție este utilizată clauza HAVING.
Principalele funcţii de grup sau funcții de agregare care se întâlnesc în limbajul SQL sunt
următoarele:
· COUNT() – funcţie de numărare;
· SUM() – funcţie care returnează suma valorilor din coloana trecută ca argument;
· MIN() – funcţie care returnează valoarea minimă din coloana trecută ca argument;
· MAX() – funcţie care returnează valoarea maximă din coloana trecută ca argument;
· AVG() – funcţie care returnează media aritmetică a valorilor din coloana primită ca
argument.

Funcţia COUNT() are mai multe forme:


· COUNT(*) – întoarce numărul total de înregistrări din tabelă;
· COUNT(expr) – întoarce numărul de valori nenule pentru expresia primită ca argument;
· COUNT(DISTINCT expr) – întoarce numărul de valori distincte pentru expresia primită ca
argument.

Funcţia SUM() întoarce suma valorilor unor expresii care sunt primite ca argument de către
funcţie. Valorile nule nu sunt luate în considerare la calculul sumei. Dacă grupul pentru care se
calculează suma este vid atunci rezultatul funcţiei SUM() va fi NULL.

Funcţia AVG() întoarce media aritmetică a valorilor din expresia primită ca argument şi poate
primi ca argument o coloană a unei tabele sau o expresie.

Funcţia MIN() întoarce valoarea minimă dintr-o expresie primită ca argument.

Funcţia MAX() întoarce valoarea maximă dintr-o expresie primită ca argument.

Funcţiie de grup MIN() şi MAX() se pot aplica atât expresiilor numerice, cât şi şirurilor de
caractere. În cazul în care se aplică şirurilor de caractere se va folosi ordinea lexicografică
pentru determinarea valorii minime, respectiv valorii maxime din expresie.

Dacă instrucţiunea SELECT, în care au fost utilizate funcţii de agregare, nu conţine


clauza GROUP BY, atunci valoarea funcţiilor de agregare va fi calculată pentru întreaga tabelă
specificată în clauza FROM a instrucţiunii de interogare a bazei de date.

Pentru exemplul anterior, dacă vrem doar afişarea departamentelor cu cel puţin 2 angajaţi,
instrucţiunea SELECT precedentă se transformă astfel (apare în cadrul instrucțiunii și
clauza HAVING după clauza GROUP BY):
SELECT id_dept, COUNT(id_angajat) FROM angajati
GROUP BY id_dept
HAVING COUNT(id_angajat) >= 2;

 Înapoi
 Mai departe
 De asemenea, un câmp, o expresie sau o tabelă poate primi un alias.
Un alias reprezintă o denumire prin care acea expresie poate fi utilizată în cadrul
interogării. De exemplu, în instrucţiunea SELECT de mai sus,
expresia COUNT(id_angajat) poate primi un alias, adică îi putem asocia un nume pe
care să-l folosim mai departe în comanda de regăsire a datelor.

 Pentru a defini un alias unei expresii se foloseşte cuvântul cheie AS urmat de numele
asociat acelei expresii, în cazul nostru putem asocia alias-
ul număr_angajati expresiei COUNT(id_angajat).

 Prin urmare, instrucţiunea SELECT precedentă poate fi rescrisă astfel:
 SELECT id_dept, COUNT(id_angajat) AS nr_angajati FROM angajati
 GROUP BY id_dept
 HAVING COUNT(id_angajat) >= 2;

 Astfel, este mult mai clar de înțeles ce returnează funcția. În plus, rezultatul acestei
interogări, care este o tabelă, va avea ca antet (cap de tabel) sau câmpuri ale tabelei
rezultat coloanele id_dept şi nr_angajati. Dacă nu asociem un alias expresiei de
numărare, coloanele rezultate ar fi id_dept şi COUNT(id_angajat)

Rezultatele obţinute în urma unei instrucţiuni SELECT pot fi ordonate în funcţie de anumite
câmpuri. Ordonarea acestor rezultate poate fi crescătoare sau descrescătoare. În cazul în care
câmpurile folosite pentru ordonare sunt de tip şir de caractere, atunci ordonarea este alfabetică
sau în ordine inversă a alfabetului.

Clauza utilizată pentru ordonarea datelor rezultate în urma unei selecţii este ORDER BY, după
această clauză se specifică numele câmpului după care se face ordonarea şi tipul de sortare
(crescător sau descrescător). Pentru sortare în ordine crescătoare avem cuvâtnul cheie ASC,
iar pentru sortare descrescătoare avem cuvântul cheie DESC.

De asemenea, se poate face sortare după mai multe câmpuri. În cazul în care, în
clauza ORDER BY, sunt specificate mai multe câmpuri sortarea se realizează astfel: se
sortează datele după valorile din primul câmp, iar în cazul în care în acest câmp avem valori
egale (identice) se trece la sortare după următorul câmp specificat în clauza ORDER BY, şi aşa
mai departe pentru toate câmpurile din clauză. De asemenea, sortarea se poate face crescător
după anumite câmpuri şi descrescător după alte câmpuri.
Sortarea implicită a unei interogări este crescătoare, deci, dacă dorim o sortare crescătoare nu
este necesar să mai specificăm cuvântul cheie ASC după numele coloanei stabilită drept
criteriu de sortare.

Dacă vrem să selectăm toţi angajaţii din baza de date sortaţi după nume şi prenume vom
realiza următoarea interogare:
SELECT * FROM angajati
ORDER BY nume, prenume;

După cum se observă lipseşte specificarea ordinii de sortare, deci, implicit, se consideră sortare
în ordine crescătoare. Interogarea următoare este echivalentă cu cea anterioară, va returna
aceleaşi rezultate:
SELECT * FROM angajati
ORDER BY nume ASC, prenume ASC;

În cazul în care se doreşte o sortare descrescătoare a valorilor returnate de interogare,


specificarea ordinii de sortare este obligatorie. Avem astfel, următorul exemplu:
SELECT * FROM angajati
ORDER BY nume DESC;

Următoarea interogare realizează o ordonare combinată, descrescătoare după nume şi


crescătoare după prenume, adică angajaţii sunt sortaţi după nume în ordine inversă, iar dacă
există mai mulţi angajaţi cu acelaşi nume se va realiza o ordonare a acestora după prenume, în
ordine alfabetică:
SELECT * FROM angajati
ORDER BY nume DESC, prenume ASC;
Ultima clauză a unei instrucţiuni SELECT este LIMIT. Această clauză, dacă este folosită
limitează numărul de înregistrări returnate de interogarea SELECT. În clauza LIMIT se poate
specifica fie un singur număr, care reprezintă numărul de înregistrări pe care
instrucţiunea SELECT le va întoarce, în acest caz fiind returnate primele n înregistrări din totalul
de înregistrări returnate, unde n este numărul specificat în cadrul clauzei LIMIT, fie se pot
specifica 2 numere.

În acest caz, când se specifică două numere, primul reprezintă poziţia de la care va începe
returnarea înregistrărilor rezultate în urma interogării, iar cel de-al doilea număr reprezintă
numărul de înregistrări care vor fi returnate (cu alte cuvinte poziţia de unde începe şi câte
înregistrări vor fi returnate de interogare).

Clauza LIMIT, atunci când este utilizată, este întotdeauna ultima în cadrul unei
instrucţiuni SELECT.
Afişarea primilor 10 angajaţi din tabela în care sunt salvaţi, ordonaţi alfabetic după nume, se
realizează cu următoarea instrucţiune:
SELECT * FROM angajati
ORDER BY nume
LIMIT 10;

Sintaxa acesteia are una dintre următoarele două forme, aşa cum am precizat şi anterior:
- LIMIT n – din ceea ce s-ar afişa în mod normal, se afişează doar primele n linii
(înregistrări);
- LIMIT m,n – din ceea ce s-ar afişa în mod normal, se afişează doar începând de la
a m+1-a linie (înregistrare) un număr de n linii (înregistrări).

Important de reţinut este faptul că prima linie este numerotată cu 0. Aşadar, instrucţiunea
exemplu prezentată mai sus ar putea fi rescrisă astfel:
SELECT * FROM angajati
ORDER BY nume
LIMIT 0,10;

Din tabela angajati vor fi selectate 10 înregistrări, începând de la poziţia 0. Deci, prima
înregistrare rezultată în urma unei selecţii se află pe poziţia 0.

Dacă am fi scris următoarea instrucţiune:


SELECT * FROM angajati
ORDER BY nume
LIMIT 1,10;
rezultatul întors ar fi tot 10 înregistrări, însă nu va fi afişat primul angajat, ci vor fi afişaţi
angajaţii, începând cu al doilea în ordine alfabetică până la al 11-lea.

Dacă în tabela noastră presupunem că am avea 100 de înregistrări, afişarea ultimilor 10


angajaţi sortaţi în ordine alfabetică după nume s-ar realiza cu instrucţiunea:
SELECT * FROM angajati
ORDER BY nume
LIMIT 90,10;
Întrucât prima poziţie este 0, dacă avem 100 de linii în tabela rezultat, atunci ultima înregistrare,
cea de-a 100, se află la linia 99. Deci, forma corectă a clauzei LIMIT pentru cerinţa anterioară
este LIMIT 90,10, iar nu LIMIT 91,10. A doua variantă ar fi afişat doar 9 înregistrări, întrucât
începând cu linia 91 nu mai există 10 înregistrări ăn tabelă. Deci, atunci când numărul de
înregistrări care ar trebui afişate, specificat în clauza LIMIT este mai mare decât numrăul de
înregistrări care există în tabelă, de la poziţia (linia) dată, atunci se afişează toate înregistrările
rămase. Nu va fi generată nici o eroare din faptul că nu mai sunt în tabelă atâtea înregistrări
câte au fost specificate în clauza LIMIT pentru afişare, ci vor fi afişate atâtea câte există.

 Înapoi
 Mai departe
 Într-o tabelă, unele coloane pot conţine valori duplicate. Adică, pentru mai multe
înregistrări, pe acelaşi câmp, vom avea aceeaşi valoare. Aceasta nu este o problemă,
dar uneori vrem să extragem dintr-o tabelă doar valorile diferite (distincte) din tabelă. În
acest caz se va folosi clauza DISTINCT în cadrul unei interogări SELECT. Astfel, în
instrucţiunea SELECT mai apare un cuvânt cheie, şi anume DISTINCT, plasat imediat
după cuvântul cheie SELECT, după care trebuie specificat câmpul (sau câmpurile)
pentru care valorile returnate trebuie să fie distincte (diferite).

 Sintaxa este următoarea:
 SELECT DISTINCT nume_câmp1 [nume_câmp2, ...] FROM nume_tabelă
 [WHERE ...];

 Trebuie reţinut și că această clauză DISTINCT poate fi utilzată şi în cadrul funcţiilor de
agregare. În acest caz, cuvântul cheie DISTINCT este utilizat ca argument al funcţiei de
agregare. De exemplu, pentru a număra doar valorile distincte dintr-o coloană.

 Un exemplu în acest sens ar fi următoarea instrucţiune SELECT, care afişează
localităţile de domiciliu ale angajaţilor salvaţi în baza de date a unei companii, în
tabela angajati. Este evident faptul că, există posibilitatea ca mai mulţi angajaţi să aibă
aceeaşi localitate de domiciliu. Deci, pentru a extrage toate localităţile din care avem
angajaţi, vom folosi o instrucţiune SELECT în care vom avea specificată o
clauză DISTINCT pentru câmpul localitate:
 SELECT DISTINCT localitate FROM angajati;
 Fără utilizarea clauzei DISTINCT, interogarea ar fi returnat un număr de rezultate egal
cu numărul înregistrărilor din tabelă, iar localităţile care se regăsesc de mai multe ori în
tabelă ar fi fost afişate de fiecare dată.

 Următoarea instrucţiune va returna toate localităţile de domiciliu, la fel ca mai sus, dar va
returna şi judeţul pentru fiecare localitate în parte (în acest caz vor exista judeţe care se
repetă):
 SELECT DISTINCT localitate, judet FROM angajati;

 Iată şi un exemplu de folosire a clauzei DISTINCT ca argument într-o funcţie de
agregare. De exemplu, dacă într-o tabelă în care sunt salvate spre evidenţă facturile
unor clienţi ai unei companii, vrem să știm câţi clienţi au facturi emise de companie,
avem nevoie de folosirea acestui argument, DISTINCT, în cadrul funcţiei COUNT:
 SELECT COUNT(DISTINCT cod_client) FROM facturi;
 Observăm că absenţa clauzei DISTINCT din cadrul funcţiei COUNT ar duce la
numărarea tuturor înregistrărilor din tabela facturi unde câmpul cod_client este nenul.
Dar dacă am fi avut mai multe facturi emise aceluiaşi client, ceea ce este foarte posibil,
rezultatul obţinut ar fi fost alterat, adică nu ar fi corespuns cerinţei noastre de a afla
numărul de clienţi unici pentru care există facturi emise de către companie.

OPERATORI SI FUNCTII SQL

În această lecţie vom aborda subiectul referitor la operatori şi funcţii predefinite în MySQL. În
ceea ce priveşte operatorii, în MySQL avem trei tipuri de operatori:
- matematici;
- logici;
- de comparare;

Expresiile care apar împreună cu aceşti operatori se numesc operanzi. Operanzii pot fi coloane
ale tabelelor, valori sau expresii.

Operatori matematici
Operatorii matematici pe care îi întâlnim în MySQL sunt: +, -, *, /, %.

Astfel, „+” este operatorul pentru adunare, „–” este operatorul pentru scădere, „*” este
operatorul pentru înmulţire, „/” este operatorul pentru împărţire iar „%” este operatorul pentru
restul împărţirii a două numere (modulo). Dacă avem împărţire la 0, deci folosim operatorul „/”,
atunci rezultatul va fi NULL. Pentru împărțire, pe lângă operatorul „/” mai poate fi utilizat și
operatorul DIV. Diferența dintre operatorul „/” și operatorul DIV este următoarea: „/” va returna
un număr fracționar dacă împărțirea nu este exactă, în timp ce DIV returnează câtul împărțirii
primului operand la al doilea, deci, va returna împărțire întreagă.

Pentru obținerea restului împărțirii a două numere, pe lângă operatorul „%” mai poate fi utilizat
și operatorul MOD. Cei doi operatori funcționează în același mod, nu sunt diferențe între ei.

Operatori logici
Operatorii logici utilizaţi în MySQL sunt: AND, OR, XOR, NOT.

În MySQL operatorii logici întorc rezultatul 1 pentru adevărat, respectiv rezultatul 0 pentru fals.
O expresie evaluată din punct de vedere logic poate fi adevărată sau falsă.

Operatorul AND este operatorul „şi logic”. În MySQL pentru „şi logic”, mai avem şi
operatorul &&.

Dacă avem 2 expresii pe care le evaluăm logic, fiecare din aceste expresii poate fi adevărată
sau falsă. Iată în continuare tabla de valori cu toate variantele posibile pentru 2 expresii,
folosind operatorul AND (&&).
1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0

Cu alte cuvinte, tabla aceasta de valori a operatorului logic AND poate fi explicată astfel: dacă
prima expresie este adevărată, deci întoarce rezultatul 1, iar cea de-a doua expresie este tot
adevărată, atunci rezultatul 1 && 1 este tot 1, deci operatorul AND returnează 1 (adevărat)
dacă ambele expresii sunt adevărate.

Dacă una dintre expresii este adevărată iar cealaltă este falsă, atunci rezultatul este fals, deci
1 AND 0 = 0 şi 0 AND 1 = 0.
Evident că, dacă avem ambele expresii false, 0 AND 0 = 0.

Deci, operatorul AND (&&) va returna adevărat doar atunci când ambele expresii sunt
adevărate, în orice alt caz rezultatul este fals.

Operatorul OR este operatorul „sau logic”. Mai avem pentru „sau logic” şi operatorul „||”. În
continuare prezentăm tabla de valori cu variantele posibile pentru 2 expresii evaluate împreună
cu operatorul OR.
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0

Cu alte cuvinte, tabla aceasta de valori a operatorului logic OR poate fi explicată astfel: dacă
prima expresie este adevărată, deci întoarce rezultatul 1, iar cea de-a doua expresie este tot
adevărată, atunci rezultatul expresiei 1 || 1 este tot 1, deci operatorul OR returnează 1
(adevărat) dacă ambele expresii sunt adevărate.

Dacă una dintre expresii este adevărată iar cealaltă expresie este falsă, atunci rezultatul este
adevărat, deci 1 OR 0 = 1 şi 0 OR 1 = 1. Practic, atunci când evaluăm valoarea de adevăr a
două expresii logice între care am folosit operatorul OR rezultatul este 1 (adevărat) dacă cel
puțin una din expresii este adevărată. Așadar, este suficient să fie una singură din expresii
adevărată pentru ca rezultatul obţinut să fie adevărat.

Evident că, dacă avem ambele expresii false, 0 OR 0 = 0.


Deci, operatorul OR (||) va returna adevărat atunci când cel puţin una dintre expresii este
adevărată, iar în cazul în care ambele expresii sunt false şi rezultatul este fals.

Operatorul XOR este operatorul „sau exclusiv”. Acest operator returnează adevărat atunci
când unul dintre operanzi este adevărat iar celălalt este fals. Atunci când ambii operanzi sunt
adevăraţi sau ambii operanzi sunt falşi, rezultatul este fals. Iată în continuare tabla de valori cu
variantele posibile pentru 2 expresii evaluate folosind operatorul XOR (sau exclusiv):
1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0

Deci, tabla de valori a operatorului logic XOR (sau exclusiv) poate fi explicată astfel: atunci
când ambele expresii evaluate sunt fie adevărate, fie false, rezultatul este fals, în timp ce
rezultatul adevărat va fi returnat doar atunci când una din expresii returnează adevărat iar
cealaltă returnează fals.
Acest operator, XOR, este mai rar folosit în evaluarea valorii de adevăr a unor expresii.

Ultimul operator logic este NOT, operatorul de negaţie. În MySQL pentru negarea unei expresii
mai avem şi operatorul „!”.

Acest operator de negaţie este foarte simplu de folosit şi de înţeles. Practic, dacă avem o
expresie adevărată şi o negăm (îi aplicăm acest operator NOT) ea devine falsă, şi reciproc,
dacă o expresie este falsă şi ea este negată, atunci rezultatul expresiei va fi adevărat. Deci,
tabla de valori posibile pentru acest operator este următoarea:
NOT 1 = 0
NOT 0 = 1

 Înapoi
 Mai departe

Operatori de comparare
De asemenea, în MySQL mai avem şi operatorii de comparare. În această categorie avem
următorii operatori:
< - compară dacă o expresie este mai mică decât altă expresie;
> - compară dacă o expresie este mai mare decât altă expresie;
<= - compară dacă o expresie este mai mică sau egală decât altă expresie;
>= - compară dacă o expresie este mai mare sau egală decât altă expresie;
= - compară dacă două expresii sunt egale;
!=, < > - compară dacă două expresii sunt diferite;
LIKE - testează dacă un şir de caractere are o anumită formă: dacă este prefixat
respectiv postfixat sau nu de un anumit subşir, dacă acesta conţine un anumit subşir. Important
de reţinut este şi faptul că, în MySQL, simbolul „_” (underline) ţine loc unui singur caracter, în
timp ce simbolul „%” ţine loc oricâtor caractere. Acestea se mai numesc caractere de înlocuire.
IS NULL - testează dacă o valoare este NULL
IS NOT NULL - testează dacă o valoare nu este NULL
O menţiune importantă este aceea că atunci când se testează anumite expresii (valori, câmpuri
ale unei tabele) pentru a determina dacă valoarea lor este NULL nu putem folosi operatorii =, !
=, <, <=, >, >=.
Pentru a testa dacă o expresie este nulă se folosesc exclusiv cei doi operatori prezentaţi
anterior și anume IS NULL, respectiv IS NOT NULL.
BETWEEN - testează dacă o valoare se găseşte între 2 valori date; forma este
următoarea expresie BETWEEN valoare_minimă AND valoare_maximă; deci, BETWEEN ve
rifică dacă expresie se găseşte în intervalul închis cu capetele valoare_minimă,
respectiv, valoare_maximă;
Operatorul BETWEEN poate fi înlocuit cu operatorii >= şi <=. Forma ar fi următoarea:
expresie >= valoare_minimă AND expresie <= valoare_maximă
Astfel, deducem mai limpede, că operatorul BETWEEN ia în considerare atunci când evaluează
expresia inclusiv valorile limită ale intervalului, în acest caz denumite valore_minimă,
repsectiv, valoare_maximă.
IN(val1, ..., valn) - testează dacă o valoare aparţine unei mulţimi de valori trecută ca
argumente între parantezele operatorului IN;
NOT IN(val1, ..., valn) - testează dacă o valoare nu aparţine mulţimii de valori dată între
parantezele operatorului.

Aceşti operatori au mai fost explicaţi la lecţia anterioară la subcapitolul Operatori folosiţi în
clauza WHERE, unde puteţi găsi prezentări lămuritoare pentru fiecare operator în parte.

Operatori de evaluare
condiționată
Operatorul CASE poate returna diverse valori, în funcție de valorile unor expresii care sunt
primite ca operand.

Important de reținut este să nu confundăm operatorul de evaluare condiționată CASE cu


instrucțiunea decizională CASE pe care o vom reîntâlni în cadrul rutinelor MySQL, la lecțiile
aferente extensiei procedurale MySQL, a procedurilor stocate.

Deși sunt asemănători ca formă, operatorul CASE se va utiliza în cadrul interogărilor SQL, pe
când instrucțiunea decizională CASE este utilizată în rutine (programe) MySQL.

Operatorul de evaluare condiționată CASE are două forme pe care le prezentăm în continuare:
CASE expresie
WHEN valoare1 THEN rezultat1
WHEN valoare2 THEN rezultat2
...
WHEN valoaren THEN rezultatn
ELSE alt_rezultat
END
sau, cea de-a doua formă:
CASE
WHEN expresie1 THEN rezultat1
WHEN expresie2 THEN rezultat2
...
WHEN expresien THEN rezultatn
ELSE alt_rezultat
END

În prima formă valoarea returnată de expresie este comparată pe rând cu toate valorile din
clauzele WHEN, adică valorile valoare1, valoare2, ..., valoaren. Dacă expresie este egală cu una
din aceste valori atunci operatorul CASE va produce rezultatul corespunzător ce urmează după
clauza THEN, adică unul dintre rezultat1, rezultat2, ..., rezultatn. Dacă valoarea returnată
de expresie nu este egală cu nici una dintre valorile cu care este comparată, atunci
operatorul CASE va produce rezultatul prezent în clauza ELSE, adică alt_rezultat, iar în caz de
absență a clauzei ELSE, care nu este obligatorie atunci va returna NULL.
A doua formă verifică pe rând valoarea fiecărei expresii din clauza WHEN, adică expresie1,
expresie 2, ..., expresie n, și va returna rezultatul primei expresii care are valoarea de
adevăr TRUE (este adevărată din punct de vedere logic).

În situația în care nici una dintre expresii nu va fi evaluată ca adevărată (TRUE), atunci se va
returna rezultatul din clauza ELSE, iar în absența clauzei ELSE, care nu este obligatorie, se va
returna NULL.

Funcţii predefinite MySQL


În MySQL avem funcţii simple care prelucrează fiecare înregistrare şi pentru fiecare înregistrare
returnează un rezultat şi funcţii de agregare (de grup) care prelucrează un set de înregistrări şi
returnează un singur rezultat pentru acel set de înregistrări.

O funcţie primeşte şi parametri. Parametrii unei funcţii sunt valori pe care o funcţie le primeşte
pentru a le prelucra şi a returna un rezultat. Parametrii unei funcţii se mai numesc şi argumente.

Putem clasifica funcţiile simple în mai multe tipuri:


· matematice;
· de comparare;
· condiţionale;
· pentru şiruri de caractere;
· pentru date calendaristice.

În continuare, vom lua fiecare din aceste tipuri de funcţii şi vom prezenta câteva dintre cele mai
utilizate funcţii din fiecare tip.
Funcţiile matematice sunt folosite pentru efectuarea de operaţii matematice. Ele pot fi utlizate fie
pentru realizarea de operaţii matematice cu numele coloanelor, fie cu valori specifice.

În continuare vom prezenta câteva dintre cele mai cunoscute funcţii matematice disponibile
în MySQL. Fiecare funcţie primeşte unul sau mai mulţi parametri care sunt trecuţi între
paranteze rotunde – „()”. Aceşti parametri pot reprezenta numele unor coloane sau numere.
Astfel, avem funcţiile:
· ABS(n) – returnează modulul sau valoarea absolută a unui număr;
· CEILING(n) – returnează cea mai mică valoare întreagă mai mare ca n;
· FLOOR(n) – returnează cea mai mare valoare întreagă mai mică ca n;
· POW(a,b) – returnează rezultatul ridicării la putere, adică ab, deci primul
parametru reprezintă baza, iar cel de-al doilea exponentul;
· ROUND(n) – returnează valoarea rotunjită a numărului primit ca paramentru,
rotunjirea se face fără zecimale; dar această funcţie poate primi şi un al doilea
parametru care reprezintă numărul de zecimale la care se face rotunjirea, deci,
mai avem forma ROUND(n,d) care va returna valoarea rotunjită a
lui n cu d zecimale;
· TRUNCATE(n,d) – returnează valoarea tăiată (trunchiată) a lui n cu d zecimale;
de exemplu TRUNCATE(1.284,1) va returna 1.2;
· RAND() – returnează un număr aleatoriu între 0 şi 1; această funcţie nu are
parametri;
· SQRT(n) – returnează valoarea rădăcinii pătrate (radicalul) unui număr;
· MOD(a,b) – returnează restul împărţirii lui a la b; acelaşi rezultat se poate obţine
şi folosind operatorul „%” – modulo;
· CONV(nr,bază_inițială,bază_transformare) – returnează un șir de caractere ce
reprezintă rezultatul obținut în urma conversiei numărului nr din baza de
numerație bază_inițială în baza de numerație bază_transformare.

 Înapoi
 Mai departe

Funcţii de comparare
În continuare vom prezenta câteva funcţii de comparare:
· LEAST(val1,val2,...) – returnează cel mai mic parametru dintr-o listă de
parametri; această funcţie trebuie să aibă cel puţin 2 parametri; dacă unul din
argumente este NULL atunci rezultatul este NULL;
· GREATEST(val1,val2,...) – returnează cel mai mare parametru dintr-o listă de
parametri; similar cu funcţia LEAST() şi această funcţie trebuie să aibă cel puţin
2 parametri;
· INTERVAL(n,n1,n2,...) – această funcţie compară valoarea lui n cu setul de
valori care urmează – n1, n2, ...; este necesar ca setul de valori ce va fi
comparat cu n să fie ordonat crescător, deci n1 < n2 < n3 ... ; funcţia va returna
0 dacă n<n1, 1 dacă n<n2, deci va returna poziţia pe care este găsită prima
valoare mai mare decât primul parametru al funcţiei, considerând că primul
parametru cu care se compară această valoare se află pe poziţia 0, al doilea pe
poziţia 1; dacă n este NULL funcţia va returna -1.

Funcţii condiţionale
Continuăm prezentarea cu funcţiile condiţionale:
· IF(expresie_testată,expr1,expr2) – această funcţie primeşte trei parametri, se
verifică valoarea de adevăr a primului argument al funcţiei, expresie_testată,
dacă valoarea de adevăr este TRUE (adevărat) atunci funcţia returnează cel
de-al doilea parametru, expr1, altfel, adică valoarea de adevăr a evaluării
expresiei de testat este FALSE (fals) atunci funcţia va returna expr2.
· IFNULL(expr1,expr2) – această funcţie returnează expr1 dacă expr1 este
diferit de NULL sau va returna expr2 dacă expr1 este NULL. Valoarea returnată
de această funcţie poate fi numerică sau şir de caractere, în funcţie de contextul
în care este folosită.
· NULLIF(expr1,expr2) – această funcţie compară cele 2 expresii primite ca
parametri, dacă sunt egale funcţia va returna NULL, iar dacă cele 2 expresii sunt
diferite va returna expr1, deci va returna primul parametru primit.

Valoarea NULL
După cum am văzut în sintaxa comenzii care creează o tabelă (CREATE TABLE), după fiecare
coloană a tabelei se pot trece nişte specificatori. Ne vom ocupa aici de
specificatorii NULL respectiv NOT NULL. Primul, care este şi implicit (dacă nu-l trecem, se
asumă automat că acea coloană are valoarea NULL), se referă la faptul că în coloana
respectivă pot să apară şi valori de tip NULL.

Astfel, dacă într-o comandă INSERT este omisă o valoare pentru o anumită coloană, în acea
coloană se va trece automat valoarea NULL.

Al doilea specificator, NOT NULL, nu permite înregistrări cu valori NULL în acea coloană. În
acest caz, dacă este omisă valoarea acelei coloane, în ea se va trece automat:
- 0 dacă este de tip numeric;
- şirul vid dacă acea coloană este de tip şir de caractere;
- 0000-00-00 dacă acea coloană este de tip dată calendaristică, etc.

Valoarea NULL reprezintă, de fapt, lipsa unei valori. Foarte important este de menţionat
aspectul că nu trebuie să se facă confuzie între valoarea NULL şi 0, de exemplu pentru coloane
numerice, sau şirul vid ("") pentru coloane de tip şir de caractere. Acestea sunt valori, şi 0 şi
şirul vid sunt valori, pe când NULL specfică de fapt lipsa unei valori în acel câmp.

Funcţii pentru şiruri de


caractere
Funcţiile pentru şiruri de caractere sunt folosite atunci când se lucrează cu şiruri de caractere,
deci parametrii acestor funcţii pot fi coloane sau valori de tip şir de caractere. Astfel, prezentăm
în continuare câteva dintre aceste funcţii pentru text:
· CONCAT(s1,s2,s3,...) – va concatena (alipi) toate şirurile date ca argumente ale
funcţiei; dacă unul dintre argumente este NULL atunci rezultatul funcţiei va
fi NULL.
· CONCAT_WS(separator,s1,s2,s3,...) – va concatena (alipi) toate şirurile date
ca argumente ale funcţiei cu separatorul dat ca prim argument între ele; dacă
separatorul este NULL atunci rezultatul funcţiei va fi NULL, dar dacă unul din
celelalte argumente este NULL, atunci funcţia va returna celelate şiruri
concatenate, ignorând NULL. Atenţie, în MySQL NU există un operator de
concatenare (ca în PHP, spre exemplu). Deci, în MySQL, pentru concatenare
vom folosi una din aceste funcţii.
· CHAR_LENGTH(s) – returnează lungimea șirului s;
· LENGTH(s) - lungimea (nr. de caractere) şirului s;
· LPAD(s,lungime_finală,şir_completare) – șirul s este completat la stânga
cu șirul șir_completare până ajunge la lungimea lungime_finală;
· RPAD(s,lungime_finală,şir_completare) – șirul s este completat la dreapta
cu șirul șir_completare până ajunge la lungimea lungime_finală;
· LTRIM(s) - întoarce şirul obţinut din s prin eliminarea spaţiilor inutile din
stânga;
· RTRIM(s) - întoarce şirul obţinut din s prin eliminarea spaţiilor inutile din
dreapta;
· TRIM(s) - întoarce şirul obţinut din s prin eliminarea spaţiilor inutile atât din
dreapta cât şi din stânga;
· SUBSTR(s,pos,nr_caractere) – întoarce din șirul s, un subșir începând de
la poziția pos, subșir de lungime nr_caractere; dacă lipsește al treilea
parametru care reprezintă câte caractere vor fi extrase în subșir, atunci
subșirul va extrage toate caracterele începând de la poziția pos până la
final; și funcția SUBSTRING este similară funcției SUBSTR;
· LEFT(s,nr_caractere) – întoarce primele nr_caractere din șirul s;
· RIGHT(s,nr_caractere) – întoarce ultimele nr_caractere din șirul s;
· LOCATE(s1,s) – returnează poziția primei apariții a subșirului s1 în șirul s,
respectiv, 0 dacă s1 nu se găsește în șirul s;
· LOCATE(s1,s,pos) – returnează poziția primei apariții a subșirului s1 în
șirul s, începând de la poziția pos; returnează 0 dacă s1 nu se găsește în
șirul s;
· UPPER(s) - întoarce şirul obţinut din s prin convertirea tuturor literelor mici
la litere mari;
· LOWER(s) - întoarce şirul obţinut din s prin convertirea tuturor literelor
mari la litere mici;
· REPLACE(s,de_înlocuit,înlocuitor) – înlocuiește în șirul s toate aparițiile
subșirului de_înlocuit cu șirul înlocuitor;

Funcţii pentru date


calendaristice
O altă categorie de funcţii MySQL este cea a funcţiilor pentru date calendaristice. Trebuie să ne
amintim că singurul format de dată acceptat de MySQL este an-lună-zi (AAAA-LL-ZZ), sau, mai
cunoscut acest format după denumirea în limba engleză year-month-day, sau prescurtarea
YYYY-MM-DD. Formatul în care se păstrează ora în baza de date este oră-minut-secundă (HH-
MM-SS), format mult mai cunoscut după denumirea în limba engleză hour-minute-second sau
după prescurtarea HH-MM-SS. Formatul în care se stochează atât data cât şi ora este year-
month-day hour-minute-second (AAAA-LL-ZZ HH-MM-SS sau YYYY-MM-DD HH-MM-SS).

Astfel avem următoarele funcţii în această categorie:


· CURDATE() – returnează data curentă;
· CURRENT_DATE() - returnează data curentă;
· CURTIME() – returnează ora curentă;
· CURRENT_TIME() – returnează ora curentă;
· CURRENT_TIMESTAMP() – returnează data şi ora curentă;
· NOW() – returnează data şi ora curentă;
· YEAR(data) – returnează anul din data introdusă ca parametru;
· MONTH(data) – returnează valoarea numerică a lunii din data primită ca
argument (valori posibile de la 1 la 12);
· DAY(data) - returnează valoarea numerică a zilei din data primită ca argument
(valori posibile de la 1 la 31);
· DAYOFMONTH(data) - returnează valoarea numerică a zilei din data primită ca
argument (valori posibile de la 1 la 31);
· HOUR(time) – returnează ora din valoarea parametrului funcţiei (intervalul de
valori este de la 0 la 23 dacă parametrul reprezintă o oră dar poate lua şi valori
mai mari dacă parametrul reprezintă un timp contorizat – număr de ore, minute şi
secunde contorizate);
· MINUTE(time) - returnează minutul din valoarea parametrului funcţiei (intervalul
de valori care poate fi returnat este de la 0 la 59);
· SECOND(time) - returnează seunda din valoarea parametrului funcţiei (intervalul
de valori care poate fi returnat este de la 0 la 59);
· DAYNAME(data) - returnează numele, în limba engleză, al zilei săptămânii din
data care este trecută ca parametru;
· MONTHNAME(data) - returnează numele, în limba engleză, al lunii din data
care este primită ca parametru;
· DAYOFWEEK(data) – returnează indexul zilei din săptămână din data primită ca
parametru (returnează 1 pentru duminică, 2 pentru luni, ..., 7 pentru sâmbătă);
· DAYOFYEAR(data) - returnează indexul zilei din anul din data primită ca
parametru (valoare posibilă returnată de la 1 la 366);
· LAST_DAY(date) – returnează ultima zi din luna datei primită ca parametru;

 Înapoi
 Mai departe

Funcţii de agregare
De asemenea, în MySQL mai avem o categorie de funcţii care operează asupra mai multor
înregistrări (linii) dintr-o tabelă a unei baze de date, calculând şi returnând o singură valoare.
Aceste funcţii poartă denumirea de funcţii agregat sau funcţii de agregare. Avem funcţii de
agregare matematice şi o funcţie agregat pentru numărare.

Funcţiile de agregare matematice sunt:


· MIN(coloană) – returnează valoarea minimă pentru un set de înregistrări din
coloana primită ca parametru;
· MAX(coloană) – returnează valoarea pentru un set de înregistrări din coloana
primită ca parametru;
· SUM(coloană) – returnează suma valorilor din coloana specificată ca
parametru;
· AVG(coloană) – returnează media aritmetică a valorilor din coloana specificată
ca parametru;
Prezentăm în continuare şi funcţia de agregare de numărare. Este vorba de funcţia:
· COUNT(coloană) – returnează numărul de înregistrări nenule din coloana
primită ca parametru pentru un set de înregistrări;
Aceste funcţii de agregare au fost prezentate pe larg, cu exemple concrete de utilizare, în cadrul
lecţiei numărul 4 la prezentarea clauzelor instrucţiunii SELECT. În instrucţiunea de regăsire a
datelor, instrucţiunea SELECT, pentru a utiliza funcţiile de agregare trebuie folosită
clauza HAVING, deci, funcţiile de agregare trebuie folosite împreună cu această
clauză HAVING.

În acest capitol au fost prezentate doar o parte dintre funcțiile predefinite ale limbajului MySQL.
Au fost selectate câteva dintre cele mai des utilizate funcții din fiecare categorie. Lista completă
a operatorilor și a tuturor funcțiilor predefinite pe care îi pune la dispoziție limbajul MySQL se
găsește în documentația oficială la adresa
următoare: http://dev.mysql.com/doc/refman/5.7/en/functions.html

De asemenea, și celelate sisteme de management al bazelor de date (Oracle, SQL Server)


oferă propriile funcții predefinite specifice fiecărui limbaj în parte, unele dintre ele identice cu
cele din MySQL, altele foarte asemănătoare cu acestea, deci, cunoscând operatorii și funcțiile
predefinite ale MySQL va fi destul de ușoară acomodarea și înțelegerea operatorilor și a
funcțiilor predefinite din alte limbaje de baze de date.

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