Adatbázisok szerver oldali programozása Labor, 2006.04.25.
A VIK Wikiből
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
<style> code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px; } li { line-height: 18px; } </style>
Programvezérlő utasítások
- Indíts egy Microsoft Server Management Studiot! A New Query ikonra kattintva nyiss meg egy ablakot, ahol a T-SQL utasításokat fogod tudni majd futtatni! Futtasd le a minta adatbázisokat létrehozó scripteket!
- Deklarálj egy változót egy pilóta nevének tárolására. Kérdezd le a pilóták nevét ebbe
a változóba a két tanult módon (
SELECT @val = oszlop FROM ...
,SET @val = (SELECT oszlop FROM ...)
). Vizsgáld meg, hogy mi történik az egyik, és mi amásik esetben!
DECLARE @pilotanev nvarchar(100) SELECT @pilotanev = nev FROM pilota PRINT @pilotanev SET @pilotanev = (SELECT nev FROM pilota WHERE pilotaid = (SELECT MIN(pilotaid) FROM pilota)) PRINT @pilotanev SET @pilotanev = (SELECT nev FROM pilota) PRINT @pilotanev
- Módosítsd úgy az előbbi scriptedet, hogy a lekérdezés a legutolsó futam nyertes
pilótájának a nevét adja vissza!
DECLARE @pilotanev nvarchar(100) SELECT @pilotanev = nev FROM pilota, futam_pilota, futam WHERE futam.futamid = futam_pilota.futamid AND pilota.pilotaid = futam_pilota.pilotaid AND ev = (SELECT MAX(ev) FROM futam) AND helyezes = 1 PRINT @pilotanev
- Módosítsd az előző lekérdezést úgy, hogy a pilóta neve mellett a futam dátumát is ki
tud íratni a képernyőre, és írd is ki egy sorba a pilóta nevét és a futam dátumát! Elég
az egyik típusú értékadást használni (amelyiket ebben az esetben még lehet).
DECLARE @pilotanev nvarchar(100) DECLARE @futamdatum datetime SELECT @pilotanev = nev, @futamdatum = datum FROM pilota, futam_pilota, futam WHERE futam.futamid = futam_pilota.futamid AND pilota.pilotaid = futam_pilota.pilotaid AND datum = (SELECT MAX(datum) FROM futam, futam_pilota WHERE futam.futamid = futam_pilota.futamid) AND helyezes = 1 PRINT @pilotanev + ' ' + convert(varchar, @futamdatum)
- Használj dátummanipuláló függvényeket, amiknek a segítségével az előző
lekérdezésben megkapott dátumot a neked tetsző formában tudod kiíratni (csak év,
hónap, nap kiíratása kell). Használhatod a DATEPART függvényt, vagy az
egyszerűbben használható YEAR, MONTH és DAY függvényeket.
DECLARE @pilotanev nvarchar(100) DECLARE @futamdatum datetime SELECT @pilotanev = nev, @futamdatum = datum FROM pilota, futam_pilota, futam WHERE futam.futamid = futam_pilota.futamid AND pilota.pilotaid = futam_pilota.pilotaid AND datum = (SELECT MAX(datum) FROM futam, futam_pilota WHERE futam.futamid = futam_pilota.futamid) AND helyezes = 1 PRINT @pilotanev + ' ' + convert(varchar, YEAR(@futamdatum)) + '-' + convert(varchar, MONTH(@futamdatum)) + '-' + convert(varchar, DAY(@futamdatum))
- Az SQL Server 2005-ben már lehetőség van a módosító utasítások eredményének
kinyerésére az OUTPUT kifejezés segítségével. Az éppen beszúrt vagy éppen törölt
értékekre az INSERTED és a DELETED átmeneti táblákra való hivatkozással
kaphatjuk meg, az eredményt pedig vagy eredményhalmazként kaphatjuk meg, vagy
átmeneti tábla illetve tábla típus deklarálásával (a részleteket nézd meg a Books
Online-ban). Ezek alapján módosítsd az anyag táblát, és emeld meg minden 100 Ft-nál
olcsóbb anyag árát 10%-kal, a módosított anyagok nevét, régi és új árát pedig
eredményhalmazként nyerd ki!
UPDATE anyag SET anyag_egysegar = anyag_egysegar*1.1 OUTPUT deleted.anyag_nev nev, deleted.anyag_egysegar regiar, inserted.anyag_egysegar ujar WHERE anyag_egysegar<100
- Felhasználva az előző feladatban nyert ismereteidet, hozz létre egy tábla típusú
változót, majd csökkentsd az anyagok árát 10%-kal. Az eredményt az átmeneti
táblába tedd, amiből pedig egy lekérdezéssel nyerd ki azon módosított anyagok
adatait, amiknek az új ára kisebb, mint 30 Ft!
DECLARE @tempanyag TABLE(nev VARCHAR(100), regiar REAL, ujar REAL) UPDATE anyag SET anyag_egysegar = anyag_egysegar*0.9 OUTPUT deleted.anyag_nev, deleted.anyag_egysegar, inserted.anyag_egysegar INTO @tempanyag WHERE anyag_egysegar<100 SELECT * FROM @tempanyag WHERE ujar<30
- Készíts egy napló táblát az anyag árainak változásának nyomon követésére. A napló
tartalmazzon egy egyedi azonosítót, egy dátumot, amikor az árváltozás bekövetkezett,
az anyag nevét, a régi és az új árát. Módosítsd az előző batch scriptedet úgy, hogy az
átmeneti táblából a 30 Ft-nál olcsóbb termékek adatai a napló táblába kerüljenek. Az
ár értékeket csak két tizedes jegyig tároljad! Kérdezd le az utoljára beszúrt adat
azonosítóját, és azt írasd ki a kimenetre!
CREATE TABLE anyagar_naplo ( id INT PRIMARY KEY IDENTITY, nev VARCHAR(100), regiar REAL, ujar REAL, datum DATETIME ) GO DECLARE @tempanyag TABLE(nev VARCHAR(100), regiar REAL, ujar REAL) UPDATE anyag SET anyag_egysegar = anyag_egysegar*0.9 OUTPUT deleted.anyag_nev, deleted.anyag_egysegar, inserted.anyag_egysegar INTO @tempanyag WHERE anyag_egysegar<100 INSERT INTO anyagar_naplo SELECT nev, convert(numeric(10,2), regiar), convert(numeric(10,2), ujar), getdate() FROM @tempanyag WHERE ujar<30
- Írj egy lekérdezést, ami kilistázza az XSFXCF neptun kódú diák összes osztályzatát mind számmal, mind pedig szöveges formátumban. Az osztályzatok előtt szerepeljen, hogy melyik félévben melyik tárgyból kapta az adott osztályzatot. A félév kódot is konvertáld át szöveges formátummá. A szemeszterkód egy ötjegyű szám, aminek első négy jegye az évet jelenti, míg az ötödik számjegye az év félévét jelenti. Például a 2002 év őszi félévét a 20022 jelöli, míg a 2003 tavaszi félévet a 20031 kód jelöli. Megjelenítéskor az első esetben „2002/2003 I. felev” a második esetben pedig „2002/2003 II. felev” szöveget szeretnénk látni. A megoldásban használni kell a Adatbázisok szerver oldali programozása SQL Server T-SQL Programvezérlő utasítások convert() konverziós függvényt, ami az explicit adattípus konverziót teszi lehetővé, illetve a substring() függvényt. A függvények működését a help-ben nézd meg! Az eredmény így nézzen ki:
-- Peti - 2006.04.25.