Tutorial BERSAMA MySQL: INNER, OUTER, LEFT, RIGHT, CROSS

Anonim

Apa itu BERSAMA?

Bergabung membantu mendapatkan data dari dua atau lebih jadual pangkalan data. Jadual saling berkaitan menggunakan kunci primer dan asing.

Nota: JOIN adalah topik yang paling disalahfahami di kalangan SQL yang cenderung. Demi kesederhanaan dan kemudahan memahami, kami akan menggunakan Pangkalan Data baru untuk mempraktikkan sampel. Seperti yang ditunjukkan di bawah

ID nama pertama nama terakhir filem_id
1 Adam Smith 1
2 Ravi Kumar 2
3 Susan Davidson 5
4 Jenny Adrianna 8
6 Lee Pong 10
ID tajuk kategori
1 KASUT ASSASSIN: EMBER Animasi
2 Keluli Sebenar (2012) Animasi
3 Alvin dan Chipmunks Animasi
4 Pengembaraan Tin Tin Animasi
5 Selamat (2012) Tindakan
6 Rumah Selamat (2012) Tindakan
7 GIA 18+
8 Tarikh Akhir 2009 18+
9 Gambar Kotor 18+
10 Marley dan saya Percintaan

Jenis bergabung

Silang BERGABUNG

Cross JOIN adalah bentuk gabungan yang paling mudah yang memadankan setiap baris dari satu jadual pangkalan data ke semua baris yang lain.

Dengan kata lain, ini memberi kita kombinasi setiap baris jadual pertama dengan semua rekod dalam jadual kedua.

Andaikan kita mahu mendapatkan semua rekod ahli daripada semua rakaman filem, kita boleh menggunakan skrip yang ditunjukkan di bawah untuk mendapatkan hasil yang kita inginkan.

SELECT * FROM `movies` CROSS JOIN `members`

Melaksanakan skrip di atas di meja kerja MySQL memberikan hasil berikut.

 
id title id first_name last_name movie_id
1 ASSASSIN'S CREED: EMBERS Animations 1 Adam Smith 1
1 ASSASSIN'S CREED: EMBERS Animations 2 Ravi Kumar 2
1 ASSASSIN'S CREED: EMBERS Animations 3 Susan Davidson 5
1 ASSASSIN'S CREED: EMBERS Animations 4 Jenny Adrianna 8
1 ASSASSIN'S CREED: EMBERS Animations 6 Lee Pong 10
2 Real Steel(2012) Animations 1 Adam Smith 1
2 Real Steel(2012) Animations 2 Ravi Kumar 2
2 Real Steel(2012) Animations 3 Susan Davidson 5
2 Real Steel(2012) Animations 4 Jenny Adrianna 8
2 Real Steel(2012) Animations 6 Lee Pong 10
3 Alvin and the Chipmunks Animations 1 Adam Smith 1
3 Alvin and the Chipmunks Animations 2 Ravi Kumar 2
3 Alvin and the Chipmunks Animations 3 Susan Davidson 5
3 Alvin and the Chipmunks Animations 4 Jenny Adrianna 8
3 Alvin and the Chipmunks Animations 6 Lee Pong 10
4 The Adventures of Tin Tin Animations 1 Adam Smith 1
4 The Adventures of Tin Tin Animations 2 Ravi Kumar 2
4 The Adventures of Tin Tin Animations 3 Susan Davidson 5
4 The Adventures of Tin Tin Animations 4 Jenny Adrianna 8
4 The Adventures of Tin Tin Animations 6 Lee Pong 10
5 Safe (2012) Action 1 Adam Smith 1
5 Safe (2012) Action 2 Ravi Kumar 2
5 Safe (2012) Action 3 Susan Davidson 5
5 Safe (2012) Action 4 Jenny Adrianna 8
5 Safe (2012) Action 6 Lee Pong 10
6 Safe House(2012) Action 1 Adam Smith 1
6 Safe House(2012) Action 2 Ravi Kumar 2
6 Safe House(2012) Action 3 Susan Davidson 5
6 Safe House(2012) Action 4 Jenny Adrianna 8
6 Safe House(2012) Action 6 Lee Pong 10
7 GIA 18+ 1 Adam Smith 1
7 GIA 18+ 2 Ravi Kumar 2
7 GIA 18+ 3 Susan Davidson 5
7 GIA 18+ 4 Jenny Adrianna 8
7 GIA 18+ 6 Lee Pong 10
8 Deadline(2009) 18+ 1 Adam Smith 1
8 Deadline(2009) 18+ 2 Ravi Kumar 2
8 Deadline(2009) 18+ 3 Susan Davidson 5
8 Deadline(2009) 18+ 4 Jenny Adrianna 8
8 Deadline(2009) 18+ 6 Lee Pong 10
9 The Dirty Picture 18+ 1 Adam Smith 1
9 The Dirty Picture 18+ 2 Ravi Kumar 2
9 The Dirty Picture 18+ 3 Susan Davidson 5
9 The Dirty Picture 18+ 4 Jenny Adrianna 8
9 The Dirty Picture 18+ 6 Lee Pong 10
10 Marley and me Romance 1 Adam Smith 1
10 Marley and me Romance 2 Ravi Kumar 2
10 Marley and me Romance 3 Susan Davidson 5
10 Marley and me Romance 4 Jenny Adrianna 8
10 Marley and me Romance 6 Lee Pong 10

