Sunteți pe pagina 1din 83

Curs

1_Test Demo BD

1. Pentru realizarea unei baze de date se foloseste urmatoarea sintaxă :


Selectați răspunsul corect:
a) CREATE DATABASE nume_baza_de_date
b) ALTER DATABASE nume_baza_de_date
c) USE DATABASE nume_baza_de_date
d) REALISE NEW DATABASE nume_baza_de_date

2. Pentru stergerea unei baze de date se foloseste urmatoarea sintaxă:


Selectați răspunsul corect:
a) DROP DATABASE nume_baza_de_date
b) REVOKE DATABASE nume_baza_de_date
c) DELETE nume_baza_de_date
d) DELETE DATABASE nume_baza_de_date

3. Stergerea bazei de date Salarii de pe server se poate realiza prin comanda:


Selectați răspunsul corect:
a) DELETE * FROM SALARII
b) ERASE Database Salarii
c) DROP DATABASE Salarii
d) DELETE Salarii

4. Care dintre urmatoarele instructiuni este folosita pentru stergerea unei baze
de date?
Selectați răspunsul corect:
a) TRUNCATE DATABASE Nume_Baza_de_Date
b) DELETE DATABASE Nume_Baza_de_Date
c) ERASE DATABASE Nume_Baza_de_Date
d) Niciuna dintre variante nu este corecta.
2_Test Demo Tipuri de date

1. Se doreste realizarea unui tabel pentru evidenta produselor avand


structura urmatoare CodProdus, DenumireProduse, DataExpirare, Pret
Care dintre urmatoarele variante privind tipurile de date o considerați
corectă ?
Selectați răspunsul corect:
a) CodProdus - int
DenumireProduse - nvarchar(100)
DataExpirare - money
Pret – date
b) CodProdus - nvarchar(100)
DenumireProduse - nvarchar(100)
DataExpirare - money
Pret – money
c) CodProdus - nvarchar(100)
DenumireProduse - nvarchar(100)
DataExpirare - date
Pret – date
d) CodProdus - int
DenumireProduse - nvarchar(100)
DataExpirare - date
Pret - money
2. Care dintre urmatoarele tipuri de date pot fi utilizate pentru a memora
un nume format din literele alfabetului romanesc (ex: Țugulea)?
Selectați răspunsul corect:
a.)Varchar
b.)Char
c.)Nchar
d.)Int

3. Care din afirmatiile urmatoare referiotare la tipul de data NCHAR


(10) este adevarata
Selectați răspunsul corect:
a) Suporta un sir de 10 caractere si suporta caractere specifice
anumitor limbi, cum sunt diacriticele din limba romana
b) Suporta un sir de 10 caractere si nu suporta caractere specifice
anumitor limbi, cum sunt diacriticele din limba romana
c) Suporta un sir de mai mult de 10 caractere si nu suporta caractere
specifice anumitor limbi, cum sunt diacriticele din limba romana
d) Suporta un sir de mai mult de 10 caractere si suporta caractere
specifice anumitor limbi, cum sunt diacriticele din limba romana

4. Care din afirmatiile urmatoare referiotare la tipul de data DATE este


adevarata
Selectați răspunsul corect:
a.)Suporta o data calendaristica si ora
b.)Suporta o data calendaristica
c.)Suporta un sir de caractere
d.)Suporta un numar cu zecimale

5. Se doreste realizarea unui tabel pentru evidenta platilor avand


urmatoarea structura: NrPlata, DataPlata , SumaPlatita, Observatii
Pe care dintre urmatoarele variante privind tipurile de date o considerati
corecta?
a) NrPlata - int
DataPlata - date
SumaPlatita - nvarchar(100)
Observatii - nvarchar(100)

b) NrPlata - int
DataPlata - date
SumaPlatita - money
Observatii - nvarchar(100)
c) NrPlata - int
DataPlata - int
SumaPlatita - date
Observatii – int
d) NrPlata - int
DataPlata - money
SumaPlatita - date
Observatii - nvarchar(100)
3_Test Demo Tabele

In cazul tabelului Student(CNP, DataNastere, MedieBac, LiceuAbsolvit)


adaugarea restrictiei privind obligativitatea ca valoarea pentru MedieBac sa fie mai
mare decat 6 se realizeaza astfel:
Selectați răspunsul corect:
a) ADD CONSTRAINT IN TABLE Student
CHECK (MedieBac>=6)
b) CREATE TABLE Student
ADD CONSTRAINT C_Medie
CHECK (MedieBac < 6)
c) ALTER TABLE Student
ADD CONSTRAINT FK_Medie FOREIGN KEY (MedieBac)
d) ALTER TABLE Student
ADD CONSTRAINT C_Medie
CHECK (MedieBac>=6)
In cazul tabelului Contract(NrContract,DataContract,DataFinalizare,Valoare,
TipContract) adaugarea restrictiei privind obligativitatea ca valoarea sa fie intre
300 si 500 se realizeaza astfel:
Selectați răspunsul corect:
a) ALTER TABLE Contract
ADD CONSTRAINT CValoare
CHECK (Valoare between 300 and 500)
b) CREATE TABLE Contract
ADD CONSTRAINT CValoare
CHECK (Valoare>500 and Valoare <300)
c) ALTER TABLE Contract
ADD CONSTRAINT CValoare (Valoare between 300 and 500)
d) ADD CONSTRAINT IN TABLE Contract
CHECK (Valoare IN (300,500))
In cazul tabelului ContractInchiriere (NrContract,DataContract,DataFinalizare)
adaugarea restrictiei privind obligativitatea ca data contractului sa fie anterioara
datei de finalizare se realizeaza astfel:
Selectați răspunsul corect:
a) MODIFY TABLE ContractInchiriere
ADD CONSTRAINT CHECK (DataContract<=DataFinalizare)
b) ADD CONSTRAINT IN TABLE ContractInchiriere
CHECK (DataContract<=DataFinalizare)
c) ALTER TABLE ContractInchiriere
ADD CONSTRAINT CDATA
CHECK (DataContract<=DataFinalizare)
d) CREATE TABLE ContractInchiriere
ADD CONSTRAINT CDATA
CHECK (DataContract<=GetDate())
In cazul tabelului Produs(NrProdus, Denumire, TipProdus) adaugarea restrictiei
privind obligativitatea ca valoarea pentru TipProdus sa fie doar A, B sau C se
realizeaza astfel:
Selectați răspunsul corect:
a) ALTER TABLE Produs
ADD CONSTRAINT FK_TipProdus FOREIGN KEY (TipProdus)
b) ALTER TABLE Produs
ADD CONSTRAINT CTIP
CHECK (TipProdus ='A' or TipProdus = 'B' or TipProdus ='C')
c) CREATE TABLE Produs
ADD CONSTRAINT
CHECK (TipProdus in ('A', 'B','C'))
d) ADD CONSTRAINT IN TABLE Produs
CHECK (TipProdus in ('A', 'B','C'))
In cazul tabelului Student(CNP, DataNastere, MedieBac, LiceuAbsolvit)
adaugarea restrictiei privind obligativitatea ca valoarea pentru DataNastere sa fie
mai mare 1 ian 2000 (1/1/2000):
Selectați răspunsul corect:
a) ALTER TABLE Student
ADD CONSTRAINT DataNastere>='1/1/2000'
b) ADD CONSTRAINT IN TABLE Student
CHECK (DataNastere in ('1/1/2000'))
c) CREATE TABLE Student
ADD CONSTRAINT C_DataNastere
CHECK (DataNastere < '1/1/2000')
d) ALTER TABLE Student
ADD CONSTRAINT C_DataNastere
CHECK (DataNastere>='1/1/2000')

4_Test Demo Relatii intre tabele


Se dau tabelele:
Student (IdStudent, Nume, Prenume, DataNasterii, NrGrupa).
Grupa (NrGrupa, Observatii)
Pentru adăugarea unei restricții de integritate referențială care sa permită
actualizarea în cascada, completați (cu un singur cuvânt) următoarea fraza TSQL:
ALTER TABLE STUDENT
ADD CONSTRAINT FK_Grupa_Student
FOREIGN KEY (NrGrupa) REFERENCES GRUPA (NrGrupa)
ON UPDATE CASCADE

Sintaxa
ALTER TABLE Contract
ADD CONSTRAINT FK_Contract
FOREIGN KEY (IdClient)
REFERENCES Client(IdClient)
ON UPDATE NO ACTION
ON DELETE CASCADE
Are ca efect:
Selectați răspunsul corect:
a) Definirea cheii externe in tabelul Contract pentru care se aplică
restricţia de integritate referenţială
b) Definirea cheii externe in tabelul Contract pentru care se realizeaza
actualizarea in cascada
c) Definirea cheii externe in tabelul Client pentru care se aplică restricţia de
integritate referenţială
d) Definirea cheii externe in tabelul Contract pentru care nu se aplică restricţia
de integritate referenţială
In cazul tabelelor
Contract(NrContract,DataContract,DataFinalizare,Valoare, TipContract,
CodClient)
Client (CodClient, DenumireClient)
adaugarea restrictiei de integritate referentiala pentru campul CodClient se
realizeaza astfel:
Selectați răspunsul corect:
a) ALTER TABLE Contract
ADD FOREIGN KEY (Codclient)
REFERENCES client(Codclient)
b) CREATE TABLE Contract
ADD CONSTRAINT FK_CodClient FOREIGN KEY (Codclient)
REFERENCES client(Codclient)

c) ALTER TABLE Contract


ADD CONSTRAINT FK_CodClient FOREIGN KEY (Codclient)
REFERENCES Client(Codclient)
d) ADD FOREIGN KEY (Codclient) IN TABLE Contract
In cazul tabelelor
Comanda(NrComanda, DataComanda )
Produs (CodProdus, DenumireProdus)
ContinutComanda( Nrcomanda, CodProdus, Cantitate, Pret)
adaugarea restrictiei de integritate referentiala pentru campul CodProdus se
realizeaza astfel:
Selectați răspunsul corect:
a) ALTER TABLE ContinutComanda
ADD CONSTRAINT FK_CodProdus FOREIGN KEY (CodProdus)
REFERENCES Produs(CodProdus)
b) ALTER TABLE ContinutComanda
ADD FOREIGN KEY (CodProdus)
REFERENCES Produs(CodProdus)
c) ADD FOREIGN KEY (CodProdus) IN TABLE ContinutComanda
d) CREATE TABLE ContinutComanda
ADD CONSTRAINT FK_NrComanda FOREIGN KEY (NrComanda)
REFERENCES Comanda(NrComanda)
In cazul legăturii dintre tabele Produse și ProduseVandute din imaginea următoare

care din afirmațiile următoare este adevărată?


Selectați răspunsul corect:
a) Definirea cheii externe IdProdus in tabelul ProduseVandute pentru care nu
se aplică restricţia de integritate referenţială și ștergerea în cascada.
b) Definirea cheii externe IdProdus in tabelul ProduseVandute pentru care se
aplică restricţia de integritate referenţială și actualizarea în cascadă.
c) Definirea cheii externe IdProdus in tabelul ProduseVandute pentru care se
aplică restricţia de integritate referenţială și actualizarea și ștergerea în
cascada.
d) Definirea cheii externe IProdus in tabelul ProduseVandute pentru care
se aplică restricţia de integritate referenţială și ștergerea în cascada.

