Kueri bersarang di SQL

Bahasa SQL memungkinkan Anda untuk menyarangkan satu kueri di dalam kueri lain. Ini memungkinkan untuk menulis satu permintaan yang sangat besar yang akan melakukan sesuatu yang besar dan kompleks, meskipun keterbacaan kode sangat berkurang.

Bergantung pada berapa banyak nilai yang dikembalikan oleh subkueri, area tempat penerapannya dapat berubah. Ada tiga opsi secara total:

  • Subquery mengembalikan satu nilai tunggal (satu kolom dan satu baris).
  • Subquery mengembalikan daftar nilai (tabel dengan satu kolom).
  • Subquery mengembalikan tabel (banyak kolom, sejumlah baris).

Mari kita lihat satu contoh untuk setiap kasus.

Subquery dengan hasil skalar

Mari kita cari daftar semua karyawan kita dari tabel karyawan yang gajinya lebih tinggi dari rata-rata perusahaan. Bagaimana kita bisa melakukannya?

Kita dapat dengan mudah memfilter karyawan dengan membandingkan gaji mereka dengan rata-rata jika kita mengetahuinya sebelumnya. Pada saat yang sama, kami telah menulis kueri yang memungkinkan kami menghitung gaji rata-rata karyawan perusahaan. Mari kita ingat itu:

SELECT AVG(salary) FROM employee 

Kemudian MySQL mengembalikan nilainya kepada kami: 76833.3333 .

Bagaimana sekarang menemukan daftar semua karyawan yang gajinya di atas rata-rata? Ini juga sangat sederhana:

 SELECT * FROM employee 
   WHERE salary > 76833.3333 

Hasil dari kueri ini adalah:

pengenal nama pekerjaan gaji
1 Ivanov Ivan Programmer 100000
2 Petrov Petr Programmer 80000
4 Rabinovich Moisha Direktur 200000

Dan sekarang kami menggabungkan kedua permintaan dengan mengganti permintaan pertama, bukan nilai 76833:

   SELECT * FROM employee 
   WHERE salary > (SELECT AVG(salary) FROM employee) 

Hasil kueri ini akan sama:

pengenal nama pekerjaan gaji
1 Ivanov Ivan Programmer 100000
2 Petrov Petr Programmer 80000
4 Rabinovich Moisha Direktur 200000

Subquery dengan daftar nilai

Apakah Anda ingat suatu kali kami memiliki tugas - untuk menemukan semua catatan dari satu tabel yang tidak ada catatan yang sesuai dari yang lain?

Ada juga gambar ini:

Kalau tidak salah, tugasnya adalah sebagai berikut: tampilkan daftar semua karyawan dari tabel karyawan yang tidak ada tugas di tabel tugas .

Mari kita juga menemukan solusi dalam dua langkah.

Pertama, mari tulis kueri yang akan mengembalikan id semua karyawan yang memiliki tugas di tabel tugas. Ingatlah dua hal:

  • hapus duplikat - gunakan kata kunci DISTINCT.
  • hapus nilai NULL dari hasilnya.
SELECT DISTINCT employee_id FROM task 
   WHERE employee_id IS NOT NULL

Dan di sini kami mendapat hasil yang bagus dari permintaan seperti itu:

identitas pegawai
1
2
5
4
6

Mari kita tuliskan sementara untuk kenyamanan sebagai urutan: 1,2,5,4,6. Sekarang mari tulis kueri kedua - ke tabel karyawan, yang akan mengembalikan daftar karyawan yang id-nya tidak ada di daftar pertama:

SELECT * FROM employee  
WHERE id NOT IN (1,2,5,4,6)

Dan hasil dari kueri ini:

pengenal nama pekerjaan gaji usia join_date
3 Ivanov Sergey Penguji 40000 tigapuluh 01-01-2014

Dan sekarang, seperti pada contoh sebelumnya, Anda dapat menggabungkan kedua permintaan hanya dengan mengganti isi permintaan pertama alih-alih daftar id.

 SELECT * FROM employee 
   WHERE id NOT IN ( 
      	SELECT DISTINCT employee_id FROM task 
      	WHERE employee_id IS NOT NULL 
   )