SQL
SQL
USE masini;
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]
);
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ă;
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 „.”.
Î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.
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.
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.
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.
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.
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.
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.
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.
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.
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)
Î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);
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.
LMD
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 ();
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 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 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.
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);
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 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.
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.
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.
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 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ţ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.
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 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.
Î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.
Î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.
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.
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.
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.
Î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.
Î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.
Î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