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:

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 
   )