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:

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:

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.