GABUNGAN DALAM

JOIN dalaman digunakan untuk mengembalikan baris dari kedua-dua jadual yang memenuhi keadaan yang diberikan.

Katakanlah, anda ingin mendapatkan senarai ahli yang telah menyewa filem berserta tajuk filem yang disewa oleh mereka. Anda hanya boleh menggunakan INNER JOIN untuk itu, yang mengembalikan baris dari kedua jadual yang memenuhi syarat yang diberikan.

SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`

Melaksanakan pemberian skrip di atas

 
first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me

Perhatikan skrip hasil di atas juga boleh ditulis seperti berikut untuk mencapai hasil yang sama.

SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`

BERSAMA Luar

MySQL Outer JOIN mengembalikan semua rekod yang sepadan dari kedua-dua jadual.

Ia dapat mengesan rekod yang tidak ada padanan dalam jadual bergabung. Ia mengembalikan nilai NULL untuk rekod jadual bergabung jika tiada perlawanan.

Bunyi Keliru? Mari lihat contoh -

BERSAMA KIRI

Andaikan sekarang anda ingin mendapatkan tajuk semua filem berserta nama ahli yang telah menyewanya. Sudah jelas bahawa beberapa filem belum disewa oleh mana-mana filem. Kita hanya boleh menggunakan LEFT JOIN untuk tujuan tersebut.

GABUNG KIRI mengembalikan semua baris dari meja di sebelah kiri walaupun tidak ada baris yang sepadan dengan jadual di sebelah kanan. Di mana tidak ada perlawanan yang dijumpai di meja di sebelah kanan, NULL dikembalikan.

SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`

Melaksanakan skrip di atas di meja kerja MySQL memberikan. Anda dapat melihat bahawa dalam hasil yang dikembalikan yang disenaraikan di bawah ini untuk filem yang tidak disewa, bidang nama ahli mempunyai nilai NULL. Itu bermaksud tidak ada ahli yang menjumpai jadual ahli untuk filem tertentu.

 
title first_name last_name
ASSASSIN'S CREED: EMBERS Adam Smith
Real Steel(2012) Ravi Kumar
Safe (2012) Susan Davidson
Deadline(2009) Jenny Adrianna
Marley and me Lee Pong
Alvin and the Chipmunks NULL NULL
The Adventures of Tin Tin NULL NULL
Safe House(2012) NULL NULL
GIA NULL NULL
The Dirty Picture NULL NULL
Note: Null is returned for non-matching rows on right

BERSAMA KANAN

RIGHT JOIN jelas bertentangan dengan LEFT JOIN. GABUNGAN KANAN mengembalikan semua lajur dari jadual di sebelah kanan walaupun tidak ada baris yang sepadan dengan jadual di sebelah kiri. Sekiranya tiada perlawanan yang dijumpai dalam jadual di sebelah kiri, NULL dikembalikan.

Dalam contoh kami, anggaplah bahawa anda perlu mendapatkan nama ahli dan filem yang disewa oleh mereka. Sekarang kita mempunyai ahli baru yang belum menyewa filem apa pun

SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`

