Sunteți pe pagina 1din 12

Actualizarea Bazelor de Date SQL este un limbaj complet de manipulare a datelor, utilizat nu numai pentru interogarea bazelor de date

ci i pentru actualizarea acestora. Comparativ cu instruciunea SELECT, care realizeaz interogarea, instruciunile SQL care actualizeaz coninutul unei baze de date sunt extrem de simple. Totui, n ceea ce privete actualizarea bazelor de date apar nite probleme n plus fa de cele prezentate n cazul interogrii. SGBD-ul trebuie s asigure integritatea datelor n timpul operaiilor de actualizare, garantnd c n baza de date vor fi introduse numai date valide i c aceasta rmne ntr-o stare consistent n cazul unei cderi a sistemului. De asemenea, SGBD-ul trebuie s coordoneze accesul simultan la date, garantnd c utilizatorii i actualizrile fcute de acetia, nu interfereaz. Instruciunile utilizate pentru actualizarea bazelor de date sunt urmtoarele: INSERT, care adaug noi linii ntr-o tabel. DELETE, care terge linii dintr-o tabel. UPDATE, care modific datele deja existente n baza de date. Adugarea Datelor n Baza de Date n mod obinuit, o nou linie este adugat ntr-o tabel atunci cnd o nou entitate, reprezentat de linia respectiv, apare n lumea real. Adugarea unei singure linii Instruciunea INSERT pentru adugarea unei singure linii ntr-o tabel conine o clauz INTO i o clauz VALUES. Clauza INTO precizeaz tabela n care va fi adugat noua linie; clauza VALUES specific valorile pe care le vor conine coloanele din linia nou adugat. n continuare sunt prezentate dou exemple de adugare de noi linii n baza de date.

Inserarea valorilor NULL 1

La inserarea unei noi linii ntr-o tabel, SQL atribuie automat valori NULL tuturor coloanelor al cror nume lipsete din lista de selecie a instruciunii INSERT. n urmtorul exemplu, care adaug o linie nou n tabela SALESREPS, coloanele QUOTA i MANAGER sunt omise.

Ca urmare, va fi adugat o nou linie n tabela SALESREPS, cu valori NULL n coloanele QUOTA i MANAGER. Putem face atribuirea valorilor NULL mai explicit, prin includerea acestor coloane n lista de selecie i specificnd apoi valoarea NULL n lista de valori. Urmtoarea instruciune are exact acelai efect ca i precedenta:

Inserarea tuturor coloanelor SQL ne permite s omitem toate coloanele din lista de selecie a instruciunii INSERT. Cnd lista de selecie lipsete, SQL genereaz automat o list de selecie care conine toate coloanele tabelei, n ordine, de la stnga spre dreapta. Este aceeai list de selecie generat de SQL atunci cnd utilizm clauza SELECT *. Utiliznd aceast facilitate, instruciunea precedent poate fi exprimat astfel:

Atunci cnd este omis lista de selecie, trebuie obligatoriu s utilizm cuvntul cheie NULL n lista de valori pentru a atribui explicit valori NULL coloanelor. n plus, secvena de date trebuie s corespund exact secvenei coloanelor tabelei respective. Adugarea mai multor linii A doua form a instruciuni INSERT adaug mai multe linii noi ntr-o tabel. n aceast form a instruciunii INSERT, valorile pentru noile linii nu sunt specificate explicit n interiorul instruciunii. Sursa noilor linii este o interogare a unei baze de date, interogare specificat n instruciunea INSERT.

S se copie toate comenzile vechi (comenzile de anul trecut, 1989) n tabela OLDORDERS.

Aceast instruciune INSERT pare complicat dar n realitate este foarte simpl. Instruciunea identific tabela care va primi noile linii (OLDORDERS) i coloanele care vor primi datele, ca n cazul inserrii unei singure linii. Restul instruciunii este o interogare care extrage date din tabele ORDERS. Figura 5.23 ilustreaz grafic aceast instruciune INSERT. Conceptual, SQL efectueaz mai nti interogarea tabelei ORDERS i apoi insereaz rezultatele interogrii, linie cu linie, n tabela OLDORDERS.

