Nested pitakon ing SQL
Basa SQL ngidini sampeyan nest siji pitakon ing pitakon liyane. Iki ndadekake iku bisa kanggo nulis siji pitakonan gedhe banget sing bakal nindakake soko gedhe lan Komplek, sanajan readability saka kode wis suda banget.
Gumantung carane akeh nilai sing dibalekake dening subqueries, wilayah sing bisa ditrapake diganti. Ana telung opsi total:
- Subquery ngasilake siji nilai (siji kolom lan siji baris).
- Subquery ngasilake dhaptar nilai (tabel kanthi siji kolom).
- Subquery ngasilake tabel (akeh kolom, sawetara baris).
Ayo goleki siji conto kanggo saben kasus.
Subquery kanthi asil skalar
Ayo goleki dhaptar kabeh karyawan saka meja karyawan sing gajine luwih dhuwur tinimbang rata-rata kanggo perusahaan. Kepiye carane bisa ditindakake?
Kita bisa gampang nyaring karyawan kanthi mbandhingake gaji karo rata-rata yen kita ngerti sadurunge. Ing wektu sing padha, kita wis nulis pitakon sing ngidini kita ngetung gaji rata-rata karyawan perusahaan. Ayo padha ngelingi:
SELECT AVG(salary) FROM employee
Banjur MySQL ngasilake kita nilai: 76833.3333 .
Kepiye saiki golek dhaptar kabeh karyawan sing gajine luwih saka rata-rata? Iku uga prasaja banget:
SELECT * FROM employee
WHERE salary > 76833.3333
Asil saka pitakonan iki bakal dadi:
id | jeneng | pendhudhukan | gaji |
---|---|---|---|
1 | Iwan Iwan | Programmer | 100000 |
2 | Petrov Petruk | Programmer | 80000 |
4 | Rabinovich Moisha | direktur | 200000 |
Lan saiki kita mung gabungke loro panjalukan kanthi ngganti panjalukan pisanan tinimbang nilai 76833:
SELECT * FROM employee
WHERE salary > (SELECT AVG(salary) FROM employee)
Asil saka pitakonan iki bakal padha:
id | jeneng | pendhudhukan | gaji |
---|---|---|---|
1 | Iwan Iwan | Programmer | 100000 |
2 | Petrov Petruk | Programmer | 80000 |
4 | Rabinovich Moisha | direktur | 200000 |
Subquery karo dhaptar nilai
Apa sampeyan ngelingi biyen kita duwe tugas - golek kabeh cathetan saka siji meja sing ora ana cathetan sing cocog saka liyane?
Ana uga gambar iki:
![](https://cdn.codegym.cc/images/article/a0eff64c-0bb4-4480-833e-c1305cd03a5e/512.jpeg)
Yen ora salah, tugase kaya ing ngisor iki: nampilake dhaptar kabeh karyawan saka meja karyawan sing ora ana tugas ing meja tugas .
Ayo goleki solusi ing rong langkah.
Pisanan, ayo nulis pitakon sing bakal ngasilake id kabeh karyawan sing duwe tugas ing tabel tugas. Cukup elinga rong perkara:
- mbusak duplikat - gunakake tembung kunci DISTINCT.
- mbusak nilai NULL saka asil.
SELECT DISTINCT employee_id FROM task
WHERE employee_id IS NOT NULL
Lan ing kene kita entuk asil sing apik saka panjaluk kasebut:
id_pegawe |
---|
1 |
2 |
5 |
4 |
6 |
Ayo ditulis sak wentoro kanggo penak minangka urutan: 1,2,5,4,6. Saiki ayo nulis pitakon kapindho - menyang tabel karyawan, sing bakal ngasilake dhaptar karyawan sing id ora ana ing dhaptar pisanan:
SELECT * FROM employee
WHERE id NOT IN (1,2,5,4,6)
Lan asil saka pitakonan iki:
id | jeneng | pendhudhukan | gaji | umur | join_date |
---|---|---|---|---|---|
3 | Ivanov Sergey | Tester | 40000 | telung puluh | 2014-01-01 |
Lan saiki, kaya ing conto sadurunge, sampeyan bisa nggabungake loro panjalukan kanthi mung ngganti awak panjalukan pisanan tinimbang dhaptar id.
SELECT * FROM employee
WHERE id NOT IN (
SELECT DISTINCT employee_id FROM task
WHERE employee_id IS NOT NULL
)