BDC-lab8

Share Embed Donate


Short Description

Functii si proceduri MySql microfost DB :)...

Description

Ministerul Educaţiei al Republicii Moldova Universitatea Tehnică a Moldovei Facultatea Calculatoare, Informaticǎ şi Microelectronicǎ Catedra Automatică şi Tehnologii Informaţionale

Raport Lucrare de laborator nr. 8 la disciplina: Baze de date și cunoștințe

tema: Proceduri stocate și funcții definite de utilizator

A verificat: lector superior Bagrin Veronica A efectuat: st. gr. TI-132 Spatari Artur

Chișinău 2016

Conținut

Sarcina 1................................................................................................................................................ Interogări simple............................................................................................................................... Interogări multi-relație....................................................................................................................10 Sarcina 2..............................................................................................................................................17 Sarcina 3..............................................................................................................................................17 Sarcina 4..............................................................................................................................................18 Sarcina 5..............................................................................................................................................18 Sarcina 6..............................................................................................................................................20 Interogări simple.............................................................................................................................20 Interogări multi-relație....................................................................................................................24 Sarcina 7..............................................................................................................................................32 Sarcina 8..............................................................................................................................................32 Sarcina 9..............................................................................................................................................32 Sarcina 10............................................................................................................................................32 Sarcina 11............................................................................................................................................34 Concluzii..............................................................................................................................................36

Sarcina lucrării 2

1. Să se creeze proceduri stocate în baza exercițiilor din capitolul 4. Parametrii de intrare trebuie să corespundă criteriilor din clauzele WHERE ale exercițiilor respective. 2. Să se creeze procedura stocată care ar elimina toate produsele unui producător sau unul din tipurile de produse ale acestui producător. În calitate de parametru de intrare, să se ia numele producătorului și tipul produsului. 3. Să se creeze o procedură stocată care ar insera în baza de date un model nou de imprimantă. În cazul în care datele inserate sunt incorecte sau incomplete, să se afișeze un mesaj de avertizare. În calitate de parametri de intrare apar datele pentru modelul respectiv. 4. Să se creeze o procedură stocată care, în calitate de parametru de intrare, să aibă numărul de tipuri de produs fabricate de către producător. În urma executării procedurii, trebuie să se afișeze un mesaj informativ, care să includă valoarea parametrului inserat și un tabel cu coloanele Producator, Produs, Nr_De_Model pentru fiecare tip de produs. 5. Să se creeze o procedură stocată care ar calcula prețul ce trebuie să-l achite cumpărătorul în timpul promoțiilor speciale la magazinul de calculatoare. Procedura va trebui să calculeze prețul nou pentru toate produsele unui producător anumit, în cazul când se anun ță promo ția. Un cumpărător poate procura deodată un singur model de produse, dar mai multe unități de acest produs. Reducerea poate fi de câteva tipuri în funcție de tipul produsului, pre țul ini țial și numărul de unități de marfă procurată. În calitate de parametri de intrare, se vor lua: -

modelul produsului procurat de cumpărător;

-

numărul de unități de marfă procurată;

-

procentul de reducere la preț în funcție de numărul de unități de marfă procurată;

-

procentul de reducere la preț în dependență de tipul de marfă procurată;

-

procentul de reducere la preț în dependență de prețul produsului fără reducere.

Astfel, trebuie să se afișeze Modelul, Tipul produsului, Producătorul, Prețul fără reducere și Suma totală spre achitare. Suma totală spre achitare trebuie să țină cont de reducerile calculate. Implicit asupra produselor procurate nu trebuie să influențeze nici o reducere. 6. Să se creeze funcții definite de utilizator în baza exercițiilor din capitolul 4. Parametrii de intrare 3

trebuie să corespundă criteriilor din clauzele WHERE ale exercițiilor respective. 7. Să se scrie funcția care ar calcula diferența aritmetică dintre valoarea curentă a înregistrării în câmpul Preț al tabelului pc_uri și valoare câmpului precedent. Ordonarea înregistrărilor în tabel trebuie să fie făcută după câmpul Cod. În calitate de exemplu al utilizării aceste funcții poate servi câmpul diferența. 8. Folosind tabelul laptop_uri, să se creeze o funcție definită de utilizator, care ar citi numerele câmpului și ar atașa sufixul respectiv la valoarea necesară. De exemplu, în cazul în care câmpul Pret, se adaugă sufixul ”$”, iar dacă câmpul este Viteza, se atașează sufixul ”GHz” etc. Să se analizeze exemplul de mai jos în calitate de model: Cod Model Viteza Ram Hd Pret Ecran 1 1298 3.5 GHz 32 GB 4 GB 700.00$ 11” 2 1321 5.0 GHz 64 GB 8 GB 970.00$ 12” Formatul funcției este următor: nume_funcție (nume_câmp)

9. Se dorește realizarea unei funcții definite de utilizator din baza de date calculatoare, care ar putea transforma câmpul Pret din dolari (stare curentă) în euro sau în lei. Se utilizează tabelul imprimante. Formatul funcției este următorul: nume_funcție (valoare_pret, curs_BNM, valuta)

Valoare

afișată trebuie să fie de tip MONEY. 10.

Să se creeze o funcție definită de utilizator, care ar returna toate datele de un anumit

produs din stoc. Se definește următorul format al funcției: nume_funcție (pret_minimal, pret_maximal, tip_produs)

unde parametrii pot lua valori -

tip_produs

- pc, laptop sau imprimanta;

-

pret_minimal

-

pret_maximal

- 0.00, valoarea implicită; - 10000.00, valoarea implicită.

4

11.

Se cere realizarea unei funcții definite de utilizator, care ar calcula cel mai ieftin sau cel

mai scump produs al unui producător. Producătorul este luat în calitate de parametru. Formatul funcției este următorul: nume_funcție (nume_producator, flag)

unde, dacă flag=1, va afișa prețul minimal pentru utilizatorul dat, iar dacă flag=0 va afișa prețul maximal. Un exemplu de rezultate returnate de funcție: Producător Nume_Produs C Laptop_uri

