Bagaimana Menggabungkan Hasil beberapa kueri SQL menggunakan pernyataan Union

- 3261
- 790
- Luis Baumbach
Dalam artikel sebelumnya kami berbicara tentang berbagai jenis BERGABUNG
Kami dapat menggunakan dalam database Mariadb/MySQL. Kali ini, sebaliknya, kita melihat PERSATUAN
Pernyataan: Bagaimana cara kerjanya, bagaimana kita dapat menggunakannya untuk menggabungkan hasil kueri yang dijalankan pada tabel yang berbeda, dan apa kekhasannya.
Dalam tutorial ini Anda akan belajar:
- Cara Menggunakan Pernyataan Uni di Server Mariadb/MySQL
- Apa sifat pernyataan Union

Hasil dari pernyataan serikat pekerja
Persyaratan dan konvensi perangkat lunak yang digunakan
Kategori | Persyaratan, konvensi atau versi perangkat lunak yang digunakan |
---|---|
Sistem | OS-independen |
Perangkat lunak | Database mariadb/mysql yang berfungsi |
Lainnya | Pengetahuan Dasar Database Mariadb/MySQL |
Konvensi | # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa |
Pernyataan serikat pekerja
Itu PERSATUAN
Pernyataan mari kita menggabungkan hasil dari dua atau lebih pertanyaan. Saat saat melakukan gabungan, kami dapat menjalankan semacam tindakan atau mengambil informasi tambahan tentang basis hubungan yang ada antar tabel, saat menggunakan PERSATUAN
pernyataan, jika beberapa kondisi dipenuhi, baris yang dihasilkan dari kueri yang diluncurkan pada tabel yang berbeda, bahkan tidak terkait, dapat digabungkan. Dalam tutorial ini kita akan melihat contoh dunia dasar dan nyata tentang bagaimana kita bisa menggunakan PERSATUAN
Pernyataan dalam lingkungan Mariadb/MySQL.
Contoh dasar
Mari kita mulai dengan contoh yang sangat mendasar untuk memperkenalkan kekhasan PERSATUAN
penyataan. Misalkan kita memiliki dua tabel yang sama sekali tidak terkait: yang pertama disebut "film" dan yang kedua "warna". Di yang pertama, setiap baris berisi informasi tentang film: judul, genre dan tanggal rilis. Yang terakhir hanya menampung nama beberapa warna. Beginilah tampilan tabelnya:
+----+---------------+---------+--------------+ | ID | Judul | Genre | rilis_date | +----+---------------+---------+--------------+| 1 | Harapan Baru | Fantasi | 1977-05-25 | | 2 | The Godfather | Drama | 1972-05-24 | +----+---------------+---------+--------------++- -+ --------+ | ID | Nama | +----+--------+| 1 | Biru | | 2 | kuning | +----+--------+
Menyalin Dan ini adalah deskripsi mereka:
+--------------+-------------+------+-----+---------+----------------+ | Bidang | Ketik | Null | Kunci | Default | Ekstra | +--------------+-------------+------+-----+------- -+ ----------------+ | ID | int (2) | Tidak | Pri | Null | auto_increment | | Judul | Varchar (20) | Tidak | | Null | | | Genre | Varchar (20) | Tidak | | Null | | | rilis_date | Tanggal | Tidak | | Null | | +--------------+-------------+------+-----+------- -+----------------++-------+-------------+------+ -----+---------+----------------+| Bidang | Ketik | Null | Kunci | Default | Ekstra | +-------+-------------+------+-----+---------+---- ------------+ | ID | int (2) | Tidak | Pri | Null | auto_increment | | Nama | Varchar (10) | Tidak | | Null | | +-------+-------------+------+-----+---------+----------------+
Menyalin Seperti yang dikatakan sebelumnya, dua tabel ini sama sekali tidak memiliki hubungan satu sama lain. Dengan menggunakan PERSATUAN
Pernyataan, bagaimanapun, kita dapat menggabungkan hasil dari dua kueri terpisah yang diluncurkan pada mereka. Ayo lari:
Pilih Judul, Genre dari Film Union SELECT ID, NAMA DARI WARNA;
Perintah di atas mengembalikan hasil berikut:
+---------------+---------+ | Judul | Genre | +---------------+---------+| Harapan Baru | Fantasi | | The Godfather | Drama | | 1 | Biru | | 2 | kuning | +---------------+---------+
Menyalin Mari kita jelaskan. Kami melakukan dua berbeda PILIH
Kueri: Di yang pertama kami memilih nilai kolom "judul" dan "genre" untuk setiap baris di tabel film. Di yang kedua, sebagai gantinya, kami memilih kolom "ID" dan "NAME" dari tabel "Warna", sekali lagi tanpa menggunakan filter apa pun.
Bahkan jika kedua tabel itu sama sekali tidak terkait, karena kami menggunakan PERSATUAN
Pernyataan antara dua pertanyaan, baris yang dikembalikan oleh masing -masing digabungkan: hasilnya adalah tabel yang dapat Anda lihat di atas.
Bahkan jika dalam sebagian besar kasus dunia nyata kolom yang dipilih dari tabel yang terlibat mungkin akan memiliki tipe data yang sama, dalam contoh konyol di atas, kita dapat dengan jelas melihat bagaimana PERSATUAN
terjadi bahkan jika kolom dari dua tabel asli berisi tipe data yang berbeda: kedua kolom yang dipilih dari tabel "film" adalah dari Varchar
tipe data, sedangkan kolom "id" dari tabel "warna" adalah tipe Int
. Ini dimungkinkan karena database secara otomatis melakukan konversi data yang diperlukan.
Hal lain yang sangat penting untuk diperhatikan adalah bahwa kolom di PERSATUAN
hasilnya, mewarisi nama mereka dari yang dipilih di Pertama
permintaan, yang di sebelah kiri PERSATUAN
Kata kunci: "judul" dan "genre". Melihat contoh di atas mungkin akan membuat Anda bertanya apa PERSATUAN
Pernyataan dapat berguna untuk skenario kehidupan nyata: mari kita lihat contoh lain.
Kasus sepak bola fantasi
Beberapa waktu yang lalu saya terlibat dalam penciptaan aplikasi sepak bola fantasi kecil. Dalam database aplikasi, ada meja yang disebut "Club", yang menjadi tuan rumah informasi tentang klub fantasi yang terlibat dalam kompetisi. Ini adalah ekstraknya:
+----+-----------------+--------+ | ID | Nama | Anggaran | +----+-----------------+--------+| 1 | Havana blu | 4 | | 2 | Longobarda | 4 | | 3 | Siderno nyata | 0 | | 4 | Tim Gempa Bumi | 66 | | 5 | Kalapagos | 33 | | 6 | Cantasant | 5 | | 7 | F.C. Mojito | 0 | | 8 | Apoel Nicotina | 1 | | 9 | Dharma | 0 | | 10 | Nyata 1908 | 12 | +----+-----------------+--------+
Menyalin Dalam proyek yang sama ada juga panggilan meja "Kalender", di mana setiap baris mewakili kecocokan antara dua klub yang tercantum di atas. Karena kami memiliki 10 klub, setiap hari kejuaraan menjadi tuan rumah total 5 pertandingan. Sebagai contoh, berikut adalah ekstrak dari semua pertandingan dari empat hari pertama:
+----+-----+------+-------------+-------+--------------+ | ID | Hari | tuan rumah | host_scores | Tamu | 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 | +----+-----+------+-------------+-------+--------------+
Menyalin Kolom pertama dari setiap baris berisi a Kunci pengganti
digunakan sebagai kunci utama
untuk meja. Yang kedua berisi bilangan bulat yang mewakili hari pertandingan adalah bagian dari. Itu tuan rumah
, host_scores
, Dan tamu
, Guest_scores
Kolom berisi, masing -masing, ID dan skor klub yang dimainkan sebagai tuan rumah dan yang dimainkan sebagai tamu.
Sekarang, katakanlah kami ingin menghasilkan peringkat di mana semua klub terdaftar dalam urutan menurun di pangkalan total skor yang mereka lakukan pada empat hari kejuaraan pertama. Jika setiap ID klub terdaftar hanya dalam kolom, katakanlah "host", operasinya akan sangat mudah: kami hanya akan menghitung jumlah skor menggunakan JUMLAH()
fungsi agregat, dan mengelompokkan hasilnya dengan ID klub, menampilkannya dalam urutan menurun:
Pilih host, sum (host_scores) sebagai total_scores dari grup kalender berdasarkan pesanan host oleh total_scores desc
Menyalin Namun, karena setiap hari kejuaraan klub bermain sebagai tuan rumah dan sebagai tamu, kueri di atas tidak akan mengembalikan hasil yang kami inginkan, tetapi akan menghasilkan total skor tim termasuk hanya skor yang dibuat ketika dimainkan sebagai tuan rumah (atau sebagai alternatif, alternatif sebagai tamu).
Itulah satu kasus di mana PERSATUAN
Pernyataan bisa berguna: kita dapat melakukan dua kueri terpisah, satu melibatkan kolom "host" dan "host_scores", dan yang lain yang melibatkan "tamu" dan "tamu"; Kami kemudian dapat menggunakan PERSATUAN
Pernyataan untuk menambahkan baris yang dihasilkan dari kueri kedua ke yang dikembalikan oleh yang pertama, dan akhirnya menghitung nilai agregat. Selain itu, kami dapat melakukan gabungan dengan tabel "klub", untuk membuat nama setiap klub muncul di hasilnya. Inilah kueri lengkapnya:
Pilih Data.Team_id, klub.Name, Sum (Skor) Sebagai Total_Scores dari (Pilih Host As Team_id, Host_Scores sebagai skor dari Calendar Union All Pilih Tamu, Guest_Scores dari Kalender) sebagai data bergabung dengan klub di klub di klub.id = data.Team_id Group dengan data.Pesanan Team_id oleh Total_Scores Desc;
Menyalin Inilah hasil dari kueri:
+---------+-----------------+--------------+ | Team_id | Nama | Total_scores | +---------+-----------------+--------------+| 6 | Cantasant | 308 | | 4 | Tim Gempa Bumi | 300.5 | | 8 | Apoel Nicotina | 290 | | 2 | Longobarda | 286.5 | | 3 | Siderno nyata | 282 | | 9 | Dharma | 282 | | 7 | F.C. Mojito | 282 | | 1 | Havana blu | 280.5 | | 5 | Kalapagos | 272 | | 10 | Nyata 1908 | 270 | +---------+-----------------+--------------+
Menyalin Seperti yang Anda lihat, pada akhir Hari Kejuaraan Keempat, tim "Cantasant" adalah orang dengan skor tertinggi. Hal lain yang perlu diperhatikan dalam kueri di atas, adalah penggunaan SEMUA
kata kunci bersama dengan PERSATUAN
: Itu perlu karena saat PERSATUAN
Pernyataan digunakan, secara default, baris duplikat dihapus; jika Union All
digunakan, sebaliknya, baris dipertahankan.
Kesimpulan
Dalam tutorial ini kami belajar untuk mengetahui PERSATUAN
Pernyataan dalam database Mariadb/MySQL. Kami melihat contoh dasar untuk menunjukkan beberapa sifat pernyataan dan contoh dunia nyata, diambil dari proyek nyata. Untuk meringkas, karakteristik a PERSATUAN
penyataan:
- Di tabel yang dihasilkan, nama kolom yang dipilih dalam kueri pertama digunakan;
- Jumlah kolom harus sama di semua kueri;
- Jenis data kolom dapat berbeda, database akan melakukan konversi;
- Secara default, saat
PERSATUAN
Pernyataan digunakan, baris duplikat dalam hasil dihapus: untuk menghindari ini dapat kita gunakanUnion All
;
Ambil lebih jauh pengetahuan Anda tentang pernyataan serikat pekerja, Anda dapat melihat dokumentasi resmi.
Tutorial Linux Terkait:
- Instal MySQL di Ubuntu 20.04 LTS Linux
- Cara menginstal mysql di almalinux
- Ubuntu 20.04 WordPress dengan Instalasi Apache
- Hal -hal yang harus diinstal pada ubuntu 20.04
- Pengantar Mesin Penyimpanan MySQL
- Instalasi ampache raspberry pi
- Pengantar Otomatisasi Linux, Alat dan Teknik
- Cara membuat tumpukan lampu berbasis Docker menggunakan Docker di…
- Cara mengubah kata sandi pengguna mariadb
- Cara bertahan data ke postgresql di java
- « PostgreSQL Performance Tuning Untuk Eksekusi Kueri Lebih Cepat
- Pengantar pemicu mariadb dan mysql »