INTEROGĂRI ÎN SQL SERVER

Similar documents
Titlul lucrării propuse pentru participarea la concursul pe tema securității informatice

CERERI SELECT PE O TABELA

CERERI SELECT PE MAI MULTE TABELE

Capitolul 4 SUBCERERI. F. Radulescu. Curs: Baze de date - Limbajul SQL

Procesarea Imaginilor

Structura și Organizarea Calculatoarelor. Titular: BĂRBULESCU Lucian-Florentin

Metrici LPR interfatare cu Barix Barionet 50 -

Subiecte Clasa a VI-a

Funcţii grup şi clauzele GROUP BY, HAVING. Operatorii ROLLUP şi CUBE.

ARBORI AVL. (denumiti dupa Adelson-Velskii si Landis, 1962)

Reflexia şi refracţia luminii. Aplicaţii. Valerica Baban

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

Versionare - GIT ALIN ZAMFIROIU

5.2 Interogări în SQL

Laborator 1. Programare declarativă. Programare logică. Prolog. SWI-Prolog

Colegiul Național Calistrat Hogaș Piatra-Neamț LIMBAJUL SQL

Creare baza de data Deschidem aplicaţia Microsoft Access. Lansarea în execuţie a programului se face urmând calea:

Modalitǎţi de clasificare a datelor cantitative

Metoda BACKTRACKING. prof. Jiduc Gabriel

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC

2. Setări configurare acces la o cameră web conectată într-un router ZTE H218N sau H298N

Olimpiad«Estonia, 2003

Interogarea (query), este operaţia prin care se obţin datele

D în această ordine a.î. AB 4 cm, AC 10 cm, BD 15cm

GHID DE TERMENI MEDIA

Subinterogari SELECT salariul FROM angajaţi WHERE nume= Ionescu SELECT nume, prenume FROM angajaţi WHERE salariul>s

Textul si imaginile din acest document sunt licentiate. Codul sursa din acest document este licentiat. Attribution-NonCommercial-NoDerivs CC BY-NC-ND

ISBN-13:

:= 950; BEGIN DELETE FROM

Mecanismul de decontare a cererilor de plata

R O M Â N I A CURTEA CONSTITUŢIONALĂ

Nume şi Apelativ prenume Adresa Număr telefon Tip cont Dobânda Monetar iniţial final

Gruparea rezultatelor unei interogări

Ghid identificare versiune AWP, instalare AWP şi verificare importare certificat în Store-ul de Windows

Documentaţie Tehnică

Excel Advanced. Curriculum. Școala Informală de IT. Educație Informală S.A.

MS POWER POINT. s.l.dr.ing.ciprian-bogdan Chirila

Auditul financiar la IMM-uri: de la limitare la oportunitate

CAIETUL DE SARCINI Organizare evenimente. VS/2014/0442 Euro network supporting innovation for green jobs GREENET

The First TST for the JBMO Satu Mare, April 6, 2018

Semnale şi sisteme. Facultatea de Electronică şi Telecomunicaţii Departamentul de Comunicaţii (TC)

Aspecte controversate în Procedura Insolvenţei şi posibile soluţii

SGBD Access 2010: Query

Reţele Neuronale Artificiale în MATLAB

Evoluția pieței de capital din România. 09 iunie 2018

Arbori. Figura 1. struct ANOD { int val; ANOD* st; ANOD* dr; }; #include <stdio.h> #include <conio.h> struct ANOD { int val; ANOD* st; ANOD* dr; }

9. Memoria. Procesorul are o memorie cu o arhitectură pe două niveluri pentru memoria de program și de date.

Platformă de e-learning și curriculă e-content pentru învățământul superior tehnic

6. Bucle. 6.1 Instrucţiunea while

INFORMAȚII DESPRE PRODUS. FLEXIMARK Stainless steel FCC. Informații Included in FLEXIMARK sample bag (article no. M )

X-Fit S Manual de utilizare

Metoda de programare BACKTRACKING

Update firmware aparat foto

În continuare vom prezenta unele dintre problemele de calcul ale numerelor Fibonacci.