5

Pret 970

Sarcina 1 Interogări simple 1. Să se găsească modelul, viteza procesorului și capacitatea discului dur pentru toate pc-urile care costă mai puțin de 500 $. Schema rezultatului afișat va fi Model, Viteza și HD. use DBlab8 go if OBJECT_ID('P1', 'P') is not null drop procedure P1 go create procedure P1 @Pret float as Select Model, Viteza, HD from pc_uri where Pret@Pret; exec P3 @Pret=1000

4. Să se găsească toate liniile tabelului imprimante pentru imprimantele color. use DBlab8 go if OBJECT_ID('P4', 'P') is not null drop procedure P4 go create procedure P4 @Color char(2) as select * from imprimante where Color=@Color; exec P4 'da'

5. Să se găsească modelul și viteza procesorului și capacitatea discului dur ale pc-urilor mai ieftine de 600 $ și care posedă cd-rom-urilor cu viteze 12x și 24x. 6

use DBlab8 go if OBJECT_ID('P5', 'P') is not null drop procedure P5 go create procedure P5 @Pret float, @CD1 varchar(3), @CD2 varchar(3) as select Model, Viteza, HD from pc_uri where pret@Pret or k.Pret>@Pret or i.Pret>@Pret; exec P7 450

8. Să se găsească producătorii care vând laptopuri sau imprimante, dar nu vând pc-uri. use DBlab8 go if OBJECT_ID('P8', 'P') is not null drop procedure P8 go create procedure P8 @Tip varchar(10) as select distinct Producator from produse where Producator not in (select Producator from produse where Tip=@Tip); exec P8 'PC'

9. Să se găsească producătorii de pc-uri cu procesoare ce funcționează ca frecven ța de tact nu mai mică de 450 MHz. Afișați câmpul Producător. 7

use DBlab8 go if OBJECT_ID('P9', 'P') is not null drop procedure P9 go create procedure P9 @Viteza decimal(3,0) as select distinct Producator from produse as l inner join pc_uri as p on l.Model=p.Model and Viteza>@Viteza; exec P9 450

10.

Să se găsească imprimantele cu cel mai înalt preț. Să se afișeze Model, Preț.

use DBlab8 go if OBJECT_ID('P10', 'P') is not null drop procedure P10 go create procedure P10 as select Model, Pret from imprimante where Pret=(Select MAX(Pret) from imprimante) exec P10

11.

Să se găsească viteza medie a pc-urilor.

use DBlab8 go if OBJECT_ID('P11', 'P') is not null drop procedure P11 go create procedure P11 as select avg(Viteza) as VitezaMedie from pc_uri exec P11

12.

Să se găsească viteza medie a laptopurilor, al căror preț depășește 1000 $.

use DBlab8 go if OBJECT_ID('P12', 'P') is not null drop procedure P12 go create procedure P12 @Pret float as select AVG(Viteza) as VitezaMedie from laptop_uri where Pret>@Pret; exec P12 1000

13.

Să se găsească viteza medie a pc-urilor produse de compania ‘A’.

use DBlab8 go if OBJECT_ID('P13', 'P') is not null drop procedure P13 go create procedure P13 @Producator char(1) as select distinct avg(Viteza) as VitezaMedie from pc_uri as l inner join produse as p on l.Model= p.Model and Producator= @Producator;

8

exec P13 'A'

14.

Să se găsească modelele și producătorii pc-urilor care au o viteză mai mare decât media

ram-ului laptopurilor. use DBlab8 go if OBJECT_ID('P14', 'P') is not null drop procedure P14 go create procedure P14 as select l.Model, l.Producator, p.Viteza from produse as l inner join pc_uri as p on l.Model=p.Model and Viteza>(Select MAX(Viteza) from laptop_uri) exec P14

15.

Afișarea tuturor producătorilor pc-urilor ce au ram-ul mai mare decât prețul dublu al

celui mai ieftin pc. Să se afișeze modelul și producătorul pc-urilor. use DBlab8 go if OBJECT_ID('P15', 'P') is not null drop procedure P15 go create procedure P15 as Select distinct p.Producator, p.Model from pc_uri as l inner join produse as p on l.Model=p.Model and RAM>(Select AVG(RAM) from laptop_uri); exec P15

16. Să se găsească modelele laptopurilor cu prețul mai mare decât prețul dublu al celui mai ieftin pc. Să se afișeze modelul laptopului și prețul acestuia. use DBlab8 go if OBJECT_ID('P16', 'P') is not null drop procedure P16 go create procedure P16 as select Model, Pret from laptop_uri where Pret>(Select MIN(Pret) from pc_uri)*2; exec P16

17.

Pentru fiecare valoare a vitezei, să se găsească prețul mediu al pc-urilor. Să se afi șeze

Viteza și Pret_Mediu. use DBlab8 go if OBJECT_ID('P17', 'P') is not null drop procedure P17 go create procedure P17 as select Viteza, AVG(Pret)as PretMediu from pc_uri

9

group by Viteza; exec P17

Interogări multi-relație 1. Să se găsească capacitățile discurilor dure, care coincid cu 2 sau mai multe pc-uri. Să se afi șeze HD. use DBlab8 go if OBJECT_ID('M1', 'P') is not null drop procedure M1 go create procedure M1 as select HD from pc_uri group by HD having count(HD)>1 ; exec M1

2. Să se găsească perechile de modele de pc-uri, care posedă procesoare cu aceia și viteză și memorie ram cu aceiași capacitate. Ca rezultat, fiecare pereche se afișează o singură dată, adică (i,j), dar nu (i,j). Ordinea de afișare: model cu număr mai mare, modelul cu număr mai mic, viteza și Ram. use DBlab8 go if OBJECT_ID('M2', 'P') is not null drop procedure M2 go create procedure M2 as select distinct p.Model, l.Model, l.Viteza, l.RAM from pc_uri as p, pc_uri as l where p.Viteza=l.Viteza and p.RAM=l.RAM and p.Model>l.Model order by p.Model ; exec M2

