Fő tartalom
Programozás
Tantárgy/kurzus: Programozás > 3. témakör
3. lecke: Relációs lekérdezések SQL-ben- Adatok felosztása kapcsolódó táblákra
- Kapcsolódó táblák összekapcsolása JOIN-nal
- Feladat: Bobby hobbijai
- Kapcsolódó táblák összekapcsolása baloldali külső összekapcsolással (LEFT OUTER JOIN)
- Feladat: Ügyfelek megrendelései
- Táblák önmagukkal való összekapcsolása „self-join”-nal
- Feladat: Filmek SQL-ben
- Többszörös összekapcsolások kombinálása
- Feladat: BarátKönyv
- Projekt: Híres emberek
- Hatékonyabb SQL, lekérdezések tervezésével és optimalizálásával
© 2023 Khan AcademyFelhasználási feltételekAdatkezelési tájékoztatóSüti figyelmeztetés
Adatok felosztása kapcsolódó táblákra
Ezidáig egyszerre csak egy táblán dolgoztunk és ezen néztük meg, hogy milyen érdekes adatokat tudunk kiválasztani. Azonban legtöbbször az adataink több különböző táblába vannak szétosztva, és ezek a táblák valamilyen módon „kapcsolódnak” egymáshoz.
Mondjuk például, hogy van egy táblánk, amiben a diákok dolgozatainak eredményeit naplózzuk, és eltároljuk e-mail címüket arra az esetre, ha romlanának a jegyeik, és ezt jelezni szeretnénk szüleiknek.
student_name | student_email | test | grade |
---|---|---|---|
Peter Rabbit | peter@rabbit.com | Nutrition | 95 |
Alice Wonderland | alice@wonderland.com | Nutrition | 92 |
Peter Rabbit | peter@rabbit.com | Chemistry | 85 |
Alice Wonderland | alice@wonderland.com | Chemistry | 95 |
Lehet még egy olyan táblánk is, amiben az tároljuk, hogy a diákok milyen könyveket olvasnak:
student_name | book_title | book_author |
---|---|---|
Peter Rabbit | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
Peter Rabbit | Jabberwocky | Lewis Carroll |
Alice Wonderland | The Hunting of the Snark | Lewis Carroll |
Alice Wonderland | Jabberwocky | Lewis Carroll |
Lehet esetleg egy olyan táblánk is, melyben részletes információkat tárolunk a diákokról:
id | student_first | student_last | student_email | phone | birthday |
---|---|---|---|---|---|
1 | Peter | Rabbit | peter@rabbit.com | 555-6666 | 2001-05-10 |
2 | Alice | Wonderland | alice@wonderland.com | 555-4444 | 2001-04-02 |
Mit gondolsz ezekről a táblákról? Változtatnál rajtuk valamilyen módon?
Egy fontos dolgot kell megérteni ezen táblák kapcsán: relációs adatokat írnak le, vagyis az általuk leírt adatok kapcsolódnak egymáshoz. Mindegyik tábla bizonyos diákokról tartalmaz adatot, és több táblában előfordul ugyanannak az adatnak a másolata. Érdekes következményekkel járhat, ha ugyanaz az adat szerepel több táblában is.
Például mi történik, ha egy diák email címe megváltozik? Melyik táblát kellene módosítani?
Meg kellene változtatnunk a címet a diákok információs táblájában, de mivel ezt az adatot a dolgozateredményeiknél is tároltuk, ott meg kellene keresnünk minden sort a diákról, és ezekben a sorokban is meg kellene változtatnunk az email címet.
Gyakran az a legjobb, ha egy adott adatot csak egy helyen tárolunk, így csak néhány helyen kell frissíteni, és kisebb a kockázata, hogy különböző adatot tárolunk különböző helyeken. Ha így csinálod, akkor győződj meg róla, hogy valahogy össze tudod kapcsolni az adatot a táblákon keresztül. Ennek módjára a későbbiekben fogunk visszatérni.
Mondjuk, hogy úgy döntünk, kitöröljük az email címeket a dolgozateredmények táblából, mert rájövünk, hogy redundáns, hiszen ez szerepel a diákok részletes információs táblájában is. Ezt kapjuk:
student_name | test | grade |
---|---|---|
Peter Rabbit | Nutrition | 95 |
Alice Wonderland | Nutrition | 92 |
Peter Rabbit | Chemistry | 85 |
Alice Wonderland | Chemistry | 95 |
Hogyan deríthetjük ki egy diák email címét? Megkereshetjük a diák sorát az információs táblában a megfelelő névilleszkedéssel. De mi történik, ha 2 diáknak ugyanaz a neve? (Tudtad, hogy Bali szigetén összesen négy keresztnévből lehet választani?) Nem alapozhatunk arra, hogy név alapján megtaláljuk a megfelelő diákot, és általában se számíts arra, hogy név vagy hasonló attribútum alapján lévő keresés pontosan kihozzon egy-egy eredményt egy táblában.
Így a legjobban akkor jársz, ha eltávolítod a diák nevét (
student_name
) és helyettesíted egy diák azonosítóval (student_id
), ami garantáltan egyedi azonosítást tesz lehetővé:student_id | test | grade |
---|---|---|
1 | Nutrition | 95 |
2 | Nutrition | 92 |
1 | Chemistry | 85 |
2 | Chemistry | 95 |
Ugyanezt a változtatást kell elvégezni a könyves táblán,
student_id
-t (a diák azonosítóját) használva a student_name
(a diák neve) helyett:student_id | book_title | book_author |
---|---|---|
1 | Tüskés néni kalandjai | Beatrix Potter |
1 | Jabberwocky | Lewis Carroll |
2 | Gubancmese | Lewis Carroll |
2 | Jabberwocky | Lewis Carroll |
Észrevetted, hogy az egyik könyvnek a szerzője és a címe is kétszer szerepel? Ez is figyelmeztető jel arra, hogy jobb lenne ezt a táblánkat több kapcsolódó táblára szétbontani, így ha valami változna egy könyv kapcsán, nem kell majd több helyen frissíteni az adatokat.
Lehet egy táblánk csak a könyvekről:
id | book_title | book_author |
---|---|---|
1 | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
2 | Jabberwocky | Lewis Carroll |
3 | The Hunting of the Snark | Lewis Carroll |
És akkor a diákok könyves táblája (
students_books
) így fog kinézni:student_id | book_id |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
2 | 2 |
Tudom, hogy ez a tábla nem olyan könnyen olvasható, mint a korábbi, ami minden információt tartalmazott minden sorban. De a táblákat általában nem úgy tervezik, hogy emberek számára olvashatóak legyenek – hanem úgy, hogy a legegyszerűbb legyen karbantartani, és legkevésbé legyenek hibákra hajlamosak. Sok esetben az a legjobb megoldás, ha az információt több kapcsolódó táblára bontjuk, így kevesebb redundáns adatunk lesz, és kevesebb helyen kell frissíteni.
Fontos megérteni, hogyan használható az SQL arra, hogy a több kapcsolódó táblára bontott adatot kezeljük, és hogyan nyerjük ki a táblák összekapcsolásával, a számunkra szükséges adatokat. Erre az ún. összekapcsolásokat (angolul „join”-okat) használjuk, amiről a továbbiakban lesz szó.
Szeretnél részt venni a beszélgetésben?
- ¿Recibiste la dirección?(1 szavazat)