Pengenalan kepada pangkalan data bergabung dengan MariaDB dan MySQL Sertai contoh

Pengenalan kepada pangkalan data bergabung dengan MariaDB dan MySQL Sertai contoh

Objektif

Belajar untuk mengetahui jenis gabungan yang berbeza dan cara menggunakannya bekerja dengan pangkalan data MySQL atau MariaDB

Keperluan

  • Tiada keperluan tertentu

Konvensyen

  • # - Memerlukan arahan Linux yang diberikan dengan keistimewaan akar sama ada
    secara langsung sebagai pengguna akar atau dengan menggunakan sudo perintah
  • $ - Memandangkan perintah Linux dilaksanakan sebagai pengguna yang tidak berkepala biasa

Pengenalan

Dalam sistem pangkalan data relasi, data dianjurkan dalam jadual, yang disusun oleh baris dan lajur. Setiap baris adalah contoh entiti yang diwakili oleh jadual, dengan lajur yang digunakan sebagai sifatnya. Hubungan antara jadual ditubuhkan oleh penggunaan kunci asing, dan pernyataan yang kita dapat melakukan pertanyaan yang merangkumi pelbagai jadual yang dipanggil menyertai. Dalam tutorial ini kita akan melihat jenis gabungan yang berbeza yang tersedia semasa menggunakan mysql atau Mariadb.

Pangkalan data "movie_store"

Apa yang akan kita lakukan dalam tutorial ini, adalah untuk menghasilkan semula beberapa kes konkrit di mana gabungan dapat membantu kita mencapai apa yang kita mahukan.

Perkara pertama yang perlu dilakukan ialah membuat pangkalan data ujian. Katakan kami memiliki kedai filem dan kami perlu menjejaki tajuk yang kami ada: kami akan membuat pangkalan data "movie_store" dan jadual untuk menjadi tuan rumah maklumat mengenai pengarah filem:

MariaDB [(Tiada)]> Buat pangkalan data Movie_Store; MariaDB [(tiada)]> Gunakan Movie_Store; MariaDB [Movie_Store]> Buat Pengarah Jadual ( -> ID Smallint (1) Unsigned Not Null Auto_increment, -> Nama Varchar (35) tidak NULL, -> Tarikh Tarikh Lahir Tidak Null, -> Kunci Utama (ID)); 
Salinan

Berikut adalah perwakilan visual jadual yang baru saja kami buat:

MariaDB [Filem]> Huraikan Pengarah; +-----------+----------------------+------+-----+- --------+ ----------------+ | Bidang | Jenis | NULL | Kunci | Lalai | Tambahan | +-----------+----------------------+------+-----+- --------+ ----------------+ | id | Smallint (1) Unsigned | Tidak | Pri | NULL | AUTO_INCREMENT | | Nama | Varchar (35) | Tidak | | NULL | | | Tarikh lahir | Tarikh | Tidak | | NULL | | +-----------+----------------------+------+-----+---------+----------------+ 
Salinan

Pertama kita membuat pangkalan data Movie_Store, daripada kita "memasuki" dengan menggunakan Gunakan pernyataan, dan akhirnya membuat jadual pengarah. Seperti yang kita katakan sebelum ini, setiap baris dalam jadual mewakili "contoh" entiti yang diwakili oleh jadual itu sendiri, dalam hal ini pengarah filem.

Setiap pengarah mempunyai beberapa sifat yang diwakili oleh lajur jadual, jadi contohnya, setiap pengarah mempunyai nama dan hari jadi. Setiap baris mempunyai pengecam unik, yang merupakan nilai dalam lajur yang merupakan kunci utama meja.

Dalam contoh ini, kunci utama juga adalah apa yang disebut a Kunci pengganti. Kunci jenis ini adalah pengenal "buatan", dalam erti kata bahawa ia tidak berkaitan dengan sifat entiti (direktori dalam kes ini): ia tidak mempunyai makna semantik, dan ia dihasilkan dan digunakan oleh sistem untuknya kerja dalaman sendiri. Kuncinya dijana secara automatik, dan kerana ia mempunyai AUTO_INCREMENT harta, ia dimasukkan secara bertahap setiap kali kita membuat baris baru, jadi kita tidak perlu memasukkannya secara eksplisit:

MariaDB [Movie_Store]> Masukkan ke Pengarah ('Nama', 'Tanggakan') Nilai-> ('George Lucas', '1944-05-14'),-> ('George Romero', '1940-02-04' ),-> ('John McTiernan', '1951-01-08'),-> ('Rian Johnson', '1973-12-17'); 
Salinan

Jadual kami kini mengandungi empat pengarah:

+----+----------------+------------+ | id | Nama | Tarikh lahir | +----+----------------+------------+| 1 | George Lucas | 1944-05-14 | | 2 | George Romero | 1940-02-04 | | 3 | John McTiernan | 1951-01-08 | | 4 | Rian Johnson | 1973-12-17 | +----+----------------+------------+ 
Salinan

Setiap pengarah mempunyai satu atau lebih filem yang berkaitan dengannya: Bagaimana kita boleh mewakili mereka ? Kami tidak dapat menambah maklumat mengenai filem dalam jadual ini: ini bermakna mempunyai banyak data berulang: setiap kali kami menambah filem, kami akan mengulangi maklumat pengarahnya, dan ini akan mengerikan untuk mengatakan sekurang -kurangnya. Kita perlu membuat jadual khusus untuk menjadi tuan rumah maklumat filem, dan pada masa yang sama, kita perlu dapat membuat rujukan antara itu dan pengarahnya. Itulah kunci asing adalah untuk:



MariaDB [Movie_Store]> Buat Judul Jadual ( -> ID Smallint (1) Unsigned Not Null Auto_increment, -> Nama Varchar (35) Tidak Null, -> Release_Date Tarikh Tidak Null, -> Genre Varchar (10) Tidak Null, -> pengarah_id kecil (1) tidak ditandatangani tidak batal, -> kunci utama (id), -> pengarah rujukan utama (pengarah_id) (ID)); 
Salinan

Kami mencipta jadual seperti dahulu, menentukan kunci utama, dan menambah kekangan utama asing. Ini adalah bagaimana kita membolehkan hubungan antara dua jadual: pada dasarnya kita memaksakan bahawa untuk baris dimasukkan, nilai lajur pengarah_id mesti sesuai dengan nilai dalam lajur id jadual pengarah (yang unik, kerana ia adalah Kunci utama jadual). Dengan kata lain, setiap tajuk mesti merujuk kepada pengarah yang ada dalam pangkalan data kami, jika tidak, ralat akan dicetuskan: ini memastikan konsistensi.

Mari masukkan beberapa tajuk dalam jadual kami:

MariaDB [Movie_Store]> Masukkan ke Tajuk ('Nama', 'Release_date', 'Genre', 'Director_ID') Nilai-> ('Night of the Living Dead', '1968-10-01', 'Seram', 2 ),-> ('Revenge of the Sith', '2005-05-19', 'Space Opera', 1),-> ('Die Hard', '1988-07-15', 'Tindakan', 3) ; 
Salinan

Itu sahaja, kami mempunyai beberapa tajuk. Mula -mula kita memasukkan karya filem yang 'Malam The Living Dead', yang diarahkan oleh George Romero: Perhatikan bahawa 2 Dalam lajur Pengarah_ID sepadan dengan ID George Romero di Jadual Pengarah.

Menggunakan prinsip yang sama, kami memasukkan filem dari George Lucas (ID 1 dalam Jadual Pengarah), 'Revenge of the Sith', dan 'Die Hard', filem tindakan terkenal yang diarahkan oleh John McTiernan (ID 3 di Jadual Pengarah). Pada masa ini kami tidak mempunyai filem dari Rian Johnson: ada alasan untuk ini (selain dari fakta bahawa saya kecewa dengan Jedi yang terakhir), dan kami akan melihatnya kemudian. Sekarang kita menyediakan struktur pangkalan data yang sangat asas, kita boleh mula bercakap bergabung.

Berapa banyak jenis bergabung?

Nama yang berbeza digunakan untuk merujuk jenis gabungan yang sama, tetapi pada dasarnya kita ada dalaman dan luar bergabung. Yang pertama juga dipanggil Menyeberang menyertai atau semata -mata bergabung (Mereka adalah sinonim di MySQL - MariaDB). Kategori terakhir termasuk dibiarkan dan betul bergabung.



Inner bergabung

Sertai dalaman marilah kita sepadan dengan baris dalam satu jadual dengan baris yang lain. Persatuan ini boleh berdasarkan hubungan antara kedua -dua jadual atau boleh dibuat tanpa mengira: dalam kes ini semua baris jadual akan disertai dengan semua baris yang lain, menghasilkan apa yang dipanggil Produk Cartesian. Ini tidak masuk akal dalam contoh kita, tetapi mari kita tunjukkan:

MariaDB [Movie_Store]> Pilih * dari Pengarah Join Title; +----+----------------+------------+----+--------- -----------------+--------------+------------+---- ---------+ | id | Nama | Tarikh lahir | id | Nama | Release_date | Genre | Pengarah_id | +----+----------------+------------+----+--------- -----------------+--------------+------------+---- ---------+ | 1 | George Lucas | 1944-05-14 | 1 | Malam Kehidupan Mati | 1968-10-01 | Seram | 2 | | 1 | George Lucas | 1944-05-14 | 2 | Revenge of the Sith | 2005-05-19 | Angkasa Operasi | 1 | | 1 | George Lucas | 1944-05-14 | 3 | Mati keras | 1988-07-15 | Tindakan | 3 | | 2 | George Romero | 1940-02-04 | 1 | Malam Kehidupan Mati | 1968-10-01 | Seram | 2 | | 2 | George Romero | 1940-02-04 | 2 | Revenge of the Sith | 2005-05-19 | Angkasa Operasi | 1 | | 2 | George Romero | 1940-02-04 | 3 | Mati keras | 1988-07-15 | Tindakan | 3 | | 3 | John McTiernan | 1951-01-08 | 1 | Malam Kehidupan Mati | 1968-10-01 | Seram | 2 | | 3 | John McTiernan | 1951-01-08 | 2 | Revenge of the Sith | 2005-05-19 | Angkasa Operasi | 1 | | 3 | John McTiernan | 1951-01-08 | 3 | Mati keras | 1988-07-15 | Tindakan | 3 | | 4 | Rian Johnson | 1973-12-17 | 1 | Malam Kehidupan Mati | 1968-10-01 | Seram | 2 | | 4 | Rian Johnson | 1973-12-17 | 2 | Revenge of the Sith | 2005-05-19 | Angkasa Operasi | 1 | | 4 | Rian Johnson | 1973-12-17 | 3 | Mati keras | 1988-07-15 | Tindakan | 3 | +----+----------------+------------+----+--------------------------+--------------+------------+-------------+ 
Salinan

Seperti yang anda lihat, setiap baris satu jadual telah digabungkan dengan setiap baris yang lain, menghasilkan 12 baris.

Mari kita lihat kes penggunaan yang berbeza untuk bergabung. Katakan kami ingin memeriksa pangkalan data kami untuk memeriksa semua filem yang diarahkan oleh George Lucas yang kami ada di kedai. Untuk melaksanakan tugas ini, kita mesti menyekat gabungan dengan a Pada Fasal, supaya ia akan berdasarkan hubungan antara tajuk dan pengarah mereka:

Mariadb [Movie_Store]> Pilih Pengarah.nama, tajuk.Nama sebagai Movie_title dari Pengarah -> Sertai tajuk di Pengarah.id = tajuk.pengarah_id -> di mana pengarah.Nama = "George Lucas" 
Salinan

Berikut adalah hasil pertanyaan di atas:

+--------------+---------------------+ | Nama | Movie_title | +--------------+---------------------+| George Lucas | Revenge of the Sith | +--------------+---------------------+ 
Salinan

Menggunakan gabungan terhad, berdasarkan hubungan antara kedua -dua jadual, kami mendapati bahawa kami hanya mempunyai satu gelaran George Lucas di kedai: Revenge of the Sith. Bukan sahaja kami menyekat gabungan di dasar hubungan yang ada di antara kedua -dua jadual, tetapi kami terus membatasi pertanyaan kepada filem yang diarahkan oleh Lucas, menggunakan Di mana penyata. Jika kami telah meninggalkannya, pertanyaan itu akan menghasilkan jadual dengan semua pengarah sedia ada - surat -menyurat filem:

+----------------+--------------------------+ | Nama | Movie_title | +----------------+--------------------------+| George Lucas | Revenge of the Sith | | George Romero | Malam Kehidupan Mati | | John McTiernan | Mati keras | +----------------+--------------------------+ 
Salinan

Perhatikan bahawa Rian Johnson tidak termasuk dalam pertanyaan. Kenapa ini berlaku? Ini adalah ciri gabungan dalaman: mereka hanya menunjukkan baris di mana pertandingan wujud dalam kedua -dua jadual. Oleh kerana tidak ada surat -menyurat untuk Rian Johnson dalam jadual tajuk, kami tidak mempunyai hasil untuk pengarah ini.



Luar bergabung

Jenis gabungan yang lain yang kita ada adalah Luar bergabung. Kategori ini sendiri dibahagikan Kiri bergabung dan Kanan bergabung. Apakah perbezaannya dengan gabungan dalaman yang kita lihat di atas ? Sebaliknya dengan apa yang berlaku dengan gabungan dalaman, gabungan luar menunjukkan pertandingan walaupun surat -menyurat tidak wujud dalam kedua -dua jadual. Apabila berlaku, ia akan menunjukkan nilai null dalam lajur yang diminta (s) jadual di mana perlawanan tidak wujud.Ini boleh berguna, sebagai contoh, jika kita ingin tahu jika terdapat beberapa pengarah yang berkaitan tanpa filem. Dalam kes kita, kita sudah tahu ia berlaku, tetapi mari mengesahkannya menggunakan gabungan kiri:

Mariadb [Movie_Store]> Pilih Pengarah.nama, tajuk.Namakan sebagai Movie_title -> Dari Pengarah Kiri Bergabung Tajuk pada Tajuk.pengarah_id = pengarah.ID 
Salinan

Hasil pertanyaan:

+----------------+--------------------------+ | Nama | Movie_title | +----------------+--------------------------+| George Romero | Malam Kehidupan Mati | | George Lucas | Revenge of the Sith | | John McTiernan | Mati keras | | Rian Johnson | NULL | +----------------+--------------------------+ 
Salinan

Satu -satunya pengarah yang tidak mempunyai filem di kedai kami ialah Rian Johnson. Semasa menggunakan luar bergabung dengan pesanan di mana kami menentukan jadual itu penting. Contohnya, menggunakan a Kiri bergabung, Seperti yang kita lakukan di atas, apabila baris dari meja kiri (dalam kes ini pengarah) tidak sepadan dengan baris jadual kanan (tajuk), a Batal Nilai ditentukan dalam setiap lajur yang diminta yang terakhir; Apabila perlawanan dijumpai, sebaliknya, nilai itu dipaparkan sama seperti yang berlaku dengan gabungan dalaman.

A Sertai betul berfungsi sama, satu -satunya perbezaan ialah peranan jadual terbalik. Di sebelah kanan sertai semua baris meja yang betul yang tidak mempunyai padanan di meja kiri ditandakan dengan nilai null.

Harta luar ini bergabung dengan sangat berguna, tetapi ada kes di mana sedikit kekeliruan dapat timbul, terutama ketika jadual memiliki nilai null yang dibenarkan di beberapa lajurnya.

Tutorial Linux Berkaitan:

  • Pasang mysql di Ubuntu 20.04 LTS Linux
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Cara Memasang MySQL di Almalinux
  • Cara menukar kata laluan pengguna Mariadb
  • Pengenalan kepada enjin penyimpanan MySQL
  • Aplikasi Antara Muka Pengguna Grafik (GUI) untuk Mengurus ..
  • Ubuntu 20.04 WordPress dengan pemasangan Apache
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Pemasangan WordPress OpenLiteSpeed
  • Pemasangan ampache raspberry pi