Notiuni fundamentale despre bazele de date si SQL (2)

1. Acordarea si revocarea privilegiilor de acces

Când un utilizator încearca sa obtina acces la o baza de date relationala, aplicatia care gazdueste baza de date (in cazul nostru MySQL) verifica daca utilizatorul are permisiunea de a executa operatia. Administratorul de sistem poate folosi comanda MySQL "GRANT" pentru a autoriza un utilizator sa obtina accesul la un tabel din baza de date. Comanda are urmatoarea forma:

Unde "tabel" este numele tabelului, "utilizator" este numele contului de utilizator, iar "parola" este parola pe care o va furniza utilizatorul pentru a-si proba identitatea.
Alternativ, administratorul de sistem poate autoriza un utilizator sa obtina acces la orice tabel dintr-o baza de date specificata, folosind urmatoarea forma a comenzii "GRANT": De exemplu, comanda urmatoare autorizeaza pe utilizatorul "Marius" sa obtina acces la toate tabelele din baza de date numita "testdb", ori de câte ori utilizatorul furnizeaza parola "mypassword":
GRANT ALL ON testdb.* TO Marius IDENTIFIED BY ’mypassword’;
Comanda "REVOKE" se poate folosi pentru retragerea privilegiilor acordate anterior, interzicerea accesului.
Comanda are urmatoarele forme: De exemplu, pentru a revoca toate privilegiile (din toate bazele de date) utilizatorului "tip_rau", scrieti comanda:
REVOKE ALL ON *.* FROM tip_rau;
Comanda "GRANT" are si o forma mai complexa pentru a autoriza accesul numai la anumite coloane specificate. Forma avansata a acestei comenzi este: - Unde "privilegiu" este privilegiul care urmeaza a fi extins, "coloane" sunt coloanele carora li se aplica privilegiul, iar "tabel", "baza_de_date", "utilizator" si "parola" au semnificatiile cunoscute.
Sunt permise si forme similare ale comenzii REVOKE: Între privilegiile posibile se numara urmatoarele: De exemplu, pentru a permite unui utilizator sa obtina accesul la o coloana, fara a o modifica, puteti folosi o secventa de comenzi similara cu urmatoarea:
REVOKE ALL ON carte FROM Marius;
GRANT
    SELECT(carteid, titlu, pret),
    INSERT(carteid, titlu, pret),
    UPDATE(carteid, titlu, pret)
    ON carte TO php IDENTIFIED BY 'mypassword';
REVOKE INSERT(pret) ON carte FROM Marius;
REVOKE UPDATE(pret) ON carte FROM Marius;
- Prima comanda revoca toate privilegiile de la nivelul tabelului; în caz contrar, aceste privilegii le vor elimina pe cele situate la nivel de coloana.
Pentru a vedea privilegiile acordate unui anumit utilizator, folositi urmatoarea comanda: Caracteristica privilegiilor furnizata de MySQL este mai sofisticata si furnizeaza mult mai multe optiuni. Pentru mai multe informatii, consultati manualul SQL de la adresa www.mysql.com

2. Accesul la datele dintr-o baza de date, interogarile SQL

În afara de Data Definition Language, SQL include Data Manipulation Language (DML). DML va permite sa formati interogari, care obtin accesul la datele aflate într-o baza de date relationala si raporteaza aceste date. De asemenea, puteti folosi DML pentru a insera, actualiza si sterge rândurile dintr-un tabel.
Cea mai elementara forma de interogare este comanda "SELECT" simpla.
Cea mai simpla interogare raporteaza toate coloanele din toate rândurile unui tabel. Interogarea are urmatoarea forma:

- Unde "tabel" este numele tabelului la care se va obtine accesul.
Aceasta comanda va afisa un tabel cu fiecare rând pe o linie separata. Datele de iesire includ numele coloanelor si linii care separa coloanele.
Daca doriti sa selectati numai anumite coloane sau sa raportati coloanele într-o anumita ordine, puteti folosi urmatoarea forma a comenzii "SELECT": - Unde "tabel" este numele tabelului, iar "coloana1" si "coloana2" sunt coloanele la care se va obtine accesul si al caror continut va fi afisat.
Puteti specifica mai multe coloane, separate prin virgula.
Daca vreti sa fie selectate numai acele rânduri care satisfac un anumit criteriu, clauza "WHERE" va permite sa specificati o conditie; rândurile care nu satisfac conditia nu sunt raportate.
De exemplu, iata o interogare care raporteaza un singur rând:
SELECT titlu, pret FROM carte WHERE carteid=1;

Forma conditiilor folosite în sub-limbajul DML al limbajului SQL este similara cu aceea a conditiilor PHP. Puteti folosi oricare din urmatorii operatori relationali: Puteti compara valoarea unei coloane cu aceea a altei coloane, respectiv valoarea unei coloane cu o valoare string. Valorile string SQL (sirurile) trebuie sa fie incluse între ghilimele simple, nu între ghilimelele duble.

