mari rekap ini cepat. Gambar dua jadual, satu untuk pelanggan dan satu untuk buku untuk menubuhkan pangkalan data pinjaman buku.
id
id
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.
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. "
Sertai dalaman akan seperti bertanya "
hanya tunjukkan pelanggan dengan pinjaman. "
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"?
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>
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!
Tunjukkan kepada saya semua pelanggan yang tidak mempunyai buku yang dipinjam.
Tunjukkan kepada saya semua buku yang tidak dipinjamkan.
Kiri bergabung dengan pengecualian
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>
ditinggalkan gabungan data pulangan
id
firstNameJika 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
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>
id
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
firstName
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.
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.
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.
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.
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!