Figura 5.23 n continuare este prezentat o alt situaie n care putem utiliza inserarea mai multor linii. Presupunem c ne intereseaz informaii despre clienii care au fcut comenzi cu valori mari - mai mari dect $15.000 i agenii de vnzri de la care acetia au cumprat. Interogarea respectiv trebuie s combine date din tabelele CUSTOMERS, SALESREPS i ORDERS. Aceast interogare va fi efectuat foarte repede n cazul unei baze de date de dimensiuni mici dar n bazele de date de dimensiuni mari, cu mii de

nregistrri, procesarea poate dura destul de mult. Putem crea o nou tabel, numit BIGORDERS, care s conin datele cerute:

Odat creat tabela BIGORDERS, urmtoarea instruciune INSERT poate fi utilizat pentru a o popula:

tergerea datelor dintr-o tabel n mod obinuit, o linie dintr-o tabel este tears cnd entitatea reprezentat de linia respectiv dispare din lumea real. Instruciunea DELETE Instruciunea DELETE terge liniile selectate dintr-o tabel. Clauza FROM precizeaz tabela din care vor fi terse liniile. Clauza WHERE specific liniile care vor fi terse din tabela respectiv. S se tearg din tabela SALESREPS agentul Henry Jacobsen.

n exemplul precedent, clauza WHERE identifica o singur linie din tabela SALESREPS n vederea tergerii. Condiiile de selecie care pot fi specificate n clauza WHERE a instruciunii DELETE sunt aceleai ca n cazul clauzei WHERE din instruciunea SELECT. Reamintim c o clauz WHERE din instruciunea SELECT poate selecta una sau mai multe linii, n funcie de condiiile de cutare. Acest lucru este valabil i n cazul instruciunii DELETE. n continuare este prezentat un exemplu n care se terg mai multe linii dintr-o tabel. S se tearg din tabela ORDERS toate comenzile efectuate de InterCorp (clientul care are codul 2126).

S se tearg toate comenzile efectuate nainte de 15 Noiembrie 1989.

S se tearg toate comenzile primite de agenii Bill Adams, Mary Jones i Dan Roberts (agenii avnd codurile 105, 109 i 101).

S se tearg acei ageni de vnzri angajai nainte de Iulie 1989 care nu au atribuit nc o cot de vnzri.

tergerea tuturor liniilor dintr-o tabel Clauza WHERE dintr-o instruciune DELETE este opional dar este aproape ntotdeauna prezent. Dac este omis, atunci vor fi terse toate liniile din tabela respectiv. S se tearg toate comenzile.

Dei aceast instruciune DELETE terge toate liniile din tabela ORDERS, ea nu terge tabela din baza de date. Definiia tabelei ORDERS i a coloanelor este stocat nc n baza de date. Tabela exist nc i n ea pot fi adugate noi linii. Pentru a terge o tabel din baza de date se utilizeaz instruciunea DROP TABLE, care va fi prezentat ntr-un paragraf ulterior. DELETE cu subinterogri Instruciunea DELETE cu o condiie simpl de cutare, ca n exemplele anterioare, selecteaz liniile care vor fi terse pe baza interogrii doar a tabelei din care urmeaz a fi terse liniile. Uneori, selecia liniilor n vederea tergerii trebuie fcut pe baza datelor din alte tabele. De exemplu, s presupunem c vrem s tergem toate comenzile preluate de Sue Smith. Fr s cunoatem codul su de angajat, nu putem s determinm aceste comenzi prin interogarea doar a tabelei ORDERS. Pentru a gsi comenzile respective trebuie s interogm dou tabele. S se afieze toate comenzile preluate de Sue Smith.

S se tearg toate comenzile preluate de Sue Smith. Nu putem utiliza un join ntr-o instruciune DELETE. Urmtoarea formulare a instruciunii DELETE este incorect:

Pentru a formula corect aceast interogare trebuie s utilizm o subinterogare n clauza WHERE.

Subinterogarea determin codul de angajat al lui Sue Smith iar clauza WHERE selecteaz apoi comenzile care corespund acestui cod. Aa cum se arat n acest exemplu, subinterogrile pot juca un rol important n instruciunea DELETE deoarece ne permit s tergem linii dintr-o tabel pe baza informaiilor culese din alte tabele. S se tearg clienii al cror reprezentani de vnzri au fcut vnzri mai mici de 80% din cot.

S se tearg toi agenii a cror valoare total a comenzilor primite este mai mic dect 2% din cot.

Subinterogrile din clauza WHERE a unei instruciuni DELETE pot fi imbricate, la fel ca n cazul instruciunii SELECT. De asemenea, pot conine referine externe (ctre coloane din alte tabele dect cele precizate n clauza FROM a subinterogrii). Ca urmare, clauza FROM a instruciunii DELETE funcioneaz la fel ca cea a instruciunii SELECT. n continuare este prezentat un exemplu de tergere care conine o subinterogare cu o referin extern. S se tearg clienii care nu au mai efectuat comenzi din data de 10 Noiembrie 1989.

Conceptual, aceast instruciune DELETE opereaz prin parcurgerea tabelei CUSTOMERS, linie cu linie i verificarea condiiei de selecie. Pentru fiecare client, subinterogarea selecteaz toate comenzile plasate nainte de data limit. Referina la coloana CUST_NUM n subinterogare este o referin extern la numrul clientului din linia curent a tabelei CUSTOMERS (linie care este verificat de instruciunea DELETE). Subinterogarea din acest exemplu este o subinterogare corelat. Referinele externe sunt ntlnite adesea n subinterogrile dintr-o instruciune DELETE deoarece ele implementeaz join-ul dintre tabelele specificate n subinterogri i tabela int (din care urmeaz s fie terse nregistrrile). Modificarea datelor din baza de date n mod uzual, valorile stocate n baza de date sunt modificate atunci cnd se modific valorile corespunztoare din lumea real. Instruciunea UPDATE Instruciunea UPDATE modific valorile uneia sau mai multor coloane din una sau mai multe linii dintr-o singur tabel. Numele tabelei int trebuie specificat n instruciunea UPDATE. Clauza WHERE selecteaz liniile care urmeaz a fi modificate. Clauza SET precizeaz care coloane vor fi modificate i stabilete noile valori ale acestora.

S se mreasc limita creditului pentru AcmeManufacturing la $60.000,00 i s se repartizeze acest client agentului de vnzri Mary Jones (agentul cu numrul 109).

n acest exemplu, clauza WHERE identific o singur linie n tabela CUSTOMERS iar clauza SET atribuie noi valori la dou dintre coloanele acestei linii. Clauza WHERE este exact ca n cazul instruciunilor DELETE sau SELECT. De fapt, condiiile de selecie care pot aprea n clauza WHERE a unei instruciuni UPDATE sunt exact la fel cu cele disponibile n cazul instruciunilor SELECT i DELETE. Ca i n cazul instruciunii DELETE, instruciunea SELECT poate modifica mai multe linii n acelai timp, n funcie de condiia de selecie. S se transfere toi agenii de la biroul din Chicago (biroul cu numrul 12) la biroul din New York (biroul cu numrul 11), i s se micoreze cota de vnzri a acestora cu 10%.

n acest caz, clauza WHERE selecteaz cteva linii din tabela SALESREPS iar valorile coloanelor REP_OFFICE i QUOTA sunt modificate n fiecare dintre acestea. Conceptual, SQL proceseaz instruciunea UPDATE prin parcurgerea, linie cu linie, a tabelei SALESREPS i actualizeaz acele linii pentru care condiia de selecie este TRUE. S se repartizeze toi clienii servii de agenii cu numerele 105, 106 sau 107,agentului cu numrul 102.