Când unei coloane nu i-a fost repartizata nici o valoare, SQL îi atribuie valoarea speciala NULL. De asemenea, programatorii pot atribui în mod explicit valoarea NULL unei coloane.
Comparatiile obisnuite cu valori NULL, care folosesc operatorii de (in)egalitate, vor returna un rezultat fals. Totusi, puteti folosi operatorul special "<=>". care compara valorile tinând cont de valoarea NULL. Daca folositi acest operator pentru a compara doua valori NULL, se obtine un rezultat adevarat.

SQL include si numerosi operatori de comparatie non-algebrici:

Operator Descriere
x BETWEEN y AND z Adevarat, daca valoarea lui x este cuprinsa între valorile lui y si z
x LIKE y Adevarat daca valoarea lui x este echivalenta cu modelul y
x NOT LIKE y Adevarat daca valoarea lui x nu este echivalenta cu modelul y
x IN (y1, y2) Adevarat daca valoarea lui x este un membru al listei y1, y2. Lista poate contine unul, doi sau mai multi membri
x NOT IN (y1, y2) Adevarat daca valoarea lui x nu este un membru al listei y1, y2. Lista poate contine unul, doi sau mai multi membri
x IS NULL Adevarat daca x are valoarea NULL
x IS NOT NULL Adevarat daca x nu are valoarea NULL
Sub-limbajul folosit pentru specificarea modelelor asociate operatorului "LIKE" este diferit de cel folosit de PHP. Meta-caracterul "%" corespunde unui numar de zero sau mai multe caractere, iar meta-caracterul "_" corespunde unui singur caracter.
Modelele, precum sirurile, sunt incluse între ghilimele simple.
- De exemplu, modelul '%ar%' corespunde oricarui sir care contine sub-sirul 'ar', inclusiv siruri precum 'ar', 'arc' si 'un zar'.
Pentru a plasa un caracter "%" sau "_" într-un sir test, folositi secventa "\%" sau "\_"; ca în PHP.
Ca si PHP, sub-limbajul DML din SQL va permite sa formati expresii logice care combina expresiile relationale. Puteti folosi oricare din urmatorii operatori logici: De exemplu, urmatoarea interogare raporteaza rândurile care au pretul de carte mai mare decât 11 sau al caror titlu include sub-sirul 'Curs':
SELECT titlu, pret FROM carte
    WHERE pret>11 OR titlu LIKE ’%Curs%’;

Pentru a compara o valoare cu o expresie regulata în MySQL, folositi urmatoarea forma:
x REGEXP y, unde "x" este valoarea care va fi testata, iar "y" este o expresie regulata, delimitata prin ghilimele simple.

3. Modificarea datelor dintr-o baza de date

Sub-limbajul SQL, Data Manipulation Language, include comenzi care va permit sa inserati rânduri noi într-un tabel, sa actualizati una sau mai multe coloane ale rândurilor existente, respectiv sa stergeri rânduri dintr-un tabel.
Pentru a insera un nou rând într-un tabel, folositi comanda "INSERT", care are urmatoarea forma:

- Unde "tabel" este numele tabelului la care se va adauga rândul.
- "valoare1" este valoarea pentru prima coloana din tabel, iar "valoare2" este valoarea celei de-a doua coloane din tabel. Se pot da mai mult sau mai putin de doua valori; numarul valorilor date ar trebui sa fie egal cu acela al coloanelor din tabel.
O coloana poate primi si valoarea "NULL", cu exceptia situatiilor când definitia coloanei nu permite.
O forma mai buna (si recomandata) a comenzii INSERT specifica numele coloanelor carora le sunt atribuite valorile: Unde coloana denumita "coloana1" primeste valoarea "valoare1", iar coloana denumita "coloana2" primeste valoarea "valoare2".
Pot fi specificate mai mult sau mai putin de doua coloane si valori. Numarul coloanelor specificate trebuie sa fie egal cu numarul valorilor specificate.
Coloanele care nu sunt denumite în comanda "INSERT" si care nu au o valoare prestabilita (DEFAULT) primesc valoarea NULL, cu exceptia situatiilor când valoarea respectiva nu este permisa (în acest caz, comanda INSERT esueaza).
Daca doriti sa adaugati mai multe randuri intr-un tabel, intr-o singura inserare, puteti folosi urmatoarea forma a comenzii INSERT:
Pentru a modifica valoarea unui rând sau mai multor rânduri existente într-un tabel, folositi o comanda "UPDATE", care are urmatoarea forma: - Unde "tabel" este numele tabelului ale carui rânduri urmeaza sa fie modificate, "coloana1" este numele primei coloane care urmeaza a fi modificata, "valoare1" este valoarea care va fi repartizata în "coloana1", "coloana2" este numele celei de-a doua coloane care urmeaza a fi modificata, "valoare2" este valoarea care va fi repartizata în "coloana2", iar "conditie" identifica rândul sau rândurile care urmeaza a fi actualizate, dupa o anumita conditie.
Poate fi actualizat un numar mai mare sau mai mic de coloane. Daca se doreste ca toate randurile coloanei sa fie actualizate, clauza "WHERE" poate fi omisa.
De exemplu, comanda urmatoare modifica din coloana "titlu" numele asociat cartii in "Curs2", in randul unde coloana "pret" are valoarea 5.
UPDATE carte SET titlu=’Curs2’
    WHERE pret=5;