5_Test demo Clauza SELECT


In cadrul executiei unei sintaxe T-SQL de selectie (SELECT), evaluarea clauzei
TOP se va realiza
Selectați răspunsul corect:

a) Prima
b) Ultima
c) Anterior clauzei SELECT
d) Depinde de structura si complexitatea sintaxei

In cadrul executiei unei sintaxe T-SQL de selectie (SELECT), evaluarea clauzei


WHERE se va realiza
Selectați răspunsul corect:
a) Ulterior clauzei GROUP BY
b) Ulterior clauzei TOP
c) Anterior clauzei FROM
d) Ulterior clauzei FROM
Rezultatul executiei sintaxei urmatoare
SELECT *
FROM Plati
ORDER BY SumaPlatita DESC
WHERE SumaPlatita> 200
va contine:
Selectați răspunsul corect:
a) Rezultatul nu va contine nicio inregistrare
b) Toate inregistrarile tabelului Plati
c) Eroare
d) Toate inregistrarile tabelului Plati ce au cea mai mare suma platita
În cadrul tabelului Plati (IdPlata, SumaPlatia, DataOraPlata),
afișarea descrescătoare a valorilor totale pentru fiecare tip de plata se realizează
astfel:
Selectați răspunsul corect:
a) SELECT SUM(SumaPlatita) as SumaTotala, TipPlata
FROM plati
GROUP BY TipPlata
ORDER BY SumaTotala
b) SELECT SumaPlatita, TipPlata
FROM plati
ORDER BY SumaTotala DESC
c) SELECT SUM(SumaPlatita) as SumaTotala, TipPlata
FROM plati
GROUP BY TipPlata
ORDER BY SumaTotala DESC
d) SELECT SUM(SumaPlatita) as SumaTotala, TipPlata
FROM plati
ORDER BY SumaTotala DESC
Fie tabelul ContinutComanda(NrComanda, CodProdus, Cantitate, Pret). Pentru a
calcula media preturilor pe fiecare produs se va utiliza comanda:
Selectați răspunsul corect:
a) SELECT AVG(Pret) as Medie, CodProdus
FROM ContinutComanda
GROUP BY Medie
b) SELECT Sum(Pret) as Total, CodProdus
FROM ContinutComanda
GROUP BY CodProdus
c) SELECT AVG(Pret) as Medie, CodProdus
FROM ContinutComanda
d) SELECT AVG(Pret) as Medie, CodProdus
FROM ContinutComanda
GROUP BY CodProdus

6_Test Demo functii predefinite


Expresia DATEPART(quarter, ‘12/11/2013’) va afisa
Selectați răspunsul corect:
a) 4
b) 11
c) 3
d) 2
Expresia ROUND (15.32,0) va afisa
Selectați răspunsul corect:
a) Eroare
b) 15
c) 16
d) 15,32
Expresia ROUND (15.78,0) va afisa
Selectați răspunsul corect:
a.)15
b.)16
c.)eroare
d.)15,78
Pentru tabelul Plata ce contine urmatoarele inregistrari
NrPlata DataPlata TipPlata SumaPlatita
1 1-1-2013 Card 200
2 1-1-2013 Bonuri de masa 120
3 2-1-2013 Card 150

Executia sintaxei urmatoare

SELECT COUNT(TipPlata) as Nr1, COUNT(DISTINCT TipPlata) as Nr2


FROM Plata

afiseaza:
Selectați răspunsul corect:
a.)Nr1 Nr2
3 3
b.)Nr1 Nr2
3 2
c.)Nr1 Nr2
2 3
d.)Nr1 Nr2
2 2
Expresia ROUND (15.78,0,1) va afisa
Selectați răspunsul corect:
a) Eroare
b) 16
c) 15
d) 15,78

7_Test Demo INSERT UPDATE DELETE


Completați fraza SQL următoare pentru a se realiza ștergerea contractelor de tip
A cu inserarea numarului de contract in tabelul ArhivaContracte.
DELETE contract
OUTPUT DELETED.nrcontract INTO ArhivaContracte.
WHERE tipContract=‘A'
Se considera tabelele
Contract (Numar, Data, Valaore, TipContract, CodClient)
Client (CodClient, Denumire, Adresa)
Completați fraza SQL următoare pentru a se adăuga două zile la data de finalizare
a contractelor pentru contractele de tip B ale clientilor din Bucuresti.
UPDATE Contract
SET datafinalizare=DATEADD(month,2,datacontract)
FROM Client
WHERE Client.CodClient=Contract.CodClient
and TipContract='B'
and Adresa=‘Bucuresti'
Completați sintaxa următoare pentru a permite ștergerea înregistrărilor tabelului
Contract pentru care tipul contractului are valoarea B, cu afișarea rezultatului.
DELETE contract OUTPUT DELETED.* WHERE TipContract='B'
Completați sintaxa următoare pentru a permite adăugarea unui contract cu valoarea
de 200, data fiind 1/1/2015, cu afișarea rezultatului.
INSERT INTO Contract (Data,Valoare)
OUTPUT INSERTED.*
Values ('1/1/2015',200). Care din afirmatiile urmatoare referitoare la tabela
DELETED este adevarata?
Selectați unul sau mai multe:
a) Se utilizeaza la adaugare
b) Se utilizeaza la modificare
c) Se utilizeaza la stergere
d) Se utilizează pentru a memora temporar înregistrările ce urmează a se
sterge din baza de date.
Ce tabel(e) temporare apar la INSERT?
Selectați răspunsul corect:
a) INSERTED
b) UPDATED
c) DELETED si INSERTED
d) DELETED
Ce tabel(e) temporare apar la DELETE?
Selectați răspunsul corect:
a.)INSERTED
b.)UPDATED
c.)DELETED
d.)DELETED si INSERTED
Stergerea tuturor inregistrarilor dintr-un tabel se realizeaza cu :
Selectați unul sau mai multe:
a) TRUNCATE TABLE Nume_Tabel
b) DROP TABLE Nume_Tabel
c) DELETE Nume_Tabel
d) DELETE FROM Nume_Tabel
8_ Test Demo Triggers
Se consideră tabelul
Colaborator(Cod, Nume, IdDepartament, DataNasterii)
Departament(IdDepartament, Denumire)
Completați următorul cod SQL pentru a se realiza un declanșator care să nu
permită adăugarea codurilor colaboratorilor cu lungime diferită de 5 caractere.
CREATE TRIGGER TR1 ON Colaborator FOR INSERT AS
IF EXISTS ( SELECT * from INSERTED where LEN(Cod)<>5)
BEGIN
RAISERROR ('Eroare',1,1)
ROLLBACK
END
Se consideră tabelul
Colaborator (Cod, Nume, IdDepartament, DataNasterii)
Departament (IdDepartament, Denumire)
Completați următorul cod SQL pentru a se realiza un declanșator care să nu
permită ștergerea departamentelor unde sunt angajați colaboratori nascuti in anul
1977.
CREATE TRIGGER TR1 ON Departament FOR [DELETE] AS
IF EXISTS (SELECT * From [DELETED] INNER JOIN Colaborator
ON [DELETED].IdDepartament =Colaborator.IdDepartament
WHERE YEAR(DataNasterii)=1977)
BEGIN
RAISERROR ('Eroare',10,10)
ROLLBACK
END
Care dinte afirmatiile urmatoare nu este adevarata
Selectați răspunsul corect:
a) Folosirea sintaxei ROLLBACK TRANSACTION in cadrul unui trigger
conduce la anularea acțiunii de modificare, adăugare sau ștergere
b) Folosirea sintaxei RAISERROR in cadrul unui trigger conduce la
anularea acțiunii de modificare, adăugare sau ștergere
c) In cadrul definirii unui trigger FOR poate fi înlocuit cu AFTER
d) Utilizarea lui INSTEAD OF in cadrul unui trigger presupune ca
instrucţiunile SQL din cadrul triggerului înlocuiesc operaţia de tip INSERT,
UPDATE sau DELETE care nu se mai execută
Executia sintaxei urmatoare

CREATE TRIGGER TR1 ON Colaborator FOR INSERT AS

IF EXISTS(SELECT * from INSERTED where LEN(Cod)=3 )


BEGIN
RAISERROR ('Eroare',1,1)
ROLLBACK
END

are ca efect
Selectați răspunsul corect:
a) realizarea unui declansator (trigger) ce nu permite adaugarea in tabela
Colaborator a inregistrarilor pentru care valoarea atributului Cod are
un numar de caractere egal cu 3
b) realizarea unui declansator (trigger) ce nu permite adaugarea in tabela
Colaborator a inregistrarilor pentru care valoarea atributului Cod are mai
mult de 3 caractere
c) afisarea unui mesaj de eroare
d) realizarea unui declansator (trigger) ce nu permite adaugarea in tabela
Colaborator a inregistrarilor pentru care valoarea atributului Cod are mai
putin de 3 caractere
Executia sintaxei urmatoare

CREATE TRIGGER TR1 ON Colaborator FOR UPDATE AS


IF EXISTS (SELECT * from INSERTED inner join DELETED on
INSERTED.cod=DELETED.Cod
where INSERTED.salariu>DELETED.Salariu )
BEGIN
RAISERROR ('Eroare',1,1)
ROLLBACK
END

are ca efect
Selectați răspunsul corect:
a) realizarea unui declansator (trigger) ce nu permite miscorarea salariilor in
cadrul tabelei Colaborator.
b) afisarea unui mesaj de eroare
c) realizarea unui declansator (trigger) ce nu permite modificarea salariilor in
cadrul tabelei Colaborator.
d) realizarea unui declansator (trigger) ce nu permite majorarea salariilor
in cadrul tabelei Colaborator.

9_Test Demo Views


In cazul obiectului de tip View realizat astfel

Create View PlatiPeste500


AS
SELECT IDPlata,SumaPlatita FROM Plati
WHERE SumaPlatita > 500
WITH CHECK OPTION
care dintre afirmatiile urmatoare este corecta?
Selectați răspunsul corect:
a) Se poate adauga in cadrul obiectului de tip view o plata avand valoarea
sumei platite de 800
b) Se poate adauga in cadrul obiectului de tip view o plata avand valoarea
sumei platite de 300
c) Nu se poate sterge o plata avand valoarea sumei platite de 800
d) Se poate modifica in cadrul obiectului de tip view o valoarea a sumei platite
de la 800 la 350.

In cazul obiectului de tip View realizat astfel


Create View PlatiPeste500
AS
SELECT IDPlata,SumaPlatita from plati
WHERE SumaPlatita > 500
care dintre afirmatiile urmatoare nu este corecta?
Selectați răspunsul corect:
a) Se poate adauga in cadrul obiectului de tip view o plata avand valoarea
sumei platite de 300
b) Se poate modifica in cadrul obiectului de tip view o valoarea a sumei platite
de la 800 la 350.
c) Nu se poate sterge o plata avand valoarea sumei platite de 800
d) Se poate adauga in cadrul obiectului de tip view o plata avand valoarea
sumei platite de 800

Executia urmatoarei sintaxe T-SQL

CREATE VIEW SumaTotalaTipPlata


AS
SELECT SUM(SumaPlatita), TipPlata
FROM plati
GROUP BY TipPlata
are ca rezultat:

Selectați răspunsul corect:


