Cara Menggabungkan Keputusan Pelbagai Pertanyaan SQL Menggunakan Pernyataan Kesatuan

- 1247
- 359
- Daryl Wilderman
Dalam artikel sebelumnya kita bercakap mengenai pelbagai jenis Menyertai
Kita boleh menggunakan dalam pangkalan data MariaDB/MySQL. Kali ini, sebaliknya, kita melihat Kesatuan
Kenyataan: Bagaimana ia berfungsi, bagaimana kita boleh menggunakannya untuk menggabungkan hasil pertanyaan yang dijalankan di meja yang berbeza, dan apakah keanehannya.
Dalam tutorial ini anda akan belajar:
- Cara Menggunakan Pernyataan Union dalam pelayan MariaDB/MySQL
- Apakah sifat pernyataan kesatuan

Hasil penyataan kesatuan
Keperluan perisian dan konvensyen yang digunakan
Kategori | Keperluan, konvensyen atau versi perisian yang digunakan |
---|---|
Sistem | OS-bebas |
Perisian | Pangkalan data MariaDB/MySQL yang bekerja |
Yang lain | Pengetahuan asas pangkalan data MariaDB/MySQL |
Konvensyen | # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah$ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak |
Pernyataan kesatuan
The Kesatuan
pernyataan marilah kita menggabungkan hasil dua atau lebih pertanyaan. Semasa melakukan gabungan, kami dapat melaksanakan beberapa jenis tindakan atau mendapatkan maklumat tambahan mengenai asas hubungan yang ada di antara jadual, semasa menggunakan Kesatuan
pernyataan, jika beberapa syarat dipenuhi, baris yang terhasil daripada pertanyaan yang dilancarkan pada jadual yang berbeza, bahkan yang tidak berkaitan, boleh digabungkan. Dalam tutorial ini kita akan melihat contoh asas dan dunia nyata bagaimana kita boleh menggunakannya Kesatuan
pernyataan dalam persekitaran MariaDB/MySQL.
Contoh asas
Mari kita mulakan dengan contoh yang sangat asas untuk memperkenalkan keunikan Kesatuan
penyata. Katakan kami mempunyai dua jadual yang sama sekali tidak berkaitan: yang pertama dipanggil "Filem" dan yang kedua "Warna". Pada bekas, setiap baris mengandungi maklumat mengenai filem: tajuk, genre dan tarikh pelepasan. Tuan rumah yang terakhir hanya nama beberapa warna. Inilah caranya jadual seperti:
+----+---------------+---------+--------------+ | id | Tajuk | Genre | Release_date | +----+---------------+---------+--------------+| 1 | Harapan Baru | Fantasy | 1977-05-25 | | 2 | The Godfather | Drama | 1972-05-24 | +----+---------------+---------+--------------++-- -+ --------+ | id | Nama | +----+--------+| 1 | BLUE | | 2 | kuning | +----+--------+
Salinan Dan ini adalah keterangan mereka:
+--------------+-------------+------+-----+---------+----------------+ | Bidang | Jenis | NULL | Kunci | Lalai | Tambahan | +--------------+-------------+------+-----+------- -+ ----------------+ | id | int (2) | Tidak | Pri | NULL | AUTO_INCREMENT | | Tajuk | Varchar (20) | Tidak | | NULL | | | Genre | Varchar (20) | Tidak | | NULL | | | Release_date | Tarikh | Tidak | | NULL | | +--------------+-------------+------+-----+------- -+----------------++-------+-------------+------+ -----+---------+----------------+| Bidang | Jenis | NULL | Kunci | Lalai | Tambahan | +-------+-------------+------+-----+---------+---- ------------+ | id | int (2) | Tidak | Pri | NULL | AUTO_INCREMENT | | Nama | Varchar (10) | Tidak | | NULL | | +-------+-------------+------+-----+---------+----------------+
Salinan Seperti yang dikatakan sebelum ini, dua jadual ini sama sekali tidak mempunyai hubungan antara satu sama lain. Dengan menggunakan Kesatuan
Pernyataan, bagaimanapun, kami dapat menggabungkan hasil dua pertanyaan berasingan yang dilancarkan pada mereka. Jom lari:
Pilih Tajuk, Genre dari Movie Union Select ID, Nama Dari Warna;
Perintah di atas mengembalikan hasil berikut:
+---------------+---------+ | Tajuk | Genre | +---------------+---------+| Harapan Baru | Fantasy | | The Godfather | Drama | | 1 | BLUE | | 2 | kuning | +---------------+---------+
Salinan Mari kita jelaskan. Kami melakukan dua yang berbeza Pilih
Pertanyaan: Pada yang pertama kami memilih nilai lajur "tajuk" dan "genre" untuk setiap baris dalam jadual filem. Pada yang kedua, sebaliknya, kami memilih lajur "id" dan "nama" dari jadual "warna", sekali lagi tanpa menggunakan penapis.
Walaupun kedua -dua jadual itu tidak berkaitan sepenuhnya, kerana kami menggunakan Kesatuan
pernyataan antara kedua -dua pertanyaan, baris yang dikembalikan oleh masing -masing digabungkan: hasilnya adalah jadual yang dapat anda lihat di atas.
Walaupun dalam kebanyakan kes dunia nyata lajur yang dipilih dari jadual yang terlibat mungkin akan mempunyai jenis data yang sama, dalam contoh bodoh di atas, kita dapat melihat dengan jelas bagaimana Kesatuan
berlaku walaupun lajur dua jadual asal mengandungi jenis data yang berbeza: kedua -dua lajur yang dipilih dari jadual "Filem" adalah dari Varchar
Jenis Data, manakala lajur "ID" jadual "Warna" adalah jenis Int
. Ini mungkin kerana pangkalan data secara automatik melakukan penukaran data yang diperlukan.
Satu lagi perkara yang sangat penting untuk diperhatikan ialah lajur di Kesatuan
hasilnya, mewarisi nama mereka dari yang dipilih di Pertama
pertanyaan, yang di sebelah kiri Kesatuan
Kata kunci: "Tajuk" dan "Genre". Melihat contoh di atas mungkin akan membuat anda bertanya apa Kesatuan
pernyataan boleh berguna untuk dalam senario kehidupan sebenar: mari kita lihat contoh lain.
Kes bola sepak fantasi
Beberapa ketika dahulu saya terlibat dalam penciptaan aplikasi bola sepak fantasi kecil. Dalam pangkalan data aplikasi, terdapat jadual yang dipanggil "Club", yang menganjurkan maklumat mengenai kelab -kelab fantasi yang terlibat dalam pertandingan. Ini adalah ekstrak daripadanya:
+----+-----------------+--------+ | id | Nama | Bajet | +----+-----------------+--------+| 1 | Havana Blu | 4 | | 2 | Longobarda | 4 | | 3 | Siderno Real | 0 | | 4 | Pasukan gempa | 66 | | 5 | Kalapagos | 33 | | 6 | Cantasant | 5 | | 7 | F.C. Mojito | 0 | | 8 | Apoel Nicotina | 1 | | 9 | Dharma | 0 | | 10 | Real 1908 | 12 | +----+-----------------+--------+
Salinan Dalam projek yang sama terdapat juga panggilan meja "kalendar", di mana setiap baris mewakili pertandingan antara dua kelab yang disenaraikan di atas. Oleh kerana kami mempunyai 10 kelab, setiap hari kejohanan menjadi tuan rumah sebanyak 5 perlawanan. Sebagai contoh, di sini adalah ekstrak semua perlawanan empat hari pertama:
+----+-----+------+-------------+-------+--------------+ | id | Hari | Host | host_scores | Tetamu | Guest_scores | +----+-----+------+-------------+-------+--------- -----+ | 1 | 1 | 2 | 75.5 | 8 | 67 | | 2 | 1 | 4 | 80 | 6 | 77 | | 3 | 1 | 7 | 63 | 9 | 71.5 | | 4 | 1 | 3 | 79.5 | 5 | 68 | | 5 | 1 | 10 | 64 | 1 | 72.5 | | 6 | 2 | 5 | 66.5 | 10 | 65.5 | | 7 | 2 | 9 | 82 | 3 | 62.5 | | 8 | 2 | 6 | 83 | 7 | 69.5 | | 9 | 2 | 8 | 77 | 4 | 79.5 | | 10 | 2 | 1 | 67 | 2 | 81.5 | | 11 | 3 | 4 | 73 | 2 | 58 | | 12 | 3 | 7 | 70.5 | 8 | 75.5 | | 13 | 3 | 3 | 66.5 | 6 | 88 | | 14 | 3 | 10 | 74.5 | 9 | 60.5 | | 15 | 3 | 5 | 68.5 | 1 | 72.5 | | 16 | 4 | 9 | 68 | 5 | 69 | | 17 | 4 | 6 | 60 | 10 | 66 | | 18 | 4 | 8 | 70.5 | 3 | 73.5 | | 19 | 4 | 2 | 71.5 | 7 | 79 | | 20 | 4 | 1 | 68.5 | 4 | 68 | +----+-----+------+-------------+-------+--------------+
Salinan Lajur pertama setiap baris mengandungi a Kunci pengganti
digunakan sebagai kunci utama
untuk jadual. Yang kedua mengandungi integer yang mewakili hari perlawanan adalah sebahagian daripada. The Tuan rumah
, host_scores
, dan tetamu
, Guest_scores
Lajur mengandungi, masing -masing, ID dan markah kelab yang dimainkan sebagai tuan rumah dan kelab yang dimainkan sebagai tetamu.
Sekarang, katakan kami ingin menjana pangkat di mana semua kelab disenaraikan dalam urutan menurun di pangkalan jumlah skor yang mereka lakukan pada empat hari kejohanan pertama. Sekiranya setiap ID kelab disenaraikan hanya dalam lajur, katakan "tuan rumah", operasi itu akan sangat mudah: kami hanya akan mengira jumlah skor menggunakan Jumlah ()
Fungsi agregat, dan kumpulan keputusan oleh ID kelab, memaparkannya dalam urutan menurun:
Pilih Hos, Sum (Host_Scores) sebagai total_scores dari kumpulan kalendar dengan pesanan tuan rumah oleh total_scores desc
Salinan Walau bagaimanapun, kerana setiap hari kejohanan kelab memainkan alternatif sebagai tuan rumah dan sebagai tetamu, pertanyaan di atas tidak akan mengembalikan hasil yang kami ingin sebagai tetamu).
Itu satu kes di mana Kesatuan
Kenyataan boleh menjadi berguna: Kami boleh melakukan dua pertanyaan berasingan, yang melibatkan lajur "host" dan "host_scores", dan yang lain yang melibatkan "tetamu" dan "tetamu_scores"; kita kemudian boleh menggunakan Kesatuan
pernyataan untuk menambahkan baris yang terhasil daripada pertanyaan kedua kepada yang dikembalikan oleh yang pertama, dan akhirnya mengira nilai agregat. Di samping. Inilah pertanyaan lengkap:
Pilih data.Team_id, kelab.nama, jumlah (skor) sebagai total_scores dari (pilih tuan rumah sebagai Team_ID, host_scores sebagai skor dari kesatuan kalendar semua tetamu pilih, tamu_scores dari kalendar) sebagai data menyertai kelab di kelab di kelab di kelab di kelab di kelab di kelab di kelab di kelab di kelab di kelab.id = data.Kumpulan Team_ID mengikut data.Pesanan Team_id oleh total_scores desc;
Salinan Inilah hasil pertanyaan:
+---------+-----------------+--------------+ | Team_id | Nama | total_scores | +---------+-----------------+--------------+| 6 | Cantasant | 308 | | 4 | Pasukan gempa | 300.5 | | 8 | Apoel Nicotina | 290 | | 2 | Longobarda | 286.5 | | 3 | Siderno Real | 282 | | 9 | Dharma | 282 | | 7 | F.C. Mojito | 282 | | 1 | Havana Blu | 280.5 | | 5 | Kalapagos | 272 | | 10 | Real 1908 | 270 | +---------+-----------------+--------------+
Salinan Seperti yang anda lihat, pada akhir hari kejohanan keempat, pasukan "cantasant" adalah yang mempunyai skor tertinggi. Perkara lain yang perlu diperhatikan dalam pertanyaan di atas, adalah penggunaan SEMUA
kata kunci bersama dengan Kesatuan
: ia perlu kerana ketika Kesatuan
Pernyataan digunakan, secara lalai, baris pendua dikeluarkan; jika Kesatuan Semua
digunakan, sebaliknya, baris dipelihara.
Kesimpulan
Dalam tutorial ini, kami belajar mengetahui Kesatuan
Penyata dalam pangkalan data MariaDB/MySQL. Kami melihat contoh asas untuk menunjukkan beberapa sifat pernyataan dan contoh dunia nyata, diambil dari projek sebenar. Untuk meringkaskan, ciri -ciri a Kesatuan
Penyata:
- Dalam jadual yang dihasilkan, nama lajur yang dipilih dalam pertanyaan pertama digunakan;
- Bilangan lajur mestilah sama dalam semua pertanyaan;
- Jenis data lajur boleh berbeza, pangkalan data akan melakukan penukaran;
- Secara lalai, apabila
Kesatuan
penyataan digunakan, baris pendua dalam hasil dikeluarkan: Untuk mengelakkan ini kita boleh menggunakanKesatuan Semua
;
Lagi mengembangkan pengetahuan anda mengenai pernyataan kesatuan, anda boleh melihat dokumentasi rasmi.
Tutorial Linux Berkaitan:
- Pasang mysql di Ubuntu 20.04 LTS Linux
- Cara Memasang MySQL di Almalinux
- Ubuntu 20.04 WordPress dengan pemasangan Apache
- Perkara yang hendak dipasang di Ubuntu 20.04
- Pengenalan kepada enjin penyimpanan MySQL
- Pemasangan ampache raspberry pi
- Pengenalan kepada Automasi, Alat dan Teknik Linux
- Cara membuat timbunan lampu berasaskan Docker menggunakan Docker pada ..
- Cara menukar kata laluan pengguna Mariadb
- Cara Mempertahankan Data ke PostgreSQL di Java
- « Penalaan Prestasi PostgreSQL untuk Pelaksanaan Pertanyaan Lebih Cepat
- Pengenalan kepada MariaDB dan MySQL Pencetus »