Pentru a sterge un rând dintr-un tabel, folositi comanda "DELETE", care are urmatoarea forma: Daca se vrea a fi sterse toate rândurile tabelului, clauza WHERE poate fi omisa.
De exemplu, comanda urmatoare sterge rândul din tabelul "carte" asociat titlului "Curs2":
DELETE FROM carte WHERE titlu='Curs2';

4. Sortarea si gruparea

Deseori, este important ca datele sa fie raportate într-o anumita secventa. Puteti specifica ordinea de raportare a rezultatelor interogarii folosind clauza "ORDER BY", care are urmatoarea forma:

Daca se vor folosi mai multe câmpuri de sortare, acestea vor fi separate prin virgula.
Daca doriti sa indicati o sortare descendenta, în locul uneia ascendente, specificati "DESC" dupa valoare.
De exemplu, pentru a ordona toate cartile în functie de pret, de la cel mai mare la cel mai mic, respectiv dupa titlu pentru un pret egal, puteti folosi urmatoarea interogare:
SELECT pret, titlu FROM carte
    ORDER BY pret DESC, titlu;
Pentru a include numai titlurile care au un pret mai mare de 50, adaugati o clauza WHERE la comanda SELECT:
SELECT pret, titlu FROM carte
    WHERE pret>50
    ORDER BY pret DESC, titlu;

SQL include functii care va permit sa raportati valori diferite, valori utile, precum un numar al rândurilor tabelului. Iata cele mai importante functii in acest sens:
Functie Descriere
count(*) - Numarul rândurilor din tabel
count(coloana) - Numarul rândurilor din tabel care contin o valoare diferita de NULL în coloana specificata
count(distinct coloana) - Numarul valorilor distincte diferite de NULL care apar în coloana specificata
avg(coloana) - Valoarea mijlocie (medie) a coloanei numerice specificate
min(coloana) - Valoarea minima din coloana specificata
max(coloana) - Valoarea maxima din coloana specificata
sum(coloana) - Suma valorilor din coloana specificata
De exemplu, interogarea urmatoare raporteaza numarul cartilor si pretul mediu al acestora:
SELECT count(*), avg(pret) FROM carte;
- Datele de iesire vor fi afisate pe o singura linie.
Clauza SQL "AS" specifica un nume nou pentru o coloana sau expresie. Numele specificat este folosit ca titlu în rapoartele SQL. Clauza "AS" este utila în lucrul cu functiile din tabelul anterior, va ajuta sa identificati mai usor datele de iesire.
De exemplu, interogarea precedenta poate fi rescrisa pentru a include o clauza "AS", astfel:
SELECT count(*) AS Carte_Numar,
    avg(pret) AS Pret_Mediu
    FROM carte;
O alta clauza utila este "GROUP BY", aceasta are urmatoarea forma: - Unde "coloana-sortare" este numele sau valoarea unei coloane, specificata într-o clauza "ORDER BY", care trebuie sa urmeze dupa clauza "GROUP BY".
De exemplu, avem un tabel "carte" cu 4 coloane (carteid, titlu, anul si pret), interogarea urmatoare raporteaza numarul cartilor si pretul mediu pentru fiecare an (anul) în parte:
SELECT count(*), avg(pret) FROM carte
    GROUP BY anul
    ORDER BY anul;
Pentru a include în datele de iesire numai grupurile selectate, specificati clauza "HAVING" imediat dupa clauza "GROUP BY". Clauza "HAVING" are urmatoarea forma: De exemplu, pentru a include numai cartile al caror atribut "anul" are valoare mai mare decât 1980, srieti urmatoarea interogare:
SELECT count(*), avg(pret) FROM carte
    GROUP BY anul
    HAVING anul>1980
    ORDER BY anul;
Mai jos sunt afisati operatorii matematici folositi in SQL:
Notiuni fundamentale despre bazele ... <<-- Anterior --- Urmator -->> Baze de date SQL ...

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Ce tag adauga imagine in pagina web?
<div> <img> <span>
<img src="http://coursesweb.net/imgs/webcourses.gif" width="191" height="63" alt="Courses-Web" />
Care din aceste coduri CSS afiseaza textul inclinat?
font-style: italic; text-decoration: underline; font-weight: 500;
#id {
  font-style: italic;
}
Clic pe functia jQuery care ascunde animat un element HTML.
click() hide() show()
$(document).ready(function() {
  $(".a_class").click(function(){ $(this).hide("slow"); });
});
Clic pe functia definita corect in PHP.
fname function() {} function fname() {} function $fname() {};
function fname($a, $b) {
  echo $a * $b;
}
Indicati forma pentru Prezent Perfect Continuu a verbului "to walk" (a merge).
have walked have been walking be walking
I have been walking for 5 hours.
- Merg pe jos de 5 ore.
Indicati Trecutul Nedefinit pentru verbul "ser" (a fi) la forma Yo.
será sería fui
Yo fui entrenador.
- Am fost antrenor.
Baze de date SQL 2 - Tutorial PHP