Rumah >pangkalan data >SQL >Bagaimanakah saya menggunakan Union, Intersect, dan kecuali pengendali dalam SQL?

Bagaimanakah saya menggunakan Union, Intersect, dan kecuali pengendali dalam SQL?

James Robert Taylor
James Robert Taylorasal
2025-03-18 11:08:25316semak imbas

Bagaimanakah saya menggunakan Union, Intersect, dan kecuali pengendali dalam SQL?

Dalam SQL, UNION , INTERSECT , dan EXCEPT pengendali digunakan untuk menggabungkan hasil dua atau lebih pernyataan pilih. Setiap pengendali mempunyai fungsi yang unik dan menggunakan kes:

  1. Kesatuan : Pengendali ini digunakan untuk menggabungkan set keputusan dua atau lebih pernyataan pilih ke dalam satu set keputusan. Ia menghilangkan baris pendua dari hasil akhir melainkan jika UNION ALL digunakan, yang termasuk pendua. Struktur pernyataan pilih mestilah sama, bermakna mereka perlu mempunyai bilangan lajur yang sama, dan lajur yang sepadan mesti mempunyai jenis data yang serasi.

    Sintaks :

     <code class="sql">SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2;</code>
  2. Intersect : Operator ini hanya mengembalikan baris yang biasa dengan set keputusan kedua -dua pernyataan pilih. Seperti UNION , pernyataan pilih mesti mempunyai struktur yang sama.

    Sintaks :

     <code class="sql">SELECT column1, column2 FROM table1 INTERSECT SELECT column1, column2 FROM table2;</code>
  3. Kecuali : Juga dikenali sebagai MINUS dalam beberapa sistem pangkalan data, pengendali ini mengembalikan semua baris dari pernyataan pilih pertama yang tidak hadir dalam pernyataan Pilih kedua. Sekali lagi, pernyataan pilih mestilah bersesuaian secara struktur.

    Sintaks :

     <code class="sql">SELECT column1, column2 FROM table1 EXCEPT SELECT column1, column2 FROM table2;</code>

Apakah perbezaan utama antara kesatuan, bersilang, dan kecuali dalam operasi SQL?

Perbezaan utama antara pengendali ini adalah berdasarkan cara mereka mengendalikan data dari pelbagai penyataan pilih:

  • Kesatuan menggabungkan set keputusan penyata pilih dan membuang baris pendua (kecuali UNION ALL digunakan). Ia digunakan apabila anda ingin mengagregat data dari sumber yang berbeza di mana penyertaan pendua harus dihapuskan.
  • Intersect mengembalikan hanya baris yang muncul dalam kedua -dua set hasil pernyataan pilih. Ini berguna apabila anda perlu mencari data biasa antara dua set rekod.
  • Kecuali mengembalikan semua baris unik dari pernyataan pilih pertama yang tidak dijumpai dalam set hasil pernyataan pilih kedua. Pengendali ini berguna untuk mencari rekod unik dalam satu set yang tidak wujud di tempat lain.

Ringkasnya, UNION menggabungkan dan berpotensi de-duplikasi data, INTERSECT mencari data biasa, dan EXCEPT mengasingkan data unik dari satu set yang tidak dijumpai di pihak yang lain.

Bolehkah anda memberikan contoh apabila menggunakan kesatuan, bersilang, atau kecuali dalam pertanyaan SQL?

Contoh Kesatuan : Katakan anda menguruskan pangkalan data dengan dua jadual, employees dan contractors , kedua -duanya mengandungi nama dan jabatan. Jika anda mahukan senarai lengkap semua kakitangan di syarikat tanpa pendua, anda boleh menggunakan UNION :

 <code class="sql">SELECT name, department FROM employees UNION SELECT name, department FROM contractors;</code>

Contoh Intersect : Bayangkan anda menjejaki kehadiran di dua acara yang berbeza, disimpan dalam event1_attendees dan event2_attendees . Untuk mengetahui siapa yang menghadiri kedua -dua acara, anda boleh menggunakan INTERSECT :

 <code class="sql">SELECT attendee_id FROM event1_attendees INTERSECT SELECT attendee_id FROM event2_attendees;</code>

Kecuali Contoh : Jika anda ingin mencari pelanggan yang mempunyai akaun tetapi tidak pernah membuat pesanan, dan ini disimpan dalam jadual customers dan orders masing -masing, anda boleh menggunakan EXCEPT :

 <code class="sql">SELECT customer_id FROM customers EXCEPT SELECT customer_id FROM orders;</code>

Bagaimanakah saya dapat mengoptimumkan pertanyaan SQL saya yang menggunakan kesatuan, bersilang, atau kecuali pengendali?

Mengoptimumkan pertanyaan yang menggunakan UNION , INTERSECT , atau EXCEPT dapat meningkatkan prestasi dengan ketara. Berikut adalah beberapa petua:

  1. Gunakan kesatuan semua bukan kesatuan jika mungkin : Jika anda tahu bahawa set hasil gabungan tidak mengandungi pendua, gunakan UNION ALL bukannya UNION . UNION ALL lebih cepat kerana ia tidak perlu menyemak dan mengeluarkan pendua.
  2. Kurangkan bilangan lajur dalam pernyataan pilih : Hanya pilih lajur yang anda perlukan. Lajur yang lebih sedikit bermakna kurang data untuk memproses dan memindahkan.
  3. Sapukan di mana klausa sebelum menggunakan pengendali : Sapukan apa -apa penapisan atau WHERE klausa dalam pernyataan SELECT individu sebelum menggunakan UNION , INTERSECT , atau EXCEPT . Ini mengurangkan jumlah data yang diproses oleh pengendali ini.
  4. Gunakan indeks : Pastikan lajur yang digunakan dalam pernyataan SELECT diindeks dengan betul. Indeks boleh mempercepatkan pengambilan data dengan ketara, terutamanya dalam jadual besar.
  5. Elakkan menggunakan yang berbeza tidak perlu : Jika anda menggunakan UNION dan bukannya UNION ALL apabila anda tidak perlu mengeluarkan pendua, ia tidak boleh melambatkan pertanyaan anda. Sentiasa menilai sama ada DISTINCT diperlukan.
  6. Mengoptimumkan setiap pernyataan pilih secara berasingan : Oleh kerana kecekapan hasil gabungan bergantung kepada kecekapan setiap pernyataan SELECT komponen, mengoptimumkan setiap bahagian pertanyaan secara individu.

Dengan mengikuti strategi pengoptimuman ini, anda dapat meningkatkan prestasi pertanyaan SQL anda yang menggunakan UNION , INTERSECT , atau EXCEPT pengendali.

Atas ialah kandungan terperinci Bagaimanakah saya menggunakan Union, Intersect, dan kecuali pengendali dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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