Cara Menggabungkan Keputusan Pelbagai Pertanyaan SQL Menggunakan Pernyataan Kesatuan

Cara Menggabungkan Keputusan Pelbagai Pertanyaan SQL Menggunakan Pernyataan Kesatuan

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

Keperluan Perisian dan Konvensyen Talian Perintah Linux
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 menggunakan Kesatuan 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