Melaksanakan skrip di atas di meja kerja MySQL memberikan hasil berikut.

 
first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me
NULL NULL Alvin and the Chipmunks
NULL NULL The Adventures of Tin Tin
NULL NULL Safe House(2012)
NULL NULL GIA
NULL NULL The Dirty Picture
Note: Null is returned for non-matching rows on left

Klausa "ON" dan "USING"

Dalam contoh pertanyaan JOIN di atas, kami telah menggunakan klausa ON untuk memadankan rekod antara jadual.

MENGGUNAKAN klausa juga boleh digunakan untuk tujuan yang sama. Perbezaannya dengan MENGGUNAKAN adalah perlu mempunyai nama yang sama untuk lajur yang dipadankan di kedua-dua jadual.

Dalam jadual "filem" setakat ini kami menggunakan kunci utamanya dengan nama "id". Kami merujuk hal yang sama dalam tabel "ahli" dengan nama "movie_id".

Mari ganti nama medan "filem" jadual "id" dengan nama "movie_id". Kami melakukan ini untuk mempunyai nama bidang yang hampir sama.

ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;

Seterusnya mari kita gunakan PENGGUNAAN dengan contoh GABUNGAN KIRI di atas.

SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )

Selain menggunakan AKTIF dan MENGGUNAKAN dengan BERGABUNG, anda boleh menggunakan banyak klausa MySQL lain seperti GROUP BY, WHERE dan bahkan berfungsi seperti SUM , AVG , dll.

Mengapa kita mesti menggunakan gabungan?

Sekarang anda mungkin berfikir, mengapa kita menggunakan JOIN ketika kita dapat melakukan tugas yang sama menjalankan pertanyaan. Terutama jika anda mempunyai pengalaman dalam pengaturcaraan pangkalan data, anda tahu kami dapat menjalankan pertanyaan satu per satu, gunakan masing-masing output dalam pertanyaan berturut-turut. Sudah tentu, itu mungkin. Tetapi dengan menggunakan JOIN, anda dapat menyelesaikan pekerjaan dengan hanya menggunakan satu pertanyaan dengan parameter carian apa pun. Sebaliknya MySQL dapat mencapai prestasi yang lebih baik dengan BERSAMA kerana dapat menggunakan Pengindeksan. Cukup menggunakan satu pertanyaan JOIN sebaliknya menjalankan beberapa pertanyaan mengurangkan overhead pelayan. Menggunakan banyak pertanyaan sebagai gantinya yang membawa lebih banyak pemindahan data antara MySQL dan aplikasi (perisian). Selanjutnya ia memerlukan lebih banyak manipulasi data pada akhir aplikasi juga.

Sudah jelas bahawa kita dapat mencapai prestasi MySQL dan aplikasi yang lebih baik dengan menggunakan JOIN.

Ringkasan

  • BERSAMA membolehkan kita menggabungkan data dari lebih dari satu jadual ke dalam satu set hasil.
  • JOIN mempunyai prestasi yang lebih baik berbanding dengan sub pertanyaan
  • INNER JOINS hanya mengembalikan baris yang memenuhi kriteria yang diberikan.
  • GABUNGAN LUAR juga dapat mengembalikan baris di mana tidak ada perlawanan yang dijumpai. Baris yang tidak sepadan dikembalikan dengan kata kunci NULL.
  • Jenis JOIN utama merangkumi Inner, Left Outer, Right Outer, Cross JOINS dll.
  • Klausa yang sering digunakan dalam operasi BERGABUNG adalah "ON". Klausa "MENGGUNAKAN" menghendaki lajur yang sepadan dengan nama yang sama.
  • GABUNGAN juga boleh digunakan dalam klausa lain seperti GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS dll.