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:
![](https://cdn.codegym.cc/images/article/a0eff64c-0bb4-4480-833e-c1305cd03a5e/512.jpeg)
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
)
GO TO FULL VERSION