Sunteți pe pagina 1din 24

1.

1 Dat vs Informaie
Pentru a nelege conceptul de design al unei baze de date, mai nti trebuie s nelegem diferena dintre date i
informaii. O dat reprezint orice mesaj primit de la receptor sub o anumit form, fr a fi procesat sau
interpretat. Informaia reprezint rezultatul procesrii datelor n vederea obinerii unui mesaj nou. Procesarea
datelor poate fi simpl (clasificare, ordonare) sau complex (diverse operaii). Pentru a avea un sens, informaia are
nevoie de un context. De exemplu, o temperatur medie de 105 grade nu are nicio semnificaie dac nu i tim
contextul: este exprimat n grade Celsius sau Fahrenheit? este temperatura unei maini sau a unei persoane?
Astfel, informaia poate fi folosit ca suport pentru luarea deciziilor.
1.2 Baze de date i sisteme de gestiune a bazelor de date
O baz de date reprezint un ansamblu structurat de date ce prezint urmtoarele caracteristici: este organizat,
coerent, structurat, are o redundan minim i controlat, este accesibil mai multor utilizatori n acelai timp.
De-a lungul timpului au fost realizate mai multe tipuri de baze de date, n funcie de modelul de date
implementat (adic de modul de organizare a datelor n baza de date):

fiiere: informaiile erau memorate n fiiere text sau binare, fiecare nregistrare ocupnd o linie;

generaia I (sfritul anilor '60 - '70): BD ierarhice i reea (informaii structurate sub forma unui arbore sau a
unei reele extinse);

generaia a II-a (sfritul anilor '70 - prezent): BD relaionale (model bazat pe teoria mulimilor i logica
predicatelor, informaia fiind organizat n mulimi numite tabele, ntre care exist relaii);

generaia a III-a (sfritul anilor '80 - prezent): BD orientate obiect.

Un sistem de gestiune a bazelor de date (SGBD sau DBMS Database Management System) reprezint un
ansamblu complet i complex de programe care asigur interfaa ntre o baz de date i utilizatorii acesteia. El este
principala component software a unui sistem de baze de date, gestioneaz datele organizate n memoria extern,
implementeaz un model de date i conine cel puin un limbaj de programare adaptat pentru lucrul cu BD.
SGBD-ul ascunde complexitatea BD fa de aplicaii i utilizatori i face managementul datelor. Avanteje ale
utilizrii unui SGBD sunt urmtoarele:

independena datelor fa de program: fizic (modul de stocare al datelor poate fi modificat fr a rescrie
programul) i logic (structura de date poate fi modificat fr a rescrie programul);

redundana minim i controlat: este asigurat de modelul de date implementat i de normalizare;

faciliti pentru utilizarea datelor: aceleai date pot fi utilizate de mai muli utilizatori, n acelai timp, pentru
scopuri diferite;

- protecia datelor:
o

securitatea datelor : accesul se face autorizat i controlat prin parole, profiluri de utilizatori, proceduri
de criptare i folosirea tabelelor virtuale;

integritatea datelor: corectitudinea i coerena datelor, cu rol de a le proteja mpotriva unor incidente.
Aici putem vorbi despre:

restriciile de integritate;

accesul concurent la date (mecanismul de tranzacie);

salvarea (stocarea datelor automat/la cerere) i restaurarea (refacerea consistenei BD automat/la cerere,
pornind de la datele salvate).

1.3 Modelul relaional

Un model de date este un ansamblu de concepte i instrumente necesare pentru a realiza structura unei colecii
de date conform creia se vor reprezenta datele.
Schema conceptual reprezint descrierea fenomenelor din realitatea nconjurtoare prin colecii de date (tabele)
i atribute (tipul de date) mpreun cu toate corelaiile (legturile) dintre ele i restriciile acestora. Definirea
schemei este o activitate de modelare deoarece transpune n termeni abstraci entitile din lumea real. Schema se
reprezint cu ajutorul unui model de date recunoscut de un anumit SGBD.
Modelul relaional: definirea entitilor se face sub form de tablouri bidimensionale, denumite tabele. Conceptele
utilizate sunt:

domeniul: un ansamblu de valori carcaterizat printr-un nume i el poate fi explicit sau implicit;

tabela/relaia: un subansamblu al produsului cartezian al mai multor domenii;

atributul: coloana unei tabele, care are o denumire i un domeniu de valori;

tuplul/nregistrarea: linia unei tabele, care nu are denumire;

cheia: un atribut sau un grup de atribute care au rolul de a identifica o nregistrare ntr-o tabel. Tipuri de
chei: primare, simple sau compuse, externe. Definirea legturilor dintre entiti se face la nivel logic,
construind relaii ntre tabele cu ajutorul unor chei de legtur ce poarta numele de chei externe (foreign
keys).

Operatorii care se folosesc sunt:

din algebra relaional: selecia (WHERE), proiecia(FIELDS), jonciunea(FROM pe 2 tabele i WHERE),


reuniunea(UNION), diferena(MINUS), intersecia(INTERSECT), produsul cartezian i diviziunea.

din calculul relaional: conjuncia(AND), disjuncia(OR), negaia(NOT).

Toi operatorii relaionali sunt implementai prin clauze n comanda SELECT.


Restriciile de integritate ale modelului relaional
a) restriciile structurale

cheie unic(UNIQUE): ntr-o tabel nu trebuie s existe mai multe nregistrri cu aceeai valoare pentru
atributul declarat unic.

cheie extern(FOREIGN KEY): ntr-o tabela A care refer o tabel B valorile cheii externe trebuie s aparin
valorilor cheii primare din tabele B sau s fie NULL. Prin intermediul ei se realizeaz legtura ntre tabele.

restricia entitii(NOT NULL): atributele declarate astfel nu pot s ia valoarea NULL. Condiia de la prima i a
treia restricie conduc la restricia de cheie primar (PRIMARY KEY), care are rolul de a identifica n mod unic o
nregistrare ntr-o tabel.

b) restricii semantice

de domeniu(CHECK): domeniul corspunztor unui atribut trebuie s se ncadreze ntre anumite valori.

temporare: valorile anumitor atribute se compar cu nite valori temporare, rezultate din calcule.

Precizarea restriciilor se poate face n 2 moduri: in-line la definirea coloanei pe care se impune restricia i outof-line separat, fie la sfritul sintaxei CREATE TABLE, fie prin comanda ALTER.
Orice SGBD relaional trebuie s aib un limbaj pentru descrierea datelor (LDD) i unul pentru manipularea
datelor (LMD).
Comenzile din LDD pot fi grupate pe 3 niveluri:

nivel conceptual: CREATE DATABASE, DROP DATABASE (terge baza de date), CREATE TABLE, DROP TABLE,
CREATE SYNONIM (crearea unor alternative la denumirea unor tabele), ALTER TABLE;

nivel logic: CREATE VIEW (crearea tabelelor virtuale = o comand SELECT stocat sub o denumire care poate
fi apelat ulterior), DROP VIEW, GRANT CONNECT(conectarea unui utilizator la bd);

nivel fizic: CREATE INDEX (ataarea unor fiiere de index unor tabele), DROP INDEX.

Comenzile din LMD sunt folosite pentru:

interogarea datelor (query): SELECT;

actualizarea datelor: INSERT, UPDATE, DELETE;

alte faciliti funcionale: agregarea prin funciile AVERAGE, SUM etc.

Comenzi LPT (Limbaj pentru procesarea tranzaciilor):


- COMMIT (salveaz o tranzacie), ROLLBACK (anuleaz o tranzacie), SAVEPOINT (definete un punct de
salvare).
Comenzi LCD (Limbaj de control al datelor):
- GRANT (acord drepturi utilizatorilor), REVOKE (retrage anumite drepturi ale utilizatorilor).
Relaii
Tipuri de legturi ntre tabele:

one-to-one legtura dintre cele dou tabele se face pe baza cheilor primare.

one-to-many cheia primar din tabela printe se adaug n tabela copil sub form de cheie extern
many-to-many nu se poate implementa i se recurge la adugarea unei tabele suplimentare care va conine cheile
primare ale tabelelor iniiale i cmpuri referitoare la asocierea dintre tabelele prini. Cheia primar din tabela
intermediar va fi o cheie compus din cheile primare ale celor dou tabele iniiale.

Proiectarea BDR prin normalizare


