Sebab OUTER JOIN

By the way, adakah anda masih ingat apabila kami menggabungkan hamparan kami dan tugas pembersihan pejabat kami hilang kerana tiada pembersih lagi?

Jika anda menjalankan pertanyaan seperti ini:

SELECT * FROM task

Kemudian kita mendapat hasil ini:

ID id_pekerja nama tarikh akhir
1 1 Betulkan pepijat pada bahagian hadapan 2022-06-01
2 2 Betulkan pepijat pada bahagian belakang 15-06-2022
3 5 Beli kopi 2022-07-01
4 5 Beli kopi 2022-08-01
5 5 Akan membeli kopi 2022-09-01
6 (NULL) Bersihkan pejabat (NULL)
7 4 Nikmati kehidupan (NULL)
8 6 Nikmati kehidupan (NULL)

Tugasan "Clear Office" hilang jika kita cuba untuk menyertai jadual tugas dengan jadual pekerja oleh employee_id.

Untuk menyelesaikan masalah ini, pelbagai pengubah telah ditambahkan pada operator JOIN yang membenarkan baris yatim tersebut disimpan tanpa pasangan dalam jadual lain.

Biar saya ingatkan anda tentang bentuk klasik operator JOIN:

table 1 JOIN table 2 ON condition

Kami boleh memberitahu SQL Server untuk memastikan bahawa semua data dari jadual kiri (jadual1) hadir dalam jadual yang dicantumkan. Walaupun tidak ada pasangan untuk mereka dalam jadual yang betul. Untuk melakukan ini, anda hanya perlu menulis:

table 1 LEFT JOIN table 2 ON condition

Jika anda mahu jadual yang dicantumkan mempunyai semua baris dari jadual yang betul , maka anda perlu menulis:

table 1 RIGHT JOIN table 2 ON
 condition

Mari tulis pertanyaan yang akan menggabungkan semua tugas dan pekerja supaya tugas tanpa pelaksana tidak hilang. Untuk melakukan ini, tulis pertanyaan:

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id

Dan hasil daripada pertanyaan ini:

ID nama pekerjaan gaji umur tarikh menyertai ID id_pekerja nama
1 Ivanov Ivan Pengaturcara 100000 25 30-06-2012 1 1 Betulkan pepijat pada bahagian hadapan
2 Petrov Petr Pengaturcara 80000 23 2013-08-12 2 2 Betulkan pepijat pada bahagian belakang
4 Rabinovich Moisha Pengarah 200000 35 12-05-2015 7 4 Nikmati kehidupan
5 Kirienko Anastasia Pengurus pejabat 40000 25 2015-10-10 3 5 Beli kopi
5 Kirienko Anastasia Pengurus pejabat 40000 25 2015-10-10 4 5 Beli kopi
5 Kirienko Anastasia Pengurus pejabat 40000 25 2015-10-10 5 5 Beli kopi
6 Vaska kucing 1000 3 2018-11-11 8 6 Nikmati kehidupan
(NULL) (NULL) (NULL) (NULL) (NULL) (NULL) 6 (NULL) Bersihkan pejabat

Satu lagi baris telah ditambahkan pada jadual kami, dan yang menariknya, terdapat banyak nilai NULL di dalamnya. Semua data yang diambil daripada jadual pekerja dipaparkan sebagai NULL, kerana tiada pelaksana daripada jadual pekerja untuk tugas "Pejabat bersih".

JOIN jenis

Terdapat 4 jenis JOIN secara keseluruhan. Mereka dibentangkan dalam jadual di bawah:

Entri ringkas panjang masuk Penjelasan
1 SERTAI SERTAI DALAM Hanya rekod yang terdapat dalam jadual A dan B
2 KIRI SERTAI KIRI LUAR SERTAI Semua baris tanpa pasangan dari jadual A mestilah
3 BETUL SERTAI SERTAI LUAR KANAN Semua baris tanpa pasangan dari jadual B mestilah
4 SERTAI LUAR SERTAI LUAR PENUH Semua baris pasangan asas daripada jadual A dan B mestilah

Untuk kesederhanaan, jika kita mewakili jadual sebagai set, maka JOIN boleh dipaparkan sebagai gambar:

Set persimpangan bermakna bahawa untuk satu jadual terdapat rekod yang sepadan daripada jadual lain yang dirujuknya.

Soalan daripada temu bual

Kadangkala pengaturcara baru dihujani dengan soalan yang sangat mudah semasa temu duga. Memandangkan jadual kami, ia boleh dirumuskan seperti berikut:

"Tulis pertanyaan yang akan memaparkan senarai semua pekerja yang tiada tugasan ." Mula-mula, mari cuba menguraikan semula soalan ini sedikit: "Tulis pertanyaan yang akan memaparkan senarai semua pekerja daripada jadual pekerja yang tiada tugasan dalam jadual tugasan ." Kita perlu dapatkan set ini:

Terdapat banyak cara untuk menyelesaikan masalah ini, tetapi saya akan mulakan dengan yang paling mudah: Mula-mula, anda boleh menyertai jadual kami dengan LEFT JOIN, dan kemudian gunakan WHERE untuk mengecualikan semua baris yang mana data yang hilang itu dipadatkan dengan NULL.

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

Dan hasil daripada pertanyaan ini:

ID nama pekerjaan gaji umur tarikh menyertai ID id_pekerja nama
3 Ivanov Sergey Penguji 40000 tiga puluh 2014-01-01 (NULL) (NULL) (NULL)

Satu-satunya kelemahan penyelesaian ini ialah di sini baris dalam jadual mengandungi NULL, dan dengan syarat kita perlu memaparkan senarai pekerja.

Untuk melakukan ini, anda sama ada perlu menyenaraikan lajur yang diperlukan bagi jadual pekerja dalam SELECT, atau jika anda perlu memaparkan kesemuanya, anda boleh menulis pembinaan berikut:

SELECT e.* FROM employee e, task t 

Permintaan lengkap akan kelihatan seperti ini:

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

hasil daripada pertanyaan ini:

ID nama pekerjaan gaji umur tarikh menyertai
3 Ivanov Sergey Penguji 40000 tiga puluh 2014-01-01

Kaedah selebihnya diserahkan kepada anda untuk kerja rumah. Saya tidak mahu menghalang anda daripada keseronokan mencari mereka sendiri.