3. Să se găsească laptopurile, a căror viteză este mai mică decât la orice pc. Să se afi șeze: Tip, Model, Viteza. use DBlab8 go if OBJECT_ID('M3', 'P') is not null drop procedure M3 go create procedure M3 as select p.Tip, p.Model, l.Viteza from laptop_uri as l inner join produse as p on l.Model=p.Model and l.Viteza=@pcNumber exec M6 3

7. Să se găsească prețul maximal al pc-urilor propuse de fiecare producător. Afișați Producator, preț maxim. use DBlab8 go if OBJECT_ID('M7', 'P') is not null drop procedure M7 go create procedure M7 as select produse.Producator, max(pc_uri.Pret) as PretMaxim from produse, pc_uri where produse.Model=pc_uri.Model group by Producator

11

exec M7

8. Pentru fiecare valoare a vitezei pc-urilor care depășește 600 Mh, să se determine pre țul mediu al calculatorului cu aceeași viteză. Afișați Viteza, preț mediu. use DBlab8 go if OBJECT_ID('M8', 'P') is not null drop procedure M8 go create procedure M8 @Viteza decimal(3,0) as select Viteza, avg(Pret) as PretMediu from pc_uri group by Viteza having Viteza>@Viteza; exec M8 600

9. Afișarea tuturor producătorilor care produc pc-uri și laptopuri care dispun de o viteză nu mai mică de 750 Mh. Afișați Producator. use DBlab8 go if OBJECT_ID('M9', 'P') is not null drop procedure M9 go create procedure M9 @Viteza decimal(3,0), @Tip1 varchar(10), @Tip2 varchar(10) as select distinct produse.Producator from produse, pc_uri, laptop_uri where produse.Model=pc_uri.Model and (Tip=@Tip1 or Tip=@Tip2) and pc_uri.Viteza>=@Viteza or produse.Model=laptop_uri.Model and laptop_uri.Viteza>=@Viteza; exec M9 750,'PC', 'Laptop_uri'

10. Să se găsească suma totală a prețurilor celor mai ieftine imrpimante de fiecare tip. use DBlab8 go if OBJECT_ID('M10', 'P') is not null drop procedure M10 go create procedure M10 @Tip1 varchar(10), @Tip2 varchar(10), @Tip3 varchar(10) as declare @a int, @b int, @c int set @a=(select min(Pret) from imprimante where Tip=@Tip1) set @b=(select min(Pret) from imprimante where Tip=@Tip2) set @c=(select min(Pret) from imprimante where Tip=@Tip3) select distinct @a+@b+@c as PretTotal from imprimante exec M10 'Jet', 'Matrix','Laser'

12

11. Să se găsească modelul produsului cu cel mai mare preț. Se afișează Model. use DBlab8 go if OBJECT_ID('M11', 'P') is not null drop procedure M11 go create procedure M11 as if ((select max(imprimante.Pret) from imprimante) > (select max(laptop_uri.Pret) from laptop_uri)) goto et1 else goto et2 et1: if ((select max(imprimante.Pret) from imprimante) > (select max(pc_uri.Pret) from pc_uri)) select imprimante.Model from imprimante where imprimante.Pret = (select max(imprimante.Pret) from imprimante) else select pc_uri.Model from pc_uri where pc_uri.Pret = (select max(pc_uri.Pret) from pc_uri) return et2: if ((select max(laptop_uri.Pret) from laptop_uri) > (select max(pc_uri.Pret) from pc_uri)) select laptop_uri.Model from laptop_uri where laptop_uri.Pret = (select max(laptop_uri.Pret) from laptop_uri) else select pc_uri.Model from pc_uri where pc_uri.Pret= (select max(pc_uri.Pret) from pc_uri) return exec M11

12. Să se găsească producătorii de imprimante care produc și pc-uri cu cel mai mic volum ram. Să se afișeze Producator. use DBlab8 go if OBJECT_ID('M12', 'P') is not null drop procedure M12 go create procedure M12 @Tip1 varchar(10), @Tip2 varchar(10) as select distinct produse.Producator from produse, pc_uri where produse.Model=pc_uri.Model and (Tip=@Tip1 or Tip=@Tip2) and pc_uri.RAM=(select min(RAM) from pc_uri) exec M12 'PC', 'Imprimante'

13. Să se găsească prețul mediu al pc-urilor și laptopurilor produse de către ‘A’. Să se afi șeze Pre_med_comun. use DBlab8 go if OBJECT_ID('M13', 'P') is not null drop procedure M13 go create procedure M13 @Producator char(1) as select avg(Tabel.Pret) as PretMediu from ( select sum(pc_uri.Pret) as Pret from produse,pc_uri where produse.Model = pc_uri.Model and produse.Producator = @Producator union select sum(laptop_uri.Pret) as Pret from produse,laptop_uri where produse.Model = laptop_uri.Model and produse.Producator = @Producator ) as Tabel exec M13 'A'

13

14. Să se găsească prețul mediu al pc-urilor pentru fiecare din producători care produc și imprimante. Afișați Producator, Pret_med_prod. use DBlab8 go if OBJECT_ID('M14', 'P') is not null drop procedure M14 go create procedure M14 @Tip1 varchar(10), @Tip2 varchar(10) as Select Producator, avg(pc_uri.Pret) as PretMediu from produse,pc_uri where produse.Model=pc_uri.Model and Producator in (select distinct Producator from produse as p where Tip=@Tip1 and exists (select Producator from produse where Tip=@Tip2 and Producator=p.Producator)) group by Producator exec M14 'PC','imprimante'

15. Să se găsească capacitatea medie a HD pc-urilor ale acelor producători care produc și imprimante. Afișați capacitatea medie HD. use DBlab8 go if OBJECT_ID('M15', 'P') is not null drop procedure M15 go create procedure M15 @Tip1 varchar(10), @Tip2 varchar(10) as Select Producator, avg(pc_uri.HD) as HDMediu from produse,pc_uri where produse.Model=pc_uri.Model and Producator in (select distinct Producator from produse as p where Tip= @Tip1 and exists (select Producator from produse where Tip=@Tip2 and Producator=p.Producator)) group by Producator exec M15 'PC','imprimante'

