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 |
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 |
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.