a.) Eroare
b.) Afisarea valorilor totale pe tipuri de plata
c.) Realizarea unui obiect de timp View SumaTotalaTipPlata
d.) Modificarea obiectului de tip ViewSumaTotalaTipPlata

Executia urmatoarei sintaxe T-SQL

CREATE VIEW SumaTotalaTipPlata


AS
SELECT SUM(SumaPlatita) as SumaTotala, TipPlata
FROM Plati
GROUP BY TipPlata
ORDER BY SumaTotala

are ca rezultat:
Selectați răspunsul corect:
a) Realizarea unui obiect de tip View SumaTotalaTipPlata
b) Afisarea valorilor totale pe tipuri de plata ordonate in functie de valoarea
totala
c) Afisarea valorilor totale pe tipuri de plata

d) Eroare

Crearea unui view pentru selectarea tuturor inregistrarilor din tabelul Plati se face
folosind urmatoarea instructiune:
Selectați răspunsul corect:
CREATE VIEW InregistrariPlati
AS
SELECT *
FROM Plati
CREATE VIEW InregistrariPlati
AS
BEGIN
SELECT *
FROM Plati
END
CREATE VIEW InregistrariPlati
(
SELECT *
FROM Plati
)
CREATE VIEW InregistrariPlati
SELECT *
FROM Plati

10_Test Demo Variabile


cum se poate realiza modificarea tipurilor de date definite de utilizator ?
Selectați răspunsul corect:
a.)DROP TYPE Nume_tip_Definit_utilizator
b.)MODIFY TYPE Nume_tip_Definit_utilizator
c.)ALTER TYPE Nume_tip_Definit_utilizator
d.)Nu se poate modifica tipul de data definit de utilizator

Urmatoarea sintaxa
CREATE TYPE CNP
FROM char(13) NOT NULL
are ca efect
Selectați răspunsul corect:
a) Definirea tipului de data personalizat CNP
b) Redefinirea tipului CHAR(13)
c) Definirea tabelului CNP
d) Niciuna din variantele precedente nu este corecta
Pentru declararea unei variabile de tip tabel ce contine doua coloane TipPlata si
SumaTotala se va folosi urmatoarea sintaxa:
Selectați răspunsul corect:
a) Declare @VariabilaTabel TABLE
(TipPlata nvarchar(50),
SumaTotala money)
b) Create @VariabilaTabel TABLE
(TipPlata nvarchar(50),
SumaTotala money)
c) Create @VariabilaTabel TABLE
(TipPlata nvarchar(50),
SumaTotala money)
d) Declare Table @Variabila TABLE
(TipPlata nvarchar(50),
SumaTotala money)
Pentru declararea unei variabile de tip tabel ce contine doua coloane
NumarComanda si ValoareComanda se va folosi urmatoarea sintaxa:
Selectați răspunsul corect:
a) Declare @VariabilaTabel TABLE
(NumarComanda bigint,
ValoareComanda money)
b) Create @VariabilaTabel TABLE
(NumarComanda bigint,
ValoareComanda date)
c) Declare Table @Variabila TABLE
(NumarComanda bigint,
ValoareComanda money)
d) Create @VariabilaTabel TABLE
(NumarComanda date,
ValoareComanda money)
Pentru declararea unei variabile @An si atribuirea valorii 2018 se va folosi
urmatoarea sintaxa:
a) DECLARE @An date
SET @An=2018
b) DIM @An int
@An=2018
c) DECLARE @An int
SET @An=2018
d) Declare @An int
@An=2018

11_Test Demo Structuri alternative/repetitive

Care afirmatie referitoare la WHILE in TSQL nu este adevarata:


Selectați răspunsul corect:
a) BREAK opreste executia buclei WHILE
b) CONTINUE este folosit pentru a relua executia buclei WHILE
c) Este folosita pentru a intrerupe executia unei secvente T-SQL
d) Repetă execuția unei secvențe de cod T-SQL cât timp este adevărată
expresia logică
Care din urmatoarele afirmatii referitare la RETURN este adevarata?
Selectați răspunsul corect:
a) RETURN este folosit in cadrul obiectelor de tip VIEW
b) RETURN este folosit pentru a returna inregistrarile dintr-un tabel
c) RETURN este folosit pentru a intrerupe executia unei secvente T-SQL.
d) RETURN nu poate fi folosit decat in cadrul declansataorilor (TRIGGER)

In cazul in care in tabela Plati se gasesc urmatoarele inregistrari


NrPlata DataPlata SumaPlatita
1 1-1-2013 500
2 1-2-2013 100
3 1-3-2013 300

Urmatoarea secventa de cod T-SQL


DECLARE @Variabila int
SET @Variabila = 2
IF @Variabila = 1
SELECT TOP 1 * FROM Plati
SELECT 'Valoarea variabilei este 1'
va afisa:
Selectați răspunsul corect:
a.)NrPlata DataPlata SumaPlatita
1 1-1-2013 500
b.)NrPlata DataPlata SumaPlatita
1 1-1-2013 500
2 1-2-2013 100
3 1-3-2013 300
c.)Valoarea variabilei este 1
d.)NrPlata DataPlata SumaPlatita
1 1-1-2013 500
2 1-2-2013 100
3 1-3-2013 300

In cazul in care in tabela Plati se gasesc urmatoarele inregistrari


NrPlata DataPlata SumaPlatita
1 1-1-2013 500
2 1-2-2013 100
3 1-3-2013 300

Urmatoarea secventa de cod T-SQL


DECLARE @Variabila int
SET @Variabila = 1
IF @Variabila = 1
BEGIN
SELECT TOP 1 * FROM Plati
SELECT 'Valoarea variabilei este 1'
END
va afisa:
Selectați răspunsul corect:
a.)Valoarea variabilei este 1
b.)NrPlata DataPlata SumaPlatita
1 1-1-2013 500
c.)NrPlata DataPlata SumaPlatita
1 1-1-2013 500
2 1-2-2013 100
3 1-3-2013 300
d.)NrPlata DataPlata SumaPlatita
1 1-1-2013 500

Valoarea variabilei este 1

In cazul in care in tabela Plati se gasesc urmatoarele inregistrari


NrPlata DataPlata SumaPlatita
1 1-1-2013 500
2 1-2-2013 100
3 1-3-2013 300

Urmatoarea secventa de cod T-SQL


DECLARE @Variabila int
SET @Variabila = 1
IF @Variabila = 1
BEGIN
SELECT * FROM Plati
SELECT 'Valoarea variabilei este 1'
END

va afisa:
Selectați răspunsul corect:
a.)Valoarea variabilei este 1
b.)NrPlata DataPlata SumaPlatita
1 1-1-2013 500

Valoarea variabilei este 1


c.) NrPlata DataPlata SumaPlatita
1 1-1-2013 500
2 1-2-2013 100
3 1-3-2013 300

Valoarea variabilei este 1


d.)NrPlata DataPlata SumaPlatita
1 1-1-2013 500

12_Test Demo Proceduri stocate

Se considera tabelul
Plati (IdPlata, DataOraPlata, TipPlata, SumaPlatita)
Incasari (IdIncasare, DataOraIncasare,TipIncasare, SumaIncasata)
Completați casetele următoare (cu un singur cuvânt) pentru a realiza o procedura
stocată care afișează lista plăților ulterioare unei date introduse ca parametru.

CREATE Procedure listaPlati


@pData as Date
AS
Select *
FROM Plati
WHERE DataOraPlata >=@pData

Se considera tabelul
Plati(IdPlata,DataOraPlata,TipPlata,SumaPlatita)
Completați casetele următoare (cu un singur cuvânt) pentru a realiza o procedura
stocată care returnează (parametru ieșire) numărul plaților ulterioare unei date
introduse ca parametru.

CREATE PROCEDURE NrPlati


@pData as DATE,
@pNr as int OUTPUT
AS
SET @pNr = (SELECT COUNT(*) FROM Plati
WHERE DataOraPlata >=@pData

În cazul în care se dorește apelarea unei proceduri stocate, cu denumire NrPlati, cu


un parametru de intrare de tip DATE și un parametru de ieșire de tip INT,
completați casetele următoare (cu un singur cuvânt) pentru a afișa valoarea
parametrului de ieșire.

DECLARE @vNrPlati as INT


EXEC NrPlati '1/1/2018', @vNrPlati OUTPUT
Select @vNrPlati

Care dintre afirmațiile următoare referitoare la procedura


stocata sp_executesql este adevărată:
Selectați răspunsul corect:
a) Permite afișarea listei bazelor de date de pe server
b) Permite redenumirea obiectelor din baza de date
c) Permite afișarea informațiilor privind coloanele unui tabel specificat ca
parametru
d) Permite executarea unor instrucțiuni SQL specificate ca parametru

Care din afirmația următoare referitoare la procedurile stocate în T-SQL este


adevărată?
Selectați unul sau mai multe:

a) Executarea de către utilizator se realizează prin intermediul unei comenzi


SELECT
b) Executarea de către utilizator se realizează prin intermediul unei
comenzi EXEC
c) Crearea procedurii se realizeză prin intermediul comenzii CREATE
PROCEDURE
d) Crearea procedurii se realizează prin intermediul comenzii INSERT
PROCEDURE

13_Test Demo Functii scalare


Sa se completeze următorul cod T-SQL pentru a se realiza o funcție scalara pentru
calculul sporului de vechime.

CREATE FUNCTION SporVechime (@Vechime INT)


RETURNS MONEY
AS
BEGIN
Declare @REZ MONEY
IF @Vechime >=10 THEN
@REZ =0.5
ELSE
@Rez=0
RETURN @Rez
END

Sa se completeze următorul cod T-SQL pentru a se apela funcția


scalara SporVechime pentru calculul sporului de vechime pentru vechimea de 20
ani.

SELECT dbo.SporVechime(20)

Sa se completeze următorul cod T-SQL pentru a se realiza o funcție scalara pentru


calculul reducerii în funcție de valoarea produsului.
CREATE FUNCTION Reducere(@Valoare MONEY)
RETURNS MONEY
AS
BEGIN
DECLARE @Reducere MONEY
IF @Valoare >=100 THEN
@Reducere=0.5
ELSE
@Reducere=0
RETURN @Reducere
END

Se considera tabelul Angajat (IdAngajat, Vechime, Nume)


Care dintre modalitățile de apelare a funcției scalare SporVechimeeste corecta?
Selectați unul sau mai multe:
a) SELECT *
FROM dbo.SporVechime (16)
b) SELECT dbo.SporVechime (Vechime), Nume
FROM Angajat
c) SELECT dbo.SporVechime (16)
d) EXECdbo.SporVechime (16)

Se considera tabelul ProdusVantut(IdProdus,NrComanda, Cantiate, Pret)


Care dintre modalitățile de apelare a funcției scalare Reducere, care calculeaza
reducerea pentru un produs, pe baza valorii acestuia,este corecta?
Selectați unul sau mai multe:
a) SELECT dbo.Reducere (Cantitate*Pret), IdProdus
FROM ProduseVandute
b) EXEC dbo.Reducere (160)
c) SELECT Reducere (Pret), IdProdus
FROM ProduseVandute
d) SELECT dbo.Reducere (160)

14_Test Demo Functii tabelare

