Sunteți pe pagina 1din 57

Modulul 1

Introducerea în Microsoft SQL Server 2014


Lectia 1 – Arhitectura de baza a unui SQL Server
Lectia 2 – Editii/Versiuni ale SQL Server
Lectia 3 – Notiuni introductive in SQL Server Mangament Studio

Lectia 1 – Arhitectura de baza a unui SQL Server


În această lecție, veți afla despre arhitectura și conceptele de bază ale Microsoft SQL Server 2014. Veti afla
cum interacționează instances, services și bazele de date și cum sunt structurate bazele de date.
Aceasta va ajuta vă pregătiți să începeți să lucrați cu interogări SQL Server în modulele viitoare

1. Relational Databases (Baze de Date relationale)

 De obicei, constă din mai multe tablee


 Foloseste îmbinări (JOIN) pentru a extrage date asociate din mai multe obiecte
 Conțin de obicei obiecte și date

Bazele de Date relationale include mai multe tablee care se raporteaza intre ele. Fiecare table de obicei reprezinta o
calsa de entiate care ar putea fi ceva tangibil (un angajat) sau ceva intangibil (o comanda de vanzare).

O baza de date foarte simpla ar fi compusa din: un table de angajati si un table de comenzi – unde clientii pot plasa
comenzi

Cand doua tablee impartasesc date comune este recomandat sa folosim imbinari (JOINs)

Bazele de date din SQL Server sunt containere pentru date si obiecte, inclusiv tablee, views sau conturi de utilizatori
(user accounts). O baza de date SQL Server este intotdeauna o singura entitate logica, sustinuta de mai multe fisiere
fizice

SQL Server accepta doua tipuri de baze de date: system si user.

Bazele de date de tip system includ:

- master - baza de date de configurare a sistemului


- msdb - baza de date de configurare pentru Agent SQL Server
- model - macheta pentru baze de date noi pentru utilizatori
- tempdb - utilizat pt a stoca date temporare. Această bază de date este
stearsa și recreata de fiecare dată când SQL Server repornește. Nu depozitați
niciodată nimic de care trebuie să vă bazați aceasta!
- Resource - o baza de date ascunsa care furnizeaza system objects catre alte baze
2. Client Server Databases

 Software-ul client este separat de motorul bazei de date


 Software-ul client și motorul bazei de date pot fi pe aceeași mașină sau conectate printr-o rețea
 Cu o configurație corectă, bazele de date pot accesa datele din alte baze de date prin rețea

Când aplicatia de tip client trimit solicitări către motor de bază de date ca instrucțiuni T-SQL, SQL Server
realizează toate utilizarea fișierelor, a memoriei și a procesorului în numele clientului. Clienții nu accesează
niciodată direct fișiere de bază de date, spre deosebire de baza de date de tip desktop aplicatii.
Indiferent daca motorul bazei de date este local sau esti conectat la el printr-o retea, nu are nicio diferenta
la codul SQL pe care il scriem. La fereastra de login trebuie doar specificat serverul la care va conectati

Queries (Interogari).
SQL is a a set-based language, scripts and batches
SQL este un limbaj bazat pe seturi, scripturi si loturi
Asta înseamnă că nu trece prin înregistrări (records) rând cu rând, dar în schimb extrage date de pe server
cate un table odata sau un subset al tableului dacă este filtrat.
Asta face SQL Server foarte eficient pentru a face față unor mari volume de date, deși scriind o interogare
simplă pentru a adăuga cinci procente la rândul precedent este destul de complicat. SQL Server nu ia în
considerare de obicei pe ce rând se află o înregistrare, se uită la datele din acel rând.

Scripturile T-SQL sunt stocate in fisiere de tip .sql extensie. In interiorul fiecarui fisier, scriptul poate fin
ordonat in batches (loturi) care sunt marcate cu cuvantul GO la sfarsit. Este important de realizat ca fiecare
batch (lot) este rulat in intregime inainte de a-l incepe pe urmatorul.

Acest lucru este important daca lucrurile trebuie sa se intample intr-o anumita ordine. De exemplu, dacă
ați avut un script care a creat un table, apoi populat-o cu date, ar eșua fără loturi. SQL Server va analiza
lotul și va respinge declarație care a populat tableul deoarece tableul nu există în prezent. Dacă scrieți
scenariul către creați tableul, tastați GO și apoi scrieți scriptul pentru a popula tableul. Va reuși pentru că
masa există atunci când SQL Server evaluează al doilea lot.

Lectia 2 – Editii/Versiuni ale SQL Server


SQL Server Editions

- Enterprise
- Standard
- Business Intelligence
Lectia 3 – Notiuni introductive in SQL Server Mangament Studio (SSMS)
Pentru a porni SSMS:

- Launch SSMS from the Windows Start screen


o Or type SSMS into the seach program and files box
- Connect to an instance or work disconnected
- Settings include
o Fonts and colors, line numbering, word wrap
o Which windows oper at start
- Useful windows include query editor, Object Explorer and Solution Explorer

La pornire, de obicei, SSMS va afisa o ferastra de dialog Conectare la Server unde poti sa specifici numele
serverului si parola.

Connectarea la SQL Server

Conectarea la un Server SQL necesita 3 lucruri:

1. Instance Name
2. Dababase Name
3. Authentication

Lucrul cu Object Explorer (F8)

Object Explorer este un instrument grafic de gestionare a


instantelor și bazelor de date SQL Server. Este unul dintre mai
multele ferestre SSMS disponibile din View Menu. Object
Explorer oferă interacțiune directă cu majoritatea obiectelor de
date SQL Server, cum ar fi tables, views și procedures. Fă clic
dreapta pe un obiect, cum ar fi un table, se va afișa în funcție de
context comenzi, inclusiv generatoare de interogări și scripturi
pentru definițiile obiectelor.

Orice operație efectuată în SSMS necesită permisiuni corespunzătoare


acordate de a administratorul bazei de date. A putea vedea un obiect sau o
comandă nu implică neapărat permisiunea de a folosi obiectul sau de a lansa comanda.

Lucrul cu Script Files si Projects

SSMS permite crearea si salvarea codului SQL in fisier text avand


o extenise de fisier .sql

To be continued

Executing Queries (F5 / Alt + X / Ctrl + E)

Pentru a executa cod SQL in SSMS trebuie scrise interogarile in fereastra “New Query” sau se poate
deschide un fisier .sql care contine interoagari.

Codul poate fi executat pe bucati, adica selectezi exact randurile pe care vrei sa le execute sau, daca nu
selectezi nimic, implicit SSMS va executa intregul cod

SMMS ofera cateva moduri de afisaj al rezultatelor interogarilor:

- Grid (ctrl + d)
- Text (ctrl + t)
- File (ctrl + shift + f)
Modulul 2 : Introduction to T-SQL Querying
Categorii de instructiuni T-SQL

- Data Manipulation Language (DML) setul de date care se focuseaza pe querying / modifying
o SELECT
o INSERT
o UPDATE
o DELETE

- Data Definition Language (DDL) setul de date care se focuseaza pe table, views si procedures
o CREATE
o ALTER
o DROP

- Data Control Language (DCL) setul de instructiuni pentru p


o GRANT
o REVOKE
o DENY

Elemente

Predicate: IN, BETWEEN, LIKE

Operatori de comparare: =, >, <, >=, <=, <>, !=, !>, !<

Operatori logici: AND, OR, NOT

Operatori aritmetici: + - * / %

Concatenare +

IN - folosit pentru a determina dacă o valoare se potrivește cu orice valoare dintr-o listă sau subinterogare

BETWEEN - folosit pentru a specifica un interval de valori

LIKE - folosit pentru a potrivi caractere cu un model


Operatorii logici – testeaza conditia de validare

Concatenare: folosit pentru combinarea de siruri de caractere

Assigment: =

Ordinea evaluarilor:

1. () paranteze
2. * / % - inmultire impartire modulo
3. + - Adunare scadere
4. = < > etc Comparare
5. NOT
6. AND
7. OR BETWEEN IN LIKE
8. =

Functii

String functions:

1. SUBSTRING
2. LEFT, RIGHT
3. LEN
4. DATALENGTH
5. REPLACE
6. REPLICATE
7. UPPER, LOWER
8. RTRIM, LTRIM

Date and Time Functions:

1. GETDATE
2. SYSDATETIME
3. GETUTCDATE
4. DATEADD
5. DATEDIFF
6. YEAR
7. MONTH
8. DAY

Functii de agregat:

1. SUM
2. MIN
3. MAX
4. AVG
5. COUNT
Modulul 3
Lectia 1: Writing SELECT statements

Lectia 2: Eliminating duplicates with DISTINCT

Lectia 3: Using Column and Table Aliases

Lectia 4: Writing simple CASE Expressions

Lectia 1: Writing SELECT statements


Clauzele SELECT și FROM sunt principale clauze pe care ne vom
axa in acest modul.

Tine minte: Clauzele FROM, WHERE, GROUP BY si HAVING se


executa inaintea clauzei SELECT.

Retrieving Columns from a Table or View

Clauza SELECT - specifica coloanele din tableele pe care doiti sa le


returnati ca set de rezultat al interogarii

Clauza FROM – specifica numele tableului din care extrageti


informatii

Dacă numele tableului sau vizualizării conține caractere


neregulate, cum ar fi spații sau alte caractere speciale, va trebui să
delimitați sau să atașați numele. TSQL acceptă utilizarea ghilimele
standard ANSI „Detalii comandă de vânzare” și parantezele pătrate
specifice SQL Server [Detalii comandă de vânzare], Toate
instructiunile se incheie cu punct si virgula ;

Displaying Columns

Pentru a afișa coloane într-o interogare trebuie delimitate prin


virgulă. Ordinea coloanelor din lista va determina afișarea lor la
iesire, indiferent de ordinea în care acestea sunt definite în tableul
sursă.

T-SQL accepta folosirea asterix-ului * intr-o clauza SELECT pentru a


afisa toate coloanele dintr-o tablea. Evita folosirea * in faza de
productie

Folosind o lista exacta in clauza SELECT vei obtine intotdeauna rezultatele dorite atat timp cat coloanele exista. Daca
tableule este dropped vei primi o eroare
Using Calculations in the SELECT Clause

O instrucțiune SELECT poate efectua calcule și manipulări. Calculele pot manipula datele coloanei sursă și utiliza
Funcții T-SQL incorporate

Operatori aritmentici:

+ adunare

- scadere

* inmultire

/ impartire

% modulo (restul impartirii)

Daca folosim un operator aritmetic ca in exemplul de mai jos, rezultatul va aparea pe o noua coloana, care nu va
avea niciun nume. Pentru a numi coloana se foloseste AS – de la alias –

SELECT unitprice, qty, (unitprice * qty)

FROM Sales.OrderDetails;

Lectia 2: Eliminating Duplicates with DISTINCT


Desi in teorie bazele de date relaţionale cer rows unice
într-un table, în practică rows-urile interogate nu sunt
intoteauda unice, chiar și atunci când ele provin dintr-un
table care utilizează un primary key pentru a diferenția
fiecare rând.

O comandă SELECT care nu cuprinde cuvântul cheie


DISTINCT va afişa toate înregistrările care rezultă din
interogare, indiferent dacă unele dintre ele sunt identice.
De exemplu, interogarea de mai jos va returna
următoarele rezultate:

In cazul folosirii cuvântului cheie DISTINCT înregisrarile duplicat sunt eliminate, afişându-se numai prima apariţie a
valorilor câmpurilor specificate în lista de atribute. De exemplu:

Dacă lista de atribute conţine mai multe coloane, operatorul


DISTINCT va afecta toate coloanele selectate. Următorul exemplu
va afişa toate combinaţiile de valori care sunt diferite pentru coloanele grad şi cod_catedra.

ALL Statement

The reason for this output is that, by default, a SELECT clause contains a hidden default ALL statement

SELECT ALL country FROM Sales.Customers; e acelasi lucru cu SELECT country FROM Sales.Customers;

Înlocuirea clauzei implicite SELECT ALL cu SELECT DISTINCT va filtra duplicatele din setul de rezultate. SELECT
DISTINCT specifică că rezultatul trebuie să conțină numai unique rows. Cu toate acestea, este important de înțeles că
opțiunea DISTINCT operează numai pe setul de coloane returnat de clauza SELECT. Nu ia in calcul nici unul dintre
coloane unice din table. DISTINCT operează, de asemenea, pe toate coloanele din lista SELECT, nu doar primul

DISTINCT se adreseaza la rows din outputset , creat de clauza SELECT. Prin urmare, vor fi doar combinații unice de
valori ale coloanei returnata de o clauză SELECT DISTINCT.

Sintaxa:
SELECT DISTINCT

FROM
Lectia 3: Using Column and Table Aliases (Aliasuri)
AS – ALIAS

SELECT qty AS quantity

FROM …

Cand extrageti date dintr-un table, coloanele extrase se vor numi exact asa cum sunt in tableul sursa. Daca doriti,
coloanele pot fi redenumite prin utilizarea aliasului (AS) in clauza SELECT. Pentru redenumirea tableelor aliasul se
foloseste in clauza FROM

In momentul afişării rezultatelor, se utilizează numele coloanelor ca antet. Când acest lucru poate face dificilă
înţelegerea rezultatelor, se poate schimba antetul prin atribuirea altor nume coloanelor (numite 'alias'-uri ale
coloanei).

Acest lucru se realizează specificând alias-ul după numele coloanei. In cazul în care alias-ul conţine spaţii sau
caractere speciale cum ar fi + sau -, acesta se va specifica între ghilimele. In exemplul de mai jos alias-ul "DATA
NAŞTERE" conţine spaţii deci este specificat între ghilimele în timp ce alias-ul impozit nu conţine spaţii sau caractere
speciale deci nu trebuie specificai obligatoriu intre ghilimele

SELECT nume, data_nast "DATA NAŞTERE"

FROM profesor;

A Folosirea aliasurilor pentru a ne referi la Coloane

Aliasurile pot fi folosite pentru a redenumi coloanele


returnate de query-uri direct din clauza SELECT. De
exemplu coloane numite qty pot fi redenumite
quantity

Sintaxa:

1. Alias cu: AS

SELECT orderid, unitprice, qty AS quantity

FROM Sales.OrderDetails

2. Alias cu semnul egal =

SELECT orderid, unitprice, qty = quantity

FROM Sales.OrderDetails

3. Alias cu space

SELECT orderid, unitprice, qty quantity

FROM Sales.OrderDetails
Avertisment: Aliasurile de coloane pot fi create accidental și prin omiterea unei virgule între două nume
de coloane din lista SELECT.

B. Folosirea aliasurilor pentru a ne referi la Tabele

Aliasurile pot fi folosite pentru a redenumi tabele


direct din clauza FROM.

Sintaxa:

Alias cu AS

SELECT order.id, unitprice, qty

FROM Sales.OrderDetails AS OD;

Alias fara AS

SELECT order.id, unitprice, qty

FROM Sales.OrderDetails OD; - space-ul dintre ultimele 2 cuvinte functioneaza ca AS

Aliasuri de Tabel si Coloana combinate:

SELECT OD.orderid, OD.unitprice, OD.qty AS Quantity

FROM Sales.OrderDetails AS OD;

Impactul asupra ordinii de procesare

Poate apărea o problemă în utilizarea aliasurilor de coloană.

IMPORTANT

Aliasurile create în clauza SELECT pot să nu fie cele la care se face


referire în altele interogari, cum ar fi WHERE sau HAVING. Acest
lucru se datorează ordinii logice de procesarea interogărilor.
Clauzele WHERE și HAVING sunt procesate înaintea clauzei SELECT.
O excepție de la aceasta este clauza ORDER BY.

