A gyakorlat célja, hogy a hallgatók átismételjék a korábban tanult SQL alapokat Microsoft SQL Server környezetben, és elsajátítsák a fejlesztőeszköz használatát.
A labor elvégzéséhez szükséges eszközök:
- Microsoft SQL Server (LocalDB vagy Express edition)
- SQL Server Management Studio
- Adatbázis-létrehozó script: mssql.sql
Amit érdemes átnézned:
A felkészülés ellenőrzése: Az alábbi mintakérdésekből 2-t fogunk feltenni, legalább 1-re helyesen kell válaszolni.
-
Hogyan lehet vizsgálni egy kifejezés nullitását?
Az
is null
operátor segítségével. -
Miképp működik a
like
operátor? Milyen jokerkaraktereket lehet használni?Kif1 like stringminta
Stringösszehasonlító operátor. A
Kif1
-ben keres a mintának megfelelően, és ha a minta illeszthető aKif1
-re, akkor az operátor igaz értékkel tér vissza. A mintaillesztés case sensitive; az annak során használható jokerkarakterek:_
: egy betű helyettesítése%
: tetszőleges hosszúságú szöveg helyettesítése''
: szimpla'
, mivel ez önmagában a stringhatároló karakter.
-
Hogyan működnek az oszlopfüggvények?
Az oszlopfüggvények működését úgy lehet elképzelni, hogy az adatbázis-kezelő szerver először lefuttatja a lekérdezést az oszlopfüggvények nélkül, majd az egyes rekordokat átadja az oszlopfüggvényeknek az értékek kiszámítására. Az oszlopfüggvények használhatóak csoportokra is, azaz a rekordokat csoportosíthatjuk, és ezen csoportok mentén számítunk ki különböző oszlopfüggvényeket.
-
Mire szolgál a
having
kulcsszó?Ha egy oszlopfüggvény kimenetére szeretnénk szűrni, akkor azt külön a
having
kulcsszó után lehet megadni. -
Írja fel a
select
utasítás általános szintaktikáját!select [distinct] oszloplista from táblalista [where logikai kifejezés] [group by oszloplista] [having logikai kifejezés] [order by oszloplista]
-
Miképp lehet megadni két tábla outer joinját?
A
from
parancsnálleft
,right
vagy fullouter join
t használva, pl.select * from gyarto left outer join termek on gyartoid=gyarto.id
.
Az első három feladatot a gyakorlatvezetővel együtt oldjuk meg. Az utolsó feladat önálló munka. A közös feladatok megoldásai megtalálhatóak az útmutatóban is. Előbb azonban próbáljuk magunk megoldani a feladatokat!
A labor teljesítésének feltétele egy olyan .pdf
formátumú jegyzőkönyv elkészítése és feltöltése, amely azt igazolja, hogy a közös 3. feladatot, valamint az önálló 4. feladatban szereplő 10 lekérdezésből legalább az első 6-ot elkészítetted. Javasoljuk ugyanakkor, hogy a többit is próbáld megoldani. Az egyes lekérdezésekhez olyan képernyőképeket kérünk a jegyzőkönyvbe, melyeken egyszerre látszik a lekérdezés és annak eredménye, valamint a lekérdezésnél kommentként a Neptun-kódod is.
Első lépésként szükségünk lesz egy adatbázisra. Az adatbázis tipikusan egy központi kiszolgálón helyezkedik el, de fejlesztés közben sokszor a saját gépünkön fut. Mi ez utóbbi opciót választjuk.
-
Kapcsolódjon a Microsoft SQL Serverhez az SQL Server Management Studio segítségével! Indítsa el az alkalmazást, és az alábbi adatokkal kapcsolódjon:
- Server name:
(localdb)\mssqllocaldb
- Authentication:
Windows Authentication
- Server name:
-
Hozzon létre egy új adatbázist (ha még nem létezik):
- Az Object Explorerben a Databasesre jobb kattintás
- Create Database
- Az adatbázis neve legyen a Neptun-kódja
-
Hozza létre a mintaadatbázist a generálóscript lefuttatásával! Nyisson egy új Query ablakot, másolja be a script tartalmát, és értelmezzük az utasításokat! A standard SQL-en kívül néhány MSSQL-specifikus kódot is találunk:
- A script elején a meglévő táblák ellenőrzése
- Automatikusan generált elsődleges kulcsok az
IDENTITY
kulcsszó segítségével - A
SET IDENTITY_INSERT ... ON/OFF
használata, hogy általunk választott azonosítókat szúrhassunk be a generált helyett
-
Futtassa le az utasításokat! Ügyeljen az eszköztáron levő legördülő menüben a megfelelő adatbázis kiválasztására.
-
Ellenőrizze, hogy létrejöttek-e a táblák! Ha a Tables mappa ki volt már nyitva, akkor frissíteni kell.
Írjon SQL-lekérdezést/-utasítást az alábbi feladatokhoz!
-
Listázza ki az összes vevőt!
Megoldás
select * from Vevo
-
Listázza ki, hogy eddig milyen nevű termékeket rendeltek!
Megoldás
select distinct t.nev from Termek t join MegrendelesTetel mt on mt.TermekID=t.ID
A
join
segítségével kapcsoljuk össze a két táblát. Ajoin
, ha külön nem rendelkezünk róla, egy inner join lesz, amiben nem szerepelnek olyan termékek, amiknek nincs párjuk aMegrendelesTetel
táblában. Fontos adistinct
kulcsszó is, amivel kiszűrjük az ismétlődéseket. -
Hány nem teljesített megrendelésünk van (a státusz alapján)?
Megoldás
select count(*) from Megrendeles m join Statusz s on m.StatuszID = s.ID where s.Nev != 'Kiszállítva'
Itt a
join
mellett az oszlopfüggvény (aggregáció) használatára látunk példát. (A táblák kapcsolására nem csak ez a szintaktika használható.) -
Melyek azok a fizetési módok, amiket soha nem választottak a megrendelőink?
Megoldás
select f.Mod from Megrendeles m right outer join FizetesMod f on m.FizetesModID = f.ID where m.ID is null
A megoldás kulcsa az
outer join
, aminek köszönhetően láthatjuk, mely fizetési mód rekordhoz nem tartozik egyetlen megrendelés se. -
Rögzítsünk egy új vevőt! Kérdezzük le az újonnan létrejött rekord kulcsát!
Megoldás
insert into Vevo(Nev, Login, Jelszo, Email) values ('Teszt Elek', 't.elek', '********', 't.elek@email.com') select @@IDENTITY
Az
insert
után javasolt kiírni az oszlopneveket az egyértelműség végett, bár nem kötelező. Vegyük észre, hogy azID
oszlopnak nem adunk értéket, mert azt a tábla definíciójakor meghatározva a szerver adja automatikusan. Ezért kell utána lekérdeznünk, hogy tudjuk, milyenID
-t adott. -
A kategóriák között hibásan szerepel a Fajáték kategórianév. Javítsuk át Fakockákra!
Megoldás
update Kategoria set Nev = 'Fakockák' where Nev = 'Fajáték'
-
Melyik termékkategóriában van a legtöbb termék?
Megoldás
select top 1 Nev, (select count(*) from Termek where Termek.KategoriaID = k.ID) as db from Kategoria k order by db desc
A kérdésre több alternatív lekérdezés is eszünkbe juthat. Ez csak egyike a lehetséges megoldásoknak. Itt láthatunk példát az allekérdezésre (subquery) is. Viszont ez nem ad helyes megoldást akkor, amikor több olyan kategória is van, amely ugyanannyi, maximális számú terméket tartalmaz, mert csak az első ilyen kategóriát adja vissza. A tökéletes megoldás:
select k.Nev from Kategoria k join Termek t on t.KategoriaID = k.ID group by k.id, k.Nev having count(t.id) = (select max(darab) from ( select count(t.id) AS darab from Kategoria k join Termek t on t.KategoriaID = k.ID group by k.id, k.Nev ) AS darabszamok )
- Mely termékek áfakulcsa 15%-os?
- Az egyes telephelyekre hány rendelés volt eddig?
- Melyik városba kérték a legtöbb rendelést?
- Melyek azok a vevők, akik már legalább 2-szer rendeltek?
- Mely számláknál nem egyezik meg a kiállítás és teljesítés dátuma?
- Írjuk ki a 2008. februári rendeléseket!
- Írjuk ki azokat a rendeléseket, melyeknél a határidő 5 napnál szűkebb a rendelés dátumához képest!
- Hány vevőnek van gmailes e-mail címe?
- Mely vevőknek van egynél több telephelye?
- Mely vevő(k) adták le a legtöbb tételből álló rendelést? (Több ilyen is lehet!)
Az itt található oktatási segédanyagok a BMEVIAUBB04 tárgy hallgatóinak készültek. Az anyagok oly módú felhasználása, amely a tárgy oktatásához nem szorosan kapcsolódik, csak a szerző(k) és a forrás megjelölésével történhet.
Az anyagok a tárgy keretében oktatott kontextusban értelmezhetőek. Az anyagokért egyéb felhasználás esetén a szerző(k) felelősséget nem vállal(nak).