függő táblázat
Most bonyolítsuk egy kicsit a kérdéseinket. Adjunk hozzá egy új feladattáblázatot az adatbázisunkhoz a munkatársaink feladataival. És lássuk, milyen bejegyzéseket tartalmaz:
SELECT * FROM task
Egy ilyen kérés eredménye:
id | employee_id | név | határidő |
---|---|---|---|
1 | 1 | Javítson ki egy hibát a kezelőfelületen | 2022-06-01 |
2 | 2 | Javítson ki egy hibát a háttérben | 2022-06-15 |
3 | 5 | Vegyél kávét | 2022-07-01 |
4 | 5 | Vegyél kávét | 2022-08-01 |
5 | 5 | Kávét fog venni | 2022-09-01 |
6 | (NULLA) | Takarítsd ki az irodát | (NULLA) |
7 | 4 | Élvezd az életet | (NULLA) |
8 | 6 | Élvezd az életet | (NULLA) |
Ez a táblázat csak 4 oszlopot tartalmaz:
- id – egyedi feladatszám (és a táblázat sorai);
- munkavállaló_azonosítója — annak az alkalmazottnak az azonosítója az alkalmazotti táblából, akihez a feladat hozzá van rendelve;
- név – a feladat neve és leírása;
- határidő - az az idő, ameddig a feladatot el kell végezni.
Ügyeljen néhány árnyalatra. Az N6 feladatnak nincs munkavállalói azonosítója, nincs takarítónk. A feladat megvan, de az előadó nem. Megtörténik.
Továbbá a 6-9. feladatoknak nincs kitűzött határideje. Ez akkor fordul elő, ha egy feladatot rendszeresen és folyamatosan kell elvégezni. Például az irodát minden nap takarítani kell, de minden nap élvezni is kell az életet :)
Ha egy tábla egy másik táblából származó azonosítókat használ, akkor egy ilyen táblát függőnek nevezünk .
Több tábla lekérdezése
Itt látjuk a feladattáblázatban, hogy két feladat van „Az élet élvezete”. Honnan tudhatjuk, kik ezek a szerencsések?
Ehhez SQL-ben egyszerre két táblán hajthatunk végre egy lekérdezést. Általánosságban elmondható, hogy SQL-ben tetszőleges számú tábla lekérdezhető egyszerre. Az ilyen kérés általános formátuma:
SELECT columns
FROM Table 1, table 2, tableN
Fontos! Ha egyszerre több táblába ír le egy lekérdezést, akkor ennek eredményeként a táblázatsorok ún. Descartes-szorzatát kapjuk. Az első táblázat minden sora hozzá lesz ragasztva a második táblázat minden sorához, és így tovább.
Vagyis ha az első táblázatban 5 sor, a másodikban 10 sor van, akkor összesen 50 sora lesz. Java nyelven ez a lekérdezés valahogy így nézne ki:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Írjuk le a lekérdezést egyszerre két táblába, és nézzük meg, mi történik:
SELECT * FROM employee, task
És ennek a lekérdezésnek az eredménye:
id | név | Foglalkozása | fizetés | kor | id | alkalmazott | _id | név | határidő |
---|---|---|---|---|---|---|---|---|---|
1 | Ivanov Iván | Programozó | 100 000 | 25 | 1 | 1 | Javítson ki egy hibát a kezelőfelületen | 2022-06-01 | |
2 | Petrov Petr | Programozó | 80000 | 23 | 1 | 1 | Javítson ki egy hibát a kezelőfelületen | 2022-06-01 | |
3 | Ivanov Szergej | Vizsgáló | 40000 | harminc | 1 | 1 | Javítson ki egy hibát a kezelőfelületen | 2022-06-01 | |
4 | Rabinovics Moisa | Rendező | 200 000 | 35 | 1 | 1 | Javítson ki egy hibát a kezelőfelületen | 2022-06-01 | |
5 | Kirienko Anasztázia | Irodavezető | 40000 | 25 | 1 | 1 | Javítson ki egy hibát a kezelőfelületen | 2022-06-01 | |
6 | Vaska | macska | 1000 | 3 | 1 | 1 | Javítson ki egy hibát a kezelőfelületen | 2022-06-01 | |
1 | Ivanov Iván | Programozó | 100 000 | 25 | 2 | 2 | Javítson ki egy hibát a háttérben | 2022-06-15 | |
2 | Petrov Petr | Programozó | 80000 | 23 | 2 | 2 | Javítson ki egy hibát a háttérben | 2022-06-15 | |
3 | Ivanov Szergej | Vizsgáló | 40000 | harminc | 2 | 2 | Javítson ki egy hibát a háttérben | 2022-06-15 | |
4 | Rabinovics Moisa | Rendező | 200 000 | 35 | 2 | 2 | Javítson ki egy hibát a háttérben | 2022-06-15 | |
5 | Kirienko Anasztázia | Irodavezető | 40000 | 25 | 2 | 2 | Javítson ki egy hibát a háttérben | 2022-06-15 |
Összesen 48 eredménysorunk van, de itt csak 11-et adtam meg. Ellenkező esetben egyszerűen nem lesz elég hely.
Három dologra figyelj:
- Azonos nevű oszlopok: id . Ez az azonosító az alkalmazotti táblából és az azonosító a feladattáblából .
- Az egyes táblázatok sorai ismétlődnek. A bal oldali oszlopban a 6. azonosítót ismét ID = 1 követi.
- Vannak értelmetlen soraink, ahol például az id (az alkalmazotti táblából) 6, és ugyanabban a sorban az alkalmazott_id 1.
Értelmetlen sorok eltávolítása
Túl sok sor van az eredményül kapott táblánkban, amely az alkalmazott és a feladat két tábla összes sorának derékszögű szorzata.
Logikusan, ha az alkalmazotti_id sor 3, akkor csak az alkalmazotti tábla azon sorához kell ragaszkodnia, ahol az id 3. Próbáljuk meg kijavítani ezt a félreértést a WHERE-rel.
Írjunk egy ilyen lekérdezést:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
És ennek a lekérdezésnek az eredménye:
id | név | Foglalkozása | fizetés | kor | id | employee_id | név | határidő |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Iván | Programozó | 100 000 | 25 | 1 | 1 | Javítson ki egy hibát a kezelőfelületen | 2022-06-01 |
2 | Petrov Petr | Programozó | 80000 | 23 | 2 | 2 | Javítson ki egy hibát a háttérben | 2022-06-15 |
4 | Rabinovics Moisa | Rendező | 200 000 | 35 | 7 | 4 | Élvezd az életet | (NULLA) |
5 | Kirienko Anasztázia | Irodavezető | 40000 | 25 | 3 | 5 | Vegyél kávét | 2022-07-01 |
5 | Kirienko Anasztázia | Irodavezető | 40000 | 25 | 4 | 5 | Vegyél kávét | 2022-08-01 |
5 | Kirienko Anasztázia | Irodavezető | 40000 | 25 | 5 | 5 | Kávét fog venni | 2022-09-01 |
6 | Vaska | macska | 1000 | 3 | 8 | 6 | Élvezd az életet | (NULLA) |
A jó hír az, hogy az értelmetlen sorok eltűntek: az első oszlop azonosítója mindig egyenlő a munkavállalói_azonosítóval.
A rossz hír az, hogy a senkire nem kiosztott feladatok – például az iroda takarítása – megszűntek. Alkalmazotti azonosítójuk NULL volt, így a WHERE elvégzése után eldobták őket.
GO TO FULL VERSION