S se atribuie o cot de vnzri de $100.000,00 tuturor agenilor care nu au asociat nc o cot.

Clauza SET din instruciunea UPDATE conine o list de atribuiri separate prin virgul. Fiecare dintre aceste atribuiri identific o coloan int care va fi actualizat i precizeaz cum va fi calculat noua valoare pentru aceast coloan. Fiecare coloan int poate s apar o singur dat list; nu pot exista dou atribuiri pentru aceeai coloan. Numele coloanelor pot fi calificate sau nu, dar nu exist nici o ambiguitate n privina numelor acestora deoarece coloanele trebuie s fac parte dintr-o singur tabel (tabela int). Expresia din fiecare atribuire trebuie s fie o expresie SQL valid, de un tip de dat compatibil cu tipul de dat al coloanei respective. Expresia trebuie s poat fi calculat pe baza valorilor liniei curente, care urmeaz s fie actualizate. Expresia nu poate conine funcii la nivel de grup sau subinterogri. Dac o expresie din lista de atribuiri se refer la valoarea unei coloane din tabela int, valoarea folosit la evaluarea expresiei este valoarea coloanei respective nainte de actualizare. Acest lucru este adevrat i n cazul coloanelor care apar n clauza WHERE. De exemplu, s considerm urmtoarea instruciune UPDATE:

nainte de actualizare, Bill Adams avea cota n valoare de $350.000,00 i valoarea vnzrilor de $367.911,00. dup actualizare, linia corespunztoare lui are o valoare a vnzrilor de $350.000,00 nu de $400.000,00. Ordinea atribuirilor n clauza SET este incorect ; aceste atribuiri trebuie specificate n alt ordine. Modificarea tuturor liniilor Clauza WHERE din instruciunea UPDATE este opional. Dac aceasta este omis, atunci vor fi actualizate toate liniile din tabela respectiv, ca n urmtorul exemplu: S se mreasc toate cotele agenilor de vnzri cu 5%.

Spre deosebire de instruciunea DELETE, n care clauza WHERE nu este aproape niciodat omis, instruciunea UPDATE fr clauza WHERE este frecvent utilizat.

10

UPDATE cu subinterogri Ca i n cazul instruciunii DELETE, subinterogrile joac un rol important n cazul instruciunii UPDATE deoarece permit selectarea liniilor ce urmeaz a fi modificate pe baza informaiilor coninute n alte tabele. S se mreasc cu $5.000,00 limita creditului tuturor clienilor care au efectuat comenzi n valoare mai mare de $25.000,00.

S se repartizeze agentului cu numrul 105 toi clienii ai cror reprezentani de vnzri au vnzri mai mici dect 80% din cota lor vnzri.

S se modifice tabela SALESREPS astfel nct toi agenii care sunt reprezentani de vnzri pentru mai mult de trei clieni s -l aib ca manager pe Sam Clark (angajatul cu numrul 106).

Ca i n cazul instruciunii DELETE, subinterogrile din clauza WHERE a instruciunii UPDATE pot fi imbricate la orice nivel i pot conine referine la tabela care urmeaz a fi modificat. Coloana EMPL_NUM din subinterogarea prezentat n exemplul anterior este o astfel de referin extern; se refer la coloana EMPL_NUM din tabela SALESREPS, tabela curent care este verificat de instruciunea UPDATE. Subinterogarea din exemplul anterior este o subinterogare corelat. Referinele externe sunt ntlnite adesea n subinterogrile din instruciunea UPDATE, deoarece acestea implementeaz join-ul dintre tabela (tabelele) din subinterogare i tabela

11

int (care urmeaz a fi modificat). Se aplic aceleai restricii ca i n cazul instruciunii DELETE: tabela int nu poate s apar n clauza FROM a unei subinterogri, indiferent de nivelul de imbricare. Acest lucru previne subinterogarea s se refere la tabela int (unele dintre liniile acestei tabele este posibil s se fi ters deja). Orice referin fcut din subinterogare la tabela int trebuie s fie o referin extern.

12