Normalizarea presupune eliminarea unor anomalii de actualizare din structura bazei de date. Acestea pot aprea
la tergere, adugare sau modificare. Normalizarea definete conceptul de form normal (FN) i folosete ca
metod descompunerea top-down a unei tabele n 2 sau mai multe tabele, pstrnd informaia de legtur. O tabel
este n forma normal i+1 dac satisface anumite restricii care arat c forma normal i+1 este mai bun dect
forma normal i. O BDR este n forma normal i dac toate tabelele ei sunt n forma normal i.
Forma normal 1 (FN1)
O tabel este n FN1 dac toate atributele ei conin valori elementare, nedecompozabile, fiecare nregistrare nu
trebuie s aib date la nivel de grup sau repetitive. Fiecare structur repetitiv genereaz prin descompunere o nou
tabel, iar atributele la nivel de grup se elimin, rmnd doar cele elementare. O tabel n FN1 poate conine
anomalii de actualizare, datorit prezenei dependenelor funcionale incomplete.
Deci, se elimin cmpurile care se repet crend o nou tabel, astfel nct tabela original i noua tabel sunt
relaionate master-detail cu o relaie one-to-many. De exemplu, o tabela master conine nregistrri ce reprezint
toi angajaii unei bnci, iar o tabel detail va conine nregistrri de detaliu, cum ar fi datele de identificare ale unui
client. Se creeaz chei n ambele tabele: tabela detail va avea o cheie primar compozit ce conine cheia primar a
tabelei master (care este deasemenea i foreign key pentru tabela master) i cheia sa primar.
Exemplu:

profesori

idprofesor

nume

varsta

incadrare

functie

salariu

catedra

Un profesor este identificat n mod unic prin atributul idprofesor i este angajat conform unei ncadrri care
nseamn grupul de atribute: functie, salariu, catedra. Se elimin atributele de grup i rezult o nou tabel cu
atribute elementare (dac ar avea atribute de grup nu am putea crea tabela cu comanda CREATE TABLE).
Daca mai adugm un cmp copii, trebuie s avem n vedere c profesor poate avea mai muli copii, deci o
nregistrare poate avea mai multe valori ale acestui cmp, de genul, copil1, copil2 etc. Aceast anomalie trebuie
eliminat prin crearea unei noi tabele, copii, care s conin drept cheie extern idul profesorului.

Forma normal 2 (FN2)


O tabel este n FN2 dac este n FN1 i fiecare atribut non-cheie al tabelei este dependent funcional complet de
cheia primar. Un atribut B al unei tabele este dependent funcional de un atribut A al aceleai tabele dac fiecrei
valori a lui A i corespunde o singur valoare a lui B. Un atribut B al unei tabele este dependent funcional complet de
un ansamblu de atribute A al aceleai tabele dac B este dependent funcional de ntreg ansamblul A i nu numai de
un atribut al lui A.
Eliminarea dependenelor incomplete se face prin descompunerea n 2 tabele, ambele coninnd un atribut B. O
tabel n FN2 poate prezenta anomalii de actualizare, datorit dependenelor tranzitive.
Se creeaz o tabel unde valorile care se repet (i nu cmpurile care se repet) sunt eliminate ntr-o nou
tabel. Rezultatul este o relaie many-to-one creat ntre tabela original i noile tabele create; noua tabel va avea
o cheie primar ce va fi format dintr-un singur cmp; tabela master conine o foreign key ctre cheia primar a noii
tabele (cheia extern nu este parte a cheii primare a tabelei originale).
Exemplu: n tabela activitate avem cheia primar compus din atributele idActivitate, disciplin i an. Atributul
sal depinde doar de ntreg ansamblul de cheie primar, n timp ce numrul de studeni depinde doar de anul de
studiu. Exist aadar o dependen incomplet care se elimin prin crearea a dou tabele, ambele coninnd
atributul implicat n dependen an.

Forma normal 3 (FN3)


O tabel este n FN3 dac este n FN2 i toate atributele non-cheie depind netranzitiv de cheia primar a tabelei.
Eliminarea dependenelor tranzitive se face prin descompunerea tabelei niiale n alte dou tabele, ambele coninnd
un atribut intermediar. O tabel nu trebuie s conin cmpuri care provin din calcule folosind atribute din aceeai
tabel. Exemplu: tabela angajati conine o dependen trazitiv ntre atributele vrst i dataNaterii. Ea se va
descompune n dou tabele, fiecare coninnd atributul comun dataNaterii, cel implicat n depende tranzitiv. Se
observ c tabela angajati2 poate fi scoas din baza de date, deoarece varsta poate fi calculat oricnd pe baza
cmpului dataNaterii. Astfel de atribute derivate, care se pot calcula pe baza altor atribute, nu trebuie incluse ntr-o
BD.
SEM 2 !!!

Limbajul de descriere a datelor


2.1. Crearea bazelor de date
CREATE DATABASE <nume bd>

Bazele de date n MySQL sunt reprezentate ca directoare, iat tabelele ca fiiere n aceste directoare. Prin urmare,
numele de baze de date, de tabele i cmpuri trebuie s fie n conformitate cu restriciile sistemului de operare
privind caractere care sunt permise n numele de directoare i fiiere. Se recomand folosirea literelor mici pentru
numele de baze de date, tabele i cmpuri, acestea fiind formate doar din caractere alfanumerice i linii de
subliniere. A se evita folosirea cuvintelor rezervate MySQL (dac totui se folosesc, trebuie ncadrate n backquotes `
` ).
Condiii de validitate a numelor ce nu folosesc delimitatori:

pot conine litere, cifre, _ sau $

nu pot fi formate numai din cifre (pot fi interpretate ca valori ntregi)

pot ncepe cu orice caracter legal, inclusiv cifr, ns unele nume care ncep cu cifre pot fi interpretate ca valori
ntregi

dac dorim ca numele s includ numai cifre sau i alte caracactere dect cele de mai sus, l plasm ntre
delimitatori.

Includerea ntre delimitatori elimin aproape toate restriciile, mai puin:

nu sunt permise spaiile, (.), (/), (\).

Nume absolut sau complet: bazaDeDate.tabela sau bazaDeDate.tabela.coloana


Nume relativ: numele simplu al tabelei sau coloanei (se consider relativ la baza de date sau tabela selectat,
curent)
Pentru tergerea unei baze de date, se folosete comanda DROP DATABASE, care terge baza de date mpreun
cu toate tabelele coninute de aceasta.
DROP DATABASE <nume bd>;
2.2. Crearea tabelelor
Pentru a crea o tabel se folosete comanda:
CREATE
TABLE
<nume
...,
<nume
cmp>
<restricii> ) <motor de stocare> ;

tabel>

