Documente Academic
Documente Profesional
Documente Cultură
Avnd n vedere posibilitile unui calculator legate de parcurgerea fiierelor, s-ar prea c vor putea fi realizate uor o mulime de rapoarte. n timpul exploatrii pe calculator a fiierului s-au depistat ns probleme cauzate de modul de structurare a informaiilor. 1. Anomalia la actualizarea datelor: Conducerea bibliotecii a impus ca numele autorului s fie scris cu majuscule. Pentru autorii mai puin prolifici nu e nici o problem, dar unii se regsesc n fiier de zeci sau chiar sute de ori. Modificarea n sute de locuri a aceluiai nume poate conduce la erori greu de depistat. Aceast anomalie poart numele de anomalia la actualizare. Pentru eliminarea ei, modelul relaional propune structurarea informaiilor n dou tabele: un tabel cu numele autorilor i un tabel cu cri: CodAutor Autor
NrInv
CodAutor
Titlu
Editura
Locul
Anul apariieie
2
n momentul nregistrrii unei cri, dac autorul exista deja n tabelul de autori, i se noteaz codul care apoi este folosit la nregistrarea crii. Dac autorul nu exist n fiierul de autori, el va fi adugat, n momentul adugrii atribuindu-se un cod. n acest mod, modificarea numelui autorilor se realizeaz simplu, numele fiecrui autor aprnd o singur dat. 2. Anomalia la tergerea datelor: Aceast anomalie poate aprea dac se cere tergerea din fiierul de cri a nregistrrii corespunznd unei cri pierdute. Odat cu titlul crii se terge i editura care a publicat-o. Ulterior, dac se dorete realizarea unui raport privind editurile cu care biblioteca are relaii, n raport nu va mai figura editura care a realizat cartea suprimat. Acest anomalie poart numele de anomalia la tergerea datelor. 3. Anomalia la adugarea datelor: Dac se dorete nregistrarea n baza de date a bibliotecii a datelor unei noi edituri, n modelul elaborat acest lucru nu este posibil fr adugarea unei prime cri achiziionate de la aceasta. Dac nu s-a cumprat nici o carte, baza noastr prezint o anomalie la adugarea datelor.
Normalizarea
Modelul relaional elaborat de Codd propune soluii pentru eliminarea acestor anomalii. Procesul de structurare a bazei de date n vederea eliminrii anomaliilor sesizate poart numele de normalizare. Normalizarea const n aducerea bazei de date ntr-una dintre formele normale, cele mai importante fiind cele 3 forme prezentate n continuare. 1. Prima form normal Prima form normal cere ca tabelele n care sunt pstrate informaiile s satisfac urmtoarelor cerine: a. Fiecare coloan trebuie s pstreze o informaie elementar (care nu se mai poate descompune). n exemplul prezentat, dac o carte are mai muli autori coloana CodAutor ar trebui s conin mai multe coduri, deci acest mod de structurare nu respect aceast cerin. b. Fiecare coloan trebuie s aib un nume unic; c. Tabelul nu poate avea dou linii coninnd informaii identice. Fiecare tabel din componena unei baze de date normalizate conine o cheie primar. O cheie primar este un cmp care are valori distincte pentru toate liniile tabelului. Uneori, mai rar, cheia primar este obinut prin alturarea valorilor dintr-un ansamblu de mai multe cmpuri. Pot exista n baza de date tabele care nu au o cheie primar. Tabelele pentru care s-a definit o cheie primar respect, de regul, cerina enunat.
3
d. ntr-un tabel nu se admit grupuri de informaii care se repet. n exemplul dat Editura i Locul formeaz un grup care probabil se repet pentru toate crile provenind de la aceeai editur. 2. A doua form normal A doua form normal se refer la tabelele care au o cheie compus din valorile mai multor cmpuri. Astfel, n exemplul dat dac datele editurii sunt pstrate ntr-un tabel separat avnd structura: NumeEd Oras Adresa NumeScurt Telefon
atunci adugarea unui nou sediu pentru o editur va face ca valoarea din coloana "NumeScurt" s apar repetat, deoarece ea nu depinde de sediul editurii ci de numele acesteia. Pentru a satisface cerinele celei de-a doua forme normale, coloanele unui tabel trebuie s depind direct de toate cmpurile care formeaz o cheie primar compus. 3. A treia form normal A treia form normal rezolv anomalia care apare n cazul n care ntr-un tabel exist una sau mai multe coloane ale cror valori nu depind direct de valoarea cheii primare. n exemplul dat, s presupunem c n tabelul n care sunt nregistrate crile exist o coloan care conine numele furnizorului (firma prin care s-a achiziionat cartea). Cu siguran c prin acelai furnizor s-au achiziionat i alte cri, deci numele acestuia va aprea pe mai multe linii deoarece furnizorul nu depinde direct de carte. Coloanele unui tabel care satisface a treia form normal conin informaii care depind direct de cheia primar.
cod editur
CodE
Edituri editura
NrInv
CodA
Titlu
CodE
Anul Carti
Acest tip de relaie este cel mai frecvent ntlnit i st la baza modelului relaional elaborat de Codd. Cheile primare din cele dou tabele sunt CodE pentru Edituri i NrInv pentru Cri. n tabelul de cri, CodE i CodA (cod autor) sunt chei strine. O cheie strin dintr-un tabel A permite regsirea unei linii dintr-un tabel asociat, B. n tabelul asociat, B, cheia strin din tabelul A este de regul cheie primar. n cazul dat, cheia strin CodA permite regsirea n tabelul de autori a numelui acestuia iar cheia strin CodE permite gsirea numelui editurii care a publicat cartea. 2. Relaii 1 la 1 (one to one) O relaie de tipul 1 la 1 apare n cazul n care unei linii dintr-un tabel i corespunde o singur linie n tabelul cu care acesta este n legtur. n cazul n care fiecrei nregistrri dintr-un tabel i corespunde o nregistrare n al doilea tabel nu este necesar nregistrarea informaiilor n dou tabele separate. 3. Relaii mai muli la mai muli (m la n, many to many) O relaie de acest tip apare n exemplul dat ntre tabela de autori i cea de cri. Astfel un scriitor poate fi autor la mai multe cri iar o carte poate avea mai muli autori (CodA_2 respectiv NrInv_3 de exemplu). n astfel de situaii se va proceda la crearea unui tabel suplimentar, de legtur, care va transforma relaia evideniat (many to many) n relaii one to many. Fiecare articol din tabelul de legtur va conine o pereche de chei strine, una fiind cheie primar n primul tabel i una n al doilea tabel:
Autori
CodA_1 CodA_2 CodA_3 CodA_4 CodA_5 CodA_6 CodA_7
Cri
NrInv_1 NrInv_2 NrInv_3 NrInv_4 NrInv_5 NrInv_6 NrInv_7 NrInv_8 NrInv_9
Autori
CodA_1 CodA_2 CodA_3 CodA_4 CodA_5 CodA_6 CodA_7
Tab. de legtur
CodA_2 CodA_2 CodA_3 CodA_6 CodA_2 NrInv_1 NrInv _3 NrInv _3 NrInv _3 NrInv _8
Cri
NrInv _1 NrInv _2 NrInv _3 NrInv _4 NrInv _5 NrInv _6 NrInv _7 NrInv _8 NrInv _9
Dup lansarea n execuie a interpertorului este necesar conectarea la serverul Oracle XE printr-o comand connect, ca n exemplul urmtor, dup care pot fi introduse comenzi. Comenzile SQL pot fi introduse pe mai multe linii, marcarea sfritului introducerii unei comenzi realizndu-se printr-un caracter '/'.
Comenzile introduse n fereastra SQL Commands pot fi terminate prin ';' ca n MySQL de exemplu sau se poate chiar omite caracterul terminal. Astfel pentru suprimarea tabelului cafea se poate scrie: drop table cafea; sau pur i simplu drop table cafea efectul fiind acelai. Comenzile SQL pot fi memorate individual apsnd butonul Save:
Indiferent de tip, la declararea unui cmp trebuie precizat lungimea: nume varchar2(50) Pentru VARCHAR2 lungimea specificat este cea maxim admis n timp ce pentru CHAR ea va fi efectiv utilizat, irurile de lungime mai mic fiind completate la dreapta cu spaii. Rezult c VARCHAR2 este mai eficient, n exemplele prezentate n continuare acest tip fiind utilizat sistematic.
b. Date numerice
Datele numerice pot fi declarate n Oracle folosind unul dintre tipurile urmtoare: NUMBER - pentru numere zecimale, BINARY_FLOAT - pentru numere reale (memorate fr conversie n baza 10) BINARY_DOUBLE- pentru numere (memorate fr conversie). reale n dubl precizie
Cel mai frecvent se folosete tipul NUMBER. Pentru declararea unei date de tip NUMBER se poate scrie: inaltime number(3)
10
sau, inaltime number(3,0) Pentru numere care au o parte ntreag i una zecimal se scrie: pret NUMBER(7,2) nsemnnd reprezentarea cmpului pret folosind 7 poziii zecimale, ultimele dou fiind folosite pentru partea real. Exemple: Numr
123 . 8 9 123 . 8 9 123 . 8 9 123 . 8 9 123 . 8 9 123 . 8 9
Declarai e
NUMBER NUMBER(3) NUMBER(6,2) NUMBER(6,1) NUMBER(3) NUMBER(4,2)
Valoare memorat
123 . 8 9 124 123 . 8 9 123 . 9
BINARY_FLOAT i BINARY_DOUBLE sunt tipuri recomandate n cazul n care datele astfel reprezentate sunt folosite la calcule mai complicate.
Crearea tabelelor va fi realizat mai uor folosind interfaa serverului Oracle XE, aa cum s-a procedat n primele cursuri. n cazul n care n momentul crerii unui tabel se impun restricii asupra cmpurilor, se declar chei strine sau se declar o cheie primar, fraza SQL corespunztoare va conine un numr de restricii introduse folosind cuvntul rezervat "constraints". Exemplu:
CREATE TABLE "DEMO_ORDERS" ( "ORDER_ID" NUMBER NOT NULL ENABLE, "CUSTOMER_ID" NUMBER NOT NULL ENABLE, "ORDER_TOTAL" NUMBER(8,2), "ORDER_TIMESTAMP" DATE, "USER_ID" NUMBER,
12
CONSTRAINT "DEMO_ORDER_PK" PRIMARY KEY ("ORDER_ID") ENABLE, CONSTRAINT "DEMO_ORDER_TOTAL_MIN" CHECK (order_total >= 0) ENABLE, CONSTRAINT "DEMO_ORDERS_CUSTOMER_ID_FK" FOREIGN KEY ("CUSTOMER_ID") REFERENCES "DEMO_CUSTOMERS" ("CUSTOMER_ID") ENABLE, CONSTRAINT "DEMO_ORDERS_USER_ID_FK" FOREIGN KEY ("USER_ID") REFERENCES "DEMO_USERS" ("USER_ID") ENABLE ) /
Obs. n fraza SQL afiat denumirile cmpurilor, constrngerilor sau denumirea tabelului apar ntre ghilimele. Aceast scriere permite folosirea de denumiri coninnd spaii (de evitat!). Dac denumirile nu pot da natere la confuzii, ghilimelele pot fi omise. Cele patru constrngeri declarate se refer la cheia primar, limitarea unei valori i declar dou cmpuri ca fiind chei strine, preciznd i tabelele legate. n primul exemplu cheia primar a fost declarat adugnd descrierii cmpului ID_regiune cuvintele PRIMARY KEY. Din aceste exemple se observ diversitatea modatitilor de scriere a unei comenzi SQL. Pentru a limita volumul de cunotine legate de sintaxa limbajului, n cele ce urmeaz comenzile vor fi realizate i testate folosind interfaa aplicaiei. Aa cum s-a vzut deja, interfaa permite i afiarea comenzilor create. Deoarece n timpul realizrii unei baze de date se pot produce incidente mergnd pn la distrugerea serverului Oracle XE, este bine s fie pstrate ntrun fiier avnd extensia .sql un numr ct mai mare de fraze a croir executare s permit refacerea tabelelor i repopularea lor cu date.
13
Comanda SELECT
Comanda SELECT creeaz o mulime de selecie. Aceasta poate conine un articol, mai multe articole sau niciunul. Articolele din mulimea de selecie conin numai cmpurile indicate de programator. Din acest punct de vedere se poate considera c SELECT creaz un subtabel coninnd numai informaiile specificate. Cmpurile nregistrrilor mulimii de selecie pot proveni dintr-un tabel sau din mai multe tabele legate. Comanda SELECT are formatul general: SELECT [DISTINCT] coloana1 [,coloana2] FROM tabel_1[,tabel_2, ...] [WHERE condiii] [GROUP BY list-coloane] [HAVING conditii] [ORDER BY list-coloane [ASC | DESC] ] Dintre cele 5 clauze ale comenzii SELECT numai clauza FROM este obligatorie. Fiecare dintre clauze are la rndul ei reguli i parametri pentru construcie, fcnd din SELECT cea mai complex comand a limbajului SQL. n frazele SELECT irurile de caractere se pun ntre caractere ' (apostrof). Pentru construirea unei comenzi SELECT se poate folosi asistentul Query Builder.
14
Aplicaia va afia trei panouri: n stnga un panou coninnd tabelele cuprinse n schema curent :
clic
clic
Not: JOB_ID din Jobs = JOB_ID din Employees. Pentru impunerea legturii se va selecta succesiv cu mouse-ul JOB_ID din Employees i din Jobs. n partea de jos un panou cuprinznd cmpurile selectate i alte specificaii:
Not: Operatorul LIKE permite selectarea liniilor care conin n cmpul testat iruri de caractere n care se regsete o succesiune de caractere precizat. Pentru definirea succesiunii de caractere cutat se poate folosi caracterul generic "%". De exemplu clauza WHERE nume LIKE 'Po%' va permite selectarea liniilor n care nume = Pop i nume=Popescu. Clauza WHERE prenume LIKE '%a' permite selectarea tuturor liniilor n care prenumele se termin n "a". Exemple: SELECT * FROM cititor WHERE nume = 'Popescu' AND prenume='Mihai' SELECT * FROM cititor WHERE nume = 'Popescu' OR nume='Mihai' SELECT * FROM cititor WHERE nume = 'Popescu' AND prenume IN('Ioan','Vasile','Grigore')
16
IN specific o mulime creia trebuie s-i aparin cmpul specificat (prenume). SELECT * FROM cititor WHERE nume = 'Popescu' AND data_nasterii BETWEEN '12-MAY-1968' AND '29-MAY-1980' Clauza BETWEEN permite definirea unui interval cruia trebuie s-i aparin cmpul specificat (data_nasterii). Clauza ORDER BY servete la impunerea ordinii de afiare a nregistrrilor mulimii de selecie. Ordonarea poate fi realizat dup valorile unuia sau a mai multor cmpuri, cresctor (ASC) sau descresctor (DESC). n cazul n care se folosesc mai multe cmpuri, acestea sunt separate prin virgul. SELECT * FROM Cititor ORDER BY Nume,Prenume,ID_cititor ASC SELECT * FROM Angajati ORDER BY salar DESC, Nume ASC, Prenume
Clauza DISTINCT permite realizarea unei mulimi de selecie care conine nregistrri distincte, care difer prin cel puin o valoare a unui cmp. De exemplu : SELECT DISTINCT Localitate FROM cititor Ultima fraz va provoca afiarea numelor localitilor n care domiciliaz cititorii. Fr clauza DISTINCT, numele oraului Cluj-Napoca ar fi fost repetat de mai multe ori. cmp. Clauza GROUP BY permite gruparea nregistrrilor dup valoarea unui Exemplul 1: SELECT Localitate, COUNT(*) as Nr_Cititori FROM Cititor GROUP BY Localitate n cazul n care se realizeaz o grupare, fiecare dintre liniile mulimii de selecie se refer la un grup de nregistrri i nu la nregistrri simple. n exemplul precedent, GROUP BY Localitate precizeaz cmpul dup care se realizeaz gruparea. nafara valorii cmpului dup care se face gruparea, n astfel de situaii liniile mulimii de selecie pot conine rezultatul aplicrii unor funcii matematice asupra articolelor care formeaz grupul (suma valorilor dintrun cmp, media valorilor, valoarea maxim sau minim, numrul de articole care formeaz grupul etc). Pentru cmpurile care vor conine rezultatul aplicrii unor funcii se recomand folosirea clausei AS nume pentru atribuirea unui nume
17
relevant coloanei respective. n exemplul dat s-a afiat rezultatul funciei COUNT(*), care numr nregistrrile din grup. Funciile care pot fi apelate pentru cmpuri numerice sunt prezentate n tabelul de mai jos.
returneaz cea mai mic valoare dintr-o coloan (cmp numeric) returneaz cea mai mare valoare dintr-o coloan (cmp numeric) returneaz suma valorilor numerice dintr-o coloan (cmp numeric) returneaz media valorilor dintr-o coloan (cmp numeric) returneaz numrul de valori dintr-o coloan returneaz numrul de valori distincte dintr-o coloan
SELECT Sectie, MAX(salar) as Sal_Max FROM Angajati GROUP BY Sectie Se pot ns aplica aceleai funcii i ntregului fiier, fr gruparea articolelor, caz n care mulimea de selecie va conine o singur nregistrare: SELECT AVG(salar) FROM Angajati SELECT AVG(salar) FROM Angajati WHERE functie='Zidar' SELECT COUNT(*) FROM Cititor Clauza HAVING servete la precizarea unui filtru care se aplic grupurilor de articole, dac este prezent clauza GROUP BY. Exemplu: SELECT Sectie, AVG(Salar) FROM Angajati GROUP BY Sectie HAVING AVG(Salar) > 500 Dac n fraza SELECT lipsete clauza GROUP BY, folosirea clauzei HAVING nu se justific, ea avnd acelai efect ca i clauza WHERE. O situaie aparte prezint comenzile SELECT care nu realizeaz o mulime de selecie ci un calcul matematic. n acest caz from nume_tabel va fi nlocuit prin from dual, ca n exemplul urmtor:
18
Cuvntul rezervat dual astfel folosit permite respectarea sintaxei comenzii SELECT.
19
Clauza JOIN este ns i soluie ntr-o alt situaie, respectiv cnd ntr-un tabel se accept pentru o cheie strin valori nule. Un exemplu simplu este cel al tabelelor Angajati i Soi prezentate n continuare.
Dintre angajaii din primul tabel doi sunt cstorii, n cazul lor ID_SOT are valori nenule. Dac se dorete realizarea unei mulimi de selecie care s cuprind angajaii, iar pentru cei cstorii numele i prenumele soului/soiei, fraza SELECT ar putea fi urmtoarea: select Angajati.Nume, Angajati.Prenume,Soti.Nume_prenume from Angajati, Soti where Angajati.ID_SOT=SOTI.ID_SOT Rezultat:
Rezultatul nu este cel dorit deoarece prin condiia pus sunt exclui din mulimea de selecie angajaii necstorii. Soluia este oferit de clauza LEFT OUTER JOIN: select Angajati.Nume, Angajati.Prenume,Soti.Nume_prenume from Angajati left outer join Soti on Angajati.ID_SOT=SOTI.ID_SOT
20
Rezultatul va cuprinde toate liniile din primul tabel iar pentru liniile din primul tabel care au corespondent n al doilea tabel, va include i informaiile corespunztoare din al doilea tabel.
Similar se poate folosi clauza RIGHT OUTER JOIN pentru includerea tuturor nregistrrilor din al doilea tabel i selectarea din primul doar a celor care satisfac relaia de legtur.
Utilizarea parametrilor
SQL permite ca la scrierea comenzii SELECT s se foloseasc parametrii. Valorile acestora sunt cerute ntr-o fereastr separat, n momentul executrii interogrii. Exemplu : sql>select * from edituri where cod_edit > :coded;
21
Comanda INSERT
Comanda INSERT adaug un rnd ntr-un tabel existent. Exemplu: INSERT INTO Edituri(CodE,Nume,Adresa,Telefon) VALUES(121, 'Albatros','B-dul Tomis Nr. 32 Constanta','0745654765') Lista de cmpuri de dup numele tabelei poate fi omis dac toate cmpurile primesc valori iar acestea sunt scrise n ordinea definit la creare (n care ele apar n capul de tabel). Dac un cmp nu primete valoare el va primi implicit valoarea NULL, dac la creare, prin modul de declarare a cmpului, introducerea unei astfel de valori este autorizat.
Comanda DELETE
Comanda DELETE suprim una sau mai multe nregistrri dintr-un fiier. Ca i n cazul comenzii SELECT, pentru definirea unui set de nregistrri care vor fi terse se utilizeaz clauza WHERE. Exemple: DELETE FROM Autori WHERE CodAut=7 DELETE FROM Edituri Ultima comand suprim toate nregistrrile din tabelul Edituri.
Comanda UPDATE
Comanda UPDATE permite modificarea unei nregistrri sau a unui set de nregistrri. Pentru precizarea setului de nregistrri afectate se folosete clauza WHERE. Exemplu: UPDATE Edituri SET Adresa='str. 1 Mai Nr. 12', Telefon='0745343435' WHERE Nume='Dacia' UPDATE Angajati SET Salar=Salar*1.2 WHERE Salar<450