Access – SQL


Tartalomjegyzék

Bevezető

A most következő ismeretek feltételeznek bizonyos előképzettséget adatbázis-kezelési témakörből, és a Microsoft Access használatából. Természetesen most is csak a középiskolai ismeretekre gondolok, hiszen ez a fejezet is elsősorban a középiskolásoknak szól. Olyan szinten megyünk csak bele az SQL nyelv használatába, amennyi egy középiskolásnak szükséges. Nem a teljes SQL nyelvet tárgyaljuk meg részletesen, hanem azt nézzük meg, hogy a Microsoft Access használatához szükség esetén hogyan tudjuk kihasználni, felhasználni az SQL nyelvet.

Említettem tehát, hogy előfeltételként ajánlatos egy kis jártasságot szerezni adatbázis-kezelés témakörben, illetve a Microsoft Access használatában. Ehhez sok információt, irodalmat lehet találni az Interneten, illetve papír alapú könyvekben is. Nos én is írtam egy kis összefoglalót erről. Igaz, hogy a Microsoft Access 2013-as verzióhoz (akkor még csak az volt), de az ott leírtak döntő többsége az újabb verziókban is használható. Ez az összefoglaló megtalálható a weboldalamon, de itt egy közvetlen link: Link

Az SQL nyelv áttekintése

Az SQL (Structured Query Language – Strukturált Lekérdező Nyelv) relációs adatbázisok kezelésére alkalmas, szabványos lekérdező nyelv. Fejlesztése az 1970-es években kezdıdött az IBM berkein belül, igaz akkor még SEQUEL-nek nevezték (Structured English QUEry Language). Később más cégek termékeiben is megjelent a lekérdező nyelv (pl. Oracle, Microsoft), 1987-től pedig ANSI szabvány lett, amelyet manapság (néhány módosítással) csaknem minden relációs adatbáziskezelő rendszer alkalmaz.

Egy relációs adatbázisban az adattárolás alapjait a táblák jelentik. Egy adatbázis általában több táblából áll. A táblák a logikailag összetartozó adatok sorokból és oszlopokból álló elrendezése. A táblák sorait adatrekordoknak, oszlopait rekordmezőknek nevezzük. Az adatbázist alkotó egyedek a táblázat soraiban, az egyedtulajdonságok pedig az oszlopaiban találhatók. Nézzünk egy képzeletbeli iskolai adatbázist, ahol nyilvántartjuk a tanulók személyes adatait, illetve egy másik táblában pedig az előmenetelüket (az osztályzataikat). Lássuk ezt a két egyszerű táblát.

Tábla neve: diakok

azonnevanyje_neveszul_helyszul_idotelefonemail
t01Kovács ÉvaMolnár TerézSzekszárd2004.03.12.302432345eva.kovacs@freemail.com
t02Tóth GáborSárosi IldikóPécs2004.06.25.204567898gaborka@citromail.com
t03Jakab ZsuzsaNagy GabriellaSzekszárd2003.11.17.702134657zsuzsika@freemail.com
t04Kovács ÉvaElek MártaPaks2005.09.30.306547891evike@gmail.hu
t05Dobos JuditKiss ÉvaSzekszárd2004.06.25.301234766dobos.judit@citromail.com
t06Kelemen IldikóDeák IlonaSzekszárd2004.08.23.202345671kelemenke@freemail.com
t07Sárosi BélaHorváth IldikóKaposvár2003.05.12. 304785643 

Tábla neve: eredmenyek

azonnevmagyartorimatekangolinfotesi
t01Kovács Éva433545
t02Tóth Gábor553343
t03Jakab Zsuzsa345554
t04Kovács Éva422333
t05Dobos Judit545444
t06Kelemen Ildikó435545
t07Sárosi Béla535244

A fenti táblázatokban 7 rekord van (személyenként egy-egy rekord), az elsőben 7 mező, a másodikban pedig 8 mező található.

Az SQL utasítások fajtái

Az SQL utasításokat cél szerint csoportosíthatjuk, mi majd csak a leggyakrabban használt utasításokat tekintjük át.

  • Lekérdező utasítások – az adatbázisből történő lekérdezéseket teszik lehetővé.
  • Adatleíró utasítások – velük tudunk például különböző táblákat, és más objektumokat létrehozni, módosítani, törölni, stb.
  • Adatmódosító utasítások – ezek szolgálnak az adatok beírására, módosítására és törlésére.