16. Să se găsească producătorii care produc numai un singur tip de produs. Să se afi șeze producătorul, tipul produsului, modelul și prețul modelului respectiv. use DBlab8 go if OBJECT_ID('M16', 'P') is not null drop procedure M16 go create procedure M16 as Select p.Producator, produse.Model, m.Pret from (Select Producator from produse group by Producator having count(Producator)=1 ) as p inner join produse on p.Producator=produse.Producator

14

inner join (select pc_uri.Model, Pret from pc_uri union select laptop_uri.Model, Pret from laptop_uri union select imprimante.Model, Pret from imprimante) as m on produse.Model=m.Model exec M16

17. Să se analizeze prețurile laptop-urilor și în funcție de valoare să fie grupate în 3 clase. Dacă este mai ieftin de 750 $- clasa econom., dacă prețul nu depășește 1100 $- clasa business, dacă pre țul este mai mare de 1100 $- clasa premium. Să se afișeze tipul produsului, Mode, Pret și clasa produsului. use DBlab8 go if OBJECT_ID('M17', 'P') is not null drop procedure M17 go create procedure M17 @ClasaProdus1 varchar(10), @ClasaProdus2 varchar(10), @ClasaProdus3 varchar(10) as select produse.Tip, laptop_uri.Model, laptop_uri.Pret,ProductClass.ClasaProdus from laptop_uri inner join BazaDeDateLab3.dbo.ProductClass on (laptop_uri.Pret750 and laptop_uri.Pret1100 and ClasaProdus=@ClasaProdus3) inner join produse on produse.Model=laptop_uri.Model exec M17 'econom', 'business', 'premium'

18. În tabelul produse să se găsească modelele la care prima cifră din model este o cifră impară, iar ultima – pară și prima cifră este mai mică decât ultima. Să se afi șeze modelul, tipul produsului, produsul primei și ultimei cifre din numărul modelului. use DBlab8 go if OBJECT_ID('M18', 'P') is not null drop procedure M18 go create procedure M18 as select model, ( LEN(REPLACE(model, '1','11')) - LEN(model))+ 2*(LEN(REPLACE(model, '2','22')) - LEN(model)) + 3*(LEN(REPLACE(model, '3','33')) - LEN(model)) + 4*(LEN(REPLACE(model, '4','44')) - LEN(model)) + 5*(LEN(REPLACE(model, '5','55')) - LEN(model)) + 6*(LEN(REPLACE(model, '6','66')) - LEN(model)) + 7*(LEN(REPLACE(model, '7','77')) - LEN(model)) + 8*(LEN(REPLACE(model, '8','88')) - LEN(model)) + 9*(LEN(REPLACE(model, '9','99')) - LEN(model)) as Suma from produse where (model%2)=0

15

exec M18

19. Să se calculeze suma cifrelor numerelor fiecărui mode din tabelul produse. Să se afi șeze modelul și suma. De exemplu, dacă modelul este 1121, atunci suma cifrelor din model este 5. use DBlab8 go if OBJECT_ID('M19', 'P') is not null drop procedure M19 go create procedure M19 as select model, ( LEN(REPLACE(model, '1','11')) - LEN(model))+ 2*(LEN(REPLACE(model, '2','22')) - LEN(model)) + 3*(LEN(REPLACE(model, '3','33')) - LEN(model)) + 4*(LEN(REPLACE(model, '4','44')) - LEN(model)) + 5*(LEN(REPLACE(model, '5','55')) - LEN(model)) + 6*(LEN(REPLACE(model, '6','66')) - LEN(model)) + 7*(LEN(REPLACE(model, '7','77')) - LEN(model)) + 8*(LEN(REPLACE(model, '8','88')) - LEN(model)) + 9*(LEN(REPLACE(model, '9','99')) - LEN(model)) as Suma from produse exec M19

20. Din tabelul produse să se obțină un tabel cu coloane Producator, PC, Imprimante; Laptop_uri. Pentru fiecare producător, în acest tabel, să se indice dacă acesta produce sau nu (da sau nu) un anumit tip de produse. De exemplu, un rând din tabelul construit poate arata: A, nu, da, nu. use DBlab8 go if OBJECT_ID('M20', 'P') is not null drop procedure M20 go create procedure M20 as select producator, REPLACE(case when [pc]>0then 'Da'else 'Nu' end+'('+ convert(varchar,[pc])+')','Nu(0)','Nu') AS pc, REPLACE(case when [laptop_uri]>0 then 'Da'else 'Nu' end+'('+ convert(varchar,[laptop_uri]) +')','Nu(0)','Nu') as laptop_uri, REPLACE(case when [imprimante]>0then 'Da'else 'Nu' end+'('+ convert(varchar,[imprimante]) +')','Nu(0)','Nu') as imprimante from ( select A.producator,b.model,a.tip from produse a JOIN pc_uri b ON a.model=b.model group by A.producator,b.model,a.tip union all select A.producator,b.model,a.tip from produse a JOIN laptop_uri b ON a.model=b.model group by A.producator,b.model,a.tip union all select A.producator,b.model,a.tip from produse a JOIN imprimante b ON a.model=b.model group by A.producator,b.model,a.tip) main pivot (count(model) for [tip] in ([pc],[laptop_uri],[imprimante])) pvt

16

exec M20

Sarcina 2 use DBlab8 go if OBJECT_ID('S2', 'P') is not null drop procedure S2 go create procedure S2 @Producator char(1), @Tip varchar(10) as if @Tip='all' delete produseS2 where Producator=@Producator else delete produseS2 where Producator=@Producator and Tip=@Tip exec S2 A, 'all' exec S2 D, 'imprimante'

