Sql Subcereri, Structuri Ierarhice

  • Uploaded by: Bogdan Hududoi
  • 0
  • 0
  • February 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Sql Subcereri, Structuri Ierarhice as PDF for free.

More details

  • Words: 1,378
  • Pages: 25
Loading documents preview...
Limbajul SQL-Oracle Interogarea datelor. Subcereri. Subcerere (cerere imbricată) – comandă SELECT inclusă într-o altă comandă SQL, care poate returna una sau mai multe linii.

Subcererile sunt utilizate pentru:  a obţine rezultate pe baza unor criterii, care apoi să fie utilizate pentru identificarea altor răspunsuri  a crea tabele pe baza unora deja existente  a manipula seturi mari de date, prin includerea în comenzi INSERT, UPDATE sau DELETE  a crea tabele virtuale (vederi, views)  a defini vederi dinamice (subcereri incluse în clauza FROM)

 a defini expresii calculate dinamic prin subcereri scalare 1

Limbajul SQL-Oracle Interogarea datelor. Subcereri. Tipuri de subcereri: Subcereri

Descriere

 subcereri single-row

returnează o singură linie (conţinând valori pentru una sau mai multe coloane)

 subcereri multiple-row

returnează 0, 1 sau mai multe linii

 subcereri multiple-column

returnează mai mult de o coloană ca rezultat al unei subcereri single-row sau multiple-row

 subcereri corelate

subcereri de oricare dintre tipurile anterioare, care asigură legătura dintre tabele, prin referirea de coloane ale cererii părinte

 subcereri scalare

returnează o singură coloană rezultat; pot fi utilizate ca orice expresie care apare într-o comandă SQL 2

Limbajul SQL-Oracle Interogarea datelor. Subcereri. SELECT id_angajat, nume FROM angajati WHERE id_functie = (SELECT id_functie FROM angajati WHERE UPPER(nume)='ABEL') AND UPPER(nume)!='ABEL';

3

Limbajul SQL-Oracle Interogarea datelor. Subcereri. SELECT id_angajat, nume FROM angajati WHERE id_functie = (SELECT id_functie FROM angajati WHERE UPPER(nume)='KING') AND UPPER(nume)!='KING'; ORA-01427: single-row subquery returns more than one row

SELECT id_angajat, nume FROM angajati WHERE id_functie IN (SELECT id_functie FROM angajati WHERE UPPER(nume)='KING') AND UPPER(nume)!='KING'; 4

Limbajul SQL-Oracle Interogarea datelor. Subcereri. Operatori de comparaţie utilizaţi în cadrul subcererilor multiple-row: Operatori

Descriere

IN

• compară cu o listă de valori • verifică dacă valoarea căutată se regăseşte în listă

NOT

• utilizat cu operatorul IN

ANY

• utilizat în combinaţie cu operatorii de comparaţie (=, <) • verifică dacă valoarea căutată îndeplineşte condiţia de comparaţie cu oricare dintre liniile returnate de subcerere

SOME

• la fel ca operatorul ANY

ALL

• utilizat în combinaţie cu operatorii de comparaţie (=, <) • verifică dacă valoarea căutată îndeplineşte condiţia de comparaţie cu toate liniile returnate de subcerere 5

Limbajul SQL-Oracle Interogarea datelor. Subcereri. UPDATE angajati SET salariul=1.1*salariul WHERE (id_functie, id_departament) = (SELECT id_functie, id_departament FROM angajati WHERE UPPER(nume)='ABEL');

6

Limbajul SQL-Oracle Interogarea datelor. Subcereri. SELECT (SELECT COUNT(id_client) FROM clienti) "Toti clientii", (SELECT COUNT(id_client) FROM comenzi) "Clientii cu comenzi“ FROM DUAL;

Toti clientii Clientii cu comenzi ------------- ------------------319

105

7

Limbajul SQL-Oracle Interogarea datelor. Subcereri. UPDATE angajati SET salariul=1.1 * salariul WHERE id_angajat IN (SELECT id_angajat FROM comenzi); UPDATE angajati a SET a.salariul=1.1 * a.salariul WHERE EXISTS (SELECT * FROM comenzi WHERE id_angajat=a.id_angajat); 8

Limbajul SQL-Oracle Interogarea datelor. Subcereri. SELECT c.nume_client FROM clienti c WHERE EXISTS (SELECT * FROM comenzi co WHERE co.id_client=c.id_client);

SEMI-JOIN

SELECT c.nume_client FROM clienti c WHERE NOT EXISTS (SELECT * FROM comenzi co WHERE co.id_client=c.id_client); 9

Limbajul SQL-Oracle Interogarea datelor. Cereri ierarhice.

ALTER TABLE angajati ADD CONSTRAINT ang_manager_fk FOREIGN KEY (id_manager) REFERENCES angajati (id_angajat); 10