A továbbiakban mi csak az SQL lekérdezésekkel foglalkozunk! Táblákat, űrlapokat és jelentéseket sokkal könnyebb és gyorsabb Tervező nézetben, illetve Varázslókkal létrehozni. Ezek ismeretét feltételezem az olvasóról (mint ahogyan azt már leírtam). Lekérdezéseket is könnyeb ezzel a módszerrel létrehozni, de vannak olyan esetek, amikor csak SQL segítségével tudjuk megoldani a feladatot! Ezért tekintjük át a legfontosabb ilyen ismereteket. Lássunk is hozzá!

Select

A SELECT utasítással a táblázatból szelektálhatunk (válogathatunk) ki adatokat, eredményül egy ún. eredménytáblát kapunk. Az eredménytábla hasonlít az adattáblákhoz, de csak ideiglenesen jön létre a lekérdezés futtatásakor, és nem tárolódik az adatbázisban. Az eredménytáblát a SELECT utasítás ún. záradékaival szűrhetjük, rendezhetjük, csoportosíthatjuk, vagy akár újabb lekérdezést is végezhetünk rajta (beágyazott-, avagy allekérdezések). Használata:

SELECT oszlop_nevek FROM tábla_neve;

Megjegyzés: az SQL nyelv parancsaiban a kis- és nagybetűk nincsenek megkülönböztetve. A jobb átláthatóság érdekében mi csupa nagy betűvel írjuk a nyelv alapszavait. Az oszlopneveket vesszővel kell elválasztani.

Most nézzünk erre egy példát. Kattintsunk a Létrehozás menüpontra, majd a Lekérdezések csoportban a Lekérdezéstervező feliratra. Ezt követően az Eredmények csoportban (balra fent) válasszuk az SQL lehetőséget. Most már nekiláthatunk az SQL utasítások írásának! Az alábbi képeken láthatjuk az említett folyamatot.

Van tehát egy adatbázisunk iskola néven (innen letölthető: Link), benne két tábla: diakok és eredmenyek. Ezeket a tanult (ismert) módon létrehoztuk már előzőleg. A továbbiakban ezzel az adatbázissal dolgozunk. Első feladatunk legyen az, hogy jelenítsük meg a diákok nevét és telefonszámát. Ehhez csak a diakok tábla kell, és a SELECT utasítás.

SELECT nev, telefon FROM diakok;

Majd kattintsunk a Futtatás patancsra az Eredmények csoportban. Az eredményt természetesen a szokásos módon menthetjük valamilyen néven (pl. Tanulók neve és telefonszáma). Az alábbi képeken az előző folyamatot látjuk.

Ha az összes mezőt szeretnénk látni a lekérdezésben, akkor nem kell felsorolni minden oszlopot, elég egy * (csillag) karaktert írnunk. Például így:

SELECT * FROM diakok;

Ha lefuttatjuk a lekérdezést, akkor most minden mezőt (oszlopot) látni fogunk. A Nézetek csoportban tudunk váltani a különböző nézetek között:

  • Adatlap nézet
  • SQL nézet
  • Tervező nézet

DISTINCT

A DISTINCT hatására a rendszer az eredménytáblából elhagyja azokat a rekordokat, amelyek többszörös adatokat tartalmaznak a kiválasztott mezőkben. Ahhoz, hogy a lekérdezés eredményében szerepeljenek, a SELECT utasításban felsorolt mezőkben lévő értékeknek egyedieknek kell lenniük.

A mi adatbázisunkban két Kovács Éva szerepel, egyikük Pakson, a másikuk pedig Szekszárdon született. Ha csak a tanulók nevét akarjuk kinyerni, akkor a SELECT DISTINCT utasítással csak egy Kovács Évát látunk. Ha viszont a nevükön kívül megjelenítjük a születési helyüket is, akkor újra mindkét kovács éva megjelenik, hiszen ők különbözőek!

Csak a nevüket kérdezzük le:

SELECT DISTINCT nev FROM diakok;

A nevüket és a születési helyüket kérdezzük le:

SELECT DISTINCT nev, szul_hely FROM diakok;

Ha például arra vagyunk kíváncsiak, hogy a tanulók milyen településeken születtek, azt is könnyen megtehetjük:

SELECT DISTINCT szul_hely FROM diakok;

WHERE

Ha tovább akarjuk szűkíteni a lekérdezések eredményét, akkor egy újabb feltétellel kell kiegészíteni a lekérdezést, amelyet a WHERE kulcsszó után kell írni.

SELECT oszlop_nevek FROM tábla_neve WHERE oszlopra_vonatkozó_feltétel;

Kérdezzük le azokat a tanulókat, akik Szekszárdon születtek. Ezt a következőképpen tehetjük meg (a Szekszárd szöveget idézőjelek között kell beírni):

SELECT nev FROM diakok WHERE szul_hely=”Szekszárd”;

Műveleti jelek a WHERE feltételben:

  • egyenlő (=)
  • nem egyenlő (<>)
  • kisebb, mint… (<)
  • nagyobb, mint… (>)
  • kisebb vagy egyenlő, mint… (<=)
  • nagyobb vagy egyenlő, mint… (>=)
  • egy keresési minta alapján keres (LIKE)
  • egy keresési intervallumot adhatunk meg (BETWEEN)

Természetesen több feltétel is megadható. Például kérdezzük le azokat a tanulókat, akik Szekszárdon születtek, és a nevük K betűvel kezdődik. Emlékezzünk arra, hogy az Access-ben vannak úgynevezett jóker karaktereink (helyettesítő karaktereink). A ? egy karaktert helyettesít, a * pedig tetszőleges számú karaktert. Így a megoldás:

SELECT nev FROM diakok WHERE szul_hely=”Szekszárd” AND nev LIKE “k*”;