Sarcina 3 use DBlab8 go if OBJECT_ID('S3', 'P') is not null drop procedure S3 go create procedure S3 @Id int, @Model varchar(4), @Color char(2), @Tip varchar(6), @Pret float as declare @errorMessage varchar(71)='Datele sunt incomplete sau gresite, verificati corectitudinea acestora.' if( (@Id is null or @Id=' ') or (@Model is null or @Model=' ') or (@Color is null or @Color=' ') or (@Tip is null or @Tip=' ') or (@Pret is null or @Pret=' ')) print @errorMessage else insert imprimante (id, model, color, tip, pret) values (@Id, @Model, @Color, @Tip, @Pret) exec S3 888,'9999', 'da', 'Laser',1000 select * from imprimante delete imprimante where id=8888

Sarcina 4 use DBlab8 go if OBJECT_ID('S4', 'P') is not null drop procedure S4 go create procedure S4 @NrProduse int as select producator as Producator, tip as Produs, count(model) as Nr_De_Modele from produse group by producator ,tip having Producator in (select Producator from produse group by producator having count(distinct tip)=@NrProduse) print 'Acest producator are la dispozitie '+RTRIM(cast(@NrProduse as varchar(10)))+' tipuri de produse.' exec S4 3

17

Sarcina 5 use DBlab8 go if OBJECT_ID('S5', 'P') is not null drop procedure S5 go create procedure S5 @Model varchar(5), @Unitati int, @Ru float as declare @Pret float declare @PC float=( select Pret from pc_uriS5 where @Model=Model+Identificator) declare @Laptop float=( select Pret from laptop_uriS5 where @Model=Model+Identificator) declare @Imprimante float=( select Pret from imprimanteS5 where @Model=Model+Identificator) declare @Rt float declare @Rp float declare @Suma float if(@Model in (select Model+Identificator from pc_uriS5 where @Model=Model+pc_uriS5.Identificator )) BEGIN set @Rt=10 set @Pret=@PC et2: if(@Pret@Pret ) Select * from FNS7(450)

8. Să se găsească producătorii care vând laptopuri sau imprimante, dar nu vând pc-uri. USE DBlab8 GO if OBJECT_ID ('FNS8','FN') IS NOT NULL DROP FUNCTION FNS8; GO Create function FNS8 (@Tip varchar(10)) RETURNS TABLE AS RETURN( select distinct Producator

21

from produse where Producator not in (select Producator from produse where Tip=@Tip) ) Select * from FNS8('PC')

9. Să se găsească producătorii de pc-uri cu procesoare ce funcționează ca frecven ța de tact nu mai mică de 450 MHz. Afișați câmpul Producător. USE DBlab8 GO if OBJECT_ID ('FNS9','FN') IS NOT NULL DROP FUNCTION FNS9; GO Create function FNS9 (@Viteza decimal(3,0)) RETURNS TABLE AS RETURN( select distinct Producator from produse as l inner join pc_uri as p on l.Model=p.Model and Viteza>@Viteza ) Select * from FNS9(450 )

10. Să se găsească imprimantele cu cel mai înalt preț. Să se afișeze Model, Preț. USE DBlab8 GO if OBJECT_ID ('FNS10','FN') IS NOT NULL DROP FUNCTION FNS10; GO Create function FNS10 () RETURNS TABLE AS RETURN( select Model, Pret from imprimante where Pret=(Select MAX(Pret) from imprimante) ) Select * from FNS10()

11. Să se găsească viteza medie a pc-urilor. USE DBlab8 GO if OBJECT_ID ('FNS11','FN') IS NOT NULL DROP FUNCTION FNS11; GO Create function FNS11 () RETURNS Float Begin declare @VitezaMedie float select @VitezaMedie=avg(viteza) from pc_uri return @VitezaMedie end Select dbo.FNS11() as VitezaMedie

12. Să se găsească viteza medie a laptopurilor, al căror preț depășește 1000 $. USE DBlab8 GO if OBJECT_ID ('FNS12','FN') IS NOT NULL DROP FUNCTION FNS12;

22

GO Create function FNS12 (@Pret float) RETURNS float begin declare @VitezaMedie float select @VitezaMedie=AVG(Viteza) from laptop_uri where Pret>@Pret return @VitezaMedie end Select dbo.FNS12(1000) as VitezaMedie

13. Să se găsească viteza medie a pc-urilor produse de compania ‘A’. USE DBlab8 GO if OBJECT_ID ('FNS13','FN') IS NOT NULL DROP FUNCTION FNS13; GO Create function FNS13 (@Producator char(1)) RETURNS float begin declare @VitezaMedie float select distinct @VitezaMedie=avg(Viteza) from pc_uri as l inner join produse as p on l.Model= p.Model and Producator= @Producator return @VitezaMedie end Select dbo.FNS13('A') as VitezaMedie

14. Să se găsească modelele și producătorii pc-urilor care au o viteză mai mare decât media ramului laptopurilor. USE DBlab8 GO if OBJECT_ID ('FNS14','FN') IS NOT NULL DROP FUNCTION FNS14; GO Create function FNS14 () RETURNS TABLE AS RETURN( select l.Model, l.Producator, p.Viteza from produse as l inner join pc_uri as p on l.Model=p.Model and Viteza>(Select MAX(Viteza) from laptop_uri) ) Select * from FNS14()

15. Afișarea tuturor producătorilor pc-urilor ce au ram-ul mai mare decât prețul dublu al celui mai ieftin pc. Să se afișeze modelul și producătorul pc-urilor. USE DBlab8 GO if OBJECT_ID ('FNS15','FN') IS NOT NULL DROP FUNCTION FNS15; GO Create function FNS15 () RETURNS TABLE AS RETURN( Select distinct p.Producator, p.Model from pc_uri as l inner join produse as p on l.Model=p.Model and RAM>(Select AVG(RAM) from laptop_uri) ) Select * from FNS15()

23

16. Să se găsească modelele laptopurilor cu prețul mai mare decât prețul dublu al celui mai ieftin pc. Să se afișeze modelul laptopului și prețul acestuia. USE DBlab8 GO if OBJECT_ID ('FNS16','FN') IS NOT NULL DROP FUNCTION FNS16; GO Create function FNS16 () RETURNS TABLE AS RETURN( select Model, Pret from laptop_uri where Pret>(Select MIN(Pret) from pc_uri)*2 ) Select * from FNS16()