Limbajul SQL-Oracle Interogarea datelor. Cereri ierarhice. Nod rădăcină

Nivel 1

Nivel 2

Nivel 3

Nivel 4

Nod

Nod frunză 11

Limbajul SQL-Oracle Interogarea datelor. Cereri ierarhice. Clauze în SELECT

Descriere

START WITH

identifică nodul rădăcină

CONNECT BY

defineşte legăturile de tip self-join, precum şi direcţia în care va fi traversată ierarhia

ORDER SIBLINGS BY

sortează liniile din cadrul fiecărui nivel ierarhic

Alte concepte utilizate: PRIOR - utilizat în cadrul CONNECT BY pentru stabilirea direcţiei în care va fi traversată ierarhia LEVEL - pseudo-coloană care identifică valoarea corespunzătoare nivelului din ierarhie (LEVEL 1 corespunde nodului rădăcină, LEVEL 2 indică nivelul copil relativ la rădăcină etc.) SYS_CONNECT_BY_PATH – funcţie care afişează calea către orice nod, pornind de ka nodul rădăcină CONNECT_BY_ROOT – operator care referă datele din nodul rădăcină

12

Limbajul SQL-Oracle Interogarea datelor. Cereri ierarhice. SELECT LEVEL, id_angajat, nume FROM angajati START WITH id_angajat=100 CONNECT BY id_manager=PRIOR id_angajat;

LEVEL ID_ANGAJAT NUME ---------- ---------- --------1 100 King 2 101 Kochhar 3 108 Greenberg 4 109 Faviet 4 110 Chen 4 111 Sciarra 4 112 Urman 4 113 Popp 3 200 Whalen 3 203 Mavris 3 204 Baer 3 205 Higgins 4 206 Gietz 2 102 De Haan 3 103 Hunold 4 104 Ernst 4 105 Austin 4 106 Pataballa 4 107 Lorentz

Limbajul SQL-Oracle Interogarea datelor. Cereri ierarhice. LEVEL ID_ANGAJAT ANGAJAT ---------- ---------- ------------------SELECT LEVEL, id_angajat, 1 100 King 2 101 Kochhar LPAD(' ',LEVEL)||nume angajat 3 108 Greenberg 4 109 Faviet FROM angajati 4 110 Chen START WITH id_angajat=100 4 111 Sciarra 4 112 Urman CONNECT BY 4 113 Popp 3 200 Whalen id_manager=PRIOR id_angajat; 3 203 Mavris 3 204 Baer 3 205 Higgins 4 206 Gietz 2 102 De Haan 3 103 Hunold 4 104 Ernst 4 105 Austin 4 106 Pataballa 4 107 Lorentz

Limbajul SQL-Oracle Interogarea datelor. Cereri ierarhice. SELECT LEVEL, id_angajat, LPAD(' ',LEVEL)||nume angajat FROM angajati START WITH id_angajat=110 CONNECT BY PRIOR id_manager = id_angajat; LEVEL ID_ANGAJAT ANGAJAT ---------- ---------- ---------1 110 Chen 2 108 Greenberg 3 101 Kochhar 4 100 King

Limbajul SQL-Oracle Interogarea datelor. Cereri ierarhice. LEVEL ID_ANGAJAT ANGAJAT ---------- ---------- ---------------SELECT LEVEL, id_angajat, 1 100 King 2 148 Cambrault LPAD(' ',LEVEL)||nume angajat 3 172 Bates 3 169 Bloom FROM angajati 3 170 Fox START WITH id_angajat=100 3 173 Kumar 3 168 Ozer CONNECT BY 3 171 Smith 2 102 De Haan id_manager=PRIOR id_angajat 3 103 Hunold ORDER SIBLINGS BY nume; 4 105 Austin 4 104 Ernst 4 107 Lorentz 4 106 Pataballa 2 147 Errazuriz 3 166 Ande 3 167 Banda 3 163 Greene 3 165 Lee 3 164 Marvins

Limbajul SQL-Oracle Interogarea datelor. Cereri ierarhice.

LEVEL ID_ANGAJAT ANGAJAT ------ ---------- -------------------------------1 100 /King SELECT LEVEL, id_angajat, 2 101 /King/Kochhar SYS_CONNECT_BY_PATH(nume,'/') 3 108 /King/Kochhar/Greenberg 4 109 /King/Kochhar/Greenberg/Faviet angajat 4 110 /King/Kochhar/Greenberg/Chen 4 111 /King/Kochhar/Greenberg/Sciarra FROM angajati 4 112 /King/Kochhar/Greenberg/Urman START WITH id_angajat=100 4 113 /King/Kochhar/Greenberg/Popp 3 200 /King/Kochhar/Whalen CONNECT BY 3 203 /King/Kochhar/Mavris 204 /King/Kochhar/Baer id_manager=PRIOR id_angajat; 3 3 205 /King/Kochhar/Higgins 4 206 /King/Kochhar/Higgins/Gietz 2 102 /King/De Haan 3 103 /King/De Haan/Hunold 4 104 /King/De Haan/Hunold/Ernst 4 105 /King/De Haan/Hunold/Austin 4 106 /King/De Haan/Hunold/Pataballa 4 107 /King/De Haan/Hunold/Lorentz

Limbajul SQL-Oracle Interogarea datelor. Cereri ierarhice. LEVEL ID_ANGAJAT ANGAJAT ---------- ----------------100 King 102 De Haan 103 Hunold 104 Ernst 105 Austin 106 Pataballa 107 Lorentz 114 Raphaely 115 Khoo 116 Baida 3 117 Tobias 3 118 Himuro 3 119 Colmenares

SELECT LEVEL, id_angajat, ---------1 LPAD(' ',LEVEL)||nume angajat 2 FROM angajati 3 4 START WITH id_angajat=100 4 4 CONNECT BY 4 id_manager=PRIOR id_angajat 2 3 AND id_angajat!=101; 3

Rezolvaţi! Care dintre următoarele opţiuni indică o listă a clauzelor comenzii SELECT într-o ordine de apariţie corectă: a) b) c) d) e)

SELECT, FROM, START WITH, CONNECT BY, WHERE SELECT, FROM, WHERE, CONNECT BY, START WITH SELECT, FROM, START WITH, WHERE, CONNECT BY SELECT, FROM, WHERE, START WITH, CONNECT BY nicio variantă corectă

19

Rezolvaţi! Care clauză a comenzii SELECT este utilizată pentru a exclude o ramură întreagă dintr-o structură ierarhică: a) b) c) d) e)

START WITH CONNECT BY WHERE HAVING nicio variantă corectă

20

Limbajul SQL-Oracle Actualizarea datelor Comandă

Descriere

INSERT

adaugă o înregistrare nouă într-o tabelă

UPDATE

modifică valori asociate coloanelor unei tabele

MERGE

realizează fie modificări ale datelor, fie adăugări de înregistrări dintr-o altă tabelă, în funcţie de o condiţie de potrivire

DELETE

şterge înregistrări dintr-o tabelă

21

Limbajul SQL-Oracle Actualizarea datelor. Comanda MERGE SELECT id_angajat, nume, salariul, id_functie FROM angajati_noi ORDER BY id_angajat; ID_ANGAJAT ---------99 103 104 105 106 120 121 122 123 124

NUME SALARIUL ID_FUNCTIE ------------------------- ---------- ---------Loren 4000,00 AD_PRES Hunold 9500,00 AD_PRES Ernst 6000,00 IT_PROG Austin 7500,00 IT_PROG Pataballa 4800,00 IT_PROG Weiss 8000,00 ST_MAN Fripp 8200,00 ST_MAN Kaufling 7900,00 ST_MAN Vollman 6500,00 ST_MAN Mourgos 5800,00 ST_MAN

22

Limbajul SQL-Oracle Actualizarea datelor. Comanda MERGE MERGE INTO angajati a USING angajati_noi b ON (a.id_angajat=b.id_angajat) WHEN MATCHED THEN UPDATE SET a.salariul=b.salariul, a.id_functie=b.id_functie WHEN NOT MATCHED THEN INSERT (a.id_angajat,a.prenume,a.nume,a.email,a.data_angajare, a.id_functie,a.salariul,a.id_departament) VALUES (b.id_angajat,b.prenume,b.nume,b.email,b.data_angajare, 23 b.id_functie,b.salariul,b.id_departament);

Limbajul SQL-Oracle Actualizarea datelor. Comanda MERGE SELECT id_angajat, nume, salariul, id_functie FROM angajati ORDER BY id_angajat; ID_ANGAJAT ---------99 100 101 102 103 104 105 106 107 108

NUME SALARIUL ID_FUNCTIE ------------------------- ---------- ---------Loren 4000,00 AD_PRES King 24000,00 AD_PRES Kochhar 17000,00 AD_VP De Haan 17000,00 AD_VP Hunold 9500,00 AD_PRES Ernst 6000,00 IT_PROG Austin 7500,00 IT_PROG Pataballa 4800,00 IT_PROG Lorentz 4200,00 IT_PROG Greenberg 12000,00 FI_MGR

24

CURSUL 11... 

Gestiunea altor obiecte ale bazei de date

Related Documents

Sql
March 2021 0
Sql
January 2021 3
Makalah Sql
January 2021 1
Programacion Sql
March 2021 0
Makalah Sql
January 2021 3

More Documents from "Dwi Rizky Afifah"