A SELECT… FROM … kifejezés
Ha hozzá szeretnénk férni az adatbázisunkban szereplő adatokhoz, például keresni szeretnénk közöttük információkat, akkor az SQL nyelv SELECT ... FROM kulcsszavait használjuk. A lekérdezések felépítése általában az alábbi:
SELECT mezőnevek FROM tábla
A SELECT kulcsszó után felsoroljuk, hogy melyik mezők tartalmát szeretnénk megkapni (később a különféle összesítő függvényeket és számolásokat is itt fogjuk majd végezni - több adat esetén ezeket vesszővel választjuk el. A lekérdezés eredményében a mezők abban a sorrendben fognak megjelenni, ahogy itt felsoroltuk őket.
A FROM kulcsszó után pedig annak a táblának (vagy később akár tábláknak) a nevét kell felsorolnunk, amelyből információt szeretnénk kinyerni.
Ha tehát például a nepesseg táblából vagyunk kíváncsiak a települések nevére, valamint a települések lakosságára, akkor az SQL lekérdezésünk valahogy így nézne ki:
SELECT telepules_nev, lakossag FROM nepesseg
Amennyiben a mezők nevében nincs semmilyen speciális karakter, és minden mezőnév csak egyértelmű (azaz nincs a lekérdezésben több olyan tábla, amikben azonos nevű mezők vannak), akkor a mezők nevét elég a fentebb látható minta szerint felsorolni. Vannak azonban más lehetőségek is a mezőnév megadására:
- `táblanév`.`mezőnév`: a legpontosabb módja a mezők nevének megadásának – tartalmazza a tábla nevét, és tartalmazza a mező nevét is, így akkor is tökéletesen működik, ha több táblában is van azonos nevű mező, és mind a táblanév, mind pedig a mezőnév körül van véve az ún. back quote karakterrel (AltGr+7), ezzel jelölve, hogy itt most objektumok nevei szerepelnek, így garantáltan nem okoznak gondot az ékezetes karakterek, a szóközök, stb. (bár ezek használatát ennek ellenére sem javasoljuk mezőnevekben és táblanevekben)Ne feledd!A különféle adatbáziskezelő programok más-más jelöléseket használnak az objektumnevekre. Míg a MySQL-ben a back quote jelöli őket, addig az Access-ben szögletes zárójelek [], a PostgreSQL-ben, MS SQL-ben és Presto SQL-ben pedig sima idézőjel.
- táblanév.mezőnév: ha sem a tábla neve, sem a mező neve nem tartalmaz speciális karaktereket, vagy kulcsszavakat, akkor a back quote karakterek elhagyhatók
- `mezőnév`: ha az adott névvel mező csak a lekérdezés egyik táblájában szerepel (vagy eleve csak egy táblából kérdezünk le), a tábla neve elhagyható
- mezőnév: ha a mező neve nem tartalmaz speciális karaktert vagy kulcsszót, akkor persze itt is elhagyhatjuk a back quote karaktereket
- táblanév.* vagy `táblanév`.*: egy adott tábla összes mezője
- *: a lekérdezésben szereplő összes tábla összes mezője
- egyszerű mezők mellett műveleteket, összesítő függvényeket, stb. is használhatunk a SELECT kifejezésben, de ezekről a saját cikkeikben találsz majd információt
Nézzünk néhány példát:
SELECT `nev` FROM `diak`
Lekéri a diak nevű táblából az összes rekordot, és ezekből megjeleníti csak a nev mezőt, azaz kilistázza a diákok neveit. (kipróbálom)
SELECT `iskola`, `kodjel` FROM `nevezo`Lekéri a nevezo táblából az összes rekordot, és ezekből megjeleníti csak az iskola és a kodjel mezőket. (kipróbálom)
SELECT * FROM `fordulo`Lekéri a fordulo táblából az összes adatot. (kipróbálom)
Próbáld ki!
A fentebbi minták mind olyan táblákra hivatkoznak, amik léteznek az info9 MySQL homokozóban – így könnyedén kipróbálhatod, átírhatod, tesztelheted, boncolgathatod őket! Kattints a példák alatti kipróbálom gombra, vagy másold be őket a homokozóba, és próbáld meg átalakítani őket! Íme néhány ötlet, amit elkészíthetsz belőlük:
- Módosítsd az első lekérdezést úgy, hogy ne csak a nev, hanem az osztaly mező is megjelenjen benne!
- Módosítsd a második lekérdezést úgy, hogy az iskola és a kodjel helyett a kodjel és a kategoria mezők jelenjenek meg!
- Kérdezd le az összes mező tartalmát a tantargy táblából!
- Jelenítsd meg csak a nevado mező tartalmát a fordulo táblából!
Mezők átkeresztelése
Bonyolultabb lekérdezések esetén előfordul, hogy egy-egy mezőnek az átláthatóság érdekében más nevet ("becenevet", vagy "álnevet") szeretnénk adni egy lekérdezésen belül. Ezt könnyedén megtehetjük az AS kulcsszó használatával, például az alábbi módon:
SELECT `nev` AS "Tanuló" FROM `diak`
Ha a lekérdezésünkben több mezőt is el szeretnénk nevezni, mindegyiknél külön kell használnunk az AS kulcsszót:
SELECT `iskola` AS "Suli", `kodjel` AS "Kódjel" FROM `nevezo`
Persze olyan is előfordulhat, hogy több mező közül csak egyet nevezünk el, ennek sincs akadálya:
SELECT `nevado` AS "Névadó", `hatarido` FROM `fordulo`Próbáld ki a lekérdezéseket a homokozóban, és figyeld meg, ahogy az AS kulcsszó használata miatt megváltozik a kimeneten a mezők elnevezése. Próbálj meg módosítani a lekérdezésen, hogy láthasd, mi változik meg a kimenetben!
Csak egyedi rekordok megjelenítése
Komplexebb lekérdezések esetén előfordulhat, hogy több, tartalmilag teljesen megegyező rekord kerül megjelenítésre. Például, ha a diákoknak csak az osztályát kérjük le, minden osztály annyiszor fog megjelenni, ahány diák rögzítve van az adott osztályból. Ha minden eredményt csak egyszer szeretnénk megjeleníteni, a SELECT után használhatjuk a DISTINCT kulcsszót:
SELECT DISTINCT `osztaly` FROM `diak`
Ez a lekérdezés a DISTINCT kulcsszó miatt minden osztályt csak egyszer fog megjeleníteni! (kipróbálom)
SELECT osztaly, tanar FROM diakok¤3¤A lekérdezésben szereplő táblákat a FROM kulcsszó után találjuk, a válasz tehát a diakok tábla.¤osztaly¤tanar¤diakok¤osztaly és tanar radio¤Ha szeretnénk, hogy a lekérdezés eredményében a nepesseg nevű mező Lakosságszám néven jelenjen meg, melyik kulcsszót kell alkalmaznunk a mező átnevezéséhez?¤2¤Mezők megjelenési nevét az AS kulcsszóval módosíthatjuk: SELECT nepesseg AS "Lakosságszám" FROM ...¤SELECT¤AS¤DISTINCT¤WHERE radio¤Hány mező fog megjelenni az alábbi lekérdezés eredményében?
SELECT nev, tagozat, evfolyam FROM diakok¤3¤Mivel 3 mezőt soroltunk fel a SELECT után, így ennyi mező is jelenne meg a kimeneten.¤1¤2¤3¤4 radio¤Adott az alábbi lekérdezés:
SELECT telepules FROM lakcimek
Melyik kulcsszóval kell kiegészítenünk ezt a lekérdezést, hogy minden település neve csak egyszer jelenjen meg - akkor is, ha a táblában több rekordban is szerepel?¤4¤Ahhoz, hogy csak egyedi rekordok jelenjenek meg, mindig a DISTINCT kulcsszót használjuk.¤AS¤UNIQUE¤PRIMARY¤DISTINCT