A következő péda azért érdekes, mert dátumot is használunk benne. Vigyázat! A dátumot kettőskeresztek (#) között kell megadni, és amerikai formátumban (nap/hónap/év). Lássuk ezt a feladatot, egy adott időintervallumban Szekszárdon született tanulókat kérdezzük le.

SELECT nev FROM diakok
WHERE szul_hely=”Szekszárd”
AND szul_ido >= #18/11/2003#
AND szul_ido <=#24/06/2004#;

IS NULL, IS NOT NULL

Ha egy rekordban egy mezőnek nincs értéke, azaz üres, akkor ezzel az utasítással kérdezhetjük le.

SELECT mezo_nev FROM tabla_nev WHERE mezo_nev IS NULL;

Ha pedig nem üres:

SELECT mezo_nev FROM tabla_nev WHERE mezo_nev IS NOT NULL;

Ahhoz, hogy egy konkrét példát láthassunk, módosítottam a diakok táblát úgy, hogy telefonszámot adtam Sárosi Bélának, de email címet nem. Ugyanis az IS NULL és az IS NOT NULL szám típusú adatokra nem használható. A továbbiakban ezzel a megváltozott táblával dolgozunk. Kérdezzük le azt a tanulót, akinek nincs email címe:

SELECT nev FROM diakok WHERE email IS NULL;

Most pedig akiknek van email címe:

SELECT nev FROM diakok WHERE email IS NOT NULL;

OR (VAGY), AND (ÉS)

Segítségükkel össze tudunk kapcsolni feltételeket. Értelemszerűen ha feltételeket VAGY művelettel kapcsolunk össze, akkor elég, ha valamelyik teljesül. ÉS művelet esetén viszont minden feltételnek teljesülnie kell. Nézzünk ezekre is két egyszerű példát. Először az OR műveletre láthatunk egy megoldást. Kérdezzük le azokat a rekordokat, ahol a nevek “k” betűvel kezdődnek, vagy a születési hely Szekszárd:

SELECT * FROM diakok
WHERE nev LIKE “k*”
OR szul_hely=”Szekszárd”;

Most pedig kérdezzük le azokat a rekordokat, ahol a tanuló születési helye Szekszárd, és a tanuló keresztneve pedig “J” betűvel kezdődik.

SELECT * FROM diakok
WHERE szul_hely=”Szekszárd”
AND nev LIKE “* J*”;

IN

Megszűrhetjük, hogy egy mező értéke egy adott felsoroláshalmazba tartozik-e. Erre szolgál az IN művelet. Adjuk meg azokat a rekordokat, ahol a tanulók egy felsorolt városhalmaz valamelyikében születtek, például Pécs, Szekszárd legyen ez a halmaz.

SELECT * FROM diakok
WHERE szul_hely IN (“Szekszárd”, “Pécs”);

BETWEEN … AND

Akkor használjuk, ha egy intervallum alapján akarjuk szűkíteni a feltételt. A két szélső érték beletartozik az intervallumba! Kérdezzünk le most egy születési dátum tartományba lévő rekordokat:

SELECT * FROM diakok
WHERE szul_ido BETWEEN #25/06/2004# AND #19/04/2005#;

NOT

Egy feltétel tagadásakor azokat a rekordokat kapjuk vissza, amelyek nem egyenlők az adott feltétellel. Ilyenkor segít a NOT kulcsszó. Kérdezzük le azokat a tanulókat, akik nem Szekszárdon születtek:

SELECT * FROM diakok
WHERE NOT szul_hely=”Szekszárd”;

ORDER BY

Rendezni tudjuk az eredményhalmazt egy (vagy több) megadott mező alapján. Az utasítás általános alakja:

SELECT oszlop_nevek FROM tábla_neve ORDER BY oszlop_neve1, oszlop_neve2, …

A mi adatbázisunkban rendezzük sorba a tanulók neveit, majd ezen belül a születési hely szerint a diakok táblából. Az eredményben minden mezőt szeretnénk látni. A megoldás a következő:

SELECT * FROM diakok ORDER BY nev, szul_hely;

ORDER BY ASC, DESC

A rendezésnél megadhatjuk, hogy a mezőt növekvő, vagy csökkenő sorrendben szeretnénk megkapni. Ebben segít az ASC (növekvő), illetve a DESC (csökkenő) kulcsszó. Ha nem adjuk meg egyik kulcsszót sem, akkor növekvően rendez. Nézzük meg a név szerinti fordított rendezést:

SELECT * FROM diakok ORDER BY nev DESC;

Az alábbi példa azt mutatja, hogy két irányba rendezünk. Név szerint növekvőbe, születési hely szerint pedig csökkenőbe rendeztük a táblát (Kovács Évánál látható).

SELECT * FROM diakok ORDER BY nev ASC, szul_hely DESC;

TOP

Megadhatjuk, hogy hány rekordot szeretnénk látni a lekérdezésben, felülről számítva. Például az első 3 rekordot kapjuk vissza a következő példában:

SELECT TOP 3 * FROM diakok;

Megadhatjuk százalékban is a TOP értéket, ilyenkor a PERCENT kulcsszót kell a szám után odaírnunk. Ha a százalékszámítás eredménye átlép egy egész értéket, akkor már az új egész értéket veszi figyelembe. Mit is jelent ez? A mi példánknál maradva, a diakok táblában 7 rekord van. Ennek a 7 rekordnak a 29 %-a 2,03, a 42 %-a pedig 2,94. Így ebben a tartományban mindig 3 rekordot ad vissza a lekérdezés (azaz a százalék 28% és 43% között legyen, szigorúan közötte, tehát a két végpont nincs benne). A következő példában százalékban adtuk meg a TOP értéket:

SELECT TOP 37 PERCENT * FROM diakok;

AS (ALIAS)

Ha az eredménytáblában az eredeti oszlopnevek helyett más neveket szeretnénk látni, akkor használjuk az AS kulcsszót. Változtassuk meg a diakok táblában az összes oszlop (mező) megjelenését. Figyelem! Ahol az ALIAS név több szóból áll (van benne üres karakter), ott az új nevet szögletes zárójelek között kell beírni.

SELECT
azon AS Azonosító,
nev AS Név,
anyja_neve AS [Anyja neve],
szul_hely AS [Születési hely],
szul_ido AS [Születési idő],
telefon AS Telefonszám,
email AS [E-mail cím]
FROM diakok;

Számított mezők létrehozása

Úgy kell (célszerű) megtervezni egy adatbázist, hogy a táblákban ne tároljunk felesleges adatokat. Például olyan adatot, melyet a többi adatból ki lehet számolni, ne tároljunk! Erre szolgálnak a számított mezők. A Microsoft Access-ben nagyon sok beépített függvényt találunk, de saját számításokat is végezhetünk. Ezeket tekintjük át most, persze csak a gyakran használtakat. A következő linken láthatjuk a Microsoft Access összes függvényét: Link

Összesítő függvények

A lekérdezés eredményeként előálló táblák egyes oszlopaiban lévő értékeken végrehajthatunk bizonyos összesítő műveleteket, amelyek egyetlen értéket állítanak elő.

Ha összesítő függvény segítségével számítunk összeget, átlagot, darabszámot vagy más mennyiséget mezőértékein, az abban a mezőben Null értékeket tartalmazó rekordok nem számítanak bele az eredménybe. Ha például a Count függvénnyel számoljuk meg a mező értékeinek számát, ez a nem Null értékű rekordok számát adja vissza. Ha a Null értéket tartalmazókat is be szeretnénk venni az eredménybe, a Count függvényt csillag (*) helyettesítű karakterrel kell használni. Ha műveleti jel (például +, -, *, /) is szerepel a kifejezésben, és a kifejezés mezőinek egyike Null értéket tartalmaz, az egész kifejezés eredménye Null érték lesz. A következő összesítő függvényeket használhatjuk:

  • AVG() – átlag
  • SUM() – összeg
  • COUNT() – darabszám
  • MAX() – maximális érték
  • MIN() – minimális érték
  • FIRST() – első rekordból ad vissza mezőértéket
  • LAST() – utolsó rekordból ad vissza mezőértéket

Hogyan használhatjuk ezeket a függvényeket? Nézzük most meg. Kérdezzük le például az eredmenyek táblából a tantárgyak átlagát, és közben jelenítsük meg a tantárgyi átlagok barátságos neveit:

SELECT
AVG(magyar) AS [Magyar átlag],
AVG(tori) AS [Történelem átlag],
AVG(matek) AS [Matematika átlag],
AVG(angol) AS [Angol átlag],
AVG(info) AS [Informatika átlag],
AVG(tesi) AS [Testnevelés átlag]
FROM eredmenyek;

Kérdezzük le a legjobb, és a legrosszabb matematika jegyeket:

SELECT
MAX(matek) AS [Legjobb matematika jegy],
MIN(matek) AS [Legrosszabb matematika jegy]
FROM eredmenyek;

Kérdezzük le az első informatika jegyet:

SELECT
FIRST(info) AS [Az első informatika jegy]
FROM eredmenyek;

Kérdezzük le, hogy hány darab történelem jegy van:

SELECT
COUNT(tori) AS [Történelem jegyek száma]
FROM eredmenyek;

Végül adjuk össze a testnevelés jegyeket:

SELECT
SUM(tesi) AS [A testnevelés jegyek összege]
FROM eredmenyek;

GROUP BY

A megadott mezőlista azonos értékű rekordjait egyetlen rekordcsoporttá alakítja. Ha SQL összesítő függvényt adunk meg a SELECT utasításban, akkor minden rekordcsoporthoz létrejön összesítő érték. Szintaxisa:

SELECT mezőlista
FROM tábla
WHERE feltétel
GROUP BY mezőcsoportlista;

Kérdezzük le az eredmenyek táblából tanulónként csoportosítva a történelem tantárgy átlagát. Mivel két Kovács Éva szerepel a táblában, ezért a kettő átlagát kapjuk meg. Láthatjuk azt is, hogy minden csoporthoz (nevekhez) létrejött az összesítő érték (ebben a példában az átlag).

SELECT nev, AVG(tori) AS [Történelem átlagok]
FROM eredmenyek
GROUP BY nev;

Természetesen lekérdezhetünk több összesítő függvényt is. A következő példában ezt látjuk:

SELECT
nev,
SUM(tori) AS [Történelem jegyek összege],
AVG(tesi) AS [A testnevelés átlag]
FROM eredmenyek
GROUP BY nev;


Feltételekkel is szűkíthetjük az eredménytáblát. Csak az angol tantárgy hármasnál jobb rekordokat tekintjük:

SELECT
nev,
SUM(tori) AS [Történelem jegyek összege],
AVG(tesi) AS [A testnevelés átlag]
FROM eredmenyek
WHERE angol>3
GROUP BY nev;

HAVING

Megadja, hogy mely csoportosított rekordok jelennek meg egy GROUP BY záradékot tartalmazó SELECT utasítás végrehajtásakor. Miután a GROUP BY csoportosította a rekordokat, a HAVING megjeleníti a GROUP BY záradékkal csoportosított összes olyan rekordot, amely eleget tesz a HAVING záradék feltételeinek.

A HAVING hasonló a WHERE záradékhoz, de a WHERE a csoportképzés előtt, az egyes rekordokat szűri, a HAVING pedig a csoportképzés után, a csoportokra érvényesít szűrőfeltételt. Miután a rekordokat a GROUP BY záradékkal csoportosítottuk, a HAVING záradékkal megadhatjuk, hogy mely rekordok jelenjenek meg. Szintaxisa:

SELECT mezőlista
FROM tábla
WHERE feltétel
GROUP BY csoportmezőlista
HAVING csoportokra vonatkozó feltétel;

Nézzünk erre is egy példát. Kérdezzük le azokat a rekordokat, ahol a testnevelés átlaga kisebb, mint 5, és közben kiszámoltuk a történelem jegyek összegét, illetve csoportosítottunk a nevek szerint:

SELECT
nev,
SUM(tori) AS [Történelem jegyek összege],
AVG(tesi) AS [A testnevelés átlag]
FROM eredmenyek
GROUP BY nev
HAVING AVG(tesi)<5;

Táblák összekapcsolása

Az adatbáziskezelés leggyakrabban használt műveletei között mindenképpen meg kell említeni az összekapcsolás műveletét is. E művelet fontosságának egyik legfőbb oka az, hogy az adatbázis tervezése során, a normalizálással az információkat több táblára bontjuk szét. Egy összetettebb lekérdezéshez szükséges információk több táblában szétszórva helyezkednek el, így a lekérdezés során össze kell gyűjteni ezen adatokat a különböző táblákból, ahol az összetartozás bizonyos mezők értékeinek kapcsolatán alapszik. Azt a folyamatot, amikor több táblából származó adatokból állítunk elő egy újabb eredménytáblázatot, összekapcsolásnak, egyesítésnek vagy join-nak nevezzük.

DESCARTES SZORZAT

Az SQL-ben két táblázat egyesítésének legegyszerűbb formája, amikor a két táblázat Descartes szorzatát képezzük, mely során az eredménytáblázat egy rekordja úgy áll elı, hogy az egyik táblázat rekordjaihoz hozzáfűzzük a másik táblázat egy-egy rekordját, ahol az eredménytáblázat minden lehetséges párosítást tartalmaz. Ha tehát az egyik táblázat 3 rekordot tartalmaz, a másik 4-et, akkor az eredmény 12 rekordból áll. Két táblázat Descartes szorzatának előállításához a következő SQL utasítást kell kiadni:

SELECT * FROM táblázatnév1, táblázatnév2;

Az így előálló egyesítéstáblázatot ezután tetszőlegesen tovább lehet alakítani a már megismert záradékokkal. Erre rendszerint szükség is van, hiszen csak nagyon ritkán van szükség két táblázat rekordjainak teljes Descartes szorzatára, legtöbbször csak a Descartes szorzat bizonyos részhalmazára van szükségünk. Tekintsük most a mi adatbázisunkban lévő két tábla Descartes szorzatát (a kép kinagyítható):

SELECT * FROM diakok, eredmenyek;

A diakok táblában 7 oszlop van, míg az eredmenyek táblában 8. Mindkét tábla 7 sort tartalmaz. Ha megnézzük a Descartes szorzat táblát, láthatjuk, hogy ebben 15 oszlop van (7 + 8). Azt is észrevehetjük, hogy itt a 7 rekord hétszer ismétlődik, azaz 7×7=49 rekordot tartalmaz.

JOIN

Persze legtöbbször nem szeretnénk ennyi mezőt és rekordot látni, ezért szűrőfeltételeket adhatunk meg. Mivel két táblából szeretnénk lekérdezni rekordokat, fontos, hogy kapcsoljuk össze a táblákat. Erre legtöbbször a kulcsmezők (lásd előző adatbázis-kezelési ismereteink) alkalmasak. Most kérdezzük le a tanulók nevét, telefonszámukat és a magyar jegyeiket. Ehhez mindkét tábla kell. Mivel van bennük egyértelmű azonosító (azon), ezeket kapcsoljuk össze (egyenlővé tesszük őket). Azt is láthatjuk, hogy most két táblából használtunk mezőket, így először meg kell adni a tábla nevét, ami tartalmazza, majd egy pont beírása után jöhet a mező neve (pl. diakok.nev)

SELECT
diakok.nev AS [A tanuló neve],
diakok.telefon AS [Telefonszám],
eredmenyek.magyar AS [Magyar tantárgy osztályzata]
FROM diakok, eredmenyek
WHERE diakok.azon=eredmenyek.azon;

INNER JOIN

Az INNER JOIN használatával a lekérdezés eredményébe nem kerülnek bele azon tábla1-beli elemek, amelyeknek nincs megfelelıjük a tábla2 táblában. Az INNER JOIN használata annyiban jobb a táblák WHERE záradékon keresztül történő kapcsolásánál, hogy így külön helyen szerepelnek a kapcsolatokat leíró feltételek és a lekérdezés eredményét szűkítő feltételek, és ezáltal a lekérdezés SQL kódja áttekinthetőbb lesz. Ahhoz, hogy megfigyeljük pontosan az INTER JOIN hatását, egy kicsit átalakítottam a táblákat. Először is az eredmények táblában is létrehoztam az email mezőt, majd Jakab Zsuzsa és Sárosi Béla email címét eltávolítottam az eredmenyek táblából.

Kapcsoljuk össze most a két táblát INNER JOIN-nal úgy, hogy a diakok táblából minden rekordot kiválasztunk és a kapcsolást az email mezőkön keresztül oldjuk meg! Mivel két tanulónál nincs email cím az eredmenyek táblában (ez a második tábla), ezért az összekapcsolás után ezek a rekordok nem jelennek meg a lekérdezésben (hiába vannak benne a diakok táblában, a kép kinagyítható).

SELECT * FROM diakok INNER JOIN eredmenyek ON diakok.email=eredmenyek.email;

LEFT JOIN

Arra is van lehetőségünk, hogy az első tábla minden adatát megjelenítsük az eredményben, attól függetlenül, hogy nincs a feltételben megadott tulajdonságú mező a második táblában. Ekkor a LEFT JOIN kulcsszót kell használni. Az előző feladatot nézzük meg most LEFT JOIN-nal. Egyből látszik, hogy most az összekapcsolásban benna van az a két rekord is, amelyeknek nincs megfelelője az eredmenyek táblában (a kép kinagyítható)!

SELECT * FROM diakok LEFT JOIN eredmenyek ON diakok.email=eredmenyek.email;

RIGHT JOIN

A RIGHT JOIN pedig pont azt teszi lehetővé, hogy a második táblában lévő összes adatot jelenítsük meg, függetlenül attól, hogy az első táblában van-e hozzátartozó mező. Tekintsük ugyanazt a feladatot, amit az előzőekben, és az eredmény most más lesz. Az eredmenyek tábla minden elem megjelenik (a kép kinagyítható).

SELECT * FROM diakok RIGHT JOIN eredmenyek ON diakok.email=eredmenyek.email;

Önillesztés

Bizonyos esetekben előfordul, hogy egy táblát önmagához kell kapcsolnunk. Például, ha diakok táblából osztálytárs párokat akarunk kiíratni. Ekkor a diakok táblát önmagához kell kapcsolnunk (illesztenünk). Mivel ilyenkor ugyanaz a tábla két „példányban” is szerepel a lekérdezésben, ezért a táblához két álnevet is kell rendelnünk. Ismét módosítottam a diakok táblán, felvettem benne egy osztaly nevű mezőt, és feltöltöttem adatokkal. Így már megoldható az előbb leírt önillesztés. A diakok tábla tehát most így néz ki:

Az eredmény, azaz a tanulópárok osztályonként pedig itt látható:

Beágyazott lekérdezés

Néha szükségünk van arra, hogy egy lekérdezés WHERE feltételében (záradékában) egy újabb lekérdezést kell megvalósítanunk. Ehhez most egy másik adatbázist fogok használni, a labdarúgó világbajnokság eredményeit tartalmazza 1930 és 2002 között (beleértve ezeket az éveket is). Ebben két tábla van, egy csapat és egy helyszin nevű tábla. Az adatbázis innen letölthető: Link

A csapat tábla (a képen nem látszik minden rekord)

A helyszin tábla (itt minden rekord látható)

A feladat az, hogy kérdezzük le, mely csapatok voltak másodikak akkor, amikor Brazília első lett. A probléma az, hogy nem tudjuk, Brazília mely években lett első! Ehhez lesz szükségünk egy beágyazott lekérdezésre, amit a fő lekérdezés WHERE záradékában kell elhelyezni. Az eredményben a második helyezett csapatok nevét és a világbajnokság évét szeretnénk látni, az év szerint növekvő sorrendben. A megoldást itt láthatjuk:

SELECT Csapat, Ev FROM csapat
WHERE Helyezes=2 AND Ev IN (SELECT EV FROM csapat WHERE Csapat = “Brazília” AND Helyezes = 1)
ORDER BY Ev ASC;

INTO

Ez az utasítás a lekérdezés eredményéből egy új táblát hoz létre. Az Access szóhasználatában táblakészítő lekérdezést hoz létre.

Szintaxis:
SELECT mező1, mező2, … INTO új tábla
FROM forrás

  • mező1, mező2, … –> a másolandó mezők nevei
  • új tábla –> a létrehozandó tábla neve
  • forrás –> annak a már meglévő táblának a neve, amelybő a rekordokat kiválasztjuk. A forrás lehet egy vagy több tábla, illetve lekérdezés.

Most használjuk ismét az iskola adatbázisunkat, és a diakok táblát felhasználva készítsünk egy új táblát a nev, anyja_neve és a szul_hely mezők másolásával (közben átneveztük őket, illetve sorba rendeztük a neveket). A megoldás:

SELECT nev AS [A tanuló neve], anyja_neve AS [Anyja neve], szul_hely AS [Születési helye]
INTO diakok_2
FROM diakok
ORDER BY nev ASC;

Több táblából is választhatunk mezőket, melyek bekerülnek az új táblába. Nézzünk erre is példát, a tanulók matematika jegyeit is láthatjuk az új táblában:

SELECT diakok.nev, diakok.anyja_neve, diakok.szul_hely, eredmenyek.matek INTO diakok_2
FROM diakok INNER JOIN eredmenyek
ON diakok.azon = eredmenyek.azon;

INSERT INTO

Segítségével egy táblába új rekordokat tudunk beilleszteni.
Sintaxis:

INSERT INTO tábla_neve (oszlop_neve1, oszlop_neve2, ..) VALUES (érték1, érték2, …);

Ha minden mezőbe (oszlopba) írunk adatokat, akkor elég csak a tábla nevét megadni.
Szintaxis:

INSERT INTO tábla_neve VALUES (érték1, érték2, …);

Egészítsük ki a diakok táblát egy új rekorddal (ne felejtsük el, hogy a szövegeket idézőjelek közé kell tenni, illetve a dátumokat pedig amerikai formátumba, és kettős keresztek között adjuk meg):

INSERT INTO diakok
VALUES (“t08”, “Molnár Péter”, “Nagy Éva”, “Pécs”, #20/09/2004#, 701123456, “petermolnar@freemail.com”, “9.a”);

Ha nem tudjuk például egy diák minden adatát, akkor csak bizonyos mezőket adunk meg. Lássuk ezt is:

INSERT INTO diakok (azon, nev, szul_ido) VALUES (“t10”, “Kiss Tibor”, #03/07/2003#);

Arra is lehetőség van, hogy rekordot (vagy rekordokat) egy másik táblából illesszünk be. A másik tábla szerkezetének, és oszlopneveinek meg kell egyezni az első táblájéval. Vigyázzunk arra is, hogy ha van kulcsmező, akkor ugyanolyan nevű kulcsmező nem lehet a táblába!. Az eredmenyek táblában megváltoztattam az azon mező (kulcsmező) értékeit. Lássuk tehát ezt a megoldást is:
Az eredeti táblák tehát a következők: