CROSS JOIN dan Hasil Cartesian
Cantuman silang yang disengajakan untuk menjana gabungan serta cantuman tidak sengaja yang melambungkan bilangan baris
CROSS JOIN dan Hasil Cartesian ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.
JOIN yang Digunakan Penemuduga untuk Memerangkap Anda
CROSS JOIN memadankan setiap baris jadual kiri dengan setiap baris jadual kanan. Tiada syarat ON. Jika jadual A mempunyai 4 baris dan jadual B mempunyai 3 baris, hasilnya ialah 4 x 3 = 12 baris.
Ini dipanggil hasil darab Kartesian. Penemuduga bertanya tentangnya atas dua sebab: untuk menguji sama ada anda boleh menjana gabungan dengan sengaja, dan untuk melihat sama ada anda mengenali cantuman silang yang tidak disengajakan yang menyebabkan set hasil berkembang secara melampau.
Sintaks CROSS JOIN Eksplisit
Cara moden yang mudah dibaca untuk menulis hasil darab Cartesan ialah menggunakan kata kunci eksplisit CROSS JOIN. Perhatikan bahawa tiada klausa ON, yang menunjukkan tujuan dengan jelas kepada penyemak.
Di sini kita memadankan setiap saiz dengan setiap warna untuk membina matriks produk yang lengkap.
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;Sintaks Koma Lama
Anda masih akan melihat hasil darab Cartesan ditulis menggunakan koma dalam klausa FROM tanpa syarat cantuman. Ini ialah sintaks ANSI lama.
Ia menghasilkan keputusan yang sama tepat seperti CROSS JOIN, tetapi berbahaya: jika anda berniat menambah syarat cantuman tetapi terlupa, anda secara senyap-senyap mendapat cantuman silang dan bukannya ralat. Utamakan CROSS JOIN yang eksplisit.
-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;Contoh Lengkap: Membina Carta Saiz
Andaikan sebuah kedai menjual baju-T dalam 3 saiz dan 4 warna, serta mahukan satu baris bagi setiap varian yang mungkin, termasuk yang belum ada dalam stok. Cantuman silang menjana kesemua 12 kombinasi dalam satu langkah.
Ini ialah penggunaan yang disengajakan paling lazim: menghasilkan susunan pilihan yang lengkap.
SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;Menjana Susunan Kalendar
Satu lagi penggunaan temu duga klasik bagi CROSS JOIN ialah membina susunan lengkap supaya setiap kombinasi wujud walaupun data tiada.
Di sini kita mencantumkan setiap kedai dengan setiap tarikh supaya LEFT JOIN yang seterusnya kepada jualan menghasilkan satu baris bagi setiap kedai pada setiap hari, dengan jurang diisi dengan sifar. Cantuman silang menjamin tiada pasangan kedai-hari yang dilangkau.
SELECT st.store_id, d.day
FROM stores st
CROSS JOIN calendar d
WHERE d.day BETWEEN DATE '2024-01-01' AND DATE '2024-01-31';Ledakan Cartesan Tidak Sengaja
Bahaya yang diuji oleh penemuduga: anda mencantumkan dua jadual tetapi terlupa syarat cantuman. Bukannya menghasilkan ralat, pangkalan data dengan senang hati memulangkan setiap kombinasi.
Jika orders mempunyai 100,000 baris dan customers mempunyai 50,000, hasilnya ialah 5 bilion baris. Pertanyaan tergantung, memori membengkak, dan nombornya kelihatan melambung jauh. Mengenal pasti corak ini dalam semakan kod ialah petanda positif.
-- BUG: no join condition between the two tables
SELECT o.order_id, c.name
FROM orders o, customers c;
-- returns COUNT(orders) * COUNT(customers) rowsCara Mengesan CROSS JOIN Tidak Sengaja
Gejala yang penemuduga mahu anda nyatakan:
- Bilangan baris ialah kira-kira hasil darab saiz kedua-dua jadual, bukannya jumlahnya.
- Nilai agregat seperti
SUMmeningkat mengikut gandaan tetap. - Pelan pertanyaan menunjukkan Gelung Bersarang tanpa penapis cantuman.
Pembaikannya hampir selalu ialah syarat kesamaan ON atau WHERE yang hilang antara kedua-dua jadual.
CROSS JOIN berbanding INNER JOIN dengan ON yang Sentiasa Benar
CROSS JOIN adalah setara secara logik dengan INNER JOIN ... ON 1=1. Kedua-duanya menghasilkan hasil darab Cartesan penuh.
Sebenarnya, cantuman dalam hanyalah cantuman silang yang diikuti penapis berdasarkan syarat ON. Model mental ini menerangkan sebab syarat yang hilang menurunkan cantuman dalam menjadi cantuman silang.
-- These two queries return identical results
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b ON 1 = 1;Mencantumkan Jadual Nombor dengan CROSS JOIN
Satu helah berkuasa: lakukan cantuman silang dengan jadual kecil numbers atau generate_series untuk menggandakan baris dengan sengaja. Ini digunakan untuk mengembangkan satu baris menjadi banyak baris, contohnya menukarkan kuantiti kepada baris unit individu.
Di sini setiap baris produk diulang qty kali dengan mencantumkannya kepada siri dan mengekalkan nombor sehingga kuantiti tersebut.
SELECT p.product_id, n.n AS unit_number
FROM products p
CROSS JOIN generate_series(1, 100) AS n(n)
WHERE n.n <= p.qty;Prestasi dan Amalan Selamat
Oleh sebab hasil berkembang secara gandaan, jangan sekali-kali lakukan cantuman silang terhadap dua jadual besar. Pastikan sekurang-kurangnya satu sisi kecil (senarai saiz, kalendar kecil atau jadual nombor).
Dalam temu duga, nyatakan perkara ini dengan jelas: 'CROSS JOIN hanya selamat apabila satu sisinya kecil dan terhad; jika tidak, hasilnya sukar diurus.' Ayat itu menunjukkan pertimbangan, bukan sekadar pengetahuan sintaks.
Bila Perlu Menggunakan CROSS JOIN
Gunakan CROSS JOIN yang disengajakan apabila anda memerlukan setiap kombinasi dua set:
- Menjana matriks pilihan (saiz x warna).
- Melengkapkan siri masa (kedai x hari) sebelum
LEFT JOIN. - Mengembangkan baris melalui jadual nombor.
Jika anda tidak mahu setiap kombinasi, hampir pasti anda memerlukan cantuman dengan syarat ON sebagai gantinya.
Semakan Pantas
Uji pemahaman anda tentang hasil darab Cartesan.
Ringkasan: CROSS JOIN
Perkara penting:
- CROSS JOIN memadankan setiap baris kiri dengan setiap baris kanan; saiz hasil ialah hasil darab data masukan.
- Sintaks koma tanpa syarat menghasilkan hasil darab Cartesan yang sama, selalunya secara tidak sengaja.
- Gunakannya dengan sengaja untuk susunan kombinasi, melengkapkan siri masa dan mengembangkan baris melalui jadual nombor.
- Cantuman dalam dengan
ONyang hilang merosot secara senyap menjadi cantuman silang, iaitu pepijat ledakan yang disukai penemuduga.
Pelajari SQL dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “CROSS JOIN dan Hasil Cartesian” percuma?
Ya — teks penuh “CROSS JOIN dan Hasil Cartesian” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “CROSS JOIN dan Hasil Cartesian”?
Cantuman silang yang disengajakan untuk menjana gabungan serta cantuman tidak sengaja yang melambungkan bilangan baris Anda berlatih Persediaan Temu Duga SQL menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga SQL?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “CROSS JOIN dan Hasil Cartesian” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga SQL ini?
Ya. Setiap pelajaran Persediaan Temu Duga SQL menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- CROSS JOIN dan Hasil Cartesian
- SELF JOIN untuk Hierarki
- Membandingkan Baris Dalam Satu Jadual
- Memilih Jenis Cantuman yang Tepat