Alasan OUTER JOIN
Omong-omong, apakah Anda ingat ketika kami menggabungkan spreadsheet kami dan tugas pembersihan kantor kami hilang karena belum ada pembersih?
Jika Anda menjalankan kueri seperti ini:
SELECT * FROM task
Kemudian kita mendapatkan hasil ini:
pengenal | employee_id | nama | tenggat waktu |
---|---|---|---|
1 | 1 | Perbaiki bug di frontend | 01-06-2022 |
2 | 2 | Perbaiki bug di backend | 15-06-2022 |
3 | 5 | Beli kopi | 01-07-2022 |
4 | 5 | Beli kopi | 01-08-2022 |
5 | 5 | Akan membeli kopi | 01-09-2022 |
6 | (BATAL) | Membersihkan kantor | (BATAL) |
7 | 4 | Menikmati hidup | (BATAL) |
8 | 6 | Menikmati hidup | (BATAL) |
Task “Clear Office” menghilang jika kita mencoba menggabungkan tabel tugas dengan tabel employee melalui employee_id.
Untuk mengatasi masalah ini, berbagai pengubah telah ditambahkan ke operator JOIN yang memungkinkan baris-baris yatim tersebut disimpan tanpa pasangan di tabel lain.
Izinkan saya mengingatkan Anda tentang bentuk klasik operator GABUNG:
table 1 JOIN table 2 ON
condition
Kita dapat memberi tahu SQL Server untuk memastikan bahwa semua data dari tabel kiri (tabel1) ada di tabel gabungan. Bahkan jika tidak ada pasangan untuk mereka di meja yang tepat. Untuk melakukan ini, Anda hanya perlu menulis:
table 1 LEFT JOIN table 2 ON condition
Jika Anda ingin tabel gabungan memiliki semua baris dari tabel kanan , maka Anda perlu menulis:
table 1 RIGHT JOIN table 2 ON
condition
Mari tulis kueri yang akan menggabungkan semua tugas dan karyawan sehingga tugas tanpa pelaksana tidak hilang. Untuk melakukan ini, tulis kueri:
SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
Dan hasil dari kueri ini:
pengenal | nama | pekerjaan | gaji | usia | join_date | pengenal | employee_id | nama |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmer | 100000 | 25 | 30-06-2012 | 1 | 1 | Perbaiki bug di frontend |
2 | Petrov Petr | Programmer | 80000 | 23 | 12-08-2013 | 2 | 2 | Perbaiki bug di backend |
4 | Rabinovich Moisha | Direktur | 200000 | 35 | 12-05-2015 | 7 | 4 | Menikmati hidup |
5 | Kirienko Anastasia | Manajer kantor | 40000 | 25 | 10-10-2015 | 3 | 5 | Beli kopi |
5 | Kirienko Anastasia | Manajer kantor | 40000 | 25 | 10-10-2015 | 4 | 5 | Beli kopi |
5 | Kirienko Anastasia | Manajer kantor | 40000 | 25 | 10-10-2015 | 5 | 5 | Beli kopi |
6 | Vaska | kucing | 1000 | 3 | 11-11-2018 | 8 | 6 | Menikmati hidup |
(BATAL) | (BATAL) | (BATAL) | (BATAL) | (BATAL) | (BATAL) | 6 | (BATAL) | Membersihkan kantor |
Baris lain telah ditambahkan ke tabel kami, dan menariknya, ada banyak nilai NULL di dalamnya. Semua data yang diambil dari tabel karyawan ditampilkan sebagai NULL, karena tidak ada pelaksana dari tabel karyawan untuk tugas "Bersihkan kantor".
GABUNG jenis
Total ada 4 jenis GABUNG. Mereka disajikan dalam tabel di bawah ini:
Entri singkat | entri panjang | Penjelasan | |
---|---|---|---|
1 | BERGABUNG | GABUNG DALAM | Hanya catatan yang ada di tabel A dan B |
2 | GABUNG KIRI | GABUNG LUAR KIRI | Semua baris tanpa pasangan dari tabel A harus |
3 | GABUNG KANAN | GABUNG KELUAR KANAN | Semua baris tanpa pasangan dari tabel B harus |
4 | GABUNG LUAR | GABUNG LUAR LENGKAP | Semua baris pasangan basa dari tabel A dan B harus |
Untuk mempermudah, jika kita merepresentasikan tabel sebagai set, maka JOIN dapat ditampilkan sebagai gambar:
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
Persimpangan set berarti bahwa untuk satu tabel ada catatan yang sesuai dari tabel lain yang dirujuknya.
Pertanyaan dari wawancara
Terkadang pemrogram pemula dibombardir dengan pertanyaan yang sangat sederhana saat wawancara. Mengingat tabel kami, dapat dirumuskan sebagai berikut:
“Tulis kueri yang akan menampilkan daftar semua karyawan yang tidak memiliki tugas .” Pertama, mari kita coba ulangi pertanyaan ini sedikit: "Tulis kueri yang akan menampilkan daftar semua karyawan dari tabel karyawan yang tidak memiliki tugas di tabel tugas ." Kita perlu mendapatkan set ini:![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
Ada banyak cara untuk mengatasi masalah ini, tetapi saya akan mulai dengan yang paling sederhana: Pertama, Anda dapat menggabungkan tabel kami dengan LEFT JOIN, lalu gunakan WHERE untuk mengecualikan semua baris yang datanya hilang diisi dengan NULL.
SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
Dan hasil dari kueri ini:
pengenal | nama | pekerjaan | gaji | usia | join_date | pengenal | employee_id | nama |
---|---|---|---|---|---|---|---|---|
3 | Ivanov Sergey | Penguji | 40000 | tigapuluh | 01-01-2014 | (BATAL) | (BATAL) | (BATAL) |
Satu-satunya kelemahan dari solusi ini adalah di sini baris dalam tabel berisi NULL, dan dengan syarat kita perlu menampilkan daftar karyawan.
Untuk melakukan ini, Anda perlu mencantumkan kolom yang diperlukan dari tabel karyawan di SELECT, atau jika Anda perlu menampilkan semuanya, Anda dapat menulis konstruksi berikut:
SELECT e.* FROM employee e, task t
Permintaan lengkap akan terlihat seperti ini:
SELECT e.*
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
hasil dari kueri ini:
pengenal | nama | pekerjaan | gaji | usia | join_date |
---|---|---|---|---|---|
3 | Ivanov Sergey | Penguji | 40000 | tigapuluh | 01-01-2014 |
Metode lainnya diserahkan kepada Anda untuk pekerjaan rumah. Saya tidak ingin menghalangi Anda dari kesenangan menemukan mereka sendiri.
GO TO FULL VERSION