bağımlı tablo
Şimdi sorgularımızı biraz karmaşıklaştıralım. Veritabanımıza çalışanlarımız için görevler içeren yeni bir görev tablosu ekleyelim. Ve hangi girişleri içerdiğini görelim:
SELECT * FROM task
Böyle bir talebin sonucu:
İD | çalışan kimliği | isim | son teslim tarihi |
---|---|---|---|
1 | 1 | Ön uçtaki bir hatayı düzeltin | 2022-06-01 |
2 | 2 | Arka uçtaki bir hatayı düzeltin | 2022-06-15 |
3 | 5 | kahve satın al | 2022-07-01 |
4 | 5 | kahve satın al | 2022-08-01 |
5 | 5 | kahve alacak | 2022-09-01 |
6 | (HÜKÜMSÜZ) | ofisi temizle | (HÜKÜMSÜZ) |
7 | 4 | Hayatın tadını çıkar | (HÜKÜMSÜZ) |
8 | 6 | Hayatın tadını çıkar | (HÜKÜMSÜZ) |
Bu tabloda yalnızca 4 sütun vardır:
- id — benzersiz görev numarası (ve tablodaki satırlar);
- çalışan_kimliği — görevin atandığı çalışan tablosundaki çalışanın kimliği;
- isim - görevin adı ve açıklaması;
- son tarih - görevin tamamlanması gereken süre.
Birkaç nüansa dikkat edin. Görev N6'da bir çalışan_kimliği yok, bir temizleyicimiz yok. Görev orada ama icracı yok. Olur.
Ayrıca, 6-9 görevlerinin belirlenmiş bir son tarihi yoktur. Bu, bir görevin düzenli ve sürekli olarak yapılması gerektiğinde gerçekleşir. Örneğin ofisin her gün temizlenmesi gerekiyor ama sizin de her gün hayattan keyif almanız gerekiyor :)
Bir tablo başka bir tablonun kimliklerini kullanıyorsa, böyle bir tabloya bağımlı tablo denir .
Birden çok tabloya karşı sorgulama
Burada görev tablosunda “Hayattan zevk almak” olmak üzere iki görev olduğunu görüyoruz. Bu şanslıların kim olduğunu nasıl bilebiliriz?
Bunu yapmak için, SQL'de aynı anda iki tablo üzerinde bir sorgu yürütebilirsiniz. Genel olarak, SQL'de aynı anda istediğiniz sayıda tabloyu sorgulayabilirsiniz. Böyle bir talebin genel formatı şöyledir:
SELECT columns
FROM Table 1, table 2, tableN
Önemli! Aynı anda birkaç tabloya bir sorgu yazarsanız, sonuç olarak tablo satırlarının Kartezyen çarpımını alırsınız . İlk tablodaki her satır, ikinci tablodaki her satıra yapıştırılır ve bu böyle devam eder.
Yani birinci tabloda 5, ikincide 10 satırınız varsa toplamda 50 satırınız olur. Java'da bu sorgu şuna benzer:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Sorgumuzu iki tabloya aynı anda yazalım ve ne olduğunu görelim:
SELECT * FROM employee, task
Ve bu sorgunun sonucu:
İD | isim | meslek | maaş | yaş | İD | çalışan | _İD | isim | son teslim tarihi |
---|---|---|---|---|---|---|---|---|---|
1 | İvanov İvan | Programcı | 100000 | 25 | 1 | 1 | Ön uçtaki bir hatayı düzeltin | 2022-06-01 | |
2 | Petrov Petr | Programcı | 80000 | 23 | 1 | 1 | Ön uçtaki bir hatayı düzeltin | 2022-06-01 | |
3 | İvanov Sergey | test cihazı | 40000 | otuz | 1 | 1 | Ön uçtaki bir hatayı düzeltin | 2022-06-01 | |
4 | Rabinovich Moisha | Müdür | 200000 | 35 | 1 | 1 | Ön uçtaki bir hatayı düzeltin | 2022-06-01 | |
5 | Kirienko Anastasia | Ofis Yöneticisi | 40000 | 25 | 1 | 1 | Ön uçtaki bir hatayı düzeltin | 2022-06-01 | |
6 | Vaska | kedi | 1000 | 3 | 1 | 1 | Ön uçtaki bir hatayı düzeltin | 2022-06-01 | |
1 | İvanov İvan | Programcı | 100000 | 25 | 2 | 2 | Arka uçtaki bir hatayı düzeltin | 2022-06-15 | |
2 | Petrov Petr | Programcı | 80000 | 23 | 2 | 2 | Arka uçtaki bir hatayı düzeltin | 2022-06-15 | |
3 | İvanov Sergey | test cihazı | 40000 | otuz | 2 | 2 | Arka uçtaki bir hatayı düzeltin | 2022-06-15 | |
4 | Rabinovich Moisha | Müdür | 200000 | 35 | 2 | 2 | Arka uçtaki bir hatayı düzeltin | 2022-06-15 | |
5 | Kirienko Anastasia | Ofis Yöneticisi | 40000 | 25 | 2 | 2 | Arka uçtaki bir hatayı düzeltin | 2022-06-15 |
Toplamda 48 sonuç satırımız var ama burada sadece 11 tane verdim. Aksi takdirde, yeterli alan olmayacak.
Üç şeye dikkat edin:
- Aynı ada sahip sütunlar: id . Bu, çalışan tablosundaki kimlik ve görev tablosundaki kimliktir .
- Her tablonun satırları tekrarlanır. Sol sütunda, ID 6'yı tekrar ID = 1 takip eder.
- Örneğin, kimliğin (çalışan tablosundan) 6 olduğu ve aynı satırda çalışan_kimliğinin 1 olduğu anlamsız satırlarımız var.
Anlamsız satırları kaldırma
Çalışan ve görev tablolarının tüm satırlarının Kartezyen ürünü olan sonuç tablomuzda çok fazla satır var .
Mantıksal olarak, çalışan_id satırı 3 ise, çalışan tablosundan yalnızca id'nin 3 olduğu satıra yapıştırılmalıdır. WHERE ile bu yanlış anlaşılmayı düzeltmeye çalışalım.
Şöyle bir sorgu yazalım:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
Ve bu sorgunun sonucu:
İD | isim | meslek | maaş | yaş | İD | çalışan kimliği | isim | son teslim tarihi |
---|---|---|---|---|---|---|---|---|
1 | İvanov İvan | Programcı | 100000 | 25 | 1 | 1 | Ön uçtaki bir hatayı düzeltin | 2022-06-01 |
2 | Petrov Petr | Programcı | 80000 | 23 | 2 | 2 | Arka uçtaki bir hatayı düzeltin | 2022-06-15 |
4 | Rabinovich Moisha | Müdür | 200000 | 35 | 7 | 4 | Hayatın tadını çıkar | (HÜKÜMSÜZ) |
5 | Kirienko Anastasia | Ofis Yöneticisi | 40000 | 25 | 3 | 5 | kahve satın al | 2022-07-01 |
5 | Kirienko Anastasia | Ofis Yöneticisi | 40000 | 25 | 4 | 5 | kahve satın al | 2022-08-01 |
5 | Kirienko Anastasia | Ofis Yöneticisi | 40000 | 25 | 5 | 5 | kahve alacak | 2022-09-01 |
6 | Vaska | kedi | 1000 | 3 | 8 | 6 | Hayatın tadını çıkar | (HÜKÜMSÜZ) |
İyi haber şu ki, anlamsız satırlar ortadan kalktı: ilk sütundaki kimlik her zaman çalışan_id'ye eşittir.
Kötü haber ise, ofis temizliği gibi kimseye verilmeyen görevler ortadan kalktı. Çalışan_id'leri NULL'du, bu yüzden WHERE yapıldıktan sonra atıldılar.
GO TO FULL VERSION