Prin urmare aliasurile combinate cu clauzele WHERE si HAVING vor


genera o eroare. O excepție de la aceasta este clauza ORDER BY.

Un exemplu care va rula fara erori:

SELECT oriderid, unitprice, qty AS quantity

FROM Sales.OrderDetails

ORDER BY quantity;
Un exemplu care va da eroare:

SELECT orderid, unitprice, qty AS quantity

FROM Sales.OrderDetails

WHERE quantity > 10;

Prin urmare adesea trebuie să repetați o expresie de mai multe ori — în clauza SELECT, unde dvs puteti crea un alias
pentru a denumi coloana, iar în clauza WHERE sau HAVING:

Lectia 4: Writing simple CASE Expressions

O expresie CASE extinde capacitatea unei clauze SELECT de a manipula datele pe măsură ce sunt preluate. Adesea
când scriind o interogare, trebuie să înlocuiți o valoare dintr-o coloană a unui tabel cu o altă valoare.

În mediile din lumea reală, CASE este adesea folosit pentru a face mai semnificative datele criptate păstrate într-o
coloană.

O expresie CASE returnează o valoare scalară (cu o singură valoare) bazată pe logica condiționată, adesea cu mai
multe conditii. Ca valoare scalară, poate fi folosită oriunde pot fi utilizate valori individuale. Pe lângă SELECT
declarația, expresiile CASE pot fi folosite în clauzele
WHERE, HAVING și ORDER BY

In T-SQL, CASE expressions return a single, or scalar,


value Spre deosebire de alte limbaje de programare,
în T-SQL CASE, expresiile nu sunt instrucțiuni, nici ele
specifică controlul fluxului programatic. În schimb,
ele sunt folosite în clauze SELECT (și alte clauze)
pentru a returna rezultatul unei expresii. The
rezultatele apar ca o coloană calculată și ar trebui fi
pseudonim pentru claritate.

În interogările T-SQL, expresiile CASE sunt adesea folosite pentru a oferi o valoare alternativă pentru o alta stocată în

Tabelul sursa. De exemplu, o expresie CASE poate poate fi folosita pentru a furniza un nume text friendly pentru

ceva stocat ca un cod numeric compact.


Forme ale expresiei CASE:

- Simple CASE
o Compara o valoare
o Returneaza prima “match”
o If no match, returneaza valoarea gasita in clauza optionala ELSE
o In no match and no else, returneaza NULL
- Searched CASE
o Evalueaza un set de predicate sau expresii logice
o Returneaza valoare gasita in clauza THEN matching first expression that evaluates to TRUE

De exemplu, următoarea expresie CASE înlocuiește un nume de categorie descriptiv pentru categoryid valoare
stocată în tabelul Production.Categories. Rețineți că aceasta nu este o operațiune JOIN, ci doar o operațiune simplă
înlocuire folosind un singur tabel:

SELECT productid, productname, categoryid

CASE categoryid

WHEN 1 THEN ‘Beverges’

WHEN 2 THEN ‘Condiments’

WHEN 3 THEN ‘Confections’

ELSE ‘Unkown Category’

END AS categoryname

FROM Production.Categories

Rezultatul :

Expresiile searched CASE (boolean) compară o valoare de intrare cu un set de predicate sau expresii logice.

Expresia poate conține o serie de valori cu care să se potrivească. Ca o simplă expresie CASE, valoarea returnata se
găsește în clauza THEN a valorii potrivite.
Modulul 4
Lectia 1: Understanding Joins
Lectia 2: Querying with Inner Joins
Lectia 3: Querying with Outer Joins
Lectia 4: Querying with cross Joins and Self Joins

Lectia 1: Understanding Joins


Clauza FROM si Tabelele virtuale

Mai devreme, am discutat despre ordinea logică a

operațiunile efectuate atunci când SQL Server


procesează o interogare. Clauza FROM dintr-o
instructiune SELECT este prima care trebuie
procesata

Această clauză determină care tabel sau tabele


vor fi sursa rândurilor pentru interogare. După
cum veți vedea in acest exemplu, acest lucru va fi
valabil indiferent dacă interogati un singur singur tabel sau aduceti la olalta mai multe tabele

Sintaxa SELECT:

Dupa cum am discutat mai devreme, FROM se proceseaza inaintea lui SELECT.

Doua exemple care au acelasi rezultat dar scrise diferit

1. Cu Alias

2. Fara Alias
Terminologia JOIN: Produsul a doua sa mai
multe tabele (Produsul Cartezian)
In cazul în care în interogare se specifică mai
multe tabele şi nu este inclusă o clauză WHERE,
interogarea va genera produsul cartezian al tabelelor.
Acesta va conţine toate combinaţiile posibile de
înregistrări din tabelele componente. Astfel, produsul
cartezian a două tabele care conţin 100, respectiv 50 de
înregistrări va avea dimensiunea de 5.000 de
înregistrări. De exemplu, să

Când învățați despre scrierea interogărilor cu


mai multe tabele în T-SQL, este important să înțelegeți
conceptul de produse carteziene. În matematică, acesta
este produs din două seturi. Produsul unui set de douaarticole și un set de șase este un set de 12 articole –adica 6 x 2
=12.

În bazele de date, un produs cartezian este rezultatul unind fiecare rând dintr-un tabel de intrare la toate rândurile
de alt tabel de intrare.

Produsul unui tabel cu 10 rânduri și un tabel cu 100 de rânduri este un set de rezultate cu1.000 de rânduri.

Pentru majoritatea interogărilor T-SQL, un produs cartezian nu este rezultatul dorit. De obicei, un produs cartezian
apare atunci când două tabele de intrare sunt unite fără a lua în considerare relațiile logice dintre ele. În absența
oricărei informații despre relații, procesorul de interogări SQL Server va scoate toate combinații posibile de rânduri.

JOIN
O joncţiune (JOIN) este o interogare care regăseşte înregistrări din două sau mai multe tabele. Capacitatea
de a realiza o joncţiune intre două sau mai multe tabele reprezintă una dintre cele mai puternice facilităţi ale unui
sistem relaţional. Legătura dintre înregistrările tabelelor se realizează prin existenţa unor câmpuri comune
caracterizate prin domenii de definiţie compatibile (chei primare sau străine). Pentru realizarea unei joncţiuni se
foloseşte comanda SELECT, precizând în clauza FROM numele tabelelor utilizate, iar în clauza WHERE criteriul de
compunere

Tipuri de JOIN

Pentru a realiza o joncţiune între doua sau mai multe


tabele se utilizează clauza WHERE a interogărilor pe aceste
tabele, în funcţie de criteriul de compunere, se disting mai
multe tipuri de joncţiuni:

1. Cross
2. Inner
3. Outer
1. Cross Join

Un operator de îmbinare încrucișată (CROSS JOIN) adaugă toate combinațiile posibile ale celor două rânduri
de tabele. Orice filtrare a rândurilor va avea loc într-o clauză WHERE. Pentru cele mai multe scopuri de interogare,
acest operator trebuie să fie evitat

2. Inner Join -

Un operator de îmbinare interioară (INNER JOIN sau doar JOIN) creează mai întâi un produs cartezian, apoi
filtrează rezultatele utilizând predicatul furnizat în Clauza ON, eliminând toate rândurile din tabelul virtual care nu
satisfac predicatul. Inner Join este un tip foarte comun de îmbinare pentru preluarea rândurilor cu atribute care se
potrivesc între tabele, cum ar fi potrivirea Clienților cu Comenzile de către un client comun.

3. OUTER JOIN –

Un operator de îmbinare exterioară (LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN) creează mai
întâi un produs cartezian și, ca un INNER JOIN, filtrează rezultatele pentru a găsi rânduri care se potrivesc în fiecare
tabel. Cu toate acestea, toate rândurile dintr-un tabel sunt păstrate și adăugate înapoi la tabelul virtual după ce
filtrul initial este aplicat. NULL-urile sunt plasate pe atributele în care nu se găsesc valori care se potrivesc.

Nota: Daca nu este specificat, de obicei, operatorul JOIN este prestabilit la INNER

Lectia 2: Querying with Inner Joins


Inner JOIN (Jonctiunea Interna)

Când scrieți interogări folosind îmbinări interioare, luați în considerare


următoarele chestii:

După cum ați văzut, aliasurile de tabel sunt preferate nu numai pentru lista
SELECT, ci și pentru a exprima clauza ON.

Îmbinările interioare pot fi efectuate pe un singur atribut de potrivire, cum ar fi un orderid sau pe mai multe atribute
de potrivire, cum ar fi combinație de orderid și productid. JOINS care se potrivesc cu mai multe atribute sunt numite
composite joins.

Ordinea în care tabelele sunt listate și unite în clauza FROM nu contează pentru SQL Server. JOINs vor fi evaluat de la
stânga la dreapta.

Exemple de INNER JOIN

1. Acest query face jonctiunea unei singuri potriviri de atribute,


relationand astfel categoryid din tabelul Production.Categories la

SELECT c.categoryid, categoryname, p.productid, p.productname

FROM Production.Categories AS c

JOIN Production.Products AS p
categoryid de la tabelul
ON c.categoryid= p.categoryid;
Production.Products
2. Acest exemplu realizeaza un JOIN compus din doua atrivute care se potrivesc, coreland atributele city si country
din Sales.Customers to HR.Employees. Nota: Se foloseste operatorul DISTINCT pentru a filtra duplicatele

SELECT DISTINCT e.city, e.country

FROM Sales.Customers AS c

JOIN HR.Employees AS e

ON c.city = e.city AND c.country = e.country;

Lectia 3: Querying with Outer Joins

În lecția anterioară, ați învățat cum să folosiți INNER JOIN pentru a potrivi rândurile din tabele separate. După cum ai
văzut, SQL Server a creat rezultatele unui query INNER JOIN prin filtrarea rândurilor care nu au îndeplinit condițiile
exprimate în predicatul clauzei ON. Rezultatul este că numai rândurile care se potriveau din ambele tabele era afișat.
Cu un OUTER JOIN, puteți alege sa afișați toate rândurile dintr-un tabel, împreună cu cele care se potrivesc de laal
doilea table. Hai sa ne uitam la un exemplu, apoi explorați procesul.

Mai întâi, să examinăm următoarea interogare, scrisă ca un INNER JOIN:

Acest rezultat returneaza 3146 de randuri care reprezinta o potrivire dintre customers si orders. Doar CustomerID
care sunt în ambele tabele vor apărea în rezultate. Doar clienții care au plasat comenzile vor fi reutrnati.

Acum, sa analizam aceeasi


problema dar cu un OUTER JOINS
USE AdventureWorks; (left)
GO

SELECT c.CustomerID, soh.SalesOrderID

FROM Sales.Customer AS c LEFT OUTER JOIN Sales.SalesOrdaerHeader AS soh

ON c.CustomerID = soh.CustomerID

Acest exemplu folosește un operator LEFT OUTER JOIN, care, după cum veți învăța, direcționează procesorul
de interogări către păstrează toate rândurile din tabelul din stânga (Sales.Customer) și afișează valorile SalesOrderID
pentru rânduri care se potrivesc în Sales.SalesOrderHeader.
Cu toate acestea, există mai multe rânduri returnate în acest exemplu. Toate clienții sunt returnați,
indiferent dacă au plasat sau nu o comandă. După cum veți vedea în această lecție, un OUTER JOIN va afișa toate
rândurile dintr-o parte a îmbinării sau alta, indiferent dacă se potrivesc sau nu.
Ce afișează o interogare de îmbinare exterioară în coloanele în care nu a existat nicio potrivire? În acest
exemplu, există nu există comenzi potrivite pentru 701 clienți. În locul coloanei SalesOrderID, va ieși SQL Server NULL
unde valorile lipsesc altfel.

Sintaxa Outer Join

Când scrieți interogări folosind OUTER JOIN, luați în considerare


următoarele chestii:

- Dupa cum ati vazut, aliasurile de tabel pot fi folosite


si pentru SELECT dar si pentru ON
- Outer joins sunt scrise folosind cuvintele LEFT
RIGHT sau FULL precedate de OUTER JOIN
Scopul este de a indica care tabel ar trebuie sa fie
pastrat si sa aiba randurile sale afisate
- Ca si in cazul INNER JOINS, outer joins pot fi
efectuate pentru un singur atribut de potrivire, cum ar fi orderid sau pe mai multe atribute cum ar fi
orderid si productid
- Spre deosebire de INNER JOINS, ordinea in care tabelel sunt listate si unite in clauza FROM conteaza,
pentru ca va determina ce alegi LEFT sau RIGHT
- Imbinarile multi-table sunt mai complexe in prezenta OUTER JOIN. Prezenta NULL-urilor in rezultatele
unei outer join pot cauza probleme daca rezultatele intermediare sunt apoi unite, printr-un inner joi la
un al 3 lea tabel.

Pentru a afisa doar randurile cand nu exista match, adauga un test NULL in clauza WHERE urmata de predicatul
OUTER JOIN

Exemple OUTER JOIN

Urmatoare interogare afiseaza toti clientii si ofera informatii


despre fiecare dintre comenzile lor, daca exista

Urmatorul exemplu afiseaza clientii care nu au plasat nicio


comanda:
Lectia 4: Querying with Cross Joins and Self Joins

Dacă într-o joncţiune de tipul celor prezentate până acum una sau mai multe înregistrări nu satisfac condiţia
de compunere specificată în clauza WHERE, atunci ele nu vor apărea în rezultatul interogării. Aceste înregistrări pot
apare însă dacă se foloseşte joncţiunea externă. Joncţiunea externă returnează toate înregistrările care satisfac
condiţia de joncţiune plus acele înregistrări dintr-un tabel ale căror valori din coloanele după care se face legătura nu
se regăsesc în coloanele corespunzătoare ale nici unei înregistrări din celalalt tabel.

Pentru a realiza o joncţiune externă între tabelele A şi B ce returnează toate înregistrările din tabela A se
utilizează seninul ( + ) în dreapta tabelului B. Pentru fiecare înregistrare din tabela A care nu satisface condiţia de
compunere pentru nici o înregistrare din tabela B, se va crea în tabela B o înregistrare nulă care va fi compusă cu
înregistrarea din tabela A. Invers, pentru a realiza o joncţiune externă între tabelele A şi B ce returnează toate
înregistrările din tabela B, se utilizează semnul ( + ) in dreapta tabelului A.

In interogarea utilizată pentru a exemplifica joncţiunea echivalentă, se observă că au fost selectate numai
catedrele în care există cadre didactice. Pentru a afişa toate catedrele, indiferent dacă ele cuprind sau nu cadre
didactice, se foloseşte următoarea interogare:

Se observă că ultima înregistrare (ce corespunde catedrei de finanţe care nu are în componenţă nici un cadru
didactic) va avea coloanele corespunzătoare primului tabel completate cu Null.

Folosirea operatorului de joncţiune externă are următoarele restricţii:

1. Operatorul ( + ) poate fi plasat în oricare parte a condiţiei din clauza WHERE, însă nu în ambele părţi. Tabelul de
partea căruia este amplasat acest operator va crea înregistrări nule care vor fi compuse cu înregistrările din celălalt
tabel care nu satisfac condiţia de compunere.

2. Dacă tabelele A şi B au condiţii multiple de joncţiune, atunci operatorul (+) trebuie utilizat în toate aceste condiţii.

3. Intr-o singură interogare nu se poate realiza o joncţiune externă a unui tabel cu mai multe tabele.

4. O condiţie care conţine operatorul (+) nu poate fi combinată cu o altă condiţie ce utilizează operatorul IN.

5. O condiţie care conţine operatorul ( + ) nu poate fi combinată cu o altă condiţie prin operatorul OR.
Deși aceasta nu este de obicei un output dorit, există câteva aplicații practice pentru scrierea unui cross join:

- Crearea unui tabel de numere, cu un rând pentru fiecare valoare posibilă dintr-un interval.
- Generarea unor volume mari de date pentru testare. Când crucea s-a unit cu ea însăși, o masă cu doar
100 rândurile pot genera cu ușurință 10.000 de rânduri de ieșire cu foarte puțină muncă din partea dvs.

- Cand scrii Cross Join nu există nicio potrivire a


rândurilor efectuate si prin urmare, nu este
necesară nicio clauză ON.

Exemple de CROSS JOIN

Următorul este un exemplu de utilizare a CROSS JOIN


pentru creați toate combinațiile a două seturi de intrare:

Folosind eșantionul TSQL, va fi nevoie de 9 nume si


prenume de angajați pentru a genera 81 de combinații:

SELF JOIN

Auto-joncţiunea reprezintă joncţiunea unui tabel cu el însuşi. Pentru ca rândurile dintr-un tabel să poată fi compuse
cu rânduri din acelaşi tabel, în clauza FROM a interogării numele tabelului va apare de mai multe ori, urmat de
fiecare dată de un alias.

De exemplu, pentru a selecta toate cadrele didactice care au un şef direct şi numele acestui şef se foloseşte
următoarea auto-joncţiune:

Autojoncţiunea poate fi folosită şi pentru verificarea corectitudinii interne a datelor. De exemplu, este puţin probabil
să existe două cadre didactice care au cod diferit dar în schimb au acelaşi nume, prenume şi dată de naştere. Pentru
a verifica dacă există astfel de înregistrări se foloseşte interogarea:
Rezumat modul 4:

Lectia 1: Understanding Joins

• Clauza FROM și Tabelele Virtuale

• Clauza FROM determină tabelele sursă să fie folosit în instrucțiunea SELECT

• Clauza FROM poate conține tabele și operatori

• Setul de rezultate al clauzei FROM este tabelul virtual

• Clauza FROM poate stabili aliasuri de tabel pentru utilizare prin fazele ulterioare de interogare

• Terminologie Join: Produs Cartezian

 Combina toate posibilitatile de valori din doua seturi


 Daca avem 3 randuri intr-un tabel si 3 in alt tabel produsul cartezian va fi 3x3 = 9

• Prezentare generală a tipurilor de îmbinare

 Cross: Combina toate randurile din ambele tabele (… produsul cartezian)


 Inner: Incepe cu produsul cartezian, aplica filtrele pentru a potrivi randurile dintre tabelele pe baza
predicatului
 Outer: Începe cu produsul cartezian; toate rândurile de la tabel desemnat păstrat, rânduri potrivite
de la un alt tabel recuperați. Adiţional NULL-urile se inserează ca substituenți

• Opțiuni de sintaxă T-SQL

 Tabel creat cu JOIN in clauza FORM in ANSI SQL-92


SELECT …
FROM Table1 JOIN Table2
ON <on_predicate>
 Tabelele unite prin virgule în clauza FROM Nerecomandat: Cartezian accidental produse!
SELECT …
FROM Table1, Table2
WHERE <where_predicate>

Modulul 5: Sorting and Filtering Data


Lectia 1: Sorting Data
Lectia 2: Filtering Data with Predicates
Lectia 3: Filtering Data with TOP and OFFSET-FETCH
Lectia 4: Working with Unkown Vaules

Lectia 1: Sorting Data


În ordinea logică a procesării interogărilor, ORDER BY
este ultima fază a unei instrucțiuni SELECT.

ORDER BY oferă posibilitatea de a controla sortarea


de rânduri pe măsură ce sunt scoase din interogare către
aplicație client.

Fără o clauză ORDER BY, Microsoft® SQL Server® nu


garantează ca ordoneaza randurile

ORDER BY poate avea mai multe tipuri de elemente în lista sa:

• Coloane după nume. Coloane suplimentare dincolo de prima specificată în listă vor fi folosite ca depărtare pentru
valorile neunice din prima coloană.

• Aliasuri de coloane. Rețineți că ORDER BY este procesat după clauza SELECT și, prin urmare, are acces la aliasuri
definite în lista SELECT.

• Coloane după poziție în clauza SELECT. Acest lucru nu este recomandat, din cauza lizibilității reduse și a atenției
suplimentare necesare pentru a menține lista ORDER BY la zi cu orice modificări aduse ordinii coloanei SELECT.

• Coloanele care nu sunt detaliate în lista SELECT, dar fac parte din tabelele enumerate în clauza FROM. Dacă
interogarea folosește o opțiune DISTINCT, orice coloană din lista ORDER BY trebuie găsită în lista SELECT.
SELECT hiredate, firstname, lastname

FROM HR.Employees

ORDER BY hiredate DESC, lastname ASC

Sortarea ascendenta si descendenta (ASC si DESC)

Sintaxa ORDER BY

ORDER BY List:

ORDER BY cu alias:

SELECT orderid, custid, YEAR(orderdate) AS orderyear

FROM Sales.Orders

Order BY orderyear;
SELECT <column_name_1> AS alias1, <column_name_2> AS alias2

FROM <table source>

ORDER BY alias1;

Lectia 2: Filtering Data with Predicates (WHERE)


Când interogați SQL Server, veți dori de cele mai multe ori să preluați doar un subset din toate rândurile
stocate în tabelul enumerat în clauza FROM.

Acest lucru este valabil mai ales pe măsură ce volumul de date crește. Pentru a limita ce rânduri sunt
returnat, veți folosi de obicei clauza WHERE în instrucțiunea SELECT. În această lecție, vei învăța cum să construiți
clauze WHERE pentru a filtra rândurile care nu se potrivesc
cu predicatul.

Pentru a limita rândurile returnate de interogarea dvs, va


trebui să adăugați o clauză WHERE la Instrucțiunea SELECT,
după clauza FROM.

Clauzele WHERE sunt construite dintr-o căutare condiție,


care la rândul ei este scrisă ca expresie predica. Predicatul
oferă un filtru logic prin care trebuie să treacă fiecare rând.
Doar randurile care returneaza TRUE în predicat va fi
transmisă către următoarea fază logică a interogării.

Cand folosesti clauza WHERE tine minte cateva chestii:

 Predicatul trebuie sa returneze valoare booleana


 Doar randurile care returenaza TRUE vor fi trecute prin filtru
 Valorile FALSE sau UNKOWN for fi scoase
 Aliasurile de coloane declarate in interogarea SELECT nu pot fi folosite in predicatul clauzei WHERE

Retine ca ordinea executiei este urmatoare: FROM – WHERE – SELECT. O consecinta a acestui fapt este ca in clauza
WHERE nu se pot folosi aliasurile de coloana create in clauza SELECT. Asadar aliasurile create in SELECT vor trebui fi
repetate in clauza WHERE

Ordine executie: FROM – WHERE – SELECT

Incorrect Column Alias in WHERE Clause


Sintaxa clauzei WHERE

Un exemplu de cod care va filtra clientii din spania:

Un exemplu de cod care va specifica o data anume:

Predicates and Operators

IN Stabilește dacă o valoare specificată se potrivește cu orice valoare din o subinterogare sau o listă.
BETWEEN Specifica un interval
LIKE Stabilește dacă un anumit șir de caractere se potrivește cu un model specificat.
AND Combină două expresii booleene și returnează TRUE daca ambele sunt TRUE.
OR Combină două expresii booleene și returnează TRUE dacă cel putin una este TRUE.
NOT Inversează rezultatul unei condiții de căutare.

Un exemplu cu operatorul OR:


Un exemplu cu operatorul IN

Un exemplu cu opertaorul NOT

Lectia 3: Filtering Data with TOP and


OFFSET Fetch
Când returnați rânduri dintr-o interogare, este posibil
sa fiti neoviti sa limitiati numarul total de randuri
returnate, ca filtru cu o clauză WHERE.

Opțiunea TOP, o Extensia proprie Microsoft a SELECT,


vă va permite să specificați un număr de rânduri
pentru returnare

TOP Option:

SELECT TOP (N) <column_list>

FROM <table_source>

Where <search_condition>;

Exemplu pentru a returna cele mai recente 5 comenzi.

Observa ca operatorul TOP depinde de clauza ORDER BY pentru a reurna randurile dorite. In absenta clauzei ORDER
BY, nu se garanteaza ce fel de randuri se returneaza

Aditional, operatorul TOP poate functiona cu optiunea WITH TIES

Fara optiunea WITH TIES


Cu optiunea WITH TIES

Asadar mai multe randuri indeplinesc conditia cu data de 6 mai

Pentru a returna procente ale numarului de randuri dorite se foloseste optiunea PERCENT plus TOP

De exemplu urmatoarea interogare contine 830 de randuri, dorim sa returneze doar 83 adica 10%
Filtering in the ORDER BY Clause Using OFFSET-FETCH
In timp ce optiunea TOP este folosita in mai multe domenii, poate avea si dezavantaje:

- TOP este o proprietate a T-SQL si SQL Server


- TOP nu accepta skipping a range of rows
- Cum TOP depinde de ORDER BY, nu poti folosi una pentru a filtra randurile si alta pentru a afisa

La fel ca TOP, OFFSET-FETCH va permite sa


returnati doar un interval de randuri selectate de interogarea dvs. Cu toate acestea, aceasta adauga functionliatatea
pentru a furniza un punct de pornire(offset) si o valoare pentru a specifica cate randuri ar dori sa returneze (a fetch
value – valoare de returnare). Aceasta ofera o tehnica convenabila pentru paginarea rezultatelor
Sintaxa OFFSET-FETCH

Urmatorul exemplu va sari peste primele 10 randuri


si apoi va returna urmatoarele 10 randuri, asa cum este determinat de data comenzii

După cum puteți vedea în definiția sintaxei, clauza OFFSET este necesară, dar clauza FETCH nu este. Dacă clauza
FETCH este omisă, toate rândurile care urmează după OFFSET vor fi returnate. Veți găsi, de asemenea, că cuvintele
cheie ROW și ROWS sunt interschimbabile, la fel ca FIRST și NEXT, ceea ce permite o sintaxă mai naturală.
Lectia 4: Working with Unkown Values

Sintaxa NULL

SELECT …

FROM …

WHERE … IS NULL

Spre deosebire de logica booleana traditionala, logica predicatelor din SQL trebuie sa tina cont de valorile lipsa si se
ocupa de cazurile in care rezultatul unui predicat este necunoscut.
Filtrele ON / Where precum si clauza HAVING trateaza NULL ca un FALSE.

O clauză WHERE care testează pentru o valoare <column_value> = N nu va returna rânduri atunci când comparația
este FALSE. Nici nu va returna rânduri atunci când valoarea coloanei sau valoarea lui N este NULL.

• ORDER BY tratează NULL-urile ca și cum ar fi aceeași valoare și sortează întotdeauna NULL-urile împreună,
punându-le primul într-o coloană. Asigurați-vă că testați rezultatele oricăror interogări pentru care este utilizată
coloana. Ordinea de sortare conține NULL-uri și înțelege impactul sortărilor crescătoare și descrescătoare asupra
NULL-urilor.

Modulul 8: Using Built-In Functions


Lectia 1: Writing Queries with Built-In Functions

 String functions
o SUBSTRING, LEFT, RIGHT, LEN, DATALENGTH
o REPLACE, REPLICATE
o UPPER, LOWER, RTRIM, LTRIM

 Date and time functions


o GETDATE, SYSDATETIME, GETUTCDATE
o DATEADD, DATEDIFF
o YEAR, MONTH, DAY
 Aggregate functions
o SUM, MIN, MAX, AVG
o COUNT, COUNTBIG

 Mathematical functions
o RAND, ROUND, POWER, ABS
o CEILING, FLOOR

Tipuri de funcții încorporate SQL Server

1. Scalar
2. Agregate
3. Window
4. Rowset

1. Functiile Scalar – returneaza o singura valoare


- UCASE() – uppercase converteste din litera
mica in litera mare
- LCASE() – lowercase converteste din litera
mare in litera mica
- MID() - middle caractere extrase dintr-un
camp de ext
- LEN() - length returneaza lungimea sirului
- ROUND() - rotunjeste un camp numeric la numarul de zecimale specificat
- NOW() - Returneaza data si ora curenta a sistemului
- FORMAT() - Formateaza modul in care un camp este afisat

Functiile scalare pot fi organizate in mai multe categorii cum ar fi

- String
- Conversion
- Logical
- Mathematical
- Date and time functions

Exemplu functie scalar YEAR in clauza SELECT

Exemplu functie scalara matematica ABS – returneaza valoarea absoulta

2. Functii Agregate

- APPROX_COUNT_DISTINCT - Returnează numărul aproximativ de valori dintr-un grup.


- AVG - Returneaza media valorilor dintr-un grup. Ignora null
- CHECKSUM_AGG - Returneaza suma de control dintr-un grup. Ignora null
- COUNT - returnează numărul de articole găsite într-un grup. Returneaza int
- COUNT_BIG - idem doar ca returneaza bigint
- GROUPING - Indica daca o coloana din GROUP BY este agregata sau nu. Returneaza boolean
- GROUPING_ID - Este o funcție care calculează nivelul de grupare
- MAX - Returneaza cea mai mare valoare
- MIN - Returneaza cea mai mica valoare
- STDEV - Returnează abaterea standard statistică a tuturor valorilor din expresia specificată.
- STDEVP - Returnează abaterea standard statistică pentru populație pentru toate valorile din
expresia specificată.
- STRING_AGG - Concatenează valorile expresiilor șir și plasează valorile separatoare între ele.
Separatorul nu este adăugat la sfârșitul șirului.
- SUM - returneaza suma
- VAR - Returnează varianța statistică a tuturor valorilor din expresia specificată
- VARP

Funcțiile agregate grupate operează pe seturi de rânduri definite într-o clauză GROUP BY și returnează un rezultat
sumar. Exemplele includ SUM, MIN, MAX COUNT și AVG. În lipsa unui GRUP BY, toate rândurile sunt considerate un
set și pe toate se realizează agregarea. Următorul exemplu utilizează o funcție COUNT și o funcție SUM pentru a
returna valorile agregate fără o clauză GROUP BY:

3. Window Functios

Window Functios vă permit să efectuați calcule față de un set sau fereastra de randuri. Ei includ clasarea,
compensarea, agregarea și distribuția funcții. Ferestrele sunt definite folosind OVER clauză și apoi li se aplică funcțiile
ferestrei seturile definite.
4. Rowset Functions

Funcțiile de set de rânduri returnează un tabel virtual care poate fi


folosit în altă parte în interogare și luați parametri specifică funcției
de set de rânduri în sine. Ei include OPENDATASOURCE,
OPENQUERY, OPENROWSET, și OPENXML.

De exemplu, funcția OPENQUERY vă permite pentru a transmite o interogare la un server conectat. Este nevoie de
numele de sistem al serverului conectat și interogarea expresie ca parametri. Rezultatele interogării sunt returnate
ca un set de rânduri, sau tabel virtual, la interogare care conține funcția OPENQUERY.

Lectia 2: Using Conversion Functions


Cand scrii interogari sql este foarte posibil sa fii nevoiti sa convertesti datele intre tipuri de date. Uneori conversia
are loc automat, si cateodata trebuie sa o si controlezi. In aceasta lectie vei invata cum sa convertesti datele intre
tipuri de date folosind mai multe functii sql.

Implicit and Explicit Data Type Conversions

Pentru a converti poti folosi CAST si CONVERT sau TRY_CONVERT

Conversia cu CAST (functie scalara):

Sintaxa CAST:
Următorul exemplu din baza de date SQL folosește CAST pentru a converti orderdate din datetime la date

Converting with CONVERT

Converting with PARSE


Lectia 3: Using Logical Functions

O expresie utila pentru validarea tipului de date al unei expresii este ISNUMERIC.

Aceasta testeaza o intrare si returneaza 1 daca expresia este convertibila in orice tip numeric, inculzand numere
intregi, zecimale, bani, floating etc. Daca nu returneaza 0

Lectia 4: Using Functions to Work with NULL

Efectuarea de teste conditionate cu IIF

IIF – returneaza doua valori, depinde de test

IIF accepta trei paramentrii: un test logic de efectuat, o valoare de returnat daca TRUE, o valoare de returnata daca
FALSE
Selecting Items from a list with CHOOSE

CHOOSE este o altă funcție logică în SQL Server. Aceasta este similară cu funcția cu același nume din Microsoft
Access. CHOOSE returnează un articol dintr-o listă, selectând element care se potrivește cu o valoare de index:

Lectia 4: Using Functions to Work with NULL

De multe ori va trebui să luați măsuri speciale pentru a trata NULL. Mai devreme în acest modul, ați învățat cum să
testați pentru NULL cu ISNULL. În acest modul, veți învăța funcții suplimentare pentru lucrul cu NULL.
Converting NULL with ISNULL
Pe lângă conversiile tipurilor de date, SQL Server oferă funcții de conversie sau înlocuire a NULL.
Atât COALESCE, cât și ISNULL pot înlocui intrarea NULL cu o altă valoare.
Pentru a utiliza ISNULL, furnizați o expresie pentru a verifica NULL și o valoare de înlocuire, ca în cele ce
urmează exemplu folosind baza de date de exemplu TSQL: Pentru clienții cu o regiune care evaluează la
NULL, literal „N/A” este returnat de funcția ISNULL în acest exemplu

Utilizarea COALESCE pentru a returna valori non-NULL


Mai devreme în acest modul, ați învățat cum să utilizați Funcția ISNULL pentru a testa NULL. Din moment
ce ISNULL este nu standard ANSI, poate doriți să utilizați funcția COALESCE în schimb. COALESCE ia drept
sale introduceți una sau mai multe expresii și returnează prima argument non-NULL pe care îl găsește.
Cu doar două argumente, COALESCE se comportă ca ISNULL. Cu toate acestea, cu mai mult de două
argumente, COALESCE poate fi folosit ca o alternativă la o expresie CASE cu mai multe părți folosind
ISNULL. Dacă toate argumentele sunt NULL, COALESCE returnează NULL

Using NULLIF to Return NULL If Values Match


Funcția NULLIF este prima pe care o veți învăța în acest sens modul care este proiectat să returneze NULL
dacă este condiția este îndeplinită. NULLIF returnează NULL când doi argumentele se potrivesc.
Aceasta are aplicații utile în domenii precum curățarea datelor, atunci când doriți înlocuiți caracterele
goale sau substituent cu NULL.
NULLIF ia două argumente și returnează NULL dacă ambele se potrivesc. Dacă nu sunt egale, NULLIF
returnează primul argument. În acest exemplu, NULLIF înlocuiește un șir gol (dacă prezent) cu un NULL, dar
returnează angajatul inițiala mijlocie dacă este prezentă:
Modulul 9: Gropuing and Aggregating Data
Lectia 1: Using Aggregate Functions

1.1 Working with Aggregate Functions

1.2 Functiine agregate despre care vom disctua sunt:

- SUM
- MIN
- MAX
- AVG
- COUNT

Cand lucram cu functii agregat trebuie sa tinem cont de cateva chestii:

- Functiile agregat retunreaza o singura valoare scalara si pot fi folosite in clauza SELECT, HAVING sau ORDER BY
- Functiile agregat ingnora valorile NULL, cu exceptia cazului cand folosim COUNT.
- Functiile agregat folosite in clauza SELECT genreaza coloane noi care nu sunt numite, le poti numi folosind AS
- Funcțiile agregate dintr-o clauză SELECT operează pe toate rândurile trecute în faza SELECT. Dacă nu există
Clauza GROUP BY, toate rândurile vor fi rezumate, ca în slide-ul de mai sus.

1.3 Clasificare funtii agregat

SUM – aduna valorile dintr o coloana


AVG – face media valorilor dintr o coloana
MIN – returneaza cel mai mic numar / sau cea mai devreme data
MAX – returneaza cel mai mare numar
COUNT / COUNT_BIG – Numara toate randurile dintr o coloana retunreaza int
Exemplu de functii agregat

Exemplu de functie agregat cu eroare:

Coloana „Sales.OrderDetails.orderid” este nevalidă în lista de selecție, deoarece nu contine o funcție


agregată în clauza GROUP BY.
Deoarece exemplul nostru nu utilizează o clauză GROUP BY, interogarea tratează toate rândurile ca un
singur grup. Toate coloanele, prin urmare, trebuie utilizate ca intrări pentru a agrega funcții. Se elimină
orderid din precedentul exemplu va preveni eroarea. Pe lângă datele numerice, cum ar fi prețul și
cantitățile din exemplul anterior, agregați expresiile pot rezuma și data, ora

This query returns first and last company by name, using MIN and MAX:
2. Using DISTINCT with Aggregate Functions
La începutul acestui curs, ați învățat despre utilizarea DISTINCT într-o clauză SELECT pentru a elimina
duplicatul rânduri.
Când este utilizat cu o funcție agregată, DISTINCT elimină valorile duplicate din intrare coloană
înainte de a calcula valoarea sumară. Acest este util atunci când doriți să rezumați unic apariții de valori,
cum ar fi clienții în Tabelul de comenzi TSQL.
Următorul exemplu returnează clienții care au comenzi plasate, grupate după ID de angajat și an:
2.1 Using Aggregate Functions with NULL

Cu excepția COUNT utilizat cu (*) opțiunea, funcțiile agregate T-SQL ignoră NULL-uri. Aceasta înseamnă, de
exemplu, că o SUMA funcția va adăuga numai valori non-NULL. NULL-uri nu evaluați la zero.

Lectia 2: Using the GROUP BY Clause

Clauza SELECT este evaluata dupa WHERE sau FROM, un virtual tabelul a fost creat.

GROUP BY vă permite să sortati rezultatele fazelor precedente de interogare în grupuri de rânduri.


Ordinea logica a operatiilor

5. SELECT
1. FROM
2. WHERE
3. GROUP BY - creates groups
4. HAVING - operates on groups

6. ORDER BY

Dacă vă amintiți de la începutul cursului, clauza SELECT nu este procesată decât după FROM, WHERE, Clauzele
GROUP BY și HAVING sunt procesate, dacă sunt prezente.

Când discutăm despre utilizarea GROUP BY, este important de reținut că nu numai că GROUP BY precede
SELECT, dar înlocuiește și rezultatele clauzele FROM și WHERE cu propriile sale rezultate.

Rezultatul final al interogării va returna doar unul rând pe grup de calificare (dacă este prezentă o clauză
HAVING). Prin urmare, orice operațiuni efectuate după GROUP BY, inclusiv SELECT, HAVING și ORDER BY, sunt
efectuate pe grupuri, nu pe originalul rânduri de detaliu.

De exemplu, coloanele din lista SELECT trebuie să returneze o valoare scalară per grup. Acest lucru poate
includeți coloana(ele) care sunt grupate sau funcțiile agregate care sunt îndeplinite pentru fiecare grup.

Exemplu eroare GROUP BY:


Using GROUP BY with Aggregate Functions
Lectia 3: Filtering Groups with HAVING:

După ce ați creat grupuri cu o clauză GROUP BY, poate doriți să filtrați în continuare rezultatele. The Clauza
HAVING acționează ca un filtru pentru grupuri, la fel ca clauza WHERE acționează ca un filtru pe rândurile returnate
de clauza FROM. În această lecție, veți învăța cum să scrieți o clauză HAVING și să înțelegeți diferențele dintre
HAVING și WHERE.

Dacă o clauză WHERE și o clauză GROUP BY sunt prezent într-o instrucțiune SELECT, HAVING clauza este a
patra fază a interogării logice prelucrare:

O clauză HAVING vă permite să creați o condiție de căutare, similară conceptual cu predicatul lui WHERE,
care va testa apoi fiecare grup returnat de clauza GROUP BY.

Următorul exemplu din baza de date TSQL grupează toate comenzile după client, apoi returnează numai acei
clienții care au plasat comenzi. Nu a fost adăugată nicio clauză HAVING, așa că nu i se aplică niciun filtru grupuri:
Următorul exemplu adaugă o clauză HAVING la interogarea anterioară. Grupează toate comenzile după
client, apoi returnează doar cei care au plasat 10 sau mai multe comenzi. Grupuri care conțin clienți care au plasat
mai puțin de 10 rânduri sunt aruncate:

Diferenta dintre HAVING si WHERE


În timp ce ambele clauze HAVING și WHERE filtrează datele, este important să ne amintim că WHERE
funcționează pe rândurile returnate de clauza FROM.

Dacă un GRUP BY...HAVING există în interogarea dvs. după WHERE, clauza WHERE va filtra rândurile înainte
ca GROUP BY să fie procesat, potențial limitativ grupurile care pot fi create.

O clauza HAVING este procesata dupa GROUP BY si opereaza numai pe grupuri, nu pe randuri de detalii:

- O clauză WHERE controlează ce rânduri sunt disponibile pentru următoarea fază a interogării.
- O clauză HAVING controlează ce grupuri sunt disponibile pentru următoarea fază a interogării.

Module 15: Executing Stored Procedures


Lectia 1: Querying Data with Stored Procedures
Examinarea procedurilor stocate:

Procedurile stocate sunt denumite colecții de instrucțiuni SQL create cu comanda CREATE PROCEDURE. Acestea
încapsulează multe servere și comenzi de bază de date și poate oferi o conexiune interfață de programare a
aplicațiilor (API) către client aplicații care utilizează parametrii de intrare, de ieșire parametrii și valorile returnate.

Procedurile stocate oferă și alte beneficii, inclusiv performanța rețelei și a motorului de baze de date îmbunătățiri

Cu toate acestea, poate fi util să rețineți că stocat procedurile pot include, de asemenea, INSERT, UPDATE, DELETE și
alte comenzi T-SQL valide. În plus, ei poate fi folosit pentru a oferi un strat de interfață între o bază de date și o
aplicație. Folosind un astfel de strat, dezvoltatorii și administratorii se pot asigura că toată activitatea este efectuată
de module de cod de încredere care validați intrarea și gestionați erorile în mod corespunzător. Elementele unui
astfel de API ar include:

- Views sau funcții cu valori de tabel ca wrappers pentru o recuperare simplă.


- Proceduri stocate pentru extragere atunci când este necesară validarea sau manipularea complexă.
- Proceduri stocate pentru inserarea, actualizarea sau ștergerea rândurilor.

Executarea Procedurilor Stocate:

La începutul acestui curs, ați învățat cum să executați procedurile stocate de sistem. Același mecanism există pentru
executarea procedurilor utilizatorului. Prin urmare unele dintre următoarele îndrumări sunt prevăzute revizuire:

 Pentru a executa o procedura stocata, folosim comanda EXECUTE sau scurtatura sa, EXEC.
 Parametrii unei proceduri stocate sunt de forma @exemplu = 1, @exemplu = 2 etc
 Dacă procedura încapsulează o instrucțiune SELECT simplă, nu sunt necesare elemente suplimentare
executa-l. Dacă procedura include un parametru OUTPUT, vor fi necesari pași suplimentari
Lectia 2: Passing Parameters to Stored Procedures
Procedurile pot fi scrise pentru a accepta parametrii pentru a oferi o mai mare flexibilitate. Majoritatea
parametrilor sunt scrisi ca parametri de intrare, care acceptă valorile transmise în instrucțiunea EXEC și sunt utilizați
în cadrul procedurii.

Unele proceduri pot returna, de asemenea, valori sub formă de parametri OUTPUT, care necesită
suplimentar manipularea de către client la invocarea procedurii. Veți învăța cum să treceți intrarea și să returnați
ieșirea parametrii din această lecție.

Lucrul cu parametrii OUTPUT


Pana acum am vazut proceduri care returneaza valori cu clauza SELECT. SQL ne permite sa retunram si cu parametrul
OUTPUT, iata si cateva beneficii:

- O procedura poate returna un rezultat cu SELECT si poate oferi o valoare aditionala precum numarul de randuri.
Pentru anumite cazuri avem nevoie de o singura valoare si folosim OUTPUT

Procedura în sine trebuie să marcheze un parametru cu cuvântul cheie OUTPUT în declarația parametrului

Lectia 3: Creating Simple Stored Procedures


Pentru a intelege mai bine cum functioneaza procedurile stocate scrise de developeri / admins, este important sa
intelegem cum sunt create. In aceasta lectie vei vedea cum sunt create procedurile stocate care returneaza un set de
valori dintr-o clauza SELECT

Crearea procedurilor pentru returnarea randurilor

Procedurile stocate in SQL sunt folosite pentru multe sarcini cum ar fi

- Configurarea sistemului si intretinerea


- Manipularea datelor.
*Creating Procedures That Accept Parameters

O procedura care accepta parametrii de intrare adauga flexibilitate userului. Pentru a defini paremetrii de intrare in
procedura stocata trebuie declarati in antentul CREATE PROCEDURE. Parametrii se declaraca cu @exemplu1,
@exemplu2 etc si apoi li se atribuite tipul de date

Exemplu:

CREATE PROCEDURE schema.nume

(@numeProcedura as INT)

AS
Lectia 4: Lucrul cu Dynamic SQL
În organizațiile în care crearea de proceduri stocate parametrizate nu este acceptată, poate fi necesar executați
codul T-SQL construit în aplicația dvs. în timpul execuției. Dynamic SQL oferă un mecanism pentru construirea unui
șir de caractere care este transmis la SQL Server, interpretat ca o comandă și executat.

Dynamic SQL este o tehnică de programare care vă permite să construiți instrucțiuni SQL în mod dinamic în timpul
execuției. Puteți crea aplicații mai generale, flexibile, utilizând SQL dinamic, deoarece textul complet al unei
instrucțiuni SQL poate fi necunoscut la compilare. De exemplu, SQL dinamic vă permite să creați o procedură care
funcționează pe un tabel al cărui nume nu este cunoscut până la runtime.

Pentru a executa Dynamic SQL

1. Folosim comanda EXECUTE or EXEC

2. The system-stored procedure sp_executesql supports string input for the query, as well as input parameters
Writing Queries with Dynamic SQL

În subiectul anterior, ați aflat că au existat două metode pentru executarea SQL dinamic. Acest subiect se
concentrează pe metoda preferată, apelarea sp_executesql.

Construirea și executarea SQL dinamic cu sp_executesql este de preferat față de utilizarea EXEC deoarece EXEC nu
poate prelua parametri în timpul execuției.

În plus, sp_executesql generează planuri de execuție care sunt mai susceptibile de a fi reutilizate decât EXEC. Poate
cel mai important, totuși, folosirea sp_executesql poate oferi o linie de apărare împotriva Atacurile de injectare SQL
prin definirea tipurilor de date pentru parametrii.

De ce preferam sp_executesql in locul EXEC?

- Deoarce EXEC nu poate prelua parametrii in timpul executiei


- Dar si pentru ca sp_executesql fenereaza planuri de executie care sunt mai susceptibile in a fi reutilizate decat
EXEC
- Cel mai important totusi este faptul ca sp_executesql poate oferi o linie de aparare impotriva atacurilor SQL
injection prin definirea unor tipuri de date pentru parametrii

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