This shows you the differences between two versions of the page.
bd2:laboratoare:07 [2019/10/14 08:01] apetrescu0506 [Coloane, TOP și ALIAS] |
bd2:laboratoare:07 [2020/11/19 15:40] (current) ciprian.truica [Variabile] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laborator 07 - SQLServer : Interogari, Variabile si XML ====== | + | ====== Laboratorul 07 - SQL Server : Interogari, Variabile si XML ====== |
===== Conținut ===== | ===== Conținut ===== | ||
Line 26: | Line 26: | ||
[INTO] -- Putem folosi rezultatul instruțiunii select pentru a popula o tabelă deja existentă | [INTO] -- Putem folosi rezultatul instruțiunii select pentru a popula o tabelă deja existentă | ||
[FROM] -- Sursa sau sursele de date de date | [FROM] -- Sursa sau sursele de date de date | ||
- | [[CROSS]|[INNER]|[LEFT|RIGHT|FULL OUTER]] JOIN -- Putem folosi mai multe surse de date cu condiții speciale | + | [[[CROSS]|[INNER]|[LEFT|RIGHT|FULL OUTER]] JOIN] -- Putem folosi mai multe surse de date cu condiții speciale |
[WHERE] -- Condițiile de filtrare a datelor deja existente | [WHERE] -- Condițiile de filtrare a datelor deja existente | ||
[GROUP BY] -- Agregarea datelor deja existente până în acest punct | [GROUP BY] -- Agregarea datelor deja existente până în acest punct | ||
Line 37: | Line 37: | ||
</code> | </code> | ||
- | <color red>Ex. 1</color> Scrieți o clauză T-SQL care întoarce răspunsul la întrebarea: De ce nu am folosit litera **N** înainte șirul de caractere constant? | + | <color red>Ex. 1</color> Scrieți o clauză T-SQL care întoarce răspunsul la întrebarea: De ce am folosit litera **N** înainte șirul de caractere constant? |
===== Comentarii ===== | ===== Comentarii ===== | ||
Line 51: | Line 51: | ||
mod | mod | ||
- | Aici trebuie doar să deschided înainte de primul rând | + | Aici trebuie doar să deschidem comentariul înainte de primul rând |
- | și să inchidem după ultimul. | + | și să-l închidem după ultimul. |
Nu este nevoie să avem vreun string special pe fiecare rând. | Nu este nevoie să avem vreun string special pe fiecare rând. | ||
*/ | */ | ||
Line 74: | Line 74: | ||
</note> | </note> | ||
- | Alias-urile sunt un mod de a oferi un nume unei coloane (câteodata este obigatoriu să avem unul, vom vedea asta). Dacă dorim să avem spațiu în pentru un alias este nevoie să folosim (N)VARCHAR. Un ALIAS se poate folsi astfel: | + | Alias-urile sunt un mod de a oferi un nume unei coloane (câteodata este obigatoriu să avem unul, vom vedea asta). Dacă dorim să avem spațiu pentru un alias este nevoie să folosim (N)VARCHAR. Un ALIAS se poate folsi astfel: |
<code sql> | <code sql> | ||
- | SELECT 'Un Alias poate fi sepcificat în acest mod' [Modul1]--Cu sau fără spațiu/Paranteze Drepte | + | SELECT 'Un Alias poate fi specificat în acest mod' [Modul1]--Cu sau fără spațiu/Paranteze Drepte |
,'Sau așa' AS 'Modul 2' | ,'Sau așa' AS 'Modul 2' | ||
Line 97: | Line 97: | ||
Produsul cartezian se poate genera în următorul mod: | Produsul cartezian se poate genera în următorul mod: | ||
- | {{:bd2:laboratoare:sqlserverlab01ex030.png?nolink&600|}} | + | {{:bd2:laboratoare:sqlserverlab01ex030.png?nolink&740|}} |
Aici pentru fiecare angajat am adus fiecare manager, ne-am dori să aducem doar managerul lui așa că vom scrie un (SELF) **INNER JOIN** în 2 moduri: | Aici pentru fiecare angajat am adus fiecare manager, ne-am dori să aducem doar managerul lui așa că vom scrie un (SELF) **INNER JOIN** în 2 moduri: | ||
- | {{:bd2:laboratoare:sqlserverlab01ex03a.png?nolink&600|}} | + | {{:bd2:laboratoare:sqlserverlab01ex03a.png?nolink&740|}} |
- | {{:bd2:laboratoare:sqlserverlab01ex03b.png?nolink&600|}} | + | {{:bd2:laboratoare:sqlserverlab01ex03b.png?nolink&740|}} |
<note> | <note> | ||
- | Duă cum puteți observa, cuvântul **INNER** poate să lipsească cu desăvârșire. Același lucru se aplică și pentru clauza **OUTER**, fiind nevoie doar de **LEFT**, **RIGHT** sau **FULL**. | + | După cum puteți observa, cuvântul **INNER** poate să lipsească cu desăvârșire. Același lucru se aplică și pentru clauza **OUTER**, fiind nevoie doar de **LEFT**, **RIGHT** sau **FULL**. |
</note> | </note> | ||
Line 115: | Line 115: | ||
Exemplu: | Exemplu: | ||
- | {{:bd2:laboratoare:sqlserverlab01ex04.png?nolink&600|}} | + | {{:bd2:laboratoare:sqlserverlab01ex04.png?nolink&740|}} |
<color red>Ex. 4</color> Aceeași problemă ca mai sus. Se rezolvă la fel? Rescrieți clauza, în mod corect și complet, fără CTE. | <color red>Ex. 4</color> Aceeași problemă ca mai sus. Se rezolvă la fel? Rescrieți clauza, în mod corect și complet, fără CTE. | ||
Line 129: | Line 129: | ||
==== Grupări, Agregate și HAVING ==== | ==== Grupări, Agregate și HAVING ==== | ||
- | Avem o mulțime de funcții de agregare predefinite pe care le găsiți [aici](https://docs.microsoft.com/en-us/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-2017). Pe lângă aceste funcții mai sunt și cele fare funcționează DOAR când apare clauza **GROUP BY**. | + | Avem o mulțime de funcții de agregare predefinite pe care le găsiți [[https://docs.microsoft.com/en-us/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-ver15|aici]]. Pe lângă aceste funcții mai sunt și cele fare funcționează DOAR când apare clauza **GROUP BY**. |
Gruparea este la fel ca și în celelate limbaje de tip SQL: dispare noțiunea de individ și apre noțiunea de întreg. Pentru a filtra, în acest caz, se folosește **HAVING** care se referă la proprietățile unui grup. Se pot folosi funcții și în acest caz. | Gruparea este la fel ca și în celelate limbaje de tip SQL: dispare noțiunea de individ și apre noțiunea de întreg. Pentru a filtra, în acest caz, se folosește **HAVING** care se referă la proprietățile unui grup. Se pot folosi funcții și în acest caz. | ||
Line 135: | Line 135: | ||
Exemplu: | Exemplu: | ||
- | {{:bd2:laboratoare:sqlserverlab01ex06.png?nolink&600|}} | + | {{:bd2:laboratoare:sqlserverlab01ex06.png?nolink&740|}} |
- | <color red>Ex. 6</color> Dorim să îmbunătățim clauza prin a adăugarea unei coloane în care vom preciza numele managerilor din acel departament. (**HINT: SUBCLAUZE**) | + | <color red>Ex. 6</color> Dorim să îmbunătățim clauza prin adăugarea unei coloane în care vom preciza numele managerilor din acel departament. (**HINT: SUBCLAUZE**) |
==== ORDER BY ==== | ==== ORDER BY ==== | ||
Line 164: | Line 164: | ||
-- Ordinea este vitală, de aici parantezele | -- Ordinea este vitală, de aici parantezele | ||
( | ( | ||
- | ( | + | ( |
- | SELECT 'Ana are Mere' | + | SELECT 'Ana are Mere' |
- | + | UNION | |
- | UNION | + | SELECT 'Dar are si Pere' |
- | + | ) | |
- | SELECT 'Dar are si Pere' | + | EXCEPT |
- | ) | + | ( |
- | + | SELECT 'Ana nu are Mere' | |
- | EXCEPT | + | ) |
- | + | ) | |
- | ( | + | |
- | SELECT 'Ana nu are Mere' | + | |
- | ) | + | |
- | ) | + | |
INTERSECT | INTERSECT | ||
- | |||
( | ( | ||
- | SELECT 'Ana are Mere' | + | SELECT 'Ana are Mere' |
- | ) | + | ) |
</code> | </code> | ||
Line 197: | Line 191: | ||
===== Exercițiu final Clauze ===== | ===== Exercițiu final Clauze ===== | ||
- | Scrieți o clauză care pentru ficare departament în care deviația standard a grilei salariale este între 1 și 1.5 obține următoarele: | + | <color red>Ex. 8. </color> Scrieți o clauză care pentru ficare departament în care deviația standard a grilei salariale este între 1 și 1.5 obține următoarele: |
- Numele departamentului | - Numele departamentului | ||
- Numele angajaților din acel departament | - Numele angajaților din acel departament | ||
Line 218: | Line 212: | ||
-- Se poate seta ca rezultat al unei clauze, oricare ar fi el | -- Se poate seta ca rezultat al unei clauze, oricare ar fi el | ||
SELECT TOP 1 @VAR_WITH_VALUE = N'Se știe' | SELECT TOP 1 @VAR_WITH_VALUE = N'Se știe' | ||
- | FROM [BD2].[dbo].[EMPLOYEE]; | + | FROM [hr].[dbo].[EMPLOYEES]; |
-- Putem afișa valoare unei variabile | -- Putem afișa valoare unei variabile | ||
Line 237: | Line 231: | ||
Exemplu Creare XML din Tabele: | Exemplu Creare XML din Tabele: | ||
- | {{:bd2:laboratoare:sqlserverlab01ex070.png?nolink&600|}} | + | {{:bd2:laboratoare:sqlserverlab01ex070.png?nolink&740|}} |
<color red>Întrebare 1</color> Ce face această clauză, dacă ignorăm partea de XML? | <color red>Întrebare 1</color> Ce face această clauză, dacă ignorăm partea de XML? | ||
Line 244: | Line 238: | ||
Putem să interogăm conținutul unui XML pentru a obține date tabelare. În exemplul de mai jos vom lua XML-ul generat anterior și ne vom folosi doar de primul nivel pentru a obține datele legate direct de angajat. | Putem să interogăm conținutul unui XML pentru a obține date tabelare. În exemplul de mai jos vom lua XML-ul generat anterior și ne vom folosi doar de primul nivel pentru a obține datele legate direct de angajat. | ||
- | {{:bd2:laboratoare:sqlserverlab01ex080.png?nolink&600|}} | + | {{:bd2:laboratoare:sqlserverlab01ex080.png?nolink&740|}} |
==== Din XML în tabele ==== | ==== Din XML în tabele ==== | ||
- | Putem să revenim din XML înapoi la o tabelă (dacă ne permite structura) folosind operatorul **OUTER APPLY**, despre care puteți să citiți mai multe [aici](https://docs.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql?view=sql-server-2017), dar el aplică anumite operațiuni pe TABELE, mai exact ce este în stânga lui și ce este în dreapta lui, la fel ca și **JOIN**. În exemplul de mai jos puteți să vedeți cum refacem datele tabelare transformate în XML. | + | Putem să revenim din XML înapoi la o tabelă (dacă ne permite structura) folosind operatorul **OUTER APPLY**, despre care puteți să citiți mai multe [[https://docs.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15|aici]], dar el aplică anumite operațiuni pe TABELE, mai exact ce este în stânga lui și ce este în dreapta lui, la fel ca și **JOIN**. În exemplul de mai jos puteți să vedeți cum refacem datele tabelare transformate în XML. |
- | {{:bd2:laboratoare:sqlserverlab01ex090.png?nolink&600|}} | + | {{:bd2:laboratoare:sqlserverlab01ex090.png?nolink&740|}} |
<color red>Întrebare 2</color> Ce credeți că returnează clauza dacă stricăm ordinea/nodurile? | <color red>Întrebare 2</color> Ce credeți că returnează clauza dacă stricăm ordinea/nodurile? |