Se consideră tabelele
Completați codul TSQL următor pentru a realiza o funcție tabelara pentru a afișa
numărul total de bonuri de casă realizate de fiecare vânzător pentru care valoarea
totală a vânzărilor depășește 100.
CREATE FUNCTION FunctieTabelara ()
RETURNS @t TABLE (MarcaVanzator int, NumarBonuriCasa int)
AS
BEGIN
INSERT INTO @t
SELECT MarcaVanzator, COUNT (BonuriCasa.NrBonCasa) as NR
FROM ProduseVandute INNER JOIN BonuriCasa
ON ProduseVandute.NrBoncasa=BonuriCasa.NrBonCasa
GROUP BY MarcaVanzator
HAVING SUM(Cantitate*pretvanzare) >100
RETURN
END

Care din următoarele răspunsuri le considerați corecte?


Selectați unul sau mai multe:
a) funcție tabelară se poate defini prin modalitatea INLINE
b) funcție tabelară se poate defini prin modalitatea MULTISET
c) O funcție tabelară se poate defini prin modalitatea
MULTIINSTRUCTIUNE
d) funcție tabelară se poate defini prin modalitatea MULTILINE

Care din următoarele răspunsuri le considerați corecte pentru a defini prin


metoda INLINE o funcție tabelară care să afișezeprimii 3 colaboratori cu cele mai
mari salarii?
Selectați răspunsul corect:
a) create functionPrimiiColaboratori()
RETURNS @Tabel Table (Cod, Nume)
as
RETURN
(SELECT TOP 3 Cod,Nume from colaborator order by salariu )
b) create function PrimiiColaboratori ()
RETURNS Table
as
(SELECT TOP 3 Cod,Nume from colaborator order by salariu )
c) create function PrimiiColaboratori()
RETURNS @Tabel Table (Cod, Nume)
as
INSERT INTOTabel
SELECT TOP 3 Cod,Nume from colaborator order by salariu
d) create function PrimiiColaboratori()
RETURNS Table
as
RETURN
(SELECT TOP 3 Cod,Nume from colaborator order by salariu )
Care din următoarele răspunsuri le considerați corecte pentru a defini o funcție
tabelară care să afișezeprimele 3 plăți cu cea mai mare sumă?
Selectați unul sau mai multe:
a) CREATE Function PrimelePlati ()
RETURNS @Tabel Table (IdPlata int,SumaPlatita money)
as
BEGIN
INSERT INTO @Tabel (IdPlata,SumaPlatita)
SELECT TOP 3 IdPlata,SumaPlatita FROM Plati Order BY
SumaPlatita DESC
RETURN
END
b) CREATE Function PrimelePlati ()
RETURNS @Tabel Table (IdPlata int,SumaPlatita money)
as
BEGIN
RETURN
SELECT TOP 3 IdPlata,SumaPlatita FROM Plati Order BY SumaPlatita
DESC
END
c) CREATE Function PrimelePlati ()
RETURNS Table
as
RETURN
(SELECT TOP 3 IdPlata,SumaPlatita FROM Plati Order BY
SumaPlatita DESC)
d) CREATE Function PrimelePlati ()
RETURNS Table
as
BEGIN
SELECT TOP 3 IdPlata,SumaPlatita FROM Plati Order BY SumaPlatita
DESC
END
Care modalitate de apelare a functiei tabelarePrimelePlati, definite în
continuare,este corectă?

CREATE Function PrimelePlati ()


RETURNS Table
as
RETURN
(SELECT TOP 3 IdPlata,SumaPlatita FROM Plati Order BY SumaPlatita DESC)
Selectați răspunsul corect:
a) exec PrimelePlati ()
b) select * from dbo.PrimelePlati ()
c) select PrimelePlati ()
d) select * from dbo.PrimelePlati

15_Test Demo Cursoare

Completați în ordine pașii necesari utilizării unui cursor în TSQL?.

DECLARARE
DESCHIDERE
ACCESARE Inregistrari
INCHIDERE
ELIBERARE MEMORIE

Care dintre afirmațiile următoare este adevărată


Selectați unul sau mai multe:
a) Sintaxa SQL pentru închiderea cursorului este
EXIT nume_cursor
b) Sintaxa SQL pentru eliberarea memoriei ocupata de un cursor este
DEALLOCATE nume_cursor
c) Sintaxa SQL pentru încărcarea în memorie a setul de înregistrări rezultat este
ALLOCATE nume_cursor
d) Sintaxa SQL pentru închiderea cursorului este
CLOSE nume_cursor
e) Sintaxa SQL pentru încărcarea în memorie a setul de înregistrări
rezultat este
OPEN nume_cursor
Selectați varianta corecta pentru declararea cursoruluicursor_platice conține
câmpurile IdPlata,DataOraPlata, SumaPlatita din tabelul TabelPlati
Selectați răspunsul corect:
a) DECLARE cursor_plati CURSOR
b) SELECT CURSOR IdPlata,DataOraPlata, SumaPlatita FROM TabelPlati
c) DECLARE cursor_plati
FOR SELECT IdPlata,DataOraPlata, SumaPlatita FROM TabelPlati
d) DECLARE cursor_plati CURSOR
FOR SELECT IdPlata,DataOraPlata, SumaPlatita FROM TabelPlati

Ce efect are următoarea secvență SQL


FETCH NEXT FROM nume_cursor INTO @NumeVaribila1

Selectați răspunsul corect:


a) Deschiderea cursorului
b) Închiderea cursorului
c) Eliberarea memoriei ocupate de cursor
d) Accesarea unei înregistrări din cursor

Tabelul Plati are următoarele înregistrări


Idplata DataPlata SumaPlatita
1 2/2/1018 400
2 3/3/2018 300
3 4/4/2018 100
4 5/5/2018 300
5 6/6/2018 250
Ce se va afișa la execuția următorului cod SQL?

DECLARE cursor_plati SCROLL CURSOR


FOR
SELECT IdPlata,DataPlata, SumaPlatita
FROM Plati
OPEN cursor_plati
FETCH ABSOLUTE 3 FROM cursor_plati
CLOSE cursor_plati
DEALLOCATE cursor_plati

Selectați unul sau mai multe:

a) Idplata DataPlata SumaPlatita


2 3/3/2018 300
b) Idplata DataPlata SumaPlatita
1 2/2/1018 400
2 3/3/2018 300
3 4/4/2018 100
4 5/5/2018 300
5 6/6/2018 250

c) Idplata DataPlata SumaPlatita


1 2/2/1018 400

d) Va afișa o eroare

e)
Idplata DataPlata SumaPlatita
3 4/4/2018 100

16_Test Demo CTE

Se consideră tabelul Angajat cu următoarea structură

Să se completeze următorul cod TSQL pentru a se realiza un CTE (Common Table


Expressions) ce va conține angajații, șefi acestora și nivelul ierarhic.

with CTE_Angajat(IdAngajat, Nume,IdSef, Nivel)


as
(
SELECT IdAngajat, Nume,IdSef, 0 as Nivel
FROM Angajat
WHERE IdSef IS NULL
UNION ALL
SELECT Angajat.IdAngajat, Angajat.Nume,Angajat.IdSef, [CTE_Angajat]
.Nivel+1 as Nivel
FROM Angajat INNER JOIN [CTE_Angajat] ON Angajat.idsef=
[CTE_Angajat] .IdAngajat

select * from CTE_Angajat

Să se completeze următorul cod TSQL pentru a se realiza un CTE (Common Table


Expressions) recursiv ce va afișa toate numerel mai mici sau egale cu 5.

with CTE_recursiv (Nr)


as
(
SELECT 1 as NR
UNION ALL
SELECT Nr+1
FROM CTE_recursiv
WHERE Nr<5
)
select * from CTE_recursiv
Alegeți varianta corecta:
Selectați răspunsul corect:
a) Un CTE (Common Table Expressions) reprezintă interfața dintre baza de
date SQL server și utilizator.
b) Un CTE (Common Table Expressions) nu poate fi autoreferit
c) Un CTE (Common Table Expressions) este un raport ce sitetizează date din
mai multe tabele.
d) Un CTE (Common Table Expressions) este similar cu un tabel
temporar prin faptul că nu este stocat ca un obiect și durează atât timp
cât durează cererea.
Care din afirmațiile următoare este adevărată?
Selectați unul sau mai multe:
a) RAISERROR permite afișarea unui mesaj de eroare
b) TRY...CATCH se folosesc pentru a capta erorile de execuție
c) Nivelul de severitate al unei erori este cuprins intre 100 si 1000
d) Un CTE (Common Table Expressions) poate fi autoreferit și poate fi
referit de mai multe ori în aceeași interogare.

Care din afirmațiile următoare este adevărată referitoare la următoarea secvență


TSQL

WITH Plati (IdPlata,DataOraPlata,TipPlata, SumaPlatita)


AS
(
SELECT IdPlata,DataOraPlata,TipPlata, SumaPlatita
FROM TabelPlati
WHERE YEAR(DataOraPlata)=2012
)

SELECT * FROM Plati


Selectați unul sau mai multe:
a) Este definit tabelul TabelPlati
b) Este definit tabelul Plati
c) Sunt afișate, prin intermediul unui CTE denumit Plati, înregistrările
din tabelul TabelPlati pentru care anul este 2012
d) Este definit unCommon Table Expressions (CTE) denumit Plati, și sunt
afișate înregistrările acestuia.

TEST RECAPITULATIV PENTRU EXAMEN

Completați codul SQL următor pentru a parcurge tabelul plăți, cu un cursor, și a


determina la ce data s-a atins plafonul de 2000 valoare totală a a sumelor plătite.

DECLARE @Data date, @Suma money, @SumaT as money


DECLARE Crs_Plati CURSOR
FOR SELECT DataOraPlata, SumaPlatita FROM Plati ORDER BY DataOraPlata
ASC
OPEN Crs_Plati
FETCH NEXT FROM Crs_Plati
INTO @Data,@Suma
SET @SumaT=@Suma
WHILE @@FETCH_STATUS=0 and @SumaT<2000
BEGIN
FETCH NEXT FROM Crs_Plati
INTO @Data,@Suma
SET @SumaT=@SumaT+@Suma
END
CLOSE Crs_Plati
DEALLOCATE Crs_Plati
SELECT @Data,@Suma,@SumaT

Se consideră tabelul
Colaborator (Cod, Nume, IdDepartament, DataNasterii)
Departament (IdDepartament, Denumire)
Completați următorul cod SQL pentru a se realiza un declanșator care să nu
permită ștergerea colaboratorilor care lucrează în departamentul Contabilitate.

CREATE TRIGGER TR1 ON Colaborator FOR DELETE AS


IF EXISTS (SELECT * From DELETED INNER JOIN Departament
ON DELETED.IdDepartament =Departament.IdDepartament
WHERE Denumire='Contabilitate')
BEGIN
RAISERROR ('Eroare!',10,10)
ROLLBACK
END

Se considera tabelele
Contract (Numar, Data, Valoare, TipContract, CodClient)
Client (CodClient , Denumire, Oras)
Completați fraza SQL următoare pentru a se modifica orașul din Bucuresti în
București, cu transfer a înregistrărilor modificate în tabelul arhiva_client.

UPDATE Client
SET Oras='București'
OUTPUT DELETED.* INTO arhiva_client
WHERE Oras='Bucuresti'

In baza de date este definit obiectul ValoareTotalaProdus care calculează valoarea


totala pentru un anumit produs al cărui Id se introduce ca parametru.

Sa se completeze următorul cod T-SQL pentru a se apela obiectul


ValoareTotalaProdus pentru calculul valorii totale a fiecărui produs din tabelul
produs.

SELECT IdProdus, dbo.ValoareTotalaProdus (IdProdus)


FROM Produs

În cazul în care se dorește apelarea unei proceduri stocate, cu denumire Plati,ce


afișează lista plăților ulterioare unei date ce se introduce ca parametru, cu un
parametru de intrare de tip DATE, completați casetele următoare (cu un singur
cuvânt) pentru a afișa valoarea parametrului de ieșire.
DECLARE @Data as Date
SET @Data='1/1/2018'
EXEC Plati @Data

Se consideră tabelele

Completați codul TSQL următor pentru a realiza o funcție tabelara pentru a afișa
produsele aferente unui nr de bon de casa ce se va introduce de la tastatura.
CREATE FUNCTION (@NrBonCasa int)
RETURNS TABLE
AS
RETURN
(Select *
FROM ProduseVandute
WHERE NrBonCasa=@NrBonCasa
)

Se dau tabelele:
Facultate (IdFacultate, Denumire, CodUniversitate).
Universitate(CodUniversitate, Denumire, )

Pentru adăugarea unei restricții de integritate referențială care sa permită ștergerea


în cascada, completați (cu un singur cuvânt) următoarea fraza TSQL:
ALTER TABLE Facultate
ADD CONSTRAINT FK_Universitate
FOREIGN KEY (CodUniversitate) References Universitate(CodUniversitate)
ON DELETE Cascade

Pentru realizarea unei baze de date se folosește următoarea sintaxă


Selectați răspunsul corect:

a.REALISE NEW DATABASE nume_baza_de_date


b.CREATE DATABASE nume_baza_de_date
c.USE DATABASE nume_baza_de_date
d.ALTER DATABASE nume_baza_de_date

Fie tabelul ContinutComanda(NrComanda, CodProdus, Cantitate, Pret).


Se dorește afișarea mediei preturilor pe fiecare produs. Care din afirmațiile
următoare, referitoare la codul SQL următor, este corectă.

CREATE #tabel TABLE(Medie money, CodProdus int)

INSERT INTO
SELECT AVG(Pret), CodProdus
FROM ContinutComanda
GROUP BY CodProdus

SELECT * FROM #tabel

Selectați răspunsul corect:

a.Codul SQL va afișa media preturilor pe produse dacă se va înlocui linia

CREATE #tabel TABLE(Medie money, CodProdus int)


cu
CREATE TABLE(Medie money, CodProdus int)

b.Codul SQL va afisa media preturilor pe produse daca se va inlocui linia

INSERT INTO
cu
INSERT INTO #tabel

c.Codul SQL va afișa media preturilor pe produse dacă se va înlocui linia

FROM ContinutComanda
cu
FROM #tabel

d.Codul SQL va afișa media preturilor pe produse dacă se va înlocui linia

GROUP BY CodProdus
cu
ORDER BY CodProdus
Se dorește realizarea unui tabel pentru evidența analizelor medicale ce va conține
următoarele câmpuri: CodAnaliza, DenumireAnaliza, Descriere,
DataAdaugareInSistem, ValoareMinima, ValoareMaxima
Care dintre următoarele variante privind tipurile de date o considerați corectă ?

Selectați răspunsul corect:

a.CodAnaliza - int
DenumireAnaliza - nvarchar(100)
Descriere - nvarchar(100)
DataAdaugareInSistem - money
ValoareMinima - int
ValoareMaxima - int

b.CodAnaliza - int
DenumireAnaliza - nvarchar(100)
Descriere - nvarchar(200)
DataAdaugareInSistem - date
ValoareMinima - money
ValoareMaxima - money

c.CodAnaliza - int
DenumireAnaliza - date
Descriere - nvarchar(1)
DataAdaugareInSistem - date
ValoareMinima - int
ValoareMaxima - int

d.CodAnaliza - int
DenumireAnaliza - date
Descriere - nvarchar(1)
DataAdaugareInSistem - date
ValoareMinima - money
ValoareMaxima – money

In cazul in care in tabela Plati se gasesc urmatoarele inregistrari


NrPlata DataPlata SumaPlatita
1 1-1-2013 500
2 1-2-2013 100
3 1-3-2013 300

Alegeți afirmația corecta referitoare la următoarea secvență de cod T-SQL


WHILE (SELECT SUM(SumaPlatita) FROM Plati )>1000
BEGIN
UPDATE Plati
SET SumaPlatita=SumaPlatita*2
END

Execuția secvenței de cod SQL nu va modifica nicio valoare a sumelor plătite


și nici nu va afișa nicio plata.

Execuția secvenței de cod SQL va afișa următorul rezultat


NrPlata DataPlata SumaPlatita
1 1-1-2013 500
2 1-2-2013 100
3 1-3-2013 300

Execuția secvenței de cod SQL va gera o bucla infinita care va dubla de mai multe
ori sumele plătite.

Execuția secvenței de cod SQL va genera dublarea, doar o singura data, a sumelor
plaților

TEST PENTRU SEMINAR


Care este rezultatul execuției codului SQL următor?

SELECT COUNT(*) As Nr1,


COUNT (DataContract) AS Nr2,
COUNT (distinct ValoareContract) AS Nr3
FROM Contract
Selectați răspunsul corect:
a.
Nr1 Nr2 Nr3
----------- ----------- -----------
444

b.
Nr1 Nr2 Nr3
----------- ----------- -----------
344

c.
Nr1 Nr2 Nr3
----------- ----------- -----------
433

d.
Nr1 Nr2 Nr3
----------- ----------- -----------
443

Se dorește realizarea unui tabel Factura (NrSerieFactura, DataFactura,


SumaFactura, CodClient)
NrSerieFactura DataFactura SumaFactura CodClient
AA234 2020-01-02 34,55 23
BB234 2020-02-02 45,44 22

Care dintre afirmațiile următoare, cu privire la tipurile de date aferente câmpurilor


tabelului, este corectă
Selectați răspunsul corect:

a.NrSerieFactura-char(10)
DataFactura - date
SumaFactura- date
CodClient – money

b.NrSerieFactura- varchar(50)
DataFactura - date
SumaFactura- money
CodClient – int

c.NrSerieFactura-int
DataFactura - money
SumaFactura- int
CodClient - date

d.NrSerieFactura-int
DataFactura - date
SumaFactura- money
CodClient - varchar(10)

e.NrSerieFactura-date
DataFactura - date
SumaFactura- nvarchar(10)
CodClient – int
Care va fi rezultatul execuției codului TSQL următor

Selectați răspunsul corect:


a. 45 35
b. 46 35
c. 46 gr
d. 45 gr

Se consideră tabelul Client (CodClient, Nume, Localitate)


Cum se șterg doar clienții din Bucuresti?
Selectați răspunsul corect:
a.DELETE Localitate='Bucuresti'
FROM Client

b.DELETE ROW Localitate='Bucuresti'


FROM Client

c.TRUNCATE TABLE Client


WHERE Localitate='Bucuresti'

d.DELETE FROM Client


CHECK Localitate='Bucuresti'

e.DELETE Client
WHERE Localitate='Bucuresti'

Se considera tabelul
Contract(Nr, DataInceput, DataSfarsit, Valoare)
Completați casetele următoare (cu un singur cuvânt) pentru a realiza o procedura
stocată care afișează lista contractelor cu valoarea mai mare decât o valoare
introdusă ca parametru.
CREATE PROC ListaContracte @Valoare Money
AS
SELECT * FROM Contract
WHERE Valoare>=@Valoare

Completați codul SQL următor (cu un singur cuvânt) pentru declararea unei
variabile @TAbonament de tip tabel și ștergerea înregistrărilor din această
variabilă de tip tabel pentru care data expirare este anterioară datei de 1 ian 2008.

DECLARE @TAbonament TABLE (Cod int, Denumire nvarchar(100), Data date,


Pret money)
DELETE @TAbonament
WHERE Data <='2008-01-01'

In cazul in care in tabela @Plati se găsesc următoarele înregistrări

Alegeți afirmația corecta referitoare la următoarea secvență de cod T-SQL

Selectați răspunsul corect:


a.
Execuția secvenței de cod SQL va genera o bucla infinita care va dubla de mai
multe ori sumele plătite.
b.
Execuția secvenței de cod SQL va genera dublarea, doar o singura data, a sumelor
plaților și nu va afișa nicio plata.
c.
Execuția secvenței de cod SQL nu va modifica nicio valoare a sumelor plătite și
nici nu va afișa nicio plata.
d.
Execuția secvenței de cod SQL nu va modifica nicio valoare a sumelor plătite și va
afișa următorul rezultat

NrPlata DataPlata SumaPlatita


1 1-1-2013 400
2 1-2-2013 200
3 1-3-2013 300

Se consideră tabelele
Abonament (IdAbonament, DataInceput, NrLuni, CodClient, IdPlata)
Client (CodClient, Nume, Localitate)
SedinteEfectuate (IdSedintaEfectuata, DataSedintaEfectuata, IdAbonament)
Plata (IdPlata, DataPlata, SumaPlatita, CodClient)

Completați codul SQL următor (cu un singur cuvânt pentru fiecare caseta) pentru a
se realiza o funcție tabelară care să calculeze totalul sumelor plătite pentru fiecare
client.

CREATE FUNCTION F_Plati () RETURNS @TBL TABLE (CodClient


varchar(100), Plati money)
AS
BEGIN
INSERT INTO @TBL
SELECT CodClient, SUM(SumaPlatita)
FROM PLATA
GROUP BY CodClient
RETURN
END

Se consideră tabelele

Chitanta (NrChitanta, DataChitanta, SumaPlatita, CodPlatitor)


Platitor(CodPlatitor, Nume, Oras)

Completați (cu un singur cuvânt) următorul cod SQL pentru a se realiza un


declanșator (trigger) care să nu permită adăugarea plătitorilor din afara
Bucurestiului.
CREATE TRIGGER TRG2
ON Platitor
FOR INSERT
AS
IF EXISTS (SELECT * FROM INSERTED WHERE Oras <> 'Bucuresti')
BEGIN
RAISERROR ('Eroare!',10,10)
ROLLBACK
END
Se considera tabelul
Comanda (Nrcomanda, DataComanda, DataLivrare, Valoare, CodClient)

Care din afirmațiile următoare este corectă?


Selectați unul sau mai multe:

a.Se dorește realizarea unei proceduri stocate care printr-un parametru de


ieșire, să returneze valoarea totala a comenzilor clientului al cărui cod se va
introduce ca parametru de intrare.

CREATE PROC ValoareTotala @Total money OUTPUT, @CodClient int


AS
SET @Total=(SELECT SUM(Valoare)
FROM Comanda
WHERE CodClient=@CodClient )
Executia acestei proceduri, pentru clientul cu codul 243, se va realiza astfel

DECLARE @T money
EXEC ValoareTotala @T OUTPUT, 234
SELECT @T

b.Realizarea unei proceduri stocate care să afișeze valoarea totală a comenzilor se


va realiza astfel

CREATE PROC ValoareTotala @CodClient int


AS
SELECT SUM(Valoare)
FROM Comanda
WHERE CodClient=@CodClient

Execuția acestei proceduri se va realiza astfel


EXEC ValoareTotala

c.Se dorește realizarea unei proceduri stocate care printr-un parametru de ieșire, să
returneze valoarea totala a comenzilor clientului al cărui cod se va introduce ca
parametru de intrare.

CREATE PROC ValoareTotala @Total money , @CodClient int


AS
SET @Total=(SELECT SUM(Valoare)
FROM Comanda
WHERE CodClient=@CodClient )

Executia acestei proceduri, pentru clientul cu codul 243, se va realiza astfel

EXEC ValoareTotala ?, 234

d.Se dorește realizarea unei proceduri stocate care printr-un parametru de ieșire, să
returneze valoarea totala a comenzilor clientului al cărui cod se va introduce ca
parametru de intrare.

CREATE PROC ValoareTotala @Total money OUTPUT, @CodClient int


AS
SET @CodClient=(SELECT SUM(Valoare)
FROM Comanda
WHERE CodClient=@Total)

Executia acestei proceduri, pentru clientul cu codul 243, se va realiza astfel

DECLARE @T money
EXEC ValoareTotala @T OUTPUT, 234
SELECT @T
e.Realizarea unei proceduri stocate care să afișeze valoarea totală se va realiza
astfel

CREATE PROC ValoareTotala


AS
SELECT SUM(Valoare)
FROM Comanda

Execuția acestei proceduri se va realiza astfel


EXEC ValoareTotala

Se considera tabele
Departament(CodDepartament, DenumireDepartament, MarcaAngajatSef)
Angajat (MarcaAngajat, NumeAngajat, CodDepartament, SalariuIncadrare,
DataAngajare)
Comisie(CodComisie, DenumireComisie, MarcaAngajat)

Completați codul următor privind adăugarea restricției privind obligativitatea ca


data de angajare sa fie ulterioara lui 2015 și a restricției de integritate referențiale
aferentă tabelului Comisie, cu actualizare in cascada.

ALTER TABLE ANGAJAT


ADD CONSTRAINT C_Salariu
CHECK (DataAngajare>’2015-01-01’)
ALTER TABLE Comisie
ADD CONSTRAINT FK_Comisie
FOREIGN KEY (MarcaAngajat)
REFERENCES Angajat(MarcaAngajat)
ON UPDATE CASCADE

Se considera tabelul
Note(INota, NumeStudent, Nota, DataNota, Disciplina)
Care afirmație, referitoare la următorul cod SQL, este corectă?

CREATE VIEW W_Total_Plati_Pe_tipuri_plata


AS
SELECT NumeStudent, AVG(Nota) AS Medie
FROM Note
GROUP BY NumeStudent
Selectați unul sau mai multe:

a.Daca se va modifica astfel


CREATE VIEW W_Medie
AS
SELECT Disciplina, AVG(Nota) As Medie
FROM Note
GROUP BY Disciplina
, execuția codului SQL va duce la realizarea unui obiect de tip View

b.Execuția codului SQL va afișa o eroare.

c.Execuția codului SQL va duce la realizarea unui obiect de tip View.

d.Daca se va modifica astfel


CREATE VIEW W_Medie
AS
SELECT TOP(100) Percent NumeStudent, AVG(Nota)
FROM Note
GROUP BY NumeStudent
, execuția codului SQL va duce la realizarea unui obiect de tip View

Legăturile dintre tabele respectă restricția de integritate referențială. Toate


câmpurile, cu excepția cheilor primare, admit si valoarea NULL. Precizați care din
următoarele afirmații este adevărată.
Selectați răspunsul corect:
a.
Execuția următorului cod:

insert into Tabel4(Id3, Valoare3, Id1)


values(1, 10000, 1)
insert into Tabel3(Id2, Valoare2, Id3)
values(1, 10000, 1)
insert into Tabel1(Id1, Valoare1, Id2)
values(1, 10000, 1)

va avea ca efect adăugarea unei înregistrări în fiecare tabel din baza de date.

b.
Execuția următorului script:

insert into Tabel1(Id1, Valoare1, Id2)


values(1, 10000, 1)
insert into Tabel3(Id2, Valoare2, Id3)
values(1, 10000, 1)
insert into Tabel4(Id3, Valoare3, Id1)
values(1, 10000, 1)

va avea ca efect adăugarea unei înregistrări în fiecare tabel din baza de date.

c.
Execuția secvenței:

insert into Tabel1(Id1, Valoare1, Id2)


values(1, 10000, 1)

va avea ca efect adăugarea unei înregistrări în Tabel1.

d.
Execuția următoarei fraze SQL

insert into Tabel3(Id2, Valoare2, Id3)


values(1, 10000, 1)

va avea ca efect adăugarea unei înregistrări în Tabel3.


CURS

CREATE TABLE Comanda (NrComanda INT IDENTITY PRIMARY KEY,


DataComanda DATE not null,
Suma MONEY,
Idclient INT)

--adaugare coloana
ALTER TABLE Comanda
ADD DataLivrare DATE
--stergere coloana
ALTER TABLE Comanda
DROP Column DataLivrare

--adaugare restrictie domeniu de valori (check)


ALTER TABLE nume_tabel
ADD CONSTRAINT nume_constrangere (CK, PK, FK)
CHECK (expresie_logica)

--in tabelul comanda suma sa fie pozitiva


ALTER TABLE comanda
ADD CONSTRAINT CK_Suma
CHECK (Suma>0)
--in tabelul comanda se adauga restricita de
-- cheie externa pentru campul idclient
ALTER TABLE comanda
ADD CONSTRAINT FK_Client
FOREIGN KEY (IdClient)
REFERENCES Client(Idclient)

--adaugare tabel examen


CREATE TABLE Examen (IdExamen int not null, DataExamen date)
--adaugare restrictie de cheie primara
ALTER TABLE Examen
ADD CONSTRAINT PK_Examen
PRIMARY KEY (IdExamen)

--stergere tabel
DROP TABLE Examen

--SQL pt obiecte ale bazei de date


CREATE
ALTER
DROP
--SQL pt inregistrari din tabele
INSERT
UPDATE
DELETE

--tabel temporar
CREATE TABLE #Persoana (Cod CHAR(20) PRIMARY KEY,
Nume NVARCHAR(100),
Prenume NVARCHAR(100),
DataAngajarii DATE)

SELECT * FROM #Persoana

INSERT INTO #Persoana


VALUES ('A', 'Ionescu', 'Ion', '2010-10-10')

INSERT INTO #Persoana (cod)


VALUES ('B')

--adaugare index
CREATE INDEX index_codIntern
ON PRODUSE (Codintern)

--ordinea de evaluare a clauzelor SQL

--Sa se afiseze primele trei produse perisabile


--cu cea mai mare cantitate toala vanduta,
--pentru care media preturilor este mai
--mare ca 5.

SELECT TOP 3 Denumire,SUM(Cantitate) as CantTotala


FROM Produse INNER JOIN ProduseVandute ON
Produse.IdProdus= ProduseVandute.IdProdus
WHERE Perisabil=1
GROUP BY Denumire
HAVING AVG(PretVanzare)>5
ORDER BY SUM(Cantitate) DESC

--Sa se afiseze primele trei produse perisabile


--cu cea mai mare cantitate toala vanduta.

SELECT top 3 Denumire,SUM(Cantitate)


FROM Produse INNER JOIN ProduseVandute ON
Produse.IdProdus= ProduseVandute.IdProdus
WHERE Perisabil=1
GROUP BY Denumire

SELECT top 3 *
FROM Produse
---produse care contin in denumire grupul "te"
SELECT *
FROM Produse
WHERE denumire like '%te%'

SELECT *
FROM Produse
WHERE denumire like '%[.]%'

--gresit
denumire like ='%te%'
denumire like 'te'
denumire = '%te%'

--data curenta
SELECT GetDate()as zicurenta, MONTH(GetDate()) as Luna, YEAR(GetDate())
as an

--obs
--gresit
MONTH(GetDate())='ian'

--afisare data intr-un anumit format


SELECT GetDate()as zicurenta, convert(char(10),GetDate(),103)

SELECT GETDATE(), CONVERT(char(10),getdate(), 103 ),


datepart(quarter,getdate()) as trimestru,
datediff(year, '2019-10-10',getdate()),
dateadd(month,-2, getdate())

SELECT DataOraPlata, convert(char(10),DataOraPlata,103),


datepart(quarter, DataOraPlata) as trimestru
FROM Plati

SELECT Denumire, LEN(Denumire) as NrCaractere,


left(Denumire, 3), right(denumire,3),
SUBSTRING(denumire,4,2),
Denumire+' , '+isnull(CodIntern,' ') + ';
#'+convert(varchar(10),codCategorie)
FROM Produse

SELECT len('123*GB DR&'), LTRIM(' GB DR '), RTRIM(' GB DR '),


LTRIM(RTRIM(' GB DR ')), UPPER('gbdr'), LOWER ('GBDR')

--rotunjire
SELECT ROUND (21.45,1)--->21.5
SELECT ROUND (21.42,1)--->21.4
SELECT ROUND (21.43478,3)--->21.435
SELECT ROUND (21.43438,3)--->21.434
--trunchiere
SELECT ROUND (21.43478,3,1)--->21.434
SELECT ROUND (21.43438,3,1)--->21.434

SELECT ROUND (21.45,1,1)--->21.4


SELECT ROUND (21.42,1,1)--->21.4

SELECT ROUND (21.45,1)--->21.5


SELECT ROUND (21.45,1,0)--->21.5
SELECT ROUND (21.45,1,1)--->21.4

--numar de tipuri de plati


SELECT COUNT(Tipplata), COUNT(DISTINCT Tipplata), COUNT(*)
FROM Plati
--numertoare plati
SELECT IdPlata, sumaplatita,
ROW_NUMBER() OVER(ORDER BY SumaPlatita) As Nr
FROM Plati
ORDER BY SumaPlatita

SELECT IdPlata, sumaplatita, Tipplata,


ROW_NUMBER() OVER(partition by Tipplata ORDER BY SumaPlatita) As
Nr
FROM Plati
ORDER BY Tipplata,SumaPlatita

SELECT IdPlata, sumaplatita,


ROW_NUMBER() OVER(ORDER BY SumaPlatita) As Nr,
RANK() OVER(ORDER BY SumaPlatita) As rang,
DENSE_RANK() OVER(ORDER BY SumaPlatita) As rang1,
NTILE(4) OVER(ORDER BY SumaPlatita) as categorie
FROM Plati
ORDER BY SumaPlatita

--IIF (condite, valoare adev, val falsa)

SELECT ...

CASE
WHEN conditie THEN rezultat
WHEN ...
END
--Pentru fiecare produs vândut se va acorda un număr de puncte de
--fidelitate în funcție de valoarea acestuia astfel:
--Dacă valoarea acestuia este mai mare de 150 se acordă 5 puncte
--Altfel se acordă 0 puncte.
SELECT IdProdus, NrBoncasa, Cantitate*PretVanzare as Valoare,
CASE
WHEN Cantitate*PretVanzare>=150 THEN 5
ELSE 0
END AS PuncteFidelitate
FROM ProduseVandute

IF (SELECT COUNT(*) FROM Plati)>10


SELECT 'mai mult de 10 plati'
ELSE
SELECT 'mai putin de 10 plati'

obiecte inregistrari in tabele


CREATE INSERT
ALTER UPDATE
DROP DELETE

INSERT Client
VALUES (222, 'A', 'Bucuresti', getdate()),
(333, 'A', 'Bucuresti', '2021-10-5')

SELECT * FROM Client

INSERT Client (Id, data)


VALUES (777, getdate() )

INSERTED
INSERT Client (Id, Denumire)
OUTPUT INSERTED.Id, INSERTED.Denumire
VALUES (5, 'D')

SELECT * FROM Client

DELETE Client
OUTPUT DELETED.*
WHERE id=5

UPDATE Client
SET Denumire='AA'
OUTPUT INSERTED.*, DELETED.*
--OUTPUT UPDATED.*
WHERE id=1

--tabel arhivaclient
CREATE TABLE arhivaclient(Id int,
Denumire nvarchar(100),
oras nvarchar(100) )

--stergere cu transfer in alta tabela


DELETE client
OUTPUT DELETED.* INTO arhivaclient
WHERE oras='Bucuresti'

SELECT * FROM Client

select * from arhivaclient

--sa se modifice perisabil = 1 (true) pentur toate produsele


--din categoria cu denumirea Băuturi
UPDATE produse
SET Perisabil=1
WHERE codCategorie IN (SELECT CodCategorie
FROM CategoriiProduse
WHERE DenumireCategorie=N'Băuturi')

UPDATE produse
SET Perisabil=1
FROM CategoriiProduse
WHERE CategoriiProduse.CodCategorie=Produse.CodCategorie
AND DenumireCategorie=N'Băuturi'

--stergere inregistrari din tabele


DELETE Client

--stergere inregistrari din tabele


TRUNCATE TABLE Client

SELECT * FROM Client

--Sa se realizeze un trigger care să nu permită adăugarea


--unui client al cărui id nu are trei caractere
--1. tabel Client
--2. actiune INSERT
--3. conditie cand nu are loc actiunea
--id-ul nu are 3 caractere
--LEN(Id)<>3
CREATE TRIGGER C5_1
ON Client --1.tabel
FOR INSERT, UPDATE --2.actiune
AS
IF EXISTS (SELECT * FROM INSERTED
WHERE LEN(Id)<>3 --3.conditie cand nu are loc actiunea
)
BEGIN
RAISERROR ('Atentie! nu se poate face adaugarea',10,10)
ROLLBACK
END
--verificare trigger cu eroare
INSERT Client (Id)
VALUES (3)
--verificare trigger fara eroare
INSERT Client (Id)
VALUES (555)

--dezactivare tigger
DISABLE TRIGGER C5_1 ON client
--activare trigger
ENABLE TRIGGER C5_1 ON client

--1. Să nu se permită ștergerea colaboratorilor născuți în


--anul 1970
1. tabel colaborator
2. actiune DELETE
3. conditie cand nu are loc actiunea
născuți în anul 1970
YEAR(Data_Nasterii)=1970

CREATE TRIGGER C6_1


ON colaborator
FOR DELETE
AS
IF EXISTS (SELECT * FROM DELETED
WHERE YEAR(Data_Nasterii)=1970)
BEGIN
RAISERROR ('Atentie la anul nasterii!',10,10)
ROLLBACK
END
--verificare cu eroare
DELETE colaborator
WHERE Cod=604
--verificare fara eroare
DELETE colaborator
WHERE Cod=10

--2. Să nu se permită modificarea salariului la o


--valoare mai mică
1. tabel Colaborator
2. actiune UPDATE
3. conditie cand nu are loc actiunea
salariu nou < salariu vechi
INSERTED.salariu < DELETED.Salariu
INSERT --->>> INSERTED
DELETE --->>> DELETED
UPDATE -->>>INSERTED,DELETED

CREATE TRIGGER C6_2


ON Colaborator
FOR UPDATE
AS
IF EXISTS (SELECT * FROM INSERTED INNER JOIN DELETED ON
INSERTED.Cod=DELETED.Cod
WHERE INSERTED.salariu < DELETED.Salariu )
BEGIN
RAISERROR ('Atentie la salariu!',10,10)
ROLLBACK
END
--verificare cu eroare
UPDATE Colaborator
SET salariu=salariu-1
WHERE cod=20
--verificare fara eroare
UPDATE Colaborator
SET salariu=salariu+1
WHERE cod=20

SELECT * FROM Colaborator

SELECT * FROM View_1

CREATE VIEW C6_3


AS
SELECT * FROM Colaborator

--verificare view
SELECT * FROM C6_3

ALTER VIEW C6_4


AS
SELECT TOP 100 percent IdProdus, Cantitate*PretVanzare AS Valoare
FROM ProduseVandute
ORDER BY Valoare

CREATE VIEW C6_5


AS
SELECT TOP 100 PERCENT Nume, Salariu
FROM colaborator
WHERE salariu>500
ORDER BY Nume
CREATE VIEW C6_6
AS
SELECT Nume,Departament
FROM colaborator
WHERE Departament LIKE '%contab%'

--verificare view
SELECT * FROM C6_6

--Sa se afișeze lista colaboratorilor ordonata în


--funcție de vârsta descrescător.
CREATE VIEW C4_4_1
AS
SELECT TOP 100 PERCENT Nume, DATEDIFF(year, Data_Nasterii,
GETDATE()) As varsta
FROM Colaborator
ORDER BY varsta DESC
--5 Sa se afișeze valoare primelor pentru fiecare
--colaborator.
CREATE VIEW C4_5
AS
SELECT Nume, Salariu*ProcentPrima AS Prima
FROM colaborator INNER JOIN PrimeColaborator ON
colaborator.cod=PrimeColaborator.CodColaborator
--6.Să se afișeze numărul de colaboratori
--din fiecare departament
CREATE VIEW C4_5_1
AS
SELECT Departament, COUNT(Cod) AS Nr
FROM Colaborator
GROUP BY Departament
--7. Să se afișeze departamentele pentru
--care salariul total este mai mare ca 4000,
--ordonate în funcție de salariul total.
CREATE VIEW C4_6
AS
SELECT TOP 100 PERCENT Departament, SUM(Salariu) AS Total
FROM Colaborator
GROUP BY Departament
HAVING SUM(Salariu)>4000
ORDER BY SUM(Salariu)
--9. Să se afișeze departamentalele cu mai
--puțin de 13 colaboratori și cu totalul
--salariilor mai mare ca 7000.
CREATE VIEW C4_9
AS
SELECT Departament, COUNT(Cod) as Nr, SUM(Salariu) as Total
FROM Colaborator
GROUP BY Departament
HAVING COUNT(Cod)<13 AND SUM(Salariu)>7000

SELECT * FROM C4_8

--proceduri stocate
CREATE PROC C6_1_1
AS
SELECT * FROM Colaborator
--executie procedura
exec C6_1_1

exec sp_databases

--variabile
--declarare
DECLARE @An int
--atribuire valori
SET @an=2021
--afisare
SELECT @an
DECLARE @An int
SELECT @an=2022
SELECT @an

--sa se realizeze o procedura stocata care afiseaza


--lista platilor
CREATE PROC C6_2_2
AS
SELECT * FROM Plati
--executie procedura
EXEC C6_2_2
--sa se realizeze o procedura stocata care afiseaza
--lista platilor dintr-un an introdus ca parametru
CREATE PROC C6_3_1
@An int
AS
SELECT * FROM Plati
WHERE YEAR(DataOraPlata)=@An
--executie procedura
EXEC C6_3_1 2013
--executie procedura
EXEC C6_3_1 2012
--Numărul plăților ulterioare unei date introdusă ca
--parametru
CREATE PROC C6_4_1
@Data DATE
AS
SELECT COUNT(Idplata)
FROM Plati
WHERE DataOraPlata>@Data
--executie procedura
EXEC C6_4_1 '2020-1-1'
--sa se modifice procedura pentru a afisa
--si lista platilor
--ulterioare datei introduse ca parametru
ALTER PROC C6_4_1
@Data DATE
AS
--afisare nr
SELECT COUNT(Idplata)
FROM Plati
WHERE DataOraPlata>@Data
--afisare lista
SELECT *
FROM Plati
WHERE DataOraPlata>@Data
--executie procedura
exec C6_4_1 '2013-1-1'
---Numărul plăților ulterioare unei date introdusă ca
--parametru, cu parametru de iesire
CREATE PROC C6_5_1
@Data date,
@Nr int OUTPUT
AS
SET @Nr=(SELECT COUNT(Idplata)
FROM Plati
WHERE DataOraPlata>@Data)
--executie procedura
DECLARE @Numar int
EXEC C6_5_1 '2012-1-1', @Numar OUTPUT
SELECT @Numar
--procedura care afiseaza lista produselor
CREATE PROC C6_6_1
AS
SELECT *
FROM Produse
--executie
EXEC C6_6_1

--curs 8
--Plățile cu cea mai mare sumă

SELECT *
FROM Plati
WHERE SumaPlatita>=ALL(SELECT SumaPlatita FROM Plati)
--subinterogare in from
SELECT *
FROM (SELECT IdPlata, SumaPlatita FROM Plati WHERE SumaPlatita>600) T

--subinterogare in select
SELECT Idplata, nrboncasa, sumaplatita,
(SELECT SUM(sumaPlatita) FROM Plati) as total,
sumaplatita*100/(SELECT SUM(sumaPlatita) FROM Plati) as pondere
FROM Plati
----subinterogare in select corelata cu interogarea principala
SELECT Idplata, nrboncasa, sumaplatita,
(SELECT COUNT(IDprodus)
FROM ProduseVandute PV
WHERE PV.NrBonCasa=Pl.nrboncasa) As NrProduse
FROM plati As PL

SELECT COUNT(IDprodus)
FROM ProduseVandute
WHERE NrBonCasa=2

--variabile de tip tabel


DECLARE @Vtbl TABLE (Id int, Suma money)
INSERT @Vtbl
VALUES (1, 2000)
SELECT * FROM @Vtbl

--tipuri de date personalizate


CREATE TYPE TipCNP
FROM char(13) NOT NULL
--utilizate tip personalizat
DECLARE @CNP TipCNP
SET @CNP='12345678123456'
SELECT @CNP

--gresit
ALTER TYPE TipCNP

DROP TYPE TipCNP

--tipuri de date personalizate de tip tabel


Create TYPE TblTipuriPlata AS TABLE (TipPlata nvarchar(50))
--utilizare
DECLARE @V TblTipuriPlata
INSERT @V
VALUES ('A')
SELECT * FROM @V

--IF
DECLARE @V int
SET @V=(SELECT AVG(Sumaplatita) FROM plati )
IF @V>700
SELECT * FROM Plati
ELSE
SELECT * FROM Produse

DECLARE @V int
SET @V=2
IF @V=1
SELECT * FROM Plati
SELECT * FROM Produse

DECLARE @V int
SET @V=2
IF @V=1
BEGIN
SELECT * FROM Plati
SELECT * FROM Produse
END

--return
SELECT * FROM Plati
RETURN
SELECT * FROM Produse

--while
DECLARE @Nr int
SET @Nr=1
WHILE @Nr<4
BEGIN
SET @Nr=@Nr+1
SELECT @Nr
END
SELECT 'mesaj1'
SELECT 'mesaj2'

--WAITFOR
WAITFOR DELAY '00:00:03'
SELECT * from plati

select getdate()
WAITFOR Time '08:37:00'
SELECT * from plati
--Procedura stocata Numărul plăților ulterioare unei date introdusă ca parametru

CREATE PROC C8_1


@Data date
AS
SELECT COUNT(IdPlata)
FROM Plati
WHERE DataOraPlata>=@Data

--executie procedura
EXEC C8_1 '2013-1-1'

DECLARE @D date
SET @D=dateadd(year, -9,getdate())
EXEC C8_1 @D

--Procedura stocata Numărul plăților (parametru iesire) ulterioare


-- unei date introdusă ca parametru

CREATE PROC C8_2


@Data date,
@Nr int OUTPUT
AS
SET @Nr=(SELECT COUNT(IdPlata)
FROM Plati
WHERE DataOraPlata>=@Data)

--executie procedura
DECLARE @N int
EXEC C8_2 '2012-1-1', @N OUTPUT
SELECT @N
--Să se realizeze o procedură stocată cu parametru care să
--afișeze produsele pentru care valoarea totală din anul 2012
--este mai mare decât parametrul.
CREATE PROC C8_3
@Valoare money
AS
SELECT Denumire, SUM(Cantitate*PretVanzare) as Valaore
FROM Produse INNER JOIN ProduseVandute ON
Produse.IdProdus=ProduseVandute.IdProdus
INNER JOIN BonuriDeCasa ON
ProduseVandute.NrBonCasa=BonuriDeCasa.NrBonCasa
WHERE YEAR(DataOraBonCasa)=2012
GROUP BY Denumire
HAVING SUM(Cantitate*PretVanzare)>@Valoare
--executie procedura
EXEC C8_3 500

--Să se realizeze o procedură stocată cu parametru de ieșire care


--să returneze valoarea totală a vânzărilor, într-un parametru de
--ieșire, pentru un vânzător al cărui cod se introduce ca parametru.
--Sa se execute aceasta procedura in cadrul altei proceduri stocate.
CREATE PROC C8_4
@Marca int,
@Valoare money OUTPUT
AS
SET @Valoare=(SELECT SUM(Cantitate*PretVanzare) as Valoare
FROM ProduseVandute INNER JOIN BonuriDeCasa ON
ProduseVandute.NrBonCasa=BonuriDeCasa.NrBonCasa
WHERE MarcaVanzator=@Marca)

--executie procedura
CREATE PROC C8_5
AS
DECLARE @V money
EXEC C8_4 '13122', @V OUTPUT
SELECT @V
--executie
EXEC C8_5

--Procedura stocata sa se afiseze detaliile unei plati


--al carei id se introduce ca parametru.
CREATE PROC C9_1
@IdPlata int=1
AS
SELECT *
FROM Plati
WHERE IDPlata=@IdPlata
--sf procedura
--executie procedura
EXEC C9_1 2
--2. Procedura stocata sa se afiseze detaliile unor plată
--al căror id se introduce ca parametru de tip tabel.
--pas 1. Definire tip de data de tip tabel
CREATE TYPE TPlati AS TABLE (Nr int)
--pas 2
CREATE PROC C9_2
@TblPlati TPlati READONLY
AS
SELECT *
FROM Plati
WHERE IdPlata IN (SELECT Nr FROM @TblPlati)
--sfarsit
--pas 3 executie
--declarare variabila de tip tabel
DECLARE @T TPlati
SELECT * FROM @T
--adaugare valori in variabila de tip tabel
INSERT @T
VALUES (1), (2), (5)
SELECT * FROM @T
--executie procedura cu variabila de tip tabel
EXEC C9_2 @T
--2. Procedura stocata sa se afiseze detaliile unor plată
--al căror id se introduce ca parametru de tip tabel.
--se va afisa si totalul sumelor platite.
--pas 1. Definire tip de data de tip tabel deja facut
--pas 2
CREATE PROC C9_3
@T TPlati READONLY
AS
SELECT *
FROM Plati
WHERE IdPlata IN (SELECT Nr FROM @T)

SELECT SUM(Sumaplatita)
FROM Plati
WHERE IdPlata IN (SELECT Nr FROM @T)
--sf procedura
--pas 3 executie procedura
DECLARE @TBL TPlati
INSERT @TBL
VALUES (1), (2), (5)
EXEC C9_3 @TBL
--2. Procedura stocata sa se afiseze detaliile unor plată
--al căror id se introduce ca parametru de tip tabel.
--Parametru de iesire va retunea totalul sumelor platite
--pas 1. Definire tip de data de tip tabel deja facut
--pas 2
CREATE PROC C9_4
@TP TPlati READONLY,
@S money OUTPUT
AS
SELECT *
FROM Plati
WHERE IdPlata IN (SELECT Nr FROM @TP)
--atribuire valoare param iesire
SET @S= (SELECT SUM(Sumaplatita)
FROM Plati
WHERE IdPlata IN (SELECT Nr FROM @TP))
--sf procedura
--pas 3 executie
DECLARE @TPL TPlati
INSERT @TPL
VALUES (1)
DECLARE @Suma money
EXEC C9_4 @TPL, @Suma OUTPUT
SELECT @Suma
--5. procedura care afiseaza suma totala a platilor din anul 2012.
CREATE PROC C9_5
AS
SELECT SUM(sumaPlatita) as Plata
FROM Plati
WHERE YEAR(Dataoraplata)=2012
--sf procedura
--executie procedura
EXEC C9_5
--6. procedura cu pam de iesire care returneaza
-- media a platilor din anul 2012.
CREATE PROC C9_6
@Total money OUTPUT
AS
SET @Total=(SELECT AVG(sumaPlatita) as Plata
FROM Plati
WHERE YEAR(Dataoraplata)=2012)
--sfarsit procedura
--executie procedura
DECLARE @S money
EXEC C9_6 @S OUTPUT
SELECT @S
--platile cu suma mai mare decat media platilor din 2012
SELECT *
FROM Plati
WHERE SumaPlatita>@S

--7.Să se realizeze o procedura stocată ce se afișeze suma


--totală a salariilor pentru colaboratorii cu domiciliu in
--anumite orașe ce se vor introduce ca parametru de tip
--tabel.
--pas 1. definire tip personalizat
CREATE TYPE TblO AS TABLE (Oras nvarchar(100))
--pas 2
CREATE PROC C9_7
@T TblO READONLY
AS
SELECT SUM(Salariu)
FROM Colaborator
WHERE Domiciliu IN (SELECT Oras FROM @T)
--sfarsit
--executie procedura in cadrul altei proceduri
CREATE PROC C9_7E
AS
DECLARE @TO TblO
INSERT @TO
VALUES ('Bucuresti'), ('Giurgiu')
EXEC C9_7 @TO
--sfarsit procedura
--executie procedura
EXEC C9_7E
--8. Functia ProcentReducere returneaza 0.5 in cazul
--in care valoarea este mai mare decat 150, altfel
--returneaza 0
CREATE FUNCTION C9_8(@Valoare money) RETURNS money
AS
BEGIN
DECLARE @Procent money
IF @Valoare>=150
SET @Procent =0.5
ELSE
SET @Procent =0
RETURN @Procent
END
--apelare functie
SELECT dbo.C9_8(200)
SELECT dbo.C9_8(100)
SELECT dbo.C9_8(150)
--apelare in SQL
SELECT Idprodus, Nrboncasa, Cantitate*PretVanzare as Valoare,
CASE
WHEN Cantitate*PretVanzare>=150 THEN 0.5000
ELSE 0
END as Procent, dbo.C9_8(Cantitate*PretVanzare) as procent2
FROM ProduseVandute

--functie tabelara ce returneaza platile anului 2012.


CREATE FUNCTION C9_1 () RETURNS TABLE
AS
RETURN
(SELECT IdPlata,SumaPlatita
FROM Plati
WHERE
YEAR(DataOraPlata)=2012)
--sau
--DataOraPlata between '2012-1-1' and '2012-12-31')

--sfarsit

--apelare functie
SELECT * FROM C9_1()

--functie tabelara ce returneaza primele 3 plati


--cu cea mai mare suma
--MULTIINSTRUCTIUNE

CREATE FUNCTION C9_2()


RETURNS @Tbl TABLE (IdPlata int, Suma Money)
AS
BEGIN
INSERT @Tbl (Idplata,suma)
SELECT TOP 3 Idplata, SumaPlatita
FROM Plati
ORDER BY SumaPlatita DESC
RETURN
END
--sfarsit
--apelare functie
SELECT * FROM C9_2()

----functie tabelara ce returneaza platile


-- unui an introdus ca parametru. INLINE
CREATE FUNCTION C9_3(@an int) RETURNS TABLE
AS
RETURN (SELECT IdPlata, SumaPlatita
FROM Plati
WHERE YEAR(DataoraPlata)=@an)
--sfarsit
--apelare functie pentru calcul medie sume platite din 2013
--in cadrul unei proceduri
CREATE PROC C9_3_A
AS
SELECT AVG(SumaPlatita)
FROM C9_3(2013)
--sfarsit procedura
--executie procedura
EXEC C9_3_A

----functie tabelara ce returneaza platile


-- unui an introdus ca parametru. MULTIINSTRUCTIUNE
CREATE FUNCTION C9_4 (@an int)
RETURNS @t TABLE (Id int, Suma money)
AS
BEGIN
INSERT @t
SELECT IdPlata,sumaPlatita
FROM Plati
WHERE YEAR(DataOraPlata)=@an
RETURN
END
--sfarsit
--apelare functie
CREATE VIEW c9_4_A
AS
SELECT Id , Suma FROM c9_4(2013)
--functie care returneaza valoarea
--suma totala a platilor pentru anul 2013.
CREATE FUNCTION C9_5() RETURNS money
AS
BEGIN
DECLARE @S money
SET @S=(SELECT SUM(SumaPlatita)
FROM Plati
WHERE YEAR(DataOraPlata)=2013)
RETURN @S
END
--sfarsit
--apelare functie scalara
SELECT dbo.C9_5()
--functie care returneaza valoarea
--suma totala a platilor pentru un an introdus ca parametru.
CREATE FUNCTION C9_6(@An int) RETURNS money
AS
BEGIN
DECLARE @S money
SET @S=(SELECT SUM(SumaPlatita)
FROM Plati
WHERE YEAR(DataOraPlata)=@An)
RETURN @S
END
--sfarsit
--apelare functie scalara
SELECT dbo.C9_6(2013), dbo.C9_6(2012)

--procedura stocata care sa afiseze


--numele colaboratorilor dintr-un departament
--introdus ca parametru
CREATE PROC C10_2
@departament nvarchar(50)
AS
--declare variabile
DECLARE @Nume nvarchar(100)
DECLARE @sir nvarchar(500)
--declarare cursor
DECLARE C10_1 CURSOR FOR
select nume from colaborator
WHERE departament=@departament
--deschidere cursor
OPEN C10_1
--accesare prima inregistrare
FETCH NEXT FROM C10_1
INTO @Nume
SET @sir=@Nume
--accesare cursor
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM C10_1
INTO @Nume
SET @sir=@sir+', '+ @Nume
END
--inchidere
CLOSE C10_1
--eliberare memorie
DEALLOCATE C10_1
SELECT @sir

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