LIMBAJUL SQL
SQL (Structured Query Language) este unul din cele mai utilizate limbaje structurate
pentru interogarea bazelor de date relaţionale. Peste o sută de sisteme de gestiune a
bazelor de date (SGBD) acceptă şi recunosc limbajul SQL.
Este un limbaj neprocedural şi declarativ, deoarece utilizatorul descrie ce date vrea să
obţină şi nu procedura prin care se ajunge la datele respective. Nu poate fi considerat un
limbaj de programare sau unul de sistem, ci mai degrabă face parte din categoria limbajelor
de aplicaţii.
SQL utilizează o sintaxă simplă, uşor de învăţat. Vocabularul de bază are mai puţin de
100 de cuvinte. În prezent, există mai multe versiuni ale standardului SQL.
Limbajul SQL înglobeaza mai multe componente, dintre care cele mai importante sunt:
componenta de descriere a datelor (LDD - Limbaj de Descriere a Datelor)
(Data Description Language - DDL) - permit descrierea structurii BD;
componenta de manipulare a datelor (LMD - Limbaj de Manipulare a Datelor)
(Data Manipulation Language - DML) - permit consultarea BD.
În limbajul SQL standardizat de ISO nu se folosesc termenii formali de relaţie,
atribut, tuplu, ci tabel, coloană, rând.
Structura lexicală a limbajului SQL
Elementele unei instrucţiuni sunt:
• cuvintele cheie, dintre care fac parte comenzile, operatorii, clauzele -
constituie partea fixă şi se scriu exact cum este necesar;
• identificatorii - cuvinte definite de utilizator reprezintând
denumirile diverselor obiecte din BD;
• constantele;
• caracterele speciale.
Regulile şi convenţiile adoptate în mod universal pentru scrierea instrucţiunilor SQL
sunt:
Majusculele sunt utilizate pentru cuvintele rezervate (SELECT, INSERT,
DELETE, UPDATE, etc.);
Literele mici sunt folosite pentru identificatori (denumiri de tablele, coloane,
câmpuri, etc.);
Valorile literale sunt încadrate între ghilimele;
Valorile de tip dată se trec între simbolul #;
Parantezele pătrate indică un element opţional;
Fiecare instrucţiune se încheie prin caracterul „punct şi virgulă”;
1
Interogarea este obiectul Access prin care se poate obţine:
răspunsul, sub forma tabelară, a unei întrebări pusă bazei de date;
actualizarea unei tabele aparţinând bazei de date (modificari de date, adăugări
sau ştergeri de înregistrari);
sursa de date (dintr-o tabelă sau mai multe) pentru un obiect de tip Forma sau
Raport.
Observație. Numele unei interogări trebuie să fie distinct de numele unui tabel sau al
unei alte interogări existente într-o bază de date, datorită faptului că atât interogările cât și
tabelele pot fi surse de date pentru formulare și rapoarte.
În Access se pot construi interogări:
a) simple, ce pot fi formulate pentru o singură tabelă;
b) complexe, care implică mai multe tabele și/ sau cereri din care sunt extrase
anumite date prin precizarea unor criterii.
Pentru a crea o interogare pas cu pas în modul Design se procedează astfel:
1. Se deschide baza de date. Se acţionează fila Create şi apoi se execută un click pe
Query Design (proiectare interogare) din grupul de instrumente Others. Efectul este afişarea
ferestrei de dialog Show Table (Figura 1. Fereastra Show Table).
Figura 1. Fereastra Show Table
2. Fereastra de dialog Show Table conţine trei fişe:
a. tab-ul Tables în care se afişează lista tuturor tabelelor din baza de date activă;
b. tab-ul Queries în care se afişează lista tuturor interogărilor existente în baza de date
activă;
c. tab-ul Both care afişează lista tuturor tabelelor şi interogărilor din baza de date
activă.
2
3. Se închide fereastra Show Table şi se execută click dreapta pe zona gri de lucru (a
se vedea figura 2) selectând SQL View.
Figura 2. Fereastra Query Design
4. Se introduce codul SQL. Implicit este scris cuvântul cheie SELECT. Atunci când se
execută o altă instrucţiune se şterge cuvântul cheie SELECT şi se adaugă instrucţiunea
corespunzătoare.
Figura 3. Fereastra SQL View
5. Se salvează interogarea creată executându-se un click pe butonul Save, iar în
fereastra Save As se introduce numele interogării create. Se acţionează butonul de comandă
OK. Numele interogării va apărea în fereastra Database (Figura 4.).
3
Figura 4. Atribuirea numelui pentru interogare
6. Se execută interogarea prin acţionarea butonului RUN de pe bara de instrumente
(Figura 5.).
Figura 5. Butonul RUN
7. Rezultatele interogării se pot vizualiza în foaia de răspuns a cererii de
interogare (Figura 6. Rezultatul unei interogări de selecţie realizată în Design View).
Figura 6. Rezultatul unei interogări de selecţie realizată în Design View
Foaia de răspuns care rezultă în urma execuţiei cererii va fi diferită în timp, în funcţie de
starea bazei de date din acel moment. Foaia de răspuns are o existenţă temporară doar pe
4
perioada activării cererii. În mod implicit, câmpurile preluate din tabele/interogări vor avea
acelaşi nume ca la sursă.
Instrucţiunile limbajului SQL
1. Instrucţiuni pentru definirea datelor
Limbajul de definire a datelor permite administratorului bazei de date sau utilizatorului
să descrie şi să denumească entităţile din baza de date precum şi relaţiile ce pot exista între
diferitele entităţi. Limbajul de definire al datelor reprezintă o colecţie de instrucţiuni utilizate
pentru descrierea tipurilor de date. Administratorul bazei de date trebuie să definească structura
bazei de date cu ajutorul acestor tipuri de date. Acesta este utilizat pentru a defini o schemă a
bazei de date sau pentru a modifica una existentă. Rezultatul compilării instrucţiunilor din
limbajul de definire a datelor reprezintă un set de tabele.
Principalele comenzi din limbajul de definire a datelor sunt:
• CREATE – permite crearea structurii unei tabele;
• ALTER – permite modificarea structurii unei tabelei;
• DROP – permite ştergerea unei tabele;
Instructiunea de creare a unui tabel (CREATE TABLE) defineste atributele (coloanele)
tabelului, domeniile atributelor şi diferite constrângeri pe care datele înregistrate (valori ale
atributelor) trebuie să le respecte pentru asigurarea integrităţii (corectitudinii) bazei de date.
Sintaxa generală a acestei instrucţiuni este:
CREATE TABLE nume_tabel (
coloana_1 domeniu_1 [constrangeri_coloana],
coloana_2 domeniu_2 [constrangeri_coloana],
……………………………………………………….,
coloana_n domeniu _n,
[constrangeri_coloana] [constrangeri_tabel] );
Constrângerile impuse fiecărui atribut (coloana), ca şi constrângerile de tabel, sunt opţionale.
Se pot introduce una sau mai multe constrângeri de atribut (coloană) ca:
PRIMARY KEY - defineşte atributul pe care îl însoţeşte ca fiind cheie primară, adică
un identificator unic al tuplului respectiv. Într-o relaţie nu pot exista două sau mai
multe tupluri cu aceeaşi valoare ca a cheii primare. Daăa cheia primară este
compusă (formată din mai multe atribute), atunci constrângerea de cheie primară
se specifică după definirea atributelor, ca o constrângere de tabel;
NOT NULL - specifică fapul că atributul respectiv nu poate lua valori nedefinite
(NULL);
5
DEFAULT - introduce o valoare implicită a atributului respectiv, care va fi
folosită la iniţializarea valorilor unui tuplu nou introdus, atunci când nu se
specifică o valoare pentru acest atribut. În lipsa parametrului DEFAULT,
valorile implicite ale atributelor depind doar de tipul atributului (numerele
reale primesc valoarea implicitpă 0, şirurile de caractere sunt şiruri vide, etc);
FOREIGN KEY necesită ca fiecare valoare din coloană să existe într-o coloană
corespondentă dintr-o tabelă referită. Constrângerea FOREIGN KEY poate face
referire doar la coloane care sunt PRIMARY KEY în tabela referită.
Comenzi pentru crearea tabelelor pot fi utilizate astfel:
1. indicând cheia la nivel de coloană
2. indicând cheile la nivel de tabel
Exemplu 1.
Să se creeze relaţia JUDETE (simbol_judet, nume_judet).
CREATE TABLE JUDETE (simbol_judet CHAR(2) PRIMARY KEY, nume_judet VARCHAR(30));
Exemplu 2.
Să se creeze relaţia LOCALITATI (cod_loc, simbol_judet, nume_loc).
CREATE TABLE LOCALITATI (cod_loc VARCHAR(7), simbol_judet CHAR (2), nume_loc
VARCHAR (50),
PRIMARY KEY (cod_loc, simbol_judet),
FOREIGN KEY (simbol_judet)
REFERENCES JUDETE(simbol_judet));
Instrucţiunile pentru modificarea structurii unei relaţii se pot folosi în una dintre
situaţiile:
a) extinderea schemei relaţiei prin adăugarea de noi atribute;
b) restrângerea schemei unei relaţii prin ştergerea unor atribute;
c) modificarea tipului unui atribut din cadrul relaţiei.
Comanda de extindere a schemei unei relaţii este:
ALTER TABLE nume_tabel ADD nume_câmp tip_dată
Prin intermediul acestei comenzi se adaugă un câmp la un tabel existent. Comanda
de restrângere a schemei unei relaţii prin ştergerea unor atribute este:
ALTER TABLE nume_tabel DROP nume_câmp
Comanda pentru modificarea tipului unui atribut din cadrul relaţiei este:
6
ALTER TABLE nume_tabel ALTER COLUMN nume_nou_câmp tip_nou_dată;
Exemplu 3.
a) Să se adauge atributul „regiunea” la relaţia LOCALITATI.
ALTER TABLE LOCALITATI ADD regiunea VARCHAR(10);
b) Să se restrângă relaţia LOCALITATI prin ştergerea atributului „regiunea”.
ALTER TABLE LOCALITATI DROP regiunea;
c) Să se modifice tipul atributului „pret_unitar” din tabela PRODUSE din INTEGER în
DOUBLE.
ALTER TABLE PRODUSE ALTER COLUMN pret_unitar DOUBLE ;
Ştergerea unei tabele se face cu comanda DROP TABLE. Sintaxa acestei comenzi
în limbajul SQL standard este:
DROP TABLE nume_tabelă
Exemplu 4.
Să se şteargă relaţia LOCALITATI.
DROP TABLE LOCALITATI;
2. Instrucţiuni pentru manipularea datelor (DML)
DML-ul permite executarea de interogări, actualizări, inserări şi ştergeri de tupluri.
Principalele instrucţiuni:
• INSERT INTO - pentru adăugarea de noi linii într-o tabelă;
• UPDATE - pentru modificarea valorilor memorate într-o tabelă;
• DELETE - pentru ştergerea liniilor dintr-o tabelă;
• SELECT - permite regăsirea liniilor memorate în tabelele bazei de date.
Interogările de tip INSERT sunt folosite pentru adăugarea de înregistrări dintr-un
tabel în altul. Există două forme ale instrucţiunii şi anume:
• INSERT ... VALUES
• INSERT ... SELECT
a) In primul caz se adaugă o singură înregistrare într-un tabel, menţionându-se
câmpurile şi valorile acestora. Se utilizează pentru operaţii simple, care presupun lucrul cu
un număr redus de înregistrări.
INSERT INTO nume_tabel (câmp1, câmp2...) VALUES (valoare1, valoare2...);
Reguli:
7
• valorile din clauza VALUES vor avea aceeaşi natură cu câmpurile din clauza INTO
• mărimea valorii va fi < dimensiunea câmpului
• corespondenţă între câmp1 şi valoare1, etc.
• dacă un câmp are specificaţia NOT NULL, este obligatorie introducerea unei
valori pentru aceasta
b) În al doilea caz, este posibil să se copieze mai multe înregistrări dintr-un tabel în
unul sau mai multe tabele.
INSERT INTO tabel_destinaţie (câmp1, câmp2...) SELECT [domeniu] câmp1,
câmp2... FROM tabel_sursă WHERE criteriu_de_adăugare;
Reguli:
• aceleaşi ca mai sus
• numărul şi natura câmpurilor din clauza INTO să fie aceleaşi cu cele returnate
de instrucţiunea SELECT
• dacă nu se introduce WHERE, toate înregistrările din tabel_sursă vor fi adăugate
în tabel_destinaţie
Între valori si numele de coloane trebuie să existe o corespondenţă unu la unu. Lista
de coloane poate să lipsească, dacă se introduc valori în toate coloanele tabelului, dar în
aceasta situaţie ordinea valorilor introduse trebuie să respecte ordinea atributelor.
Exemplu 5.
a) Să se adauge în relaţia Județe județul cu simbolul de județ BV și numele Brașov.
INSERT INTO Judete VALUES ('BV', 'Brasov');
b) Să se adauge în relaţia Localitati localitatea Săcele cu codul 507412 şi simbolul de judeţ
BV.
INSERT INTO Localitati VALUES (507412,'BV', 'Săcele');
c) Să se adauge în relaţia Localitati localitatea cu codul 507400 și simbolul de judet BV.
INSERT INTO Localitati (cod_loc, simbol_judet) VALUES (507400, 'BV');
d) Să se adauge în relaţia Salariati codul angajatului şi numele din relaţia Angajati.
INSERT INTO Salariati (cod_angajat, nume )
SELECT Angajati.cod_angajat, [Link]
FROM Angajati;
Interogările de tip UPDATE pot modifica valorile câmpurilor din înregistrări existente.
Sintaxa instrucţiunii este:
UPDATE nume_tabel SET nume_câmp1=valoare1 [,nume_câmp2=valoare2]...
[WHERE criteriu_de_actualizare];
Efectul acestei comenzi este de actualizare a tuturor liniilor care îndeplinesc condiţia
din clauza WHERE, sau a tuturor liniilor din tabelă, în cazul în care lipseşte această clauză.
Noile valori sunt date de clauza SET.
Exemplu 6.
Să se actualizeze relaţia Localitati completând numele localității cu Făgăraş pentru
localitatea cu codul 507400.
UPDATE Localitati SET nume_loc='Făgăraş' WHERE cod_loc=507400;
Instructiunea DELETE permite ştergerea uneia sau mai multor linii dintr-un tabel şi
are următoarea sintaxă:
DELETE FROM nume_tabel [WHERE conditie];
Din tabel se şterg acele linii care îndeplinesc condiţia dată în clauza WHERE. Dacă este
omisă clauza WHERE, atunci vor fi şterse toate liniile din tabel.
Exemplu 7.
Să se şteragă înregistrarea cu codul localitatii egal cu 507400.
DELETE FROM LOCALITATI WHERE cod_loc=507400;
Copierea structurii şi a datelor unei tabele
a) Copiază structura unui tabel existent (fără înregistrări) într-un tabel nou
SELECT * INTO tabel_nouaFROM tabel_vechi WHERE 1=2
b) Copiază structura şi datele dintr-un tabel existent într-un tabel nou
SELECT * INTO tabela_noua FROM tabela_veche
Exemplu 8.
Să se copieze structura tabelei Clienti într-o tabelă care se va numi Clienti_copie.
SELECT * INTO Clienti_copie FROM Clienti WHERE 1=2;
Exemplu 9.
Să se copieze structura şi datele tabelei Clienti într-o tabelă care se va numi Clienti_copie2.
SELECT * INTO Clienti_copie2 FROM Clienti;
Instrucţiunile de selecţie reprezintă una din categoriile cele mai importante ale
limbajului SQL ACCESS. Indiferent dacă sunt cereri simple sau complexe, cuvântul cheie este
SELECT. Pentru cererile de interogare simple, sintaxa instrucţiunii este:
SELECT [domeniu] listă_selecţie FROM
nume_tabel1, nume_tabel2,…
[WHERE criteriu_selecţie]
[ORDER BY câmpuri_criteriu [ASC|DESC]];
Domeniu
Specifică o opţiune de includere sau eliminare din rezultatul selecţiei, a înregistrărilor
care conţin duplicate. Opţiunile posibile sunt:
ALL cere includerea tuturor înregistrărilor care îndeplinesc condiţiile impuse.
Cum instrucţiunile SELECT tabel şi SELECT ALL tabel au acelaşi rezultat practic,
calificativul ALL este rar folosit.
DISTINCT cere eliminarea înregistrărilor care conţin duplicate în câmpurile
selectate, afişând numai o apariţie a acesteia.
DISTINCTROW cere eliminarea înregistrărilor care conţin duplicate în
ansamblullor, nu numai în câmpurile selectate, afişând numai o apariţie a
acesteia.
apară în tabelul cu rezultatele interogării. Similar
Listă_selecţie cuprinde câmpurile care dorim să
cu Field … Show …din grila de proiectare QBE.
Clauza FROM specifică numele tabelului sau tabelelor pe care se face cererea de
interogare. Pentru mai multe tabele, numele acestora se separă cu „ , ” (virgulă). Pe
lângă tabele, ca sursă de informaţii pot apărea şi interogări deja create.
Clauza WHERE cere numai înregistrările care îndeplinesc criteriul de selecţie specificat.
Criteriul de selecţie este o expresie care conţine obligatoriu şi un operator adecvat
tipului de dată al câmpului respectiv. Clauza WHERE este opţională.
Clauza ORDER BY cere ordonarea în mod crescător (ASC) sau descrescător (DESC) a
rezultatelor interogării.
Ordonarea este opţională şi se poate face după unul sau mai
multe câmpuri_criteriu.
Exemplu 10.
Să se afişeze toate localitatile din judetul Brasov.
SELECT nume_loc FROM LOCALITATI
WHERE simbol_judet='BV';