Rumah > pembangunan bahagian belakang > tutorial php > 3 lagi menyertai anda harus biasa

3 lagi menyertai anda harus biasa

Joseph Gordon-Levitt
Lepaskan: 2025-02-16 13:06:13
asal
522 orang telah melayarinya

3 lagi menyertai anda harus biasa

Takeaways Key

    Artikel menerangkan penggunaan gabungan kiri, gabungan kanan, gabungan dalaman, dan gabungan luar di SQL, menggunakan contoh mudah pangkalan data pinjaman buku dengan dua jadual: pelanggan dan buku.
  • Konsep 'kiri' dan 'kanan' dalam SQL bergabung dijelaskan sebagai tidak lebih daripada perintah sumber. Jadual yang disebutkan sebelum kata kunci gabungan adalah meja 'kiri' dan yang selepas itu adalah jadual 'kanan'.
  • Artikel memperkenalkan konsep bergabung dengan pengecualian, yang berguna untuk pertanyaan yang termasuk perkataan 'tidak' atau 'tidak'. Ini bergabung menggunakan klausa WHERE untuk mengecualikan data, khususnya apabila mencari nilai null.
  • Sertai luar dengan pengecualian digambarkan sebagai berguna untuk memilih data tanpa sambungan antara jadual, walaupun ia tidak disokong dalam MySQL.
  • Ia ditekankan bahawa klausa di mana harus selalu digunakan terhadap bidang yang tidak boleh mempunyai batal sebagai nilai sebenar mereka. Juga, diperhatikan bahawa Cross Join adalah gabungan unik yang sepadan dengan setiap baris dalam Jadual A ke setiap baris dalam Jadual B.
Terdapat banyak cara untuk menyertai data dari dua jadual pangkalan data dan menapis maklumat yang anda perlukan. Craig Buckler menulis sekeping popular mengenai pemahaman; iaitu dalaman, kiri, kanan, dan luar penuh. Artikel ini adalah lanjutan dari yang satu.

mari rekap ini cepat. Gambar dua jadual, satu untuk pelanggan dan satu untuk buku untuk menubuhkan pangkalan data pinjaman buku.


Jadual Pelanggan

id firstName LastName book_id 1 Joe Meniup 1 2 Jane Doe 2 3 Harry Crow 2 4 Jeffrey Salji 0 Jadual Buku

id Tajuk 1 Star Wars 2 Jurassic Park 3 Wanita kecil 4 Tom Sawyer Jadual Buku mempunyai satu baris untuk setiap buku.

Jadual pelanggan mempunyai satu baris untuk setiap pelanggan yang hanya boleh mempunyai satu buku yang dipinjamkan pada satu masa. Sekiranya mereka tidak mempunyai buku yang dipinjam, book_id akan menjadi 0 atau rentetan kosong.

ini adalah contoh yang sangat mudah untuk membuat gabungan yang jelas untuk difahami!

Sertai kiri di sini akan berada dalam kes yang anda ingin tanya soalan seperti "

Tunjukkan kepada saya semua pelanggan termasuk mana -mana buku yang dipinjam.

"

Anda dapat melihat dalam imej bahawa semua data dalam bulatan kiri, atau jadual, dimasukkan ke dalam set hasil. Hanya data yang bertindih dari jadual buku dimasukkan dari jadual yang betul. Ini bermakna bahawa dengan gabungan kiri, beberapa data dalam jadual yang betul boleh dikecualikan. 3 lagi menyertai anda harus biasa

Sertai yang betul akan seperti bertanya "

tunjukkan kepada saya semua buku di perpustakaan saya, bersama -sama dengan mana -mana pelanggan yang telah meminjamnya.

"

Dalam imej ini, anda melihat bahawa semua data dalam jadual yang betul dimasukkan ke dalam set hasil. Hanya data yang bertindih dari jadual pelanggan dimasukkan. Ini bermakna dengan gabungan yang betul, beberapa data di meja kiri boleh dikecualikan.

Sebuah gabungan luar akan seperti bertanya " tunjukkan kepada saya semua pinjaman dan semua buku, tanpa mengira hubungan antara mereka. "

3 lagi menyertai anda harus biasa

Dalam imej ini, anda dapat melihat bahawa semua data dari kedua -dua jadual akan dimasukkan, tanpa mengira sama ada beberapa data bertindih. Apabila pertanyaan seperti ini dilakukan, anda akan mempunyai data yang tidak bertindih dalam hasilnya, dan medan tersebut akan ditetapkan ke NULL.

Sertai dalaman akan seperti bertanya "

hanya tunjukkan pelanggan dengan pinjaman. "

3 lagi menyertai anda harus biasa di sini anda dapat melihat bahawa data boleh dikecualikan dari kedua -dua jadual kiri dan kanan. Anda tidak akan melihat mana -mana pelanggan jika mereka tidak mempunyai buku, dan anda tidak akan melihat mana -mana buku jika mereka tidak dipinjamkan!

Ini adalah jenis data yang paling biasa dan merupakan tingkah laku lalai apabila menggunakan kata kunci bergabung dengan sendirinya. Kata tambahan "dalaman" biasanya tidak diperlukan.

Apa maksud "kiri" dan "betul"?

Anda boleh memikirkan "kiri" dan "kanan" sebagai tidak lebih daripada urutan sumber. Lihat pertanyaan ini:

Perhatikan bahawa saya menyebutkan pelanggan jadual sebelum saya menggunakan kata kunci Join. Ini bermakna pelanggan adalah meja "kiri" saya. Satu lagi cara berfikir mengenainya ialah bertanya jadual mana yang tersisa dari kata kunci gabungan, dan yang berada di sebelah kanannya.
<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Beberapa kaveat:

Hanya kerana satu jadual adalah "kiri", tidak bermakna anda memilih semua rekodnya. Ini adalah fungsi gabungan kiri atau kanan menyertai, bukan perintah sumber!
  • Jadual yang kiri akan mempunyai lajur yang disenaraikan terlebih dahulu dalam set hasil melainkan anda secara khusus memilih lajur di bahagian Pilih.
  • urutan jadual selepas kata kunci tidak penting, ia akan mengembalikan hasil yang sama jika ditukar.
  • Cukup mengkaji semula. Apakah gabungan baru ini?

Nah, mereka bukan "baru", mereka hanya satu cara untuk menanyakan soalan tambahan. Bagaimanakah anda dapat mencari jawapan kepada soalan dengan perkataan "tidak" atau "tidak" dalam pertanyaan?

Tunjukkan kepada saya semua pelanggan yang tidak mempunyai buku yang dipinjam.

Tunjukkan kepada saya semua buku yang tidak dipinjamkan.

Kiri bergabung dengan pengecualian

Lihat grafik ini. Perhatikan perbezaan dari yang di atas di kawasan yang berlorek.

Ini kelihatan seperti gabungan kiri, tetapi tidak lagi mempunyai data "bertindih". Kenapa? Ini sama seperti bertanya " tunjukkan kepada saya pelanggan yang tidak mempunyai buku yang dipinjam. Jika anda pandai, anda mungkin fikir anda hanya boleh mencari jadual pelanggan untuk book_id 0 untuk melakukan perkara yang sama. Itu akan berfungsi dalam contoh ini tetapi kebanyakan masa ia tidak akan; ia bergantung pada bagaimana jadual anda direka.

pertanyaan kelihatan seperti ini:

Kami kini telah memasukkan klausa di mana. Bila -bila masa anda mempunyai klausa WHERE, anda tidak termasuk data
<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
, atau menapisnya, hampir seperti carian. Jadi mengapa kita mencari books.id menjadi batal? Mengapa itu akan menjadi batal? Mari kita jalankan standard kiri menyertai dan lihat data yang dikembalikan, kita akan mendapat jawapan:

ditinggalkan gabungan data pulangan

id

firstName LastName book_id id1 Tajuk 1 Joe Meniup 1 1 Star Wars 2 Jane Doe 2 2 Jurassic Park 3 Harry Crow 2 2 Jurassic Park 4 Jeffrey Salji 0 batal batal Bolehkah anda melihat masalahnya? Ini adalah gabungan kiri yang bermaksud semua data dari jadual pelanggan dimasukkan tanpa mengira pertindihan dengan buku. Jeffrey Snow dimasukkan tetapi dia tidak mempunyai buku yang dipinjam, inilah sebabnya lajur "ID1" dan "Tajuk" ditetapkan untuk batal. Apabila jadual disertai, tidak akan ada tajuk buku atau ID buku yang dikaitkan dengannya. Jika kita bertanya " tunjukkan kepada saya semua pelanggan termasuk buku yang mereka ada ", anda akan mahu data di atas kerana Jeffrey adalah pelanggan tanpa mengira jika dia mempunyai buku yang dipinjam atau tidak. Itu akan menjadi fungsi gabungan kiri dalam kes ini.

Jika kita bertanya soalan "

Tunjukkan kepada saya pelanggan tanpa buku mengenai pinjaman ", kini masuk akal untuk dicari. Kami hanya perlu memilih pelanggan di mana kita melihat NULL untuk lajur Books.id (apabila disertai, akan dilabelkan ID1 kerana terdapat dua lajur bernama "ID"). Kami melakukan ini dengan standard di mana klausa jika kita menambah di mana books.id adalah batal. Sekarang hasilnya ditapis hanya ini:

id firstName

LastName book_id id1 Tajuk 4 Jeffrey Salji 0 batal batal anda kini mempunyai semua pelanggan yang tidak mempunyai buku yang dipinjam. betul sertai dengan pengecualian mari kita lakukan dengan sama dengan gabungan yang betul. Mari kita cari semua buku yang tidak dipinjamkan kepada sesiapa sahaja.

Sertai hak normal akan mengembalikan setiap buku tanpa mengira sama ada ia dipinjamkan, set hasilnya akan kelihatan seperti ini:

id firstName LastName book_id id1 Tajuk 1 Joe Meniup 1 1 Star Wars 2 Jane Doe 2 2 Jurassic Park 3 Harry Crow 2 2 Jurassic Park batal batal batal batal 3 Wanita kecil batal batal batal batal 4 Tom Sawyer Ini kelihatan sedikit berbeza. Pertama, anda mungkin melihat bahawa Jurassic Park disenaraikan dua kali. Ini kerana dua orang mempunyai buku yang dipinjam, dan pangkalan data kembali berturut -turut untuk setiap perlawanan.

Perhatikan semua lajur yang sepadan dari jadual pelanggan adalah batal untuk wanita kecil dan Tom Sawyer kerana tiada siapa yang meminjam tajuk tersebut sehingga tidak ada data bertindih.

Jika kita mahu memilih semua buku yang tidak dipinjamkan, kita hanya menggunakan klausa WHERE untuk mencari "NULL" dalam lajur Pelanggan.ID.

Hasilnya harus diramalkan. Kami hanya mendapat buku yang tidak dipinjamkan.
<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

id firstName LastName book_id id1 Tajuk batal batal batal batal 3 Wanita kecil batal batal batal batal 4 Tom Sawyer sertai luar dengan pengecualian gabungan terakhir kelihatan seperti ini.

Gabungan ini tidak begitu berguna, tetapi pada dasarnya akan memberi anda senarai kedua -dua pelanggan tanpa pinjaman, dan buku yang tidak dipinjamkan, pada masa yang sama.

3 lagi menyertai anda harus biasa Sertai pelik seperti ini mungkin berguna dalam kes -kes di mana anda benar -benar perlu memilih data tanpa sambungan antara jadual. Mungkin anda sedang memburu data yatim atau mencari ketidakkonsistenan dalam beberapa pangkalan data lama yang anda tukar.

Malah, jenis gabungan ini sangat pelik sehingga anda tidak dapat melakukannya di MySQL, ia tidak menyokong gabungan luar. SQL biasa tidak, dan pertanyaan akan kelihatan seperti ini (MSSQL bukan MySQL):

Hasil pertanyaan ini akan mengembalikan data mencari sesuatu seperti ini:

<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>WHERE books.id IS NULL
Salin selepas log masuk
id

firstName LastName book_id id1 Tajuk 1 Jeffrey Salji 0 batal batal batal batal batal batal 3 Wanita kecil batal batal batal batal 4 Tom Sawyer Anda boleh mencapai gabungan luar menggunakan kaedah Craig Buckler yang dijelaskan dengan kesatuan, tetapi itu bukan tanpa masalah yang berpotensi. Hasil Google teratas untuk mensimulasikan gabungan luar penuh di MySQL adalah dari tahun 2006 dan boleh didapati di sini. Ia boleh menjadi agak rumit. Perkara utama untuk diperhatikan dalam kod di atas adalah memeriksa NULL pada kedua -dua belah gabungan, kerana kami ingin mengecualikan dari kedua -dua jadual. Tanpa memeriksa kedua -dua belah pihak, kami hanya akan berakhir dengan salah satu yang lain bergabung hanya bercakap tentang. Tidak kira bagaimana pelik atau menyokong pertanyaan seperti ini, saya ingin memasukkannya kerana ia adalah jenis gabungan yang sah, jika anda boleh memikirkan alasan untuk menggunakannya.

Pemikiran Lain

anda harus sentiasa menggunakan klausa di mana anda terhadap bidang yang tidak boleh mempunyai NULL sebagai nilai sebenar mereka! Kami sentiasa diuji terhadap medan ID yang tidak boleh mempunyai batal sebagai nilai. Bayangkan jika jadual buku kami mempunyai medan ISBN yang membenarkan batal. Jika kami diuji untuk NULL menggunakan medan itu , ia termasuk baris yang mungkin tidak kami mahukan!

Terdapat satu lagi gabungan yang dipanggil Salib Sertai yang juga pelik dan unik. Bayangkan bukan hanya sepadan dengan satu pengguna ke satu buku, setiap pengguna dipadankan dengan setiap buku! Ya, ini bermakna jika anda mempunyai 20 buku dan 30 pelanggan, silang silang akan menghasilkan 30*20 baris data! Sebagai contoh bagaimana ini boleh berguna, lihat artikel ini.

Perhatikan bahawa dalam MySQL, gabungan, gabungan dalaman, dan silang bersambung adalah setara sintaksis dan boleh menggantikan satu sama lain. Ini kerana Join dan Inner Join melakukan perkara yang sama dan mesti menggunakan kata kunci On untuk memadankan lajur. Apabila menggunakan Salib Bergabung, tidak ada kata kunci, kerana ia sepadan dengan setiap baris dalam Jadual A ke setiap baris dalam Jadual B.

Kesimpulan

Saya harap ini lebih banyak bergabung dengan anda. Fikirkan tentang menggunakannya bila -bila masa anda meminta data antara jadual di mana sesuatu "tidak" sepadan dengan yang lain.

  • "Cari semua pelanggan yang belum dipesan sebelum ini".
  • "Cari semua pelanggan tidak dalam senarai hitam".
  • "Cari semua produk yang belum dijual".
  • "Cari semua pelanggan yang tidak meminjam buku".
  • "Cari semua anjing yang belum berjalan akhir -akhir ini".
  • "Cari pekerja yang tidak pernah menghantar dalam tiket sokongan".
Secara ringkasnya, bergantung pada bagaimana pangkalan data dan jadual anda ditakrifkan, anda mungkin perlu menggunakan klausa WHERE untuk memeriksa nilai null ke

dengan tingkah laku gabungan biasa. Jadi ... adakah anda pernah memerlukan silang silang? Mana -mana kes penggunaan khusus yang anda ingin beritahu kami atau mahu kami menutup? Marilah kita tahu! Soalan Lazim (Soalan Lazim) Mengenai SQL Bergabung

Apakah jenis SQL yang berlainan dan bagaimana mereka berbeza antara satu sama lain? Terdapat empat jenis asas SQL bergabung: gabungan dalaman, meninggalkan gabungan, gabungan kanan, dan gabungan penuh. Inner Join Returns Records yang mempunyai nilai yang sepadan dalam kedua -dua jadual. Kiri Join Returns semua rekod dari meja kiri, dan rekod yang dipadankan dari meja kanan. Sertai kanan mengembalikan semua rekod dari meja kanan, dan rekod yang dipadankan dari meja kiri. Penuh sertai mengembalikan semua rekod apabila terdapat perlawanan di meja kiri atau kanan.

Bagaimana saya menggunakan pelbagai gabungan dalam SQL?

Pelbagai gabungan boleh digunakan dalam SQL dengan hanya menambah lebih banyak penyataan gabungan dalam pertanyaan SQL anda. Setiap penyataan gabungan mesti mempunyai klausa sendiri yang menentukan syarat -syarat untuk menyertai. Perintah penyataan gabungan dalam pertanyaan anda dapat mempengaruhi hasilnya, jadi penting untuk mempertimbangkan logik pertanyaan anda dengan teliti ketika menggunakan pelbagai bergabung. ? Ini dilakukan dengan menggunakan dua penyataan gabungan dalam pertanyaan SQL anda. Kenyataan gabungan pertama menggabungkan dua jadual pertama, dan pernyataan gabungan kedua menggabungkan hasil gabungan pertama dengan jadual ketiga. Perintah penyataan gabungan dan syarat -syarat yang dinyatakan dalam klausa ON menentukan bagaimana jadual digabungkan. Perbezaan antara gabungan kiri dan gabungan yang betul di SQL adalah urutan di mana jadual disertai dan hasil yang dikembalikan. Sertai kiri mengembalikan semua rekod dari meja kiri dan rekod yang dipadankan dari meja kanan. Sekiranya tidak ada perlawanan, hasilnya adalah batal di sebelah kanan. Sebaliknya, gabungan kanan mengembalikan semua rekod dari meja kanan dan rekod yang dipadankan dari meja kiri. Sekiranya tidak ada perlawanan, hasilnya adalah batal di sebelah kiri.

Bagaimana saya boleh memvisualisasikan SQL bergabung? Setiap bulatan dalam rajah mewakili jadual. Kawasan di mana lingkaran bertindih mewakili rekod yang dikembalikan oleh gabungan itu. Untuk gabungan dalaman, hanya kawasan bertindih yang ditunjukkan. Untuk menyertai kiri, semua bulatan kiri dan kawasan bertindih ditunjukkan. Untuk menyertai yang betul, semua bulatan yang betul dan kawasan bertindih ditunjukkan. Untuk menyertai penuh, seluruh kawasan kedua -dua lingkaran ditunjukkan. adalah perlawanan di sebelah kiri atau meja kanan. Sekiranya tidak ada perlawanan, hasilnya adalah batal di kedua -dua belah pihak. Jenis gabungan ini berguna apabila anda ingin mengekalkan semua rekod dari kedua -dua jadual, walaupun tidak ada perlawanan antara lajur yang disatukan. 🎜> Ya, anda boleh menggunakan SQL bergabung dengan lebih daripada dua jadual. Ini dilakukan dengan menggunakan pelbagai penyataan gabungan dalam pertanyaan SQL anda. Setiap penyataan gabungan menggabungkan dua jadual, jadi untuk menyertai tiga jadual, anda akan menggunakan dua penyataan gabungan, untuk menyertai empat jadual, anda akan menggunakan tiga penyataan gabungan, dan sebagainya.

Apakah kesan prestasi menggunakan pelbagai gabungan dalam SQL?

Menggunakan pelbagai gabungan dalam SQL boleh memberi impak yang signifikan terhadap prestasi pertanyaan, terutamanya jika jadual yang disertai mempunyai sejumlah besar rekod. Setiap operasi menyertai memerlukan kuasa dan memori pemprosesan, jadi semakin banyak gabungan yang anda ada dalam pertanyaan anda, lebih banyak sumber yang diperlukan untuk melaksanakan pertanyaan. Walau bagaimanapun, kesan prestasi dapat dikurangkan dengan menggunakan indeks, mengoptimumkan pertanyaan anda, dan menggunakan perkakasan yang sesuai. Pertanyaan SQL anda yang menggunakan bergabung. Salah satu cara ialah menggunakan indeks pada lajur yang sedang bergabung. Ini dapat mempercepatkan operasi gabungan dengan ketara. Cara lain adalah untuk mengehadkan bilangan rekod yang dikembalikan oleh pertanyaan dengan menggunakan klausa WHERE. Juga, perintah penyataan gabungan dalam pertanyaan anda boleh menjejaskan prestasi, jadi penting untuk mempertimbangkan dengan teliti logik pertanyaan anda. > Beberapa kesilapan biasa untuk dielakkan apabila menggunakan SQL bergabung termasuk lupa untuk menentukan klausa On, yang boleh mengakibatkan produk Cartesian, menyertai lajur yang tidak diindeks, yang dapat melambatkan prestasi pertanyaan, dan menggunakan jenis gabungan yang salah, yang boleh mengakibatkan keputusan yang tidak betul. Ia juga penting untuk diingat bahawa perintah penyataan gabungan dalam pertanyaan anda boleh menjejaskan hasilnya, jadi penting untuk mempertimbangkan dengan teliti logik pertanyaan anda.

Atas ialah kandungan terperinci 3 lagi menyertai anda harus biasa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan