Bagaimana Menggabungkan Hasil beberapa kueri SQL menggunakan pernyataan Union

Bagaimana Menggabungkan Hasil beberapa kueri SQL menggunakan pernyataan Union

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

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
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 gunakan Union 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