Documente Academic
Documente Profesional
Documente Cultură
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
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.
- Enterprise
- Standard
- Business Intelligence
Lectia 3 – Notiuni introductive in SQL Server Mangament Studio (SSMS)
Pentru a porni SSMS:
La pornire, de obicei, SSMS va afisa o ferastra de dialog Conectare la Server unde poti sa specifici numele
serverului si parola.
1. Instance Name
2. Dababase Name
3. Authentication
To be continued
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
- 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
Elemente
Operatori de comparare: =, >, <, >=, <=, <>, !=, !>, !<
Operatori aritmetici: + - * / %
Concatenare +
IN - folosit pentru a determina dacă o valoare se potrivește cu orice valoare dintr-o listă sau subinterogare
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
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
Displaying Columns
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
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 –
FROM Sales.OrderDetails;
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:
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
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
FROM profesor;
Sintaxa:
1. Alias cu: AS
FROM Sales.OrderDetails
FROM Sales.OrderDetails
3. Alias cu space
FROM Sales.OrderDetails
Avertisment: Aliasurile de coloane pot fi create accidental și prin omiterea unei virgule între două nume
de coloane din lista SELECT.
Sintaxa:
Alias cu AS
Alias fara AS
IMPORTANT
FROM Sales.OrderDetails
ORDER BY quantity;
Un exemplu care va da eroare:
FROM Sales.OrderDetails
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:
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
Î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
- 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:
CASE categoryid
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
Sintaxa SELECT:
Dupa cum am discutat mai devreme, FROM se proceseaza inaintea lui SELECT.
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ă
Î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
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
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.
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
FROM Sales.Customers AS c
JOIN HR.Employees AS e
Î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.
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.
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.
Pentru a afisa doar randurile cand nu exista match, adauga un test NULL in clauza WHERE urmata de predicatul
OUTER JOIN
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.
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.
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:
• Clauza FROM poate stabili aliasuri de tabel pentru utilizare prin fazele ulterioare de interogare
• 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
Sintaxa ORDER BY
ORDER BY List:
ORDER BY cu alias:
FROM Sales.Orders
Order BY orderyear;
SELECT <column_name_1> AS alias1, <column_name_2> AS alias2
ORDER BY alias1;
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.
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
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.
TOP Option:
FROM <table_source>
Where <search_condition>;
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
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:
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.
String functions
o SUBSTRING, LEFT, RIGHT, LEN, DATALENGTH
o REPLACE, REPLICATE
o UPPER, LOWER, RTRIM, LTRIM
Mathematical functions
o RAND, ROUND, POWER, ABS
o CEILING, FLOOR
1. Scalar
2. Agregate
3. Window
4. Rowset
- String
- Conversion
- Logical
- Mathematical
- Date and time functions
2. Functii Agregate
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
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.
Sintaxa CAST:
Următorul exemplu din baza de date SQL folosește CAST pentru a converti orderdate din datetime la date
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
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:
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
- SUM
- MIN
- MAX
- AVG
- COUNT
- 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.
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.
Clauza SELECT este evaluata dupa WHERE sau FROM, un virtual tabelul a fost creat.
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.
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:
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.
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:
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.
- 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
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:
(@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.
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.