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:
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
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:![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
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.