(<nume
<tip

cmp>

<tip
date>

date>

<modificatori>

<modificatori>

Aceast instruciune ncepe cu numele tabelei, urmat de un set de paranteze. Parantezele includ una sau mai
multe definiii de cmpuri, astfel: numele cmpului, tipul de dat specific cmpului i modificatori speciali sau
restricii aplicate pe acel cmp. Dup nchiderea parantezei urmeaz, opional, un specificator cu numele motorului
de stocare care se va utiliza pentru aceast tabel (noi vom folosi implicit InnoDB).
La crearea unei tabele este necesar specificarea tipului de date pentru fiecare cmp. Utilizarea inteligent a
tipurilor de date conduce la o indexare i regsire eficient, o execuie corect i rapid. De exemplu, folosirea

tipului VARCHAR pentru un cmp numeric nu ar putea permite realizarea de calcule cu el, la fel cum folosirea tipului
TEXT pentru iruri de caractere mici ar putea duce la o pierdere de spaiu.
Tipurile numerice:

valori ntregi: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT. Ele difer prin mrimea valorilor pe care le pot
stoca. Primele trei sunt pentru valori mici, INT este pentru valori mari, iar BIGINT pentru valori extrem de
mari.

valori reale: FLOAT (simpl precizie), DOUBLE (dubl precizie), DECIMAL(valori zecimale).

Pentru ele se poate specifica dimensiunea, ntre paranteze: INT(10), FLOAT(7,4) = valori cu apte cifre, dou
pentru partea ntreag, una pentru separator, patru pentru partea zecimal.
Tipurile caracter i ir de caractere:

dimensiune fix: CHAR

dimensiune variabil: VARCHAR.

Ambele pot avea definit dimensiunea ntre paranteze, la definire: VARCHAR(20). Dimensiunea maxim este de
255 de caractere.
Tipurile text i binare

pentru a stoca date ASCII: TEXT, TINYTEXT, MEDIUMTEXT, LONGTEXT

pentru a stoca date binare: BLOB, TINYLOB, MEDIUMLOB, LONGLOB.

Ambele definesc iruri de caractere cu dimensiuni mai mari de 255 caractere.


Tipurile de date dat i or

dat sub form de an, lun, zi: DATE

dat sub form de or sau durat: TIME

dat i or n acelai cmp: DATETIME, TIMESTAMP.

Aceste tipuri au formate numerice (YYYYMMDD, HHMMSS) sau ir de caractere (YYYY-MM-DD).


Tipurile enumerri
Se folosesc pentru cmpuri ale cror valoare se selecteaz dintr-o list predefinit de valori. Aici avem tipurile
ENUM (se alege o singur valoare din set) i SET (se alege zero, una sau mai multe valori).
Adugarea modificatorilor de cmp i a cheilor
Un anumit numr de constrngeri suplimentare poate fi aplicat unui cmp pentru a crete coerena datelor care
vor fi introduse. Acetia pot fi definii:

in-line, ca parte a definiiei unui cmp;

out-of-line, dup definirea tuturor cmpurilor, n cazul n care se refer la mai multe coloane (de exemplu, o
cheie primar compus).

Pentru a specifica dac un cmp fi lsat gol sau trebuie neaprat s ia o valoare, se plaseaz modificatorul NULL
sau NOT NULL dup definirea coloanei respective.
Pentru a specifica o valoare implicit pentru un cmp, se folosete modificatorul DEFAULT. Valoarea implicit este
utilizat atunci cnd se introduce o nou nregistrare n care nu se d o valoarea acelui cmp. n absena lui DEFAULT,
pentru cmpurile NOT NULL, MySQL niializeaz cmpul cu o valoare neutr. Exemplu:

Pentru a obliga MySQL s genereze n mod automat un numr pentru un cmp prin incrementare se folosete
modificatorul AUTO_INCREMENT. El se aplic doar cmpurilor numerice NOT NULL care aparin cheii primare. O
tabel poate conine un singur cmp AUTO_INCREMENT.
Pentru a indexa un cmp se folosete modificatorul INDEX. Atunci cnd un cmp este indexat, MySQL creeaz un
fiier n care sorteaz nregistrrile pe baza acelui index; astfel, el nu mai parcurge fiecare rnd al tabelei la o
interogare, ci parcurge numai indexul. Indexarea este recomandat pentru cmpurile care apar frecvent n clauza
WHERE, ORDER BY, GROUP BY ale comenzii SELECT i pentru cmpurile folosite pentru legturile ntre tabele. Un
cmp declarat index poate lua valori duplicate n tabel sau valori NULL. Exemplu:
O variant a modificatorului INDEX este UNIQUE. El este un tip special de index utilizat pentru a garanta c
valorile introduse sunt fie unice, fie NULL. Exemplu:
Pentru a declara o cheie primar se folosete modificatorul PRIMARY KEY. Aceast constrngere este o combinaie
ntre NOT NULL i UNIQUE deoarece ea necesit ca valorile din respectivul cmp s nu fie NULL sau s se repete n
alt nregistrare. Ea servete ca identificator unic pentru fiecare nregistrare din tabel i tabela este implicit
indexat dup cheia primar.
Pentru a declara o cheie extern se folosete modificatorul FOREIGN KEY, ce leag un cmp dintr-o tabel (o
cheie primar) cu un alt cmp din alt tabel (care devine cheie extern), crend astfel legturi ntre tabele. Cheile
externe sunt suportate numai de motorul de stocare InnoDB, modificatorul FOREIGN KEY fiind ignorat de celelalte
motoare de stocare. Exemplu:
Utilizarea indecsilor. Pentru a accelera cutrile i a reduce timpul de execu ie, MySQL permite indexarea
anumitor cmpuri dintr-o tabel. Astfel, se va evita scanarea complet a unei tabele, cutnd n index i efectund
apoi saltul direct la locaia corespunztoare din tabel. Citirea unui index este mai rapid dect scanarea ntregii
tabele, datorit dimensiunilor reduse ale indexurilor. Un index are i dezavantaje: ocup spaiu suplimentar pe disc i
poate afecta viteza instruciunilor de actualizare a datelor, deoarece el trebuie actualizat ori de cte ori sunt
adugate, modificate sau terse nregistrri din tabel. Cu toate acestea, este recomandat folosirea indexurilor,
deoarece discurile devin din ce in ce mai ieftine, iar MySQL are numeroase tehnici de optimizare a timpului de
actualizare. Un index se poate crea la definirea tabelei, sau ulterior. Pentru a crea un index compus din mai multe
cmpuri (maxim 15), se folosete modificatorul INDEX( nume_cmp1, nume _cmp2, ...). Pentru a crea un index
dup ce s-a creat tabela, se folosete comanda CREATE INDEX:
CREATE INDEX <nume index> ON <nume tabel> ( <nume cmp> );
Dac nu s-a specificat numele indexului la declararea lui cu INDEX n cadrul comenzii CREATE TABLE, el va primi
implicit numele cmpului pe care l indexeaz.
Pentru tergerea unui index se folosete comanda DROP INDEX:
DROP INDEX <nume cmp> ON <nume tabel>

2.3. Modificarea structurii tabelelor


Definirea tabelelor nu este definitiv, structura tabelelor poate fi modificat ulterior cu comanda ALTER TABLE.
Aceasta
este
folosit
pentru
adugare/tergere
de
coloane,
modificarea
tipurilor
cmpurilor,
adugarea/modificarea/tergerea cheilor, modificarea numelor tabelelor.
Redenumirea tabelelor se realizeaz cu comanda:
ALTER TABLE <nume vechi tabel> RENAME TO <nume nou tabel>;
sau
RENAME TABLE <nume vechi tabel> TO <nume nou tabel>;

Redenumirea coloanelor i modificarea proprietilor


Clauza CHANGE poate fi folosit pentru modificarea numelui unui cmp, a tipului i proprietilor, prin simpla
folosire a unei noi definiii a cmpului n locul celei originale. Exemplu:
Atunci cnd tipul unui cmp este modificat, MySQL va ncerca s converteasc automat datele din coloana
respectiv la noul tip. Dac va rezulta o contradicie ntre tipurile de date, MySQL va genera o eroare.Pentru a
modifica aceast comportament implicit, se adaug clauza IGNORE la instruciunea ALTER TABLE, ceea ce face ca
MySQL s ignore astfel de neconcordane.
Adugarea i eliminarea cmpurilor i cheilor
Adugarea unui nou cmp la o tabel se face cu clauza ADD n comanda ALTER TABLE:
ALTER TABLE <nume tabel> ADD <nume cmp><tip dat><modificatori>;
tergerea unui cmp existent n tabel se face cu clauza DROP n comanda ALTER TABLE: ALTER TABLE <nume
tabel> DROP <nume cmp>;
Pentru a aduga o nou cheie primar se folosete clauza ADD PRIMARY KEY: ALTER TABLE <nume tabel> ADD
PRIMARY KEY (<nume cmp>);
Pentru a terge cheia primar a unei tabele se utilizeaz clauza DROP PRIMARY KEY: ALTER TABLE <nume
tabel> DROP PRIMARY KEY;
Cheia primar este de obicei AUTO_INCREMENT i este necesar mai nti s se ndeprteze acest atribut de pe
cmpul cheie primar i apoi el s fie ters.
Modificarea tipurilor tabelelor
Pentru a modifica motorul de stocare pentru o tabel se folosete clauza ENGINE: ALTER TABLE <nume tabel>
ENGINE <nume motor de stocare>;
tergerea tabelelor
Se face folosind comanda DROP TABLE: DROP TABLE <nume tabel>;
Aceasta comand terge imediat obiectele-int cu toate datele pe care le conin i trebuie utilizate cu atenie!
Dac se dorete doar golirea unei tabele de nregistrrilor coninute, se folosete comanda TRUNCATE TABLE.
Cmpul AUTO_INCREMENT, dac exist, este resetat automat la execuia comenzii (acest lucru nu se ntmpl dac
se terg toate nregistrrile din tabel cu comanda DELETE).
Vizualizarea informaiilor referitoare la baza de date, tabele i cmpuri
SHOW DATABASES (lista bazelor de date de pe server)
SHOW TABLES (lista tabelelor dintr-o baza de date)
DESCRIBE (structura unei tabele)
SHOW TABLE STATUS (detalii despre tabele: numr, numr de nregistrri, data ultimei actualizri etc.)
SHOW
COLUMNS
FROM
nume
tabel
SHOW
CREATE
TABLE
nume
tabel
(comenzile
pentru
crearea
tabelei)
SHOW
INDEX
(lista
de
indexuri
pentru
tabele)
SHOW ERRORS, SHOW WARNINGS (lista erorilor i avertizrilor de pe server)
SEM 3 !!!
Limbajul de manipulare a datelor
Dup definirea bazelor de date i tabelelor, urmtorul pas este utilizarea lor prin popularea cu nregistrri i
efectuarea interogrilor asupra datelor stocate.
3.1 Crearea nregistrrilor: INSERT
Comanda care realizeaz acest lucru este INSERT, care permite introducerea a dou sau mai multe nregistrri
ntr-o tabel. Comanda are mai multe forme, sub urmtoarele aspecte:

se pot introduce una sau mai multe nregistrri cu aceeai instruciune INSERT;

se poate specifica setul complet de valori pentru o nregistrare sau valorile doar pentru anumite cmpuri;

se pot introduce nregistrri fr a specifica nicio valoare pentru coloane, toate cmpurile avnd ulterior
valoarea default;

se pot introduce nregistrri ce constituie rezultat al unei interogri SELECT.

3.1.1 Introducerea unei nregistrri prin specificarea tuturor valorilor


INSERT INTO <nume tabel> VALUES (val1, val2, val3, );
Comanda INSERT este urmat de cuvntul cheie INTO, un nume de tabel i clauza VALUES, specificnd valorile
care urmeaz s fie introduce n cmpurile tabelei. Trebuie specificate valorile pentru toate coloanele tabelei i n
ordinea n care apar ele n tabel.
Dezavantaje:

numrul de valori specificate trebuie s fie mereu egal cu numrul de cmpuri din tabel; dac se terge sau
se adaug o coloan, instruciunea INSERT trebuie modificat;

dac se schimb ordinea cmpurilor din tabel, ordinea valorilor din instruciunea INSERT trebuie modificat.

Exemplu:
3.1.2 Introducerea unei nregistrri doar pentru o parte a coloanelor
INSERT INTO <nume tabel> (cmp1, cmp2, cmp3) VALUES (val1, val2, val3);
Dac nu dorim s dm valorile pentru toate cmpurile tabelei, se folosete aceast form a instruciunii INSERT.
Aceste situaii pot aprea n cazul cmpurilor AUTO_INCREMENT, pentru care nu trebuie s dm noi valori explicite,
sau pentru cmpurile calculate ulterior.
Pentru aceast form este necesar precizarea listei de coloane crora le corespund aceste valori. Coloanele
precizate nu trebuie s fie n ordinea din tabel sau consecutive. Pentru toate coloanele care nu apar n list se va
pune valoarea default.
Numrul de coloane trebuie s fie acelai cu numrul de valori, valoarea de pe poziie i corespunde cmpului de
pe poziie i din lista cu cmpuri. Are avantajul c se poate modifica structura coloanelor tabelei fr s se modifice
instruciunea INSERT.
Exemplu:

Mai exist o variant a comenzii INSERT care permite specificarea valorilor pentru o parte a coloanelor sau pentru
toate:
INSERT INTO <nume tabel> SET cmp1=val1, cmp2=val2, cmp3=val3, ... ;
Exemplu:

3.1.3 Introducerea unei nregistrri numai cu valori default


MySQL permite introducerea unei nregistrri fr a specifica nicio valoare. Astfel, noua nregistrare va fi compus
numai din valori default ale tuturor coloanelor. Sintaxa este urmtoarea:
INSERT INTO <nume tabel> VALUES ();

Exemplu:
3.1.4 Introducerea mai multor nregistrri cu o singur instruciune
Toate formele instruciunii INSERT descrise mai sus pot fi folosite pentru a introduce mai multe nregistrri o
dat. Dac unul din seturile de valori genereaz o eroare (tip de date incompatibil etc.) valorile de pn atunci
rmn introduse, dar cele urmtoare nu vor mai fi adugate.
Exemplu:

3.2 Extragerea de informaii din tabele: SELECT


Instruciunea SELECT este folosit pentru a obine date de la server. Rezultatul ntors de server ca urmare a
execuiei acestei instruciuni este un ansamblu de rnduri i coloane, la fel ca n cazul unei tabele. Chiar dac
rezultatul seamn cu o tabel, el nu are unele caracteristici proprii tabelelor (nu este memorat permanent pe
server) i, chiar dac provine dintr-o singur tabel, rezultatul poate conine doar o parte a datelor sau combinaii
ale datelor din tabela respectiv.
Sintaxa general a instruciunii SELECT este urmtoarea:
SELECT
<cmp1><cmp2>
[WHERE
[ORDER
[LIMIT <nr randuri>];

...

[FROM

BY

<nume

tabel>]
<condiie>]
<criteriu>]

Obs. Clauzele care apar ntre [ ] sunt opionale. Instruciunea SELECT accept i alte clauze care vor fi detaliate
n cursurile urmtoare.
3.2.1 Tipul valorilor coloanelor returnate de SELECT

se pot returna valori care nu se regsesc n tabele de pe server. Aici numele de coloane sunt exact expresiile
scrise de noi n SELECT, nu apare clauza FROM, iar valorile rezult din evaluarea expresiilor.

Exemplu:

se pot returna coloane din tabele, specificnd numele lor n instruciune i neaprat clauza FROM urmat de
numele tabelei care ne intereseaz. Interogarea ntoarce toate nregistrrile, dar numai cu valorile
corespunztoare coloanelor specificate n comand.

Exemplu:
Dac se dorete returnarea tuturor coloanelor din tabel, se folosete caracterul *.
Exemplu:

combinaii de constante i nume de tabele. Se pot crea expresii complexe folosind funcii predefinite MySQL.
Operatorii i funciile predefinite care sunt folosite la crearea expresiilor vor fi discutate n cursurile viitoare.

Exemplu:

3.2.2 Numele pentru coloanele returnate de SELECT


Coloanele returnate de o instruciune SELECT au ca nume chiar expresiile folosite n cadrul instruciunii. Acest
lucru nu este mereu preferat, de aceea se definesc nume explicite pentru coloane, denumite alias-uri. Ele se creeaz
folosind cuvtul cheie AS urmat de numele dorit, imediat dup o expresie ce stabilete valoarile unei coloane.
Exemplu:

Alias-urile sunt utile cnd:

numele implicit este prea lung;

extragem date din mai multe tabele i exist coloane cu acelai nume n tabele diferite.

3.2.3 Clauza WHERE


Prin adugarea clauzei WHERE la instruciunea SELECT se poate alege ce nregistrri s fie extrase dintr-o tabel.
nregistrrile nu au nume dup care s fie identificate unic, ele sunt filtrate dup datele pe care le conin. De aceea,
clauza WHERE specific rndurile ce trebuie extrase cu ajutorul unei condiii i apoi ntoarce nregistrrile ce
ndeplinesc condiia. Sintaxa unei instruciuni SELECT ce conine i clauza WHERE este:
SELECT <cmp1><cmp2> ... FROM <nume tabel> WHERE <condiie>;
Condiiile sunt formate din expresii folosind constante, operatori, funcii i nume de coloane. Rezultatul unei
expresii poate fi adevrat sau fals i sunt ntoarse doar nregistrrile pentru care expresia este adevrat. Cea mai
simpl expresie WHERE are o condiie, iar cele mai complexe au mai multe condiii combinate folosind operatorii
logici AND i OR (AND are prioritate mai mare dect OR). Dac dorim s controlm prioritile, utilizm parantezele.
Exemplu 2:
3.2.4 Clauza LIMIT
Permite limitarea numrului de nregistrri ntoarse de instruciunea SELECT i are dou forme:

dup LIMIT se specific un singur parametru: nr maxim de nregistrri returnate;

dup LIMIT se specific doi parametrii: nr de nregistrri ignorate i nr maxim de nregistrri returnate.

Exemplu:

Clauza LIMIT x returneaz primele x nregistrri cerute, dar ele depind de ordinea n care sunt extrase. Clauza
ORDER BY permite ordonarea nregistrrilor conform unui criteriu, afiarea nregistrrilor putnd fi diferite dac
criteriile de sortare sunt diferite.
3.2.5 Clauza ORDER BY
Permite stabilirea ordinii n care sunt ntoarse nregistrrile i poate avea unul sau mai multe criterii de sortare.
Pentru fiecare criteriu ordonarea poate fi cresctoare (se specific cu cuvntul-cheie ASC), descresctoare (se
specific cu cuvntul-cheie DESC) sau aleatoare (se specific RAND() ).Dac nu se specific nimic, implicit se face
ordonare cresctoare.
Exemplu:

3.3 Modificarea nregistrrilor: UPDATE


Instruciunea UPDATE permite modificarea valorilor nregistrrilor deja adugate n tabele.
UPDATE <nume tabel> SET cmp1=val1, cmp2=val2, ... [ WHERE condiie ];
Exemplu:

Cu o singur instruciune pot fi realizate modificri pe una sau mai multe coloane.
Clauza WHERE este opional. Ea se folosete pentru a specifica o condiie; dac se respect acea condiie, se va
realizarea modificarea nregistrrilor; n sens contrar, ele vor rmne neschimbate.
Dac WHERE lipsete, se vor modifica toate nregistrrile din tabel.
Expresiile ce dau valoare coloanelor sunt aceleai ca n cazul lui SELECT: pot conine constante, funcii
predefinite, nume de coloane, operatori.
Instruciunea UPDATE poate fi combinat cu clauzele ORDER BY i LIMIT.
Returneaz numrul de nregistrri ce fac subiectul modificrii i numrul de nregistrri modificate efectiv. Este
posibil ca cele dou s fie diferite.
3.4 tergerea nregistrrilor: DELETE
Permite tergerea controlat a nregistrrilor ce ndeplinesc anumite criterii. Sintaxa este:
DELETE FROM <nume tabel> [WHERE <condiie>] [ORDER BY <criteriu>] [LIMIT <nr max>];
Exemplu:

SEM 4!!!!!
Capitolul IV - Operatori i funcii predefinite MySQL
4.1 Caracteristici ale expresiilor SQL
Expresiile sunt folosite n diverse instruciuni i clauze MySQL, cum ar fi:

valorile coloanelor returnate de SELECT;

valorile introduse pe coloane de UPDATE;

criteriile din ORDER BY;

condiiile din WHERE.

Expresiile sunt formate din:

constante (numere, caractere, date calendaristice);

valori ale cmpurilor din tabele;

operatori;

funcii predefinite MySQL;

valori NULL.

4.2 Operatori
4.2.1. Operatori aritmetici
Sunt operatori care realizez rezultate numerice i care sunt corespunztori operatorilor matematici clasici:

+, -, * (adunare, scdere, nmulire)

/ (ctul mpririi)

% (restul mpririi)

Operatorii + i pot fi folosii i cu date de tip dat calendaristic, adunnd sau sczndun interval de timp.
Pentru specificarea intervalului dorit se folosete cuvntul-cheie INTERVAL urmat de valoarea dorit i unitatea de
msur corespunztoare: SECOND, MINUTE, HOUR, DAY, MONTH, YEAR.
Exemplu:
4.2.2 Operatori logici
Sunt folosii pentru a uni expresii care au ca rezultat valori de adevrat sau fals. n MySQL, aceste valori sunt
implementate ca 0 i 1. Operatorii logiic sunt:

AND, && : I logic.

Exemplu:

OR, || : SAU logic. Dac sql_mode are activ opiunea PIPES_AS_CONCAT, operatorul || nu mai este
interpretat ca sau, ci va realiza concatenarea a dou iruri de caractere.

Exemplu:

XOR : SAU exclusiv.

NOT, ! : negare

Exemplu:
4.2.3 Operatori de comparare
Accept unul sau mai muli operanzi i returneaz 0 (fals), 1 (adevrat) sau NULL (atunci cnd cel puin unul
dintre operanzi este NULL). Operatorii de comparare sunt urmtorii: - >, <, >=, <= : pot fi folosii pe valori
numerice sau iruri de caractere, compararea fiind una alfabetic (se returneaz 1 dac primul operand se afl n
relaia respectiv cu al doilea i 0 n cazul invers).
Exemplu:

= (egal), != (diferit), <>(diferit) : returneaz NULL dac cel puin unul dintre operanzi este NULL.

Exemplu:

IS NULL, IS NOT NULL : verific dac expresia are valoarea NULL. Nu se folosete = deoarece al doilea
operand ar fi NULL, ceea ce ar conduce la rezultatul NULL, indiferent de valoarea expresiei.

Exemplu:

<=> : verific egalitatea. Dac unul dintre operanzi este NULL, returneaz 0, dac ambii sunt NULL
returneaz 1.

BETWEEN val1 AND val2 : folosit pentru a pune condiia ca valoarea unei expresii s se ncadreze ntr-un
interval. Poate fi precedat de NOT pentru ca valoarea s se afle n afara intervalului.

Exemplu:

expr1 IN (val1, val2, ...) : returneaz 1 dac primul operand se regsete printre valorile specificate n list i
0 n caz contrar. Poate fi precedat de NOT pentru negarea condiiei.

Exemplu:

expr1 LIKE expr2 : pune condiia ca formatul primului operand s fie acelai cu al celui de-al doilea. n
expresia a doua se pot folosi caractere speciale: _ (ine locul unui caracter) i % (ine locul a orictor
caractere). Poate fi precedat de NULL pentru a nega condiia.

Exemplu:
4.2.4 Conversii de date
Atunci cnd operanzii unui operator au tipuri de date diferite, MySQL realizeaz conversii automate astfel nct
operatorul s poat fi aplicat. Sunt posibile urmtoarele situaii:

numerele sunt transformate automat n iruri de caractere, i invers, acolo unde este nevoie.

datele calendaristice sunt transformate n numere cnd sunt folosite ntr-un context numeric, i invers.

valorile de tip ENUM i SET sunt automat convertite n caractere sau numere, depinznd de context.

4.3 Funcii MySQL predefinite simple


Funciile MySQL predefinite sunt corespunztoare operaiilor mai des ntlnite. Fiecare funcie primete un anumit
numr de parametrii i returneaz o valoare. Pentru apelarea unei funcii se foloseste numele funciei urmat de lista
de parametrii ntre paranteze rotunde.
Tipuri de funcii predefinite:
a.

b.

funcii simple: primesc zero sau mai muli parametrii, ce pot fi constante sau expresii (care pot conine la
rndul lor alte funcii, coloane din tabele etc.). O expresie ce conine o funcie aplicat unei coloane din tabel
va produce o valoare pentru fiecare nregistrare implicat. Funciile simple se grupeaz n:
o

funcii matematice

funcii de comparare

funcii condiionaele

funcii pentru iruri de caractere

funcii pentru date calendaristice

funcii de agregare: acioneaz asupra mai multor rnduri dintr-un set de rezultate (de exemplu, media
salariilor dintr-un departament, suma vnzrilor dintr-o lun).

4.3.1 Funcii matematice


Realizeaz operaii matematice i aritmetice uzuale, cele mai cunoscute fiind urmtoarele:

ABS(val): returneaz modulul valorii primite ca parametru.

CEIL(val) / CEILING(val): returneaz cel mai apropiat ntreg mai mare sau egal cu valoarea primit.

FLOOR(val): returneaz cel mai apropiat ntreg mai mic sau egal cu valoarea primit.

ROUND(val): returneaz ntregul cel mai apropiat de valoarea primit ca parametru. Dac vrem s precizm i
numrul de zecimale, folosim varianta ROUND(val, nr_zecimale).

TRUNCATE(val, nr_zecimale): trunchiaz valoarea, pstrnd numai numrul de zecimale cerut.

POW(baza, exponent) / POWER(baza, exponent): returneaz rezultatul ridicrii bazei la puterea exponent.

EXP(val): returneaz ridicarea lui e la puterea exponent.

LOG(val), LOG10(val), LOG2(val): returneaz logaritmul natural / n baza 10 / n baza 2

SQRT(val): returneaz radicalul de ordin 2 al valorii. Dac valoarea primit ca parametru este negativ, se va
returna NULL (radicalul nu se extrage din numere negative).

PI(): returneaz valoarea numrului pi.

COS(), SIN(), TAN(), COT(), ACOS(), ASIN(), ATAN(): returneaz cosinus, sinus, tangent, cotangent,
arccosinus, arcsinus, arctangent.

RAND(): returneaz un numr subunitar cuprins ntre [0, 1). Poate fi folosit pentru a produce numere n orice
interval, prin nmulirea lui cu o valoare: 100*RAND() va produce numere n intervalul [0,100).

SIGN(): returneaz -1 pentru numere negative, 0 pentru zero, 1 pentru numere pozitive.

Exemplu:
4.3.2 Funcii de comparare
Se aplic pentru numere, dar i pentru iruri de caractere (realiznd compararea alfabetic):

LEAST(val1, val2, val3, ...): returneaz cea mai mic valoarea din list.

GREATEST(val1, val2, val3, ...): returneaz cea mai mare valoarea din list.

INTERVAL(n, n1, n2, n3, ...): returneaz 0 dac n<n1, 1 dac n<n2, 2 dac n<n3. Pentru ca functia s
funcioneze corect, trebuie ca valorile n1, n2, n3, ... s fie n ordine cresctoare.

Exemplu:
4.3.3 Funcii condiionale
Permit luarea de decizii pe baza valorilor unor expresii:

IF(expr_evaluat, expr1, expr2): dac expresia evaluat este adevrat (nu ia valoarea 0 sau NULL), atunci
se returneaz valoarea expr1, n caz contrar se returneaz expr2.

IIFNULL(expr1, expr2): dac expr1 are valoare NOT NULL, se returneaz valoarea expr1, n caz contrar se
returneaz expr2.

INULLIF(expr1, expr2): dac expr1=expr2 returneaz NULL, n caz contrar se returneaz expr1.

Exemplu:
4.3.4 Funcii pentru iruri de caractere
Exist urmtoarele categorii:
a.

lungimea unui ir de caractere:

b.

CHAR_LENGTH(ir) / CHARACTER_LENGTH(ir): returneaz numrul de caractere din ir.

LENGTH(ir) / OCTET_LENGTH(ir): returneaz numrul de octei ocupat de ir.

concatenare
o

CONCAT(ir1, ir2): returneaz irul rezultat din concatenarea celor dou iruri date ca parametrii.
Dac unul dintre iruri este NULL, rezultatul va fi NULL.

CONCAT_WS(separator, ir1, ir2): realizeaz concatenarea irurilor date ca parametrii, dar care vor fi
desprite de separatorul specificat. Parametrii NULL sunt ignorai.

Exemplu:
c.

d.

e.

f.

padding = completarea cu caractere a unui ir pentru a atinge lungimea dorit


o

LPAD(ir, lungime_dorit, ir_adugat): adaug la nceputul irului specificat attea exemplare ale lui
ir_adugat cte sunt necesare pentru a se ajunge la lungimea dorit.

RPAD(ir, lungime_dorit, ir_adugat): funcioneaz ca cel de mai sus, dar face adugarea la sfrit.

eliminarea spaiilor marginale


o

LTRIM(ir): elimin spaiile de la nceputul irului

RTRIM(ir): elimin spaiile de la sfritul irului

TRIM(ir): elimin spaiile de la nceputul i sfritul irului.

conversii litere mari/mici


o

LCASE(ir) / LOWER(ir): transform majusculele n litere mici

UCASE(ir) / UPPER(ir): transform literele mici n majusculele

extragere de subiruri
o

SUBSTR(ir, poziit_nceput): returneaz irul de la poziia specificat pn la sfritul irului iniial.

SUBSTR(ir, poziit_nceput, lungime): funcioneaz ca cel de mai sus, doar c returneaz un numr
de caractere egal cu valoarea lungime.

LEFT(ir, n): returneaz primele n caractere ale irului

RIGHT(ir, n): returneaz ultimele n caractere ale irului

MID(ir, pozie, lungime): echivalent cu SUBSTR(ir, poziie, lungime).

Exemplu:
g.

gsirea poziiei unui subir n cadrul unui ir


o

h.

LOCATE(subir, ir) / POSITION(subir, ir): returneaz poziia primei apariii a subirului, de la stnga
la dreapta, sau 0 dac lipsete.

modificarea unui ir de caractere

INSERT(ir, poziie, numr_caractere, nlocuitor): nlocuiete un ir cu altul

REPLACE(ir, de_nlocuit, nlocuitor): nlocuiete toate apariiile subirului de nlocuit cu cel nlocuitor.

Exemplu:
4.3.5 Funcii pentru date calendaristice
a.

ora/data curent
o

CURDATE() / CURRENT_DATE() / CURRENT_DATE : returneaz data curent, n formatul AAAA-LL-ZZ.

CURTIME() / CURRENT_TIME() / CURRENT_TIME : returneaz ora curent, n formatul HH:MM:SS.

NOW() / CURRENT_TIMESTAMP() / CURRENT_TIMESTAMP : returneaz momentul de timp curent, n


formatul AAAA-LL-ZZ HH:MM:SS

b.
Exemplu:
b.

c.

extragere elemente componente


o

YEAR(data) : returneaz anul component al datei primite ca parametru.

MONTH(data) : returneaz luna component

DAY(data) / DAYOFMONTH(data): returneaz ziua component

DAYOFWEEK(data) : indexul zilei din sptmn, cu 1=duminic, 2=luni, ...

WEEKDAY(data) : acelai lucru, dar cu 0=luni, 1=marti, ...

DAYOFYEAR(data) : returneaz numrul zilei din anul respectiv, valoare ntre 1 i 366

HOUR(timp) : returneaz componenta or a argumentului

MINUTE(timp) : returneaz minutul

SECOND(timp) : returneaz secunda

operaii aritmetice
- DATE_ADD(data, INTERVAL expresie unitate_msur) : adaug intervalul de timp specificat la dat,
returnnd noua dat rezultat. Unitatea de msur poate fi HOUR, MINUTE, SECOND, YEAR, MONTH,
DAY. - DATE_SUB(data, INTERVAL expresie unitate_msur) : analog, dar scade intervalul ADDTIME(data, interval_timp) : adaug intervalul de timp la data specificat. Intervalul de timp poate
fi negativ, ceea ce nseamn efectuarea unei scderi. - SUBTIME(data, interval_timp) : analog, dar
scade intervalul

d.

determinarea sau impunerea formatului de date calendaristice


o

DATE_FORMAT(data, format) : returneaz o reprezentare a datei primite n formatul dorit.Formatul se


specific sub forma unui string ce conine secvena %c, unde c este un caracter. Cteva secvene
utilizate des: %Y - anul pe 4 cifre

%y anul pe 2 cifre

%m luna pe 2 cifre

%c luna pe 1 cifr

%d ziua pe 2 cifre

%e ziua pe 1 cifr

%H ora pe 2 cifre

%k luna pe 1 cifr

%i minutul pe 2 cifre

%s secunda pe 2 cifre

Exemplu:
4.4 Funcii MySQL predefinite de agregare
Funciile simple prezentate pn acum operau pe una sau mai multe valori primite explicit ca parametru. Ele se
aplicau pe fiecare nregistrare a tabelei, producnd o valoare pentru fiecare nregistrare. Rezult un numr de valori
calculate egal cu numrul de nregistrri prelucrate. Se spune c funciile simple prelucreaz valori pe orizontal.
Funciile de agregare realizeaz compunerea valorilor pe vertical, ele opereaz asupra tuturor valorilor de pe o
coloan, returnnd pe baza acestora o singur valoare. Dac o funcie simpl produce o valoare per nregistrare, o
funcie de agregare produce o valoare per grup de nregistrri. Se poate ca un grup s reprezinte toat tabela, i
astfel funcia produce o valoare pentru ntreaga tabel.
Funciile de agregare primesc ca parametru o expresie; valoarea expresiei este evaluat pentru fiecare
nregistrare n parte. Funcia se apeleaz o singur dat i prelucreaz setul de valori, producnd un singur rezultat.
Acest lucru difer de cazul funciilor simple, unde funcia era apelat de un numr de ori egal cu numrul de
nregistrri prelucrate, producnd tot attea valori.
Funciile de agregare se aplic doar instruciunii SELECT, n timp ce funciile simple pot fi folosite i n clauzele
WHERE, ORDER BY.
4.4.1 Funcii matematice

MIN(expresie) : returneaz valoarea minim a expresiei dintre toate valorile rezultate prin evaluarea expresiei
pentru fiecare nregistrare n parte.

MAX(expresie) : analog, returneaz valoarea maxim.

SUM(expresie) : returneaz suma valorilor unei expresii pentru toate nregistrrile unui grup.

AVG(expresie) : returneaz media valorilor unei expresii pentru toate nregistrrile unui grup.

4.4.2 Funcii de numrare

COUNT(*) : returneaz numrul de nregistrri ale unui grup

COUNT(expresie) : returneaz numrul de valori nenule ale expresiei, expresie fiind evaluat pentru fiecare
nregistrare din grup.

COUNT(DISTINCT expresie) : returneaz numrul de valori nenule unice.

4.4.3 Funcii de agregare pentru iruri de caractere

GROUP_CONCAT ( [DISTINCT] expresie [ORDER BY criteriu] [SEPARATOR valoare]) : evalueaz expresia


pentru toate nregistrrile i apoi concateneaz valorile expresiei. Valorile NULL sunt ignorate. naintea
concatenrii valorile pot fi ordonate i se poate specifica un separator.

Exemplu:

4.4.4 Funcii de agregare i gruparea nregistrrilor


Exist cazuri n care dorim s aplicm anumite funcii de agregare pe grupuri de nregistrri i nu pe toate
nregistrrile din tabel. Acest lucru se face cu ajutorul clauzei GROUP BY, urmat de una sau mai multe expresii
separate prin virgul. Astfel nregistrrile vor fi mprite n grupuri, fiecare grup coninnd nregistrrile care produc
aceeai valoare pentru expresiile din GROUP BY; funciile de agregare vor produce o singur valoare pentru fiecare
grup.
Clauza GROUP BY ordineaz nregistrrile dup coloanele menionate. Dac este plasat ntr-o instruciune
SELECT, trebuie plasat dup WHERE i nainte de ORDER BY.
Atunci cnd o instruciune SELECT dispune de GROUP BY. nu are n general sens ca n lista de coloane returnate
s fie i altele dect cele dup care se face gruparea.
Exemplu:

4.4.5 Clauza HAVING


Atunci cnd dorim s restrngem numrul de nregistrri returnate de un SELECT, n general folosim clauza
WHERE. ns, atunci cnd n WHERE avem coloane calculate cu funcii de agregare, nu ami putem folosi WHERE, ci
utilizm clauza HAVING.
Explicaia este urmtoarea: condiiile din WHERE filtreaz rezultatele incluse n setul final returnat de SELECT, dar
funciile de agregare acioneaz abia dup ce au fost alese nregistrrile din setul de rezultate. De aceea nu putem
filtra n WHERE dup o coloana calculat cu funcie de agregare, deoarece aceasta nu exist inc la executarea lui
WHERE. Clauza HAVING filtreaz rezultatele dup aceleai principii, ns acioneaz dup executarea funciilor de
agregare.
Exemplu:

SEM 5 !!!!!

Capitolul V Join-uri
5.1 Conceptul de join
Eficiena sistemelor de baze de date relaionale const n capacitatea lor de a mprti datele n mai multe
tabele i de a genera vederi dinamice asupra acestora prin conectarea tabelelor n diverse moduri. Acest capitol
arat cum MySQL poate fi folosit pentru interogarea simultan a mai multor tabele i combinarea datelor preluate
din acestea. Pn acum am folosit instruciunea SELECT pentru a extrage date dintr-o singur tabel. n realitatea,
interogrile sunt mult mai sofisticate, necesitnd combinarea nregistrrilor din tabele diferite pentru a produce
rezultatul dorit. Un join reprezint o interogare SQL n care sunt manipulate date din mai multe tabele. Cel mai des
ntlnit exemplu este cel al interogrii de tip SELECT care reunete coloanele mai multor tabele. Vom folosi tabelele
studeni i prezene, cu urmtoarea structur i urmtoarele nregistrri:

Un exemplu de join fr clauza WHERE:


Interogarea de mai sus a returnat produsul cartezian ntre cele dou tabele, adic fiecare nregistrare din tabela
studeni a fost afiat alturi de fiecare nregistrare din tabela prezene, rezultnd de fiecare dat o nregistrare care
conine coloanele ambelor tabele. Numrul de nregistrri rezultat va fi egal cu produsul numrului de nregistrri al
ambelor tabele.
Pentru a preciza felul n care se realizeaz corespondena ntre nregistrri, dac ntre tabele exist o relaie, se
folosete clauza WHERE, stabilindu-se o relaie ntre cheia primar din prima tabel i corenpondenta ei cheia
extern din a doua tabel.
Am precizat n acest fel c unei nregistrri din tabela studeni cu un anumit id i corespunde doar nregistrrile
care au aceeai valoare pe coloana student din tabela prezene. Clauza WHERE scris astfel elimin toate perechile
n care coloana comun este NULL. n cazul utilizrii join-urilor se recomand prefixarea fiecrui nume de cmp cu
numele tabelei creia i aparine. Aceasta reduce ambiguitatea atunci cnd se lucreaz cu tabele care au cmpuri cu
denumiri identice. La fel ca la oricare interogare de tip SELECT, rezultatul obinut printr-un join poate conine doar
coloanele necesare i se pot aduga condiii suplimentare pentru filtrarea rezultatelor returnate.
Exemplu:
Folosind funcia COUNT() putem calcula numrul studenilor cu numele Ionescu care au nregistrri n tabela
prezene. Pentru rapiditate, se pot folosi alias-uri pentru tabelele implicate n join.
Exemplu:
5.2 Tipuri de join

cross joins = implic produsul cartezian al tabelelor, care afieaz o tabel cu toate permutrile posibile

inner joins = ntorc toate nregistrrile care au coresponden n toate tabelele

outer joins = ntorc toate nregistrrile corespunztoare unei laturi ale legturii i completeaz spaiile libere
cu NULL

self-joins = implic dublarea unei tabele prin utilizarea alias-urilor, urmat de legarea copiilor cu alte tipuri de
legturi

unions = implic adugarea tuturor nregistrrilor din tabelele implicate pentru a ntoarce drept rezultat suma
compozit a acestora.

5.2.1 Cross joins


Cel mai simplu tip de join este cross join-ul, care multiplic tabelele implicate pentru a crea un rezultat ce include
toate combinaiile ale acestora. (a se vedea primul exemplu, cu instruciunea SELECT fr clauza WHERE). Datorit
dimensiunilor foarte mari a setului de rezultate afiat, aceste legturi diminueaz performana serverului i sunt
folosite rar. Din fericire, ele sunt necesare rareori, i este recomandat s se adauge o clauz WHERE care s filteaze
rezultatele pentru a limita dimensiunea setului rezultat de nregistrri.
5.2.2 Inner joins
Inner joins sunt cele mai folosite tipuri de legturi i cele mai simetrice. Ele necesit o relaie ntre tabelele
implicate i face ca nregistrrile care nu au corespond s fie eliminate din setul final de rezultate. Cel mai folosit tip
de inner join este jonciunea de egalitate equi join, pentru care cmpurile din tabelele legate sunt comparate
folosind operatorul de egalitate (=). Rezultatul final va include doar acele nregistrri care a coresponden n
cmpurile specificate. Exemplu: s se afieze numele studenilor, data la care a avut loc ora respectiv i dac au
fost prezeni sau nu.
Dei mai puin frecvente, legturile de tip inner joins bazate pe inegaliti sunt de asemenea posibile (ele nu intr
n categoria equi-joins).
Exemplu:

Precizarea legturilor se poate face i prin intermediul cuvintelor-cheie INNER JOIN i CROSS JOIN, n locul
virgulei ce desparte numele tabelelor implicate n legtur.
Exemplu:

5.2.3 Outer joins


Am vzut c legturile de tip inner join sunt simetrice, adic pot fi incluse n setul final de rezultate numai
nregistrrile care au corespondent n tabelele legate (cheia extern din a doua tabel s nu fie NULL). nregistrrile
care nu am corespondent (cheia extern corepunztoare este NULL) sunt automat omise din setul de rezultate. Pe
de alt parte, legturile de tip outer join sunt asimetrice, adic toate nregistrrile din tabela care reprezint o parte
a nregistrrii sunt incluse n setul final de rezultate, indiferent dac ele au sau nu corespondent n tabela ce
reprezint cea de-a doua parte a legturii. n funcie de partea legturii pentru care se dorete pstrarea
nregistrrilor, se definete left outer join sau right outer join. Pentru left outer join, toate nregistrrile tabelei din
partea stng a legturii i care corespund clauzei WHERE vor aprea n setul final de rezultate. Analog, pentru right
outer join. Pentru ilustra acest tip de legtura, s-a adugat n tabela prezene o nregistrare care are valoarea NULL
pentru coloana cheie-extern student. (nainte s-a modificat coloana student pentru a putea accepta valori null).
Exemplu: s se afieze toi studenii i pentru fiecare dintre ei data la care a fost prezent la o ora sau valoarea
null dac nu au o prezen corespunztoare.

Exemplu: s se afieze toate prezenele nregistrate i numele studenilor corespunztori sau null dac nu este niciun
student nregistrat pentru prezena respectiv.
Se observ c left outer join-ul afieaz 3 studeni suplimentari, pentru care nu exist prezene nregistrate, iar
right outer join-ul afieaz 1 prezen suplimentar, care nu are un id de student nregistrat.
Termenii left i right sunt interschimbabili. O legtur left se poate transforma ntr-una right i invers prin simpla
inversare a ordinii denumirii tabelelor n clauza FROM.
5.2.4 Self joins
Legturile de tip self join implic legarea unei tabele cu ea nsi i este utilizat atunci cnd se lucreaz cu seturi
de rezultate pentru care valorile cmpurilor conin legturi interne. Pentru a realiza o legtur self join, se aloc
tabelului n cauz dou alias-uri diferite i apoi se construiete o legtur prin clauza WHERE.
5.2.5 Uniuni
n plus fa de legturi, exist i operatorul UNION, utilizat pentru a combina rezultatul mai multor interogri
SELECT ntr-un singur set de rezultate. Cel mai adesea acest operator este folosit pentru a nsuma rezultatele
produse de diferite interogri cu scopul de a crea o tabel unic coninnd toate rezultatele. Putei combina oricte
interogri SELECT cu operatorul UNION, ct timp se respect urmtoarele dou conditii:

numrul de cmpuri returnate de fiecare interogare SELECT trebuie s fie acelai;

tipul datelor corespunztoare fiecrui cmp trebuie s fie acelai.

Exemplu:
SEM 6 !!!!!!!!!!
Capitolul VI Subinterogri, view-uri, tranzacii
6.1 Subinterogri
O subinterogare reprezint o interogare SELECT care este plasat n cadrul alteia, acolo unde este nevoie de o
valoare calculat. O subinterogare trebuie ntotdeauna inclus ntre paranteze rotunde.
Avantaje:

unele interogri complexe care folosesc mai multe tabele i join-uri se pot rescrie mai simplu folosind
subinterogri (se potrivesc mai bine cu logica natural);

prin subinterogri se realizeaz o partiionare a unei interogri complexe n poriuni ce pot fi gndite
independent.

Pentru exemplele din curs vom lucra pe urmtoarele tabele relaionate ntre ele:
Exemplu: s se afieze toi angajaii care au fost angajai n aceeai zi cu Rzvan.
Tipuri de subinterogri
Privind exemplul de mai sus, se observ faptul c subinterogarea trebuie s ndeplineasc o condiie, astfel nct
rezultatele returnate s fie compatibile cu expresia la care particip. Subinterogarea din exemplu trebuie s
returneze un singur rnd, deoarece operandul drept al lui = trebuie s fie o singur valoare, nu o mulime de valori
(n acest caz, nu s-ar tii pe care dintre rezultate s le atribuie operandului stng).
n funcie de numrul de rnduri i coloane returnate, subinterogrile se mpart n:

subinterogri de tip scalar: returneaz o singur valoare (o singur nregistrare ce are o singur coloan).
Rezultatul unei astfel de subinterogri poate fi folosit n locul valorilor constante din expresiile MySQL;

subinterogri de tip list: returneaz mai multe nregistrri, dar cu o singur coloan. Rezultatul lor poate fi
folosit n expresii acolo unde este nevoie de o list de valori (de exmplu, operatul IN);

subinterogri de tip rnd: returneaz un singur rnd cu mai multe coloane. Pot fi folosite pentru a compara
valorile unui rnd cu un set de valori explicit n cadrul instruciunii;

subinterogri de tip tabel: returneaz mai multe rnduri ce au mai multe coloane. Pot fi folosite n locul unei
tabele, ca termen al unui join.

Dintre cele prezentate, primele dou i ultima sunt mai des ntlnite i vor fi discutate n continuare.
6.2.1 Subinterogri de tip scalar
Ele pot fi foloite n expresii SQL oriunde este nevoie de p valoare constant (de exemplu, opeanzi, argumente de
funcii etc). Ele trebuie s returnze o singur nregistrare cu o singur coloan, n caz contrar interogarea va eua.
Exemplu:

dac n tabela angajai avem mai muli din departamentul IT (cu id-ul = 1), subinterogarea returneaz mai
multe rnduri i interogarea eueaz.

dac se ncearc returnarea mai multor coloane n subinterogare, interogarea eueaz.

o interogare corect (subinterogarea returneaz o singur valoare salariu mediu)

6.2.2 Subinterogri de tip list


O subinterogare de tip list produce mai multe nregistrri cu o singur coloan. Rezultatul poate fi folosit n
expresii SQL pe post de valori fie n contexte care implic liste (cum este opartorul IN), fie n alte contexte
(comparaii):
Exemplu pentru operatorul IN: s se afieze detalii despre posturile care sunt ocupate de angajaii din tabela
angajai.

O subinterogare poate fi folosit ca operand al uui operator de comparare, folosind cuvintele cheie ANY, ALL,
SOME:

expresia oprator ALL (subinterogare) returneaz true dac toate valorile returnate de subinterogare se afl n
relaie cu valoarea expresiei din stnga. Exemplu: s se afieze detalii despre angajaii care au salariu mai
mare dect salariile din departamentul cu id-ul 2.

expresia operator ANY (subinterogare) returneaz true dac mcar una dintre valorile returnate de
subinterogare se afl n relaie cu valoarea din stnga operatorului. Exemplu: s se afieze detalii despre
angajaii care au salariu mai mare dect oricare salariu care este mai mic de 1500.

Observaii:

a scrie valoare = ANY (subinterogare) este echivalent cu a scrie valoare IN (subinterogare);

a scrie valoare != ALL (subinterogare) este echivalent cu a scrie valoare NOT IN (subinterogare);

cuvntul cheie SOME este un sinonim pentru ANY.

6.2.3 Subinterogri de tip tabel


Subinterogrile de tip tabel returneaz mai multe rnduri cu mai multe coloane i pot fi folosite n locul unei
tabele n cadrul unui join. n aceste condiii este obligatoriu ca subinterogarea s aib un alias, astfel nct s poat
fi referit.
6.2 Tabele virtuale
O tabel virtual (view) reprezint o interogare SELECT a crei definiie este stocat n baza de date. Ceea ce
difereniaz un view de o tabel real este c el nu conine datele, ci numai specifica modul de acces la date.
Pornind de la datele deja stocate, un view:

poate selecta date dintr-una sau mai multe tabele;

poate prelucra datele;

poate furniza doar un subset al coloanelor din tabela de provenien a datelor, selectnd doar coloanele dorite
n definiia view-ului;

poate furniza doar un subset al rndurilor din tabela de provenien a datelor, aplicnd clauza WHERE
instruciunii SELECT ce efinete view-ul.

Cteva utilizri posibile ale view-urilor:

memorarea n baza de date a interogrilor efectuate des;

regsirea doar a unor informaii din baza de date, fie din motive de securitate (pentru a limita accesul la date
confideniale sau pentru a nu risca modificarea datelor), fie din motive de uurin.

Definirea unui view se face cu ajutorul instruciunii:


CREATE [OR REPLACE] VIEW <nume view> AS <instruciune select>;
Exemplu:
Un view este asociat unei baze de date, el fiind creat automat n baza de date curent. Dac vrem s-l crem n alt
baz de date, specificm numele astfel: nume_baz_de_date.nume_view.
View-urile mpart acelai spaiu cu tabelele din baza de date, de aceea la crearea unui view nu trebuie s existe
deja o tabel cu acelai nume. n cazul n care n baza de date exist deja un view cu acelai nume, clauza OR
REPLACE va determina nlocuirea definiiei acestuia cu noua definiie. Dac exist o tabel cu acelai nume, ea nu va
fi nlocuit, iar crearea view-ului va eua.
Modificarea unui view: singura modificare permis este schimbarea definiiei acestuia. Sintaxa este asemntoare
cu cea de creare, dar se folosete instruciunea ALTER i nu poate fi folosit clauza OR REPLACE:
ALTER VIEW <nume view> AS <instruciune select>;
tergerea unui view se realizeaz cu instruciunea DROP VIEW.
DROP VIEW <nume view1>, <nume view2>, ...;

6.3 Tranzacii
Tranzacia reprezint un set de instruciuni ce se execut atomic:

dac una dintre instruciuni eueaz, se poate readuce baza de date n starea anterioar tranzaciei.

dac toate instruciunile sunt executate corect, se fac modificrile permanente n baza de date (COMMIT).

Tranzaciile sunt folosite pentru a ne asigura c operaiile care implic mai multe interogri nu fac modificri
pariale n baza de date n caz de eroare. Deasemenea, sunt folosite pentru gestionarea accesului concurent la date:
ct timp o tranzacie este n desfurare, modificrile efectuate nu sunt vizibile dect pentru clientul care o
efectueaz.
Serverul MySQL este implicit n modul autocommit (este un caz de tranzacie cu o singur instruciune). A crea o
tranzacie ce conine mai multe instruciuni nseamn a dezactiva modul autocommit i a face manual commit-ul la
terminarea cu succes a tranzaciei.
Modul autocommit poate fi dezactivat n dou moduri:

prin setarea variabilei autocommit pe zero. MySQL nu va produce modificrile permanente dect dup ce
clientul execut explicit COMMIT.

prin folosirea instruciunilor START TRANSACTION sau BEGIN. Dac iniial autocommit-ul era pus pe 1 (adic
se fcea automat), pe durata tranzaciei el devine 0, dup COMMIT el redevine 1.

O tranzacie se poate ncheia n dou moduri:

COMMIT modificrile aduse de instruciunile componente ale tranzaciei devin permanente.

ROLLBACK modificrile aduse de instruciunile componente ale tranzaciei executate pn atunci sunt
anulate.
Observaie: nu se poate face ROLLBACK pentru instruciunile DLL, ci doar pentru DML.
Evenimente care pot cauza COMMIT:

clientul execut explicit COMMIT.

clientul demareaz o nuo tranzacie; ca urmare, tranzaia n desfurare va fi ncheiat


automat cu COMMIT.

clientul execut o instruciune DLL; ca urmare, tranzaia n desfurare va fi ncheiat automat


cu COMMIT.

Evenimente care pot cauza ROLLBACK:

clientul execut explicit ROLLBACK.

clientul se deconecteaz; tranzacia n desfurare va suferi ROLLBACK.


Sem 7 :::::::::::::::::::::

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