Sunteți pe pagina 1din 7

Conspect la MySQL

18

VEDERILE
O vedere (un tabel virtual) este o instruciune SELECT stocat (memorat) care returneaz un tabel ce conine date obinute dintr-unul sau mai multe tabele. Caracteristicele vederilor sunt: Componentele unei vederi pot fi tabele de baz, tabele temporare sau alte vederi; SGBD-ul stocheaz vederile numai sub forma unei instruciuni SELECT, nu sub forma unei mulimi de valori, eliminndu-se redundana datelor; O vedere se va vedea atunci, cnd este referit prin nume ntr-o instruciune SQL. Acest tabel exist numai pe durata execuiei instruciunii i dispare la ncheierea execuiei instruciunii; O vedere este format dintr-o mulime de coloane denumite i de rnduri care conin date; Nu exist restricii pentru interogrile efectuate prin intermediul unei vederi; O vedere este ntotdeauna reprezentat ca un singur tabel. Crearea unei vederi. O vedere poate fi privire ca o prezentare personalizat, care furnizeaz o fereastr cu pagini etichetate pentru accesarea unuia sau mai multor tabele de baz. Fereastra poate afia un ntreg tabel de baz, o parte dintr-un tabel, sau o combinaie de tabele sau de pri ale lor. Avantajele vederilor Simplificarea accesului la date. (nu se vede complexitatea datelor i simplific instruciunile pentru utilizator); Actualizarea automat. La actualizarea unui tabel modificrile se propag automat n toate vederile ce fac referire la tabelul respectiv; Creterea securitii. (Se vizualizeaz numai vederea nu i tot tabelul); Independena logic a datelor. (Protejarea aplicaiei de modificrile logice ale proiectului BD);

Pagina 1 din 7

Conspect la MySQL 18 La crearea vederilor trebuie s inem cont de urmtoarele: o Instruciunile SQL pentru manipularea vederilor modific datele din BD, ce ar presupune permisiunea administratorului de reea pentru a le rula; o Numele vederilor aceleai reguli ca a tabelelor i nu pot s coincid cu un alt nume de vedere sau tabel; o Coloanele vederilor motenesc implicit numele coloanelor din tabelele componente. Ele pot fi redenumite cu AS; o Dac dou coloane au acelai nume una trebuie redenumit; o O coloan redefinit ntr-o vedere poate fi o simpl referin la o coloan, un literal sau o expresie care conine calcule sau funcii de comasare; o O coloan dintr-o vedere motenete tipul de date al coloanei sau expresiei din care este derivat; o Unele SGBD nu permit crearea de vederi pe baza tabelelor temporare; o Vederile pot fi imbricate. Numrul maxim de nivele de imbricare variaz la diferite SGBD; o Vederile pot servi ca o modalitate de salvare a interogrilor complexe; o O vedere nu poate face referire la ea nsi; o Vederile pot afia datele formatate ntr-un mod diferit fa de modul n care acestea sunt formatate n tabele; o O vedere nu permite utilizarea indecilor i nici a restriciilor; o Cnd definim o vedere cu SELECT *, SQL convertete n mod intern caracterul * ntr-o list de coloane. Aceast convertire are loc o singur dat, la crearea vederii, nu la rularea acesteia. De unde rezult c definiia vederii nu se va schimba, dac se adaug o coloan la unul dintre tabelele componente; o SGBD-ul execut de fiecare dat vederile cnd se face referire la ele. Vederile complexe n special cele imbricate pot nruti n mod serios performanele; o Nu putem utiliza SELECT INTO cu o vedere; o Nu pot fi create vederi temporare. O vedere exist numai pe durata executrii unei instruciuni SQL; un tabel temporar exist pe durata unei sesiuni;

Pagina 2 din 7

Conspect la MySQL Pentru a crea o vedere: CREATE VIEW view [(view_columns)] AS select_statement;

18

view numele vederii, care trebuie creat (nume unic); view_columns o list opional de nume a coloanelor, separate prin virgule. Numrul coloanelor trebuie s fie egal cu numrul de coloane din clauza SELECT a instruciunii select_statement. Dac lista coloanelor este omis coloanele vederii vor moteni numele din select_statement. Fiecare nume de coloan trebuie s fie unic n cadrul vederii. select_statement o instruciune SELECT care precizeaz coloanele i rndurile utilizate din tabele. Aceast instruciune poate fi orict de complex i poate utilize mai multe tabele sau alte vederi. Utilizarea clauzei ORDER BY nu este n general permis.