9. CURSOARE. Obiective. În acest Capitol, vom învăţa despre: Manipularea cursoarelor. Folosirea Cursor FOR Loops şi Nesting Cursors.

Lucrarea de laborator nr. 4

UNIVERSITATEA DIN CRAIOVA FACULTATEA DE ELECTROMECANICĂ CATEDRA DE ACŢIONĂRI ELECTRICE. Şef lucrări dr. ing. Cătălin CONSTANTINESCU BAZE DE DATE

La fereastra de autentificare trebuie executati urmatorii pasi: 1. Introduceti urmatoarele date: Utilizator: - <numarul dvs de carnet> (ex: "9",

Mods euro truck simulator 2 harta romaniei by elyxir. Mods euro truck simulator 2 harta romaniei by elyxir.zip

LIDER ÎN AMBALAJE EXPERT ÎN SISTEMUL BRAILLE

ANALIZA FUNCŢIONALĂ, O METODĂ DE MODELARE ÎN PROIECTAREA UTILAJELOR

UNIVERSITATEA ŞTEFAN CEL MARE SUCEAVA

Proiectarea bazelor de date. PL/SQL Înregistrări și Colecții # 13. Adrian Runceanu

Laborator 2 - Statistică descriptivă

Proceduri stocate. Crearea procedurilor stocate. Varianta 1 În Management Studio se dă clic pe New Query ca în imaginea de mai jos: Fig.

REVISTA NAŢIONALĂ DE INFORMATICĂ APLICATĂ INFO-PRACTIC

Dispozitive Electronice şi Electronică Analogică Suport curs 02 Metode de analiză a circuitelor electrice. Divizoare rezistive.

EN teava vopsita cu capete canelate tip VICTAULIC

Grafuri bipartite. Lecție de probă, informatică clasa a XI-a. Mihai Bărbulescu Facultatea de Automatică și Calculatoare, UPB

Mulțumim anticipat tuturor acelora care vor transmite critici/observații/sugestii

Proiectarea bazelor de date # 11. PL/SQL Funcții în PL/SQL (partea a II-a) Adrian Runceanu

PROCEDURA PRIVIND DECONTURILE. 2. Domeniu de aplicare Procedura se aplică în cadrul Universităţii Tehnice Cluj-Napoca

MICROSOFT ACCESS 2007 (DE CĂUTAT???)

Laborator 2. Definirea tablourilor şi a funcţiilor (în linia de comandă) în Matlab 7.0

Updating the Nomographical Diagrams for Dimensioning the Concrete Slabs

5.1 Definirea datelor în SQL

Propuneri pentru teme de licență

Ierarhia memoriilor Tipuri de memorii Memorii semiconductoare Memoria cu unități multiple. Memoria cache Memoria virtuală

INTERPRETOARE DE COMENZI

F. Radulescu. Curs: Utilizarea bazelor de date, anul IV C5.

Managementul referinţelor cu

[{CYCLE NOCYCLE}] [{CACHE

6. Excepţii şi aserţiuni. 6. Excepţii şi aserţiuni

Class D Power Amplifiers

Baza de date: tabele, date. Componentele unei B.D.: tabele, constrangeri, relatii. Entitati ale unei B.D.: formulare, interogari, rapoarte

Preţul mediu de închidere a pieţei [RON/MWh] Cota pieţei [%]

earning every day-ahead your trust stepping forward to the future opcom operatorul pie?ei de energie electricã și de gaze naturale din România Opcom

Baze de date distribuite și mobile

Tema 1 - Transferuri de date DMA intr-o arhitectura de tip Cell

Ghid de utilizare a Calculatorului valorii U

CONSISTENŢA INTERNĂ A UNUI INSTRUMENT. O DECIZIE DIFICILĂ.

Proiectarea Sistemelor Software Complexe

PROIECTAREA ALGORITMILOR

Ce pot face pe hi5? Organizare si facilitati. Pagina de Home

CHAMPIONS LEAGUE 2017 SPONSOR:

APLICAŢIE INFORMATICĂ PENTRU PREGĂTIREA MISIUNILOR DE NIVEL TACTIC

2. In the pattern below, which number belongs in the box? 0,5,4,9,8,13,12,17,16, A 15 B 19 C 20 D 21

Candlesticks. 14 Martie Lector : Alexandru Preda, CFTe

1.1. Noţiuni introductive

Cap.5 Normalizarea relaţiilor

Transcription:

INTEROGĂRI ÎN SQL SERVER Principala operaţie efectuată într-o bază de date este operaţia de extragere a datelor, care se realizează cu ajutorul unei clauze SELECT. SELECT Clauza SELECT are o sintaxă foarte complexă, dar, pe scurt, se poate folosi următoarea: SELECT [DISTINCT] lista_coloane [ INTO tabel_nou ] FROM lista_tabele [ WHERE predicat ] [ GROUP BY lista_coloane ] [ HAVING predicat ] [ ORDER BY lista_coloane [ ASC DESC ] ] SQL pune la dispoziţie condiţii de joncţiune ce permit obţinerea de date din tabele diferite. Se pot folosi următoarele: CROSS JOIN Este echivalentul din standardul ANSI/ISO SQL: 1999 SQL pentru calcularea unui produs cartezian. Seturile de rezultate reprezintă toate combinaţiile posibile de coloane din ambele tabele. FROM note CROSS JOIN student INNER JOIN Permite folosirea de condiţii la joncţiune. Folosind clauza ON se permite folosirea clauzei WHERE pentru a restrânge numărul de rânduri obţinute. FROM note INNER JOIN student ON note.cods=student.cods; OUTER JOINS În standardul ANSI-99 SQL, o joncţiune a două sau mai multe tabele care returnează doar rândurile corespondente se numeşte joncţiune interioară. Dacă se returnează şi celelalte, se spune că avem o joncţiune exterioară. Se folosesc în sintaxă termenii left, full, şi right, care fac referire la ordinea de apariţie a tabelelor în clauza FROM. Left Outer Join FROM note LEFT OUTER JOIN student ON note.cods =student.cods; Interogarea va întoarce toate rândurile corespondente, cât şi toate notele, chiar dacă acestea nu aparţin nici unui student. Right Outer Join FROM note RIGHT OUTER JOIN student ON note.cods =student.cods; Interogarea va întoarce toţi studenţii, chiar şi cei care nu au note.

Full Outer Join FROM note FULL OUTER JOIN student ON note.cods =student.cods; Extrage atât rândurile corespondente cât şi celelalte din ambele tabele, adică se vor returna toate rândurile din ambele tabele chiar dacă acestea nu au corespondent. UNION Acet operator combină rezultatele obţinute în urma execuţiei a două interogări într-unul singur. Permite combinarea rezultatelor a două interogări într-un singur set de rezultate, respectând condiţiile: a. fiecare interogare trebuie să aibă acelaşi număr de coloane şi să le listeze în aceeaşi ordine; b. coloanele returnate de fiecare instrucţiune SELECT trebuie să fie compatibile la atribuire sau trebuie să fie transformate explicit într-un tip de date compatibil la atribuire cu coloanele lor corespondente din celelalte instrucţiuni SELECT c. combinarea coloanelor compatibile la atribuire, dar de tipuri diferite, produce o coloană de tipul cu cea mai mare precedenţă dintre cele două (de exemplu, combinarea unei coloane de tip smallint cu o coloană de tip float produce o coloană rezultat de tip float; d. numele coloanelor returnate de UNION sunt derivate din cele din prima instrucţiune SELECT e. UNION ALL este mai rapidă decât UNION deoarece ea nu elimină duplicatele înainte de returnate. Operaţii semantice FROM: permite afişarea produsului cartesian al listei_de_tabele WHERE: aplică σ predicat GROUP BY: grupează tuplurile corespunzător cu lista_de_grupare_pe_coloane HAVING: aplică σ predicat grupurilor SELECT: aplică π lista_de_iesire_a_coloanelor (păstrează duplicatele) DISTINCT: elimină duplicatele ORDER BY: ordonează rezultatul pe baza listei_de_ordonare_pe_coloane Predicate Un predicat este o expresie care returnează TRUE sau NOT TRUE. Ele se întâlnesc în clauzele WHERE sau HAVING ale unei interogări. Obs. S-a folosit NOT TRUE şi nu FALSE datorită problemelor de logică trivalentă uneori nu se cunoaşte dacă o expresie este falsă, tot ceea ce se ştie este că, cu siguranţă, nu este adevărată Cele mai folosite predicate sunt: BETWEEN indică dacă o valoare dată se găseşte în intervalul închis definit de alte două valori LIKE testează dacă o valoare se află sau nu într-un şir model. Se pot folosi caracterele de înlocuire: % procent (corespunde oricărui număr de caractere) şi _ underscore (corespunde unui singur caracter). EXISTS funcţie predicat care acceptă ca unic parametru o subinterogare. Dacă interogarea returnează un set de rezultate, EXISTS întoarce valoarea TRUE, altfel întoarce valoarea FALSE IN oferă o metodă prescurtată de comparare a unei valori scalare cu fiecare element dintr-o listă. ANY, ALL lucrează exclusiv cu subinterogări. ANY, operează similar predicatului IN GROUP BY Această clauză se foloseşte pentru a grupa rândurile dintr-un tabel în seturi mai mici, pe baza unei condiţii de grupare. SELECT cods, AVG(nota) FROM note GROUP BY cods; HAVING Să presupunem că se doreşte găsirea celei mai mari note acordate fiecărui student, dar numai a acelora care au mai mult de o notă. Ce este greşit în această soluţie?

SELECT cods, MAX(nota) FROM note WHERE COUNT(*) > 1 GROUP BY cods; Se poate folosi clauza HAVING la fel ca în cazul clauzei WHERE pentru a restrânge numărul de rânduri returnate de interogare. Într-o interogare care foloseşte clauzele GROUP BY şi HAVING, rândurile sunt mai întâi grupate, după care se afişează doar rândurile ce îndeplinesc condiţia din clauza HAVING. Clauza HAVING este folosită pentru a restrânge numărul de grupuri returnate de clauza GROUP BY. SELECT cods, MAX(nota) FROM note GROUP BY cods HAVING COUNT(*) > 1; Funcţii de grup (funcţii agregat) Funcţiile de grup operează pe seturi de înregistrări furnizând un singur rezultat pe grup. Fiecare dintre funcţiile de mai jos furnizează un singur rezultat: MIN: folosită pe coloane ce păstrează orice fel de tipuri de date returnând valoarea minimă. MAX: folosită pe coloane ce păstrează orice fel de tipuri de date returnând valoarea maximă. SUM: folosită pe coloane ce păstrează valori numerice pentru a calcula suma valorilor din coloana respectivă. AVG: folosită pe coloane ce păstrează valori numerice pentru a calcula media aritmetică a valorilor din coloana respectivă. COUNT: întoarce numărul de rânduri. VARIANCE: folosită pe coloane ce păstrează valori numerice pentru a calcula împrăştierea rezultatelor. De exemplu, dacă media aritmetică a notelor dintr-o grupă la ultimul test este 82%, iar studenţii au înregistrat un scor între 40% şi 100%, rezultatul obţinut folosind această funcţie este mai mare decât dacă scorul studenţilor ar fi fost cuprins între 78% şi 88%. STDDEV: asemănător cu funcţia anterioară. Pentru două seturi de date care au aproximativ aceeaşi medie, cu cât împrăştierea este mai mare cu atât deviaţia standard este mai mare. Sintaxa: SELECT coloana, functie_de_grup(coloana),.. FROM tabel WHERE predicat GROUP BY coloana,...; Subinterogări O clauză SELECT care este inserată în cadrul altei clauze SELECT este numită subinterogare. Subinterogarea se execută cu scopul de a obţine informaţii necunoscute. Clauza exterioară foloseşte informaţiile obţinute prin subinterogare pentru a afla ceea ce i se cere. Subinterogarea se execută o singură dată, anterior, în memoria principală a sistemului. Subinterogările se pot introduce în clauzele: WHERE, HAVING şi FROM. Sintaxa: SELECT lista_de_selectie FROM tabel WHERE expresie operator(select lista_de_selectie FROM tabel); Clauza SELECT din paranteză este interogarea interioară sau subinteorgarea. Reguli Subinterogările oferă un mijloc de a baza o interogare pe o alta (imbricarea interogărilor). Trebuie respectate regulile: a. lista de selecţie a unei subinterogări create cu ajutorul unui operator de comparare poate conţine doar o singură expresie sau nume de coloană;

b. dacă clauza WHERE a unei interogări exterioare conţine numele unei coloane, aceasta trebuie să fie compatibilă din punct de vedere al joncţiunii cu coloana din subinterogare; c. tipurile de date ntext, text şi image nu sunt permise într-o subinterogare; d. clauza DISTINCT nu poate fi utilizată în subinterogări ce conţin clauza GROUP BY; e. într-o subinterogare nu poate fi utilizată clauza ORDER BY decât dacă s-a utilizat şi restricţia TOP; f. o vedere creată pe baza unei subinterogări nu poate fi actualizată; Obs. Construcţiile SELECT pot fi imbricate pe max. 16 nivele. O subinterogare diferă de operatorul de cuplare prin aceea că rezultatul final conţine date doar de la ultimul tabel. Există 2 tipuri de subinterogări: Subinterogări ce furnizează ca rezultat un singur rând Folosesc operatorii aritmetici specifici: (>, =, >=, < <>, <=) şi întorc doar un singur rând în urma execuţiei interogării interioare. Acestea: Returnează un singur rând Folosesc doar operatorii de comparare (=, >,>=, <, <=, <>) Întotdeauna: Interogarea interioară se introduce între paranteze rotunde Interogarea interioară se plasează la dreapta operatorului de comparare. De reţinut că: Interogările interioară şi exterioară pot prelua date din tabele diferite. Doar o singură clauză ORDER BY poate fi folosită într-o clauză SELECT şi, dacă apare, trebuie să se afle la sfârşitul clauzei SELECT principale. Subinterogări ce furnizează ca rezultat mai multe rânduri Folosesc predicatele IN, ANY, ALL, SOME, EXISTS şi întorc ca rezultat mai multe rânduri din interogarea interioară. De această dată nu se mai pot folosi operatorii de comparare. Operatorul NOT se poate folosi cu oricare dintre aceste predicate. Dacă una dintre valorile returnate de o astfel de subinterogare este NULL, dar celelalte nu sunt: Dacă se folosesc IN sau ANY, interogarea exterioară va returna doar rândurile corespunzătoare valorilor care nu sunt NULL. Dacă se foloseşte ALL interogarea exterioară nu va returna nimic, deoarece ALL compară un rând provenit din interogarea exterioară cu fiecare valoare returnată de subinterogare, inclusiv cele NULL. Comparând ceva cu NULL va rezulta tot NULL. În continuare este prezentată sintaxa folosită în toate cele trei situaţii. Varianta 1 Predicatele [ANY SOME ALL] Această variantă este folosită atunci când se compară o valoare cu o altă valoare obţinută în urma folosirii unei subinterogări. De exemplu, următoarea construcţie întoarce toţi studenţii (şi notele corespunzătoare acestora) care au cele mai mari note. SELECT Nume, Prenume, Nota FROM Student INNER JOIN Note ON Student.Cods=Note.Cods WHERE Nota = (SELECT Max(Nota) FROM Note); ceea ce conduce la un rezultat diferit de varianta: SELECT Nume, Prenume, MAX(Nota) FROM Student INNER JOIN Note ON Student.Cods=Note.Cods GROUP BY Nume, Prenume; în care răspunsul corespunde întrebării: "Care este cea mai mare notă obţinută de fiecare student?" Se observă faptul că, deoarece subinterogarea întoarce o singură valoare, nu este nevoie să se folosească nici unul dintre predicatele ANY, SOME sau ALL. Următoarea construcţie prezintă toţi studenţii (şi notele corespunzătoare acestora) care au note mai mari decât notele studentului Radu Tiberiu: SELECT Nume, Prenume, Nota

FROM Student INNER JOIN Note ON Student.Cods=Note.Cods WHERE Nota > All( SELECT Nota FROM Note INNER JOIN Student ON Student.Cods =Note.Cods WHERE Nume = 'Radu' And Prenume='Tiberiu'); Se observă faptul că predicatele ANY şi SOME conduc la obţinerea aceluiaşi rezultat, returnând toate variantele ce respectă condiţia de comparare pentru cel puţin una dintre valorile returnate de către subinterogare. De exemplu, dacă se înlocuieşte ALL cu SOME în interogarea anterioară, rezultatul obţinut va conţine toţi studenţii (şi notele corespunzătoare acestora) care sunt mai mari decât cea mai mică notă acordată studentului Radu Tiberiu. Varianta 2 Predicatul [NOT] IN Această variantă se foloseşte la căutarea unei valori a unei coloane dintr-un tabel rezultat în urma alteri interogări. De exemplu, următoarea construcţie returnează toţi studenţii (şi notele corespunzătoare) din tabelul "Student" care nu apar în tabelul "Note" (studenţii care nu au note): SELECT Cods,Nume, Prenume FROM Student WHERE Cods NOT IN (SELECT Cods FROM Note); Varianta 3 Predicatul [NOT] EXISTS Această variantă se foloseşte atunci când se verifică dacă o anumită valoare există (este returnată) în urma executării subinterogării. De exemplu, următoarea construcţie afişează toţi studenţii care nu au note: SELECT Cods, Nume, Prenume FROM Student WHERE NOT EXISTS (SELECT * FROM Note WHERE Note.Cods =Student.Cods); Se observă faptul că tabelul "Note" este referit în subinterogare, ceea ce face ca SQL Server să evalueze subinterogarea câte o dată pentru fiecare valoare a identificatorului "CodS" din tabelul "Note". Observaţii de ansamblu Atunci când se folosesc sintaxele 1 sau 2 subinterogarea trebuie să întoarcă o singură coloană. Altfel va apare un mesaj de eroare. Clauza SELECT interioară are acelaşi format şi reguli ca şi orice altă clauză SELECT, dar trebuie inclusă între paranteze rotunde. Exerciţii 1. Afişaţi notele obţinute de către studentul Radu Tiberiu. 2. Afişaţi taxele mărite cu 10% 3. Afişaţi numele şi prenumele studenţilor într-o singură coloană. 4. Afişaţi toţi studenţii care nu au prenumele Andrei. 5. Afişaţi numele şi prenumele studenţilor care au plătit taxe de peste 20 de lei, dar mai mici de 30 lei. 6. Afişaţi numele şi prenumele studenţilor care au primit note. 7. Afişaţi numele şi prenumele studenţilor din Braşov, Iaşi, Covasna 8. Reuniţi datele obţinute prin executarea a două interogări, astfel:

- Prima extrage numele şi prenumele studenţilor care au luat note mai mari de 7; - A doua extrage numele şi prenumele studenţilor care au luat note de 5. 9. Câţi studenţi plătesc taxă? 10. Care este suma taxelor plătite de către toţi studenţii? 11. Afişaţi suma totală a plăţilor studentului Radu Tiberiu. 12. Care este cea mai mare taxă? 13. Cine are cea mai mare medie a notelor? 14. Câţi ani au trecut de la începutul studiilor fiecărui student? 15. Afişaţi cursurile urmate de către studentul Radu Tiberiu. 16. Afişaţi numele şi prenumele studenţilor, precum şi cursurile promovate cu note mai mari de 8. 17. Afişaţi numele şi prenumele studentelor care sunt la zi şi sunt bursiere. 18. Câte note are fiecare student? Furnizaţi numele şi prenumele lor. 19. Afişaţi media notelor obţinută de către fiecare student. 20. Afişaţi numele şi prenumele studenţilor care au primit note mai mari decât cea mai mică notă acordată.