17. Pentru fiecare valoare a vitezei, să se găsească prețul mediu al pc-urilor. Să se afișeze Viteza și Pret_Mediu. USE DBlab8 GO if OBJECT_ID ('FNS17','FN') IS NOT NULL DROP FUNCTION FNS17; GO Create function FNS17 () RETURNS TABLE AS RETURN( select Viteza, AVG(Pret)as PretMediu from pc_uri group by Viteza )

Interogări multi-relație 1. Să se găsească capacitățile discurilor dure, care coincid cu 2 sau mai multe pc-uri. Să se afi șeze HD. USE DBlab8 GO if OBJECT_ID ('FNM1','FN') IS NOT NULL DROP FUNCTION FNM1; GO Create function FNM1() RETURNS TABLE AS RETURN( select HD from pc_uri group by HD having count(HD)>1 ) Select * from FNM1()

2. Să se găsească perechile de modele de pc-uri, care posedă procesoare cu aceiași viteză și memorie ram cu aceiași capacitate. Ca rezultat, fiecare pereche se afișează o singură dată, adică 24

(i,j), dar nu (i,j). Ordinea de afișare: model cu număr mai mare, modelul cu număr mai mic, viteza și Ram. USE DBlab8 GO if OBJECT_ID ('FNM2','FN') IS NOT NULL DROP FUNCTION FNM2; GO Create function FNM2 () RETURNS TABLE AS RETURN( select distinct p.Model, l.Model as Modell, l.Viteza, l.RAM from pc_uri as p, pc_uri as l where p.Viteza=l.Viteza and p.RAM=l.RAM and p.Model>l.Model ) Select * from FNM2()

3. Să se găsească laptopurile, a căror viteză este mai mică decât la orice pc. Să se afi șeze: Tip, Model, Viteza. USE DBlab8 GO if OBJECT_ID ('FNM3','FN') IS NOT NULL DROP FUNCTION FNM3; GO Create function FNM3 () RETURNS TABLE AS RETURN( select p.Tip, p.Model, l.Viteza from laptop_uri as l inner join produse as p on l.Model=p.Model and l.Viteza=@pcNumber ) Select * from FNM6(3)

7. Să se găsească prețul maximal al pc-urilor propuse de fiecare producător. Afi șa ți Producator, preț maxim. USE DBlab8 GO if OBJECT_ID ('FNM7','FN') IS NOT NULL DROP FUNCTION FNM7; GO Create function FNM7 () RETURNS TABLE AS RETURN( select produse.Producator, max(pc_uri.Pret) as PretMaxim from produse, pc_uri where produse.Model=pc_uri.Model group by Producator ) Select * from FNM7()

8. Pentru fiecare valoare a vitezei pc-urilor care depășește 600 Mh, să se determine prețul mediu al USE DBlab8 GO if OBJECT_ID ('FNM8','FN') IS NOT NULL DROP FUNCTION FNM8; GO Create function FNM8 (@Viteza decimal(3,0)) RETURNS TABLE AS RETURN( select Viteza, avg(Pret) as PretMediu from pc_uri

26

group by Viteza having Viteza>@Viteza ) Select * from FNM8(600)

9. Afișarea tuturor producătorilor care produc pc-uri și laptopuri care dispun de o viteză nu mai mică de 750 Mh. Afișați Producator. USE DBlab8 GO if OBJECT_ID ('FNM9','FN') IS NOT NULL DROP FUNCTION FNM9; GO Create function FNM9 (@Viteza decimal(3,0), @Tip1 varchar(10), @Tip2 varchar(10) ) RETURNS TABLE AS RETURN( select distinct produse.Producator from produse, pc_uri, laptop_uri where produse.Model=pc_uri.Model and (Tip=@Tip1 or Tip=@Tip2) and pc_uri.Viteza>=@Viteza or produse.Model=laptop_uri.Model and laptop_uri.Viteza>=@Viteza ) Select * from FNM9(750,'PC', 'Laptop_uri')

10. Să se găsească suma totală a prețurilor celor mai ieftine imprimante de fiecare tip. USE DBlab8 GO if OBJECT_ID ('FNM10','FN') IS NOT NULL DROP FUNCTION FNM10; GO Create function FNM10 (@Tip1 varchar(10), @Tip2 varchar(10), @Tip3 varchar(10) ) RETURNS float begin declare @a int, @b int, @c int ,@d float set @a=(select min(Pret) from imprimante where Tip=@Tip1) set @b=(select min(Pret) from imprimante where Tip=@Tip2) set @c=(select min(Pret) from imprimante where Tip=@Tip3) select distinct @d= @a+@b+@c from imprimante return @d end Select dbo.FNM10('Jet', 'Matrix','Laser') as PretTotal

11. Să se găsească modelul produsului cu cel mai mare preț. Se afișează Model. USE DBlab8 GO if OBJECT_ID ('FNM11','FN') IS NOT NULL DROP FUNCTION FNM11; GO Create function FNM11 () RETURNS INT BEGIN DECLARE @Rezultat FLOAT

27

DECLARE @a float = (select max(imprimante.Pret) from imprimante) DECLARE @b float = (select max(laptop_uri.pret) from laptop_uri) DECLARE @c float = (select imprimante.Model from imprimante where imprimante.Pret = (select min(imprimante.Pret) from imprimante)) DECLARE @d FLOAT = (select pc_uri.Model from pc_uri where pc_uri.Pret = (select max(pc_uri.Pret) from pc_uri)) DECLARE @e float = (select laptop_uri.Model from laptop_uri where laptop_uri.Pret = (select max(laptop_uri.Pret) from laptop_uri)) DECLARE @f float = (select pc_uri.Model from pc_uri where pc_uri.Pret = (select max(pc_uri.Pret) from pc_uri)) if(@a > @b) goto et1 else goto et2 et1: if((select max(imprimante.Pret) from imprimante)>(select max(pc_uri.Pret) from pc_uri)) SET @Rezultat = @c else SET @Rezultat = @d return @Rezultat et2: if((select max(laptop_uri.Pret) from laptop_uri)>(select max(pc_uri.Pret) from pc_uri)) SET @Rezultat = @e else SET @Rezultat = @f RETURN @Rezultat END Select dbo.FNM11() as ModelPretMax