Pagina 3 din 7

Conspect la MySQL Exemple de vederi: 1. CREATE VIEW au_names AS SELECT au_id, au_fname, au_lname FROM authors; Creeaz o vedere care listeaz informaiile personale (numerele de telefon i adresele). 2. CREATE VIEW cities (au_id, au_city, pub_id, pub_city) AS SELECT a.au_id, a.city, p.pub_id, p.city FROM authors a INTER JOIN publishers p ON a.city = p.city;

18

Creeaz o vedere care listeaz autorii care locuiesc n orae n care se afl i sedii de edituri. De observat c n aceast vedere sunt utilizate numele de coloane au_city i pub_city. Redenumirea acestor coloane elimin ambiguitatea care ar fi aprut dac ambele coloane ar fi motenit acelai nume (city) de la tabelele componente. (Pentru aceste cazuri lista view_columns are rolul ei). 3. CREATE VIEW revenues (Publisher, Booktype, Revenue) AS SELECT pub_id, type, SUM(price * sales) FROM titles GROUP BY pub_id, type; Creeaz o vedere care listeaz venitul total (pre*vnzri) pentru fiecare editur, grupat dup tipul crii. 4. CREATE VIEW mailing_labels AS SELECT TRIM (au_fname || || au_lname) AS address1, TRIM (address) AS address2, TRIM (city) || , || TRIM (state) || , || TRIM (zip) AS address3 FROM authors; Creeaz o vedere care faciliteaz tiprirea etichetelor cu adresele autorilor. n acest exemplu numele coloanelor au fost atribuite n instruciunea SELECT, nu n instruciunea CREATE VIEW. 5. CREATE VIEW au_titles (LastName, Title) AS SELECT an.au_lname, t.title_name FROM title_authors ta INTER JOIN au_names an ON ta.au_id = an.au_id INTER JOIN titles t ON t.title_id = ta.title_id WHERE an.au_id in (A02, A05); Creeaz o vedere care listeaz numele de familie ale autorilor cu codurile A02 i A05 i crile pe care fiecare le-a scris fiecare din ei (singur sau n calitate de co-autor). Aici sa utilizat o vedere imbricat au_names. MySQL 4.0 nu accept vederile. n alte medii de lucru cu BD trebuie de modificat unele lucruri. Simpla creare a unei vederi nu afieaz nimic. CREATE VIEW nu face dect s salveze vederea sub forma unei instruciuni SELECT denumite. Pentru a putea vizualiza date prin intermediul unei vederi putem interoga vederea cu SELECT ca n cazul tabelului. Pentru vederea din exemplul 5 putem afia rezultatul astfel: SELECT * FROM au_titles; - listeaz toate rndurile i coloanele vederii au_titles. SELECT DISTINCT au_city FROM cities; - listeaz oraele distincte din vederea cities.

Pagina 4 din 7

Conspect la MySQL La vizualizarea vederilor putem: Rearanja ordinea n care sunt afiate coloanele utiliznd clauza SELECT; Utiliza operatori i funcii pentru a efectua calcule; Modifica antetele coloanelor folosind clauza AS; Filtra rndurile utiliznd clauza WHERE; Grupa rndurile utiliznd clauza GROUP BY; Filtra rndurile grupate utiliznd clauza HAVING; Compune vederea cu alte vederi sau tabele utiliznd clauza JOIN; Sorta rezultatul utiliznd clauza ORDER BY.

18

Pagina 5 din 7

Conspect la MySQL Regsirea datelor cu ajutorul vederilor. SELECT columns FROM view [JOIN joins] [WHERE search_condition] [GROUP BY grouping_columns] [HAVING search_condition] [ORDER BY sort_columns] View numele vederii care trebuie interogat (apelat);

18

Exemple: SELECT BookType, AVG (revenue) AS AVG (revenue) FROM revenues GROUP BY BookType HAVING AVG (revenue) > 1000000; Afieaz tipurile de cri pentru care media vnzrilor a depit un milion de uniti convenionale. SELECT address3 FROM mailing_labels WHERE adress1 LIKE %Kell%; Afieaz al treilea rnd al al adresei potale a fiecrui autor al crui nume conine irul Kell. SELECT DISTINCT an.au_fname, an.au_lname FROM au_names an INNER JOIN title_autors ta ON an.au_id = ta.au_id WHERE ta.au_order > 1; Afieaz numele fiecrui autor care nu a fost autor principal al cel puin unei cri. SELECT au_fname, au_lname FROM au_names WHERE state = CA; Afieaz numele autorilor care locuiesc n statul California. Actualizarea datelor prin intermediul unei vederi. O vedere actualizabil este o vedere care permite modificarea tabelelor componente prin intermediul instruciunilor INSERT, UPDATE, DELETE. Sintaxa acestor operaii este aceiai ca i la tabele. Ca o vedere s fie actualizabil trebuie: Vederea trebuie definit numai pe baza unui singur tabel; SELECT nu poate conine clauzele GROUP BY sau HAVING; Este interzis SELECT DISTINCT; Utilizarea interogrilor, care conin clauze UNION, INTERSECT i EXCEPT este interzis; Instruciunea SELECT trebuie s conin numai referine la coloane simple nu i la coloane rezultate; Exemple: CREATE VIEW ny_autors AS SELECT au_id,au_fname, au_lname,state FROM autors WHERE state = NY; SELECT * FROM ny_autors; Creeaz i afieaz vederea ny_autors, care listeaz codul, numele i statul de reedin numai pentru autorii care locuiesc n statul New York. INSERT INTO ny_autors VALUES (A08, Don,Dawson,NY); Insereaz un rnd nou prin intermediul vedereii ny_autors; INSERT INTO ny_autors VALUES (A09, Jill,LeFlore,CA); Insereaz un rnd nou prin intermediul vedereii ny_autors, cu toate c n vedere este specificat WHERE state = NY. n acest exemplu inserarea este permis, deoarece instruciunea CREATE VIEW nu conine clauza WITH CHECK OPTION SGBD-ul nu este obligat s pstreze coerena cu definiia original a vederii. Pagina 6 din 7

Conspect la MySQL SGBD-ul ar fi anulat operaia de inserare, dac vederea ar fi fost definit astfel:

18

CREATE VIEW ny_autors AS SELECT au_id,au_fname, au_lname,state FROM autors WHERE state = NY WITH CHECK OPTION; Actualizarea unui rnd prin intermediul unei vederi. UPDATE ny_autors SET au_fname = Ian, au_lname = Ford WHERE au_id = A01; Actualizeaz un rnd existent. Valorile din celelaltecoloane rmn nemodificate. Ca i n cazul anterior n dependen de existena WITH CHECK OPTION sau lipsa ei putem sau nu actualiza rnduri cu informaie din alte state. De exemplu instruciunea: UPDATE ny_autors SET au_fname = Ian, au_lname = Ford state = CA WHERE au_id = A01; tergerea unui rnd prin intermediul unei vederi. DELETE FROM ny_autors WHERE au_id = A05; Trebuie s menionm c se terg toate coloanele din cadrul tabelului nu numai cele indicate n vedere. Actualizrile vederilor pot avea consecine asupra integritii. SGBD-ul nu va terge un rnd n cazul n care eliminarea rndului respectiv ar duce la nclcarea restriciilor de integritaea (cheie extern). Unele actualizri pot fi manipulate prin intermediul opiunii CASCADE a restriciei FOREIGN KEY i nu prin intermediul definiiei vederii. Note: vedere actualizabil trebuie s conin o cheie a tabelului de baz pentru a se asigura c fiecrui rnd din cadrul vederii i corespunde un singur rnd din cadrul tabelului de baz. Pentru orice coloan care nu face parte dintr-o vedere actualizabil trebuie s existe posibilitatea acceptrii NULL-urilor sau s existe o restricie DEFAULT n tabelul de baz. Valorile actualizate trebuie s respecte restriciile impuse coloanelor din tabelul de baz, precum tipul de date, proprietatea de acceptare a NULL-urilor i alte restricii. tergerea unei vederi. DROP VIEW ny_autors; tergerea unui tabel nu terge i vederile care fac referire la tabelul respectiv, astfel nct aceste vederi trebuie terse.

Pagina 7 din 7

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