12. Să se găsească producătorii de imprimante care produc și pc-uri cu cel mai mic volum ram. Să se afișeze Producator. USE DBlab8 GO if OBJECT_ID ('FNM12','FN') IS NOT NULL DROP FUNCTION FNM12; GO Create function FNM12 (@Tip1 varchar(10), @Tip2 varchar(10)) RETURNS TABLE AS RETURN( select distinct produse.Producator from produse, pc_uri where produse.Model=pc_uri.Model and (Tip=@Tip1 or Tip=@Tip2) and pc_uri.RAM=(select min(RAM) from pc_uri)) Select * from FNM12('PC','imprimante')

13. Să se găsească prețul mediu al pc-urilor și laptopurilor produse de către ‘A’. Să se afi șeze Pre_med_comun. USE DBlab8 GO if OBJECT_ID ('FNM','FN') IS NOT NULL DROP FUNCTION FNM; GO Create function FNM (@Producator char(1)) RETURNS float begin

28

declare @PretMediu float select @PretMediu=avg(Tabel.Pret) from ( select sum(pc_uri.Pret) as Pret from produse,pc_uri where produse.Model = pc_uri.Model and produse.Producator = @Producator union select sum(laptop_uri.Pret) as Pret from produse,laptop_uri where produse.Model = laptop_uri.Model and produse.Producator = @Producator ) as Tabel return @PretMediu end Select dbo.FNM('A') as PretMediu

14. Să se găsească prețul mediu al pc-urilor pentru fiecare din producători care produc și imprimante. Afișați Producator, Pret_med_prod. USE DBlab8 GO if OBJECT_ID ('FNM14','FN') IS NOT NULL DROP FUNCTION FNM14; GO Create function FNM14 ( @Tip1 varchar(10), @Tip2 varchar(10) ) RETURNS TABLE AS RETURN( Select Producator, avg(pc_uri.Pret) as PretMediu from produse,pc_uri where produse.Model=pc_uri.Model and Producator in (select distinct Producator from produse as p where Tip=@Tip1 and exists (select Producator from produse where Tip=@Tip2 and Producator=p.Producator)) group by Producator ) Select * from FNM14('PC','imprimante')

15. Să se găsească capacitatea medie a HD pc-urilor ale acelor producători care produc și imprimante. Afișați capacitatea medie HD. USE DBlab8 GO if OBJECT_ID ('FNM15','FN') IS NOT NULL DROP FUNCTION FNM15; GO Create function FNM15 (@Tip1 varchar(10), @Tip2 varchar(10) ) RETURNS TABLE AS RETURN( Select Producator, avg(pc_uri.HD) as HDMediu from produse,pc_uri where produse.Model=pc_uri.Model and Producator in (select distinct Producator from produse as p where Tip= @Tip1 and exists (select Producator from produse where Tip=@Tip2 and Producator=p.Producator)) group by Producator )

29

Select * from FNM15('PC','imprimante')

16. Să se găsească producătorii care produc numai un singur tip de produs. Să se afi șeze producătorul, tipul produsului, modelul și prețul modelului respectiv. USE DBlab8 GO if OBJECT_ID ('FNM16','FN') IS NOT NULL DROP FUNCTION FNM16; GO Create function FNM16 () RETURNS TABLE AS RETURN( Select p.Producator, produse.Model, m.Pret from (Select Producator from produse group by Producator having count(Producator)=1 ) as p inner join produse on p.Producator=produse.Producator inner join (select pc_uri.Model, Pret from pc_uri union select laptop_uri.Model, Pret from laptop_uri union select imprimante.Model, Pret from imprimante) as m on produse.Model=m.Model ) Select * from FNM16()

17. Să se analizeze prețurile laptop-urilor și în funcție de valoare să fie grupate în 3 clase. Dacă este mai ieftin de 750 $- clasa econom., dacă prețul nu depășește 1100 $- clasa business, dacă pre țul este mai mare de 1100 $- clasa premium. Să se afișeze tipul produsului, Mode, Pret și clasa produsului. USE DBlab8 GO if OBJECT_ID ('FNM17','FN') IS NOT NULL DROP FUNCTION FNM17; GO Create function FNM17 (@ClasaProdus1 varchar(10), @ClasaProdus2 varchar(10), @ClasaProdus3 varchar(10)) RETURNS TABLE AS RETURN( select produse.Tip, laptop_uri.Model, laptop_uri.Pret,ProductClass.ClasaProdus from laptop_uri inner join BazaDeDateLab3.dbo.ProductClass on (laptop_uri.Pret750 and laptop_uri.Pret1100 and ClasaProdus=@ClasaProdus3) inner join produse on produse.Model=laptop_uri.Model ) Select * from FNM17('econom', 'business', 'premium')

30

18. În tabelul produse să se găsească modelele la care prima cifră din model este o cifră impară, iar ultima – pară și prima cifră este mai mică decât ultima. Să se afi șeze modelul, tipul produsului, produsul primei și ultimei cifre din numărul modelului. USE DBlab8 GO if OBJECT_ID ('FNM18','FN') IS NOT NULL DROP FUNCTION FNM18; GO Create function FNM18 () RETURNS TABLE AS RETURN( select model, ( LEN(REPLACE(model, '1','11')) - LEN(model))+ 2*(LEN(REPLACE(model, '2','22')) - LEN(model)) + 3*(LEN(REPLACE(model, '3','33')) - LEN(model)) + 4*(LEN(REPLACE(model, '4','44')) - LEN(model)) + 5*(LEN(REPLACE(model, '5','55')) - LEN(model)) + 6*(LEN(REPLACE(model, '6','66')) - LEN(model)) + 7*(LEN(REPLACE(model, '7','77')) - LEN(model)) + 8*(LEN(REPLACE(model, '8','88')) - LEN(model)) + 9*(LEN(REPLACE(model, '9','99')) - LEN(model)) as Suma from produse where (model%2)=0 ) Select * from FNM18()

19. Să se calculeze suma cifrelor numerelor fiecărui mode din tabelul produse. Să se afi șeze modelul și suma. De exemplu, dacă modelul este 1121, atunci suma cifrelor din model este 5. USE DBlab8 GO if OBJECT_ID ('FNM19','FN') IS NOT NULL DROP FUNCTION FNM19; GO Create function FNM19 () RETURNS TABLE AS RETURN( select model, ( LEN(REPLACE(model, '1','11')) - LEN(model))+ 2*(LEN(REPLACE(model, '2','22')) - LEN(model)) + 3*(LEN(REPLACE(model, '3','33')) - LEN(model)) + 4*(LEN(REPLACE(model, '4','44')) - LEN(model)) + 5*(LEN(REPLACE(model, '5','55')) - LEN(model)) + 6*(LEN(REPLACE(model, '6','66')) - LEN(model)) + 7*(LEN(REPLACE(model, '7','77')) - LEN(model)) + 8*(LEN(REPLACE(model, '8','88')) - LEN(model)) + 9*(LEN(REPLACE(model, '9','99')) - LEN(model)) as Suma from produse ) Select * from FNM19()

20. Din tabelul produse să se obțină un tabel cu coloane Producator, PC, Imprimante; Laptop_uri. 31

Pentru fiecare producător, în acest tabel, să se indice dacă acesta produce sau nu (da sau nu) un anumit tip de produse. De exemplu, un rând din tabelul construit poate arata: A, nu, da, nu. USE DBlab8 GO if OBJECT_ID ('FNM20','FN') IS NOT NULL DROP FUNCTION FNM20; GO Create function FNM20 () RETURNS TABLE AS RETURN( select producator, REPLACE(case when [pc]>0then 'Da'else 'Nu' end+'('+ convert(varchar,[pc])+')','Nu(0)','Nu') AS pc, REPLACE(case when [laptop_uri]>0 then 'Da'else 'Nu' end+'('+ convert(varchar,[laptop_uri]) +')','Nu(0)','Nu') as laptop_uri, REPLACE(case when [imprimante]>0then 'Da'else 'Nu' end+'('+ convert(varchar,[imprimante]) +')','Nu(0)','Nu') as imprimante from ( select A.producator,b.model,a.tip from produse a JOIN pc_uri b ON a.model=b.model group by A.producator,b.model,a.tip union all select A.producator,b.model,a.tip from produse a JOIN laptop_uri b ON a.model=b.model group by A.producator,b.model,a.tip union all select A.producator,b.model,a.tip from produse a JOIN imprimante b ON a.model=b.model group by A.producator,b.model,a.tip) main pivot (count(model) for [tip] in ([pc],[laptop_uri],[imprimante])) pvt ) Select * from FNM20()

Sarcina 7 create function Sarcina7 () returns table as return( select *, coalesce(a.pret(select b.pret from pc_uri as b where b.id+1=a.id),pret) as diferenta from pc_uri as a ) select * from Sarcina7()

Sarcina 8 USE DBlab8 GO if OBJECT_ID ('FNSS8','FN') IS NOT NULL DROP FUNCTION FNSS8; GO Create function FNSS8 (@column as varchar(10)) RETURNS TABLE AS RETURN( Select model,case @column when 'viteza' then cast(viteza as varchar(10))+' GHz' when 'ram' then cast(ram as varchar(10))+' GB' when 'hd' then cast(hd as varchar(10))+' GB' when 'pret' then cast(pret as varchar(10))+' $' when 'ecran' then cast(ecran as varchar(10))+'"' end result from laptop_uri

32

) Select Select Select Select

* from FNSS8('viteza') * from FNSS8('ram') * from FNSS8('hd') * from FNSS8('pret')

Select * from FNSS8('ecran')

Sarcina 9 USE DBlab8 GO if OBJECT_ID ('FNSS9','FN') IS NOT NULL DROP FUNCTION FNSS9; GO Create function FNSS9(@valoare_pret float, @curs_BNM float, @valuta char(3)) RETURNS MONEY as begin return( case @valuta when 'EUR' then @valoare_pret*@curs_BNM when 'MDL' then @valoare_pret*@curs_BNM end ) end select dbo.FNSS9(400,20.5758,'MDL') as result select dbo.FNSS9(400, 0.9243,'EUR') as result

Sarcina 10 create table pc_uriS10 (idPC int not null, modelPC varchar(4) not null, vitezaPC decimal(3,0) not null, ramPC decimal(3,0) not null, hdPC decimal(2,0) not null, cdPC varchar(3) not null, pretPC float not null, constraint idd1S10 primary key(idPC)); create table laptop_uriS10 (idLaptop int not null, modelLaptop varchar(4) not null, vitezaLaptop decimal(3,0) not null, ramLaptop decimal(3,0) not null, hdLaptop decimal(2,0) not null, pretLaptop float not null, ecranLaptop int, constraint idd2S10 primary key(idLaptop)); create table imprimanteS10 (idImprimante int not null, modelImprimante varchar(4) not null, colorImprimante char(2) not null, tipImprimante varchar(6) not null, pretImprimante float not null, constraint idd3S10 primary key(idImprimante )); insert into pc_uriS10 select * from pc_uri insert into laptop_uriS10 select * from laptop_uri insert into imprimanteS10 select * from imprimante select * from pc_uriS10 select * from laptop_uriS10 select * from imprimanteS10

33

create function task10(@tip_produs varchar(10), @pret_min float, @pret_max float) returns table as return( select tab.*, case @tip_produs when 'PC'then tab.pretPC when 'Laptop-uri' then tab.pretLaptop when 'Imprimante' then tab.pretImprimante else 0 end pret from (select * from produse left join pc_uriS10 on modelPC=produse.model and (pretPC>@pret_min and pretPC@pret_min and pretLaptop@pret_min and pretImprimante
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF