Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

gabung sendiri vs gabung dalam

Saya merasa terbantu untuk menganggap semua tabel dalam pernyataan SELECT sebagai mewakili kumpulan data mereka sendiri.

Sebelum menerapkan ketentuan apa pun, Anda dapat menganggap setiap kumpulan data sudah lengkap (seluruh tabel, misalnya).

Gabung hanyalah salah satu dari beberapa cara untuk mulai menyempurnakan kumpulan data tersebut untuk menemukan informasi yang benar-benar Anda inginkan.

Meskipun skema basis data dapat dirancang dengan mempertimbangkan hubungan tertentu (Kunci Utama <-> Kunci Asing), hubungan ini benar-benar hanya ada dalam konteks kueri tertentu. Penulis kueri dapat menghubungkan apa pun yang mereka inginkan dengan apa pun yang mereka inginkan. Nanti saya kasih contohnya...

INNER JOIN menghubungkan dua tabel satu sama lain. Seringkali ada beberapa operasi GABUNG dalam satu kueri untuk menyatukan beberapa tabel. Ini bisa menjadi serumit yang dibutuhkan. Sebagai contoh sederhana, perhatikan tiga tabel berikut...

STUDENT

| STUDENTID | LASTNAME | FIRSTNAME |
------------------------------------
      1     |  Smith   |   John
      2     |  Patel   |  Sanjay
      3     |   Lee    |  Kevin
      4     |  Jackson |  Steven
ENROLLMENT

| ENROLLMENT ID | STUDENTID | CLASSID |
---------------------------------------
        1       |     2     |    3
        2       |     3     |    1
        3       |     4     |    2
CLASS

| CLASSID | COURSE | PROFESSOR |
--------------------------------
     1    | CS 101 |   Smith
     2    | CS 201 |  Ghandi
     3    | CS 301 |  McDavid
     4    | CS 401 |  Martinez

Tabel SISWA dan tabel KELAS dirancang untuk berhubungan satu sama lain melalui tabel PENDAFTARAN. Tabel semacam ini disebut Tabel Persimpangan .

Untuk menulis kueri untuk menampilkan semua siswa dan kelas tempat mereka terdaftar, seseorang akan menggunakan dua gabungan bagian dalam...

SELECT stud.LASTNAME, stud.FIRSTNAME, class.COURSE, class.PROFESSOR
FROM STUDENT stud
INNER JOIN ENROLLMENT enr
    ON stud.STUDENTID = enr.STUDENTID
INNER JOIN CLASS class
    ON class.CLASSID = enr.CLASSID;

Baca di atas erat dan Anda akan melihat apa yang terjadi. Apa yang akan Anda dapatkan sebagai imbalan adalah kumpulan data berikut...

 | LASTNAME | FIRSTNAME | COURSE | PROFESSOR |
 ---------------------------------------------
     Patel  |   Sanjay  | CS 301 |  McDavid
      Lee   |   Kevin   | CS 101 |   Smith
    Jackson |  Steven   | CS 201 |  Ghandi

Dengan menggunakan klausa JOIN, kami membatasi kumpulan data dari ketiga tabel hanya yang cocok satu sama lain. "Kecocokan" ditentukan menggunakan AKTIF klausa. Perhatikan bahwa jika Anda menjalankan kueri ini, Anda tidak lihat baris CLASSID 4 dari tabel CLASS atau baris STUDENTID 1 dari tabel STUDENT karena ID tersebut tidak ada dalam kecocokan (dalam hal ini tabel PENDAFTARAN). Lihat "LEFT"/"RIGHT"/"FULL OUTER" JOINs untuk membaca lebih lanjut tentang cara membuatnya bekerja sedikit berbeda.

Harap dicatat, per komentar saya tentang "hubungan" sebelumnya, tidak ada alasan mengapa Anda tidak dapat menjalankan kueri yang berkaitan dengan tabel STUDENT dan tabel CLASS secara langsung pada kolom LASTNAME dan PROFESSOR. Kedua kolom itu cocok dalam tipe data dan, lihat itu! Mereka bahkan memiliki nilai yang sama! Ini mungkin akan menjadi kumpulan data yang aneh sebagai balasannya. Maksud saya adalah itu bisa dilakukan dan Anda tidak pernah tahu kebutuhan apa yang mungkin Anda miliki di masa depan untuk koneksi menarik dalam data Anda. Pahami desain database tetapi jangan menganggap "hubungan" sebagai aturan yang tidak dapat diabaikan.

Sementara itu... DIRI BERGABUNG!

Perhatikan tabel berikut...

PERSON

| PERSONID | FAMILYID |  NAME  |
--------------------------------
      1    |     1    |  John
      2    |     1    | Brynn
      3    |     2    | Arpan
      4    |     2    | Steve
      5    |     2    |  Tim
      6    |     3    | Becca

Jika Anda merasa sangat ingin membuat database semua orang yang Anda kenal dan siapa yang berada dalam keluarga yang sama, ini mungkin tampilannya.

Jika Anda ingin mengembalikan satu orang, PERSONID 4, misalnya, Anda akan menulis...

SELECT * FROM PERSON WHERE PERSONID = 4;

Anda akan mengetahui bahwa dia berada dalam keluarga dengan FAMILYID 2. Kemudian untuk menemukan semua dari ORANG-ORANG dalam keluarganya yang akan Anda tulis...

SELECT * FROM PERSON WHERE FAMILYID = 2;

Selesai dan selesai! SQL, tentu saja, dapat menyelesaikan ini dalam satu kueri menggunakan, Anda dapat menebaknya, SELF JOIN.

Apa yang benar-benar memicu perlunya SELF JOIN di sini tabel berisi kolom unik (PERSONID) dan kolom yang berfungsi sebagai semacam "Kategori" (FAMILYID). Konsep ini disebut Kardinalitas dan dalam hal ini mewakili satu ke banyak atau 1:M hubungan. Hanya ada satu dari setiap PERSON tapi ada banyak PERSON dalam KELUARGA .

Jadi, yang ingin kami kembalikan adalah semua anggota keluarga jika satu anggota keluarga PERSONID diketahui...

SELECT fam.*
FROM PERSON per
JOIN PERSON fam
    ON per.FamilyID = fam.FamilyID
WHERE per.PERSONID = 4;

Inilah yang akan Anda dapatkan...

| PERSONID | FAMILYID |  NAME  |
--------------------------------
      3    |     2    | Arpan
      4    |     2    | Steve
      5    |     2    |  Tim

Mari kita perhatikan beberapa hal. Kata-kata SELF JOIN tidak terjadi dimanapun. Itu karena SELF JOIN hanyalah sebuah konsep. Kata JOIN dalam kueri di atas bisa menjadi LEFT JOIN sebaliknya dan hal-hal yang berbeda akan terjadi. Inti dari SELF JOIN adalah bahwa Anda menggunakan tabel yang sama dua kali.

Pertimbangkan kotak sabun saya dari sebelumnya pada set data. Di sini kita telah mulai dengan kumpulan data dari tabel PERSON dua kali. Baik contoh kumpulan data memengaruhi yang lain kecuali jika kita mengatakannya demikian.

Mari kita mulai dari bagian bawah kueri. per kumpulan data dibatasi hanya pada baris-baris di mana PERSONID =4. Mengetahui tabel yang kita tahu akan mengembalikan tepat satu baris. Kolom FAMILYID pada baris tersebut bernilai 2.

Dalam klausa ON kami membatasi keluarga kumpulan data (yang saat ini masih merupakan seluruh tabel PERSON) hanya untuk baris yang nilai FAMILYID cocok dengan satu atau lebih dari FAMILYID dari per Himpunan data. Seperti yang telah kita diskusikan, kita mengetahui per kumpulan data hanya memiliki satu baris, oleh karena itu satu nilai FAMILYID. Oleh karena itu keluarga kumpulan data sekarang hanya berisi baris di mana FAMILYID =2.

Terakhir, di bagian atas kueri, kami MEMILIH semua baris di fam kumpulan data.

Voila! Dua kueri dalam satu.

Sebagai kesimpulan, INNER JOIN adalah salah satu dari beberapa jenis operasi JOIN. Saya akan sangat menyarankan untuk membaca lebih lanjut tentang LEFT, RIGHT, dan FULL OUTER JOIN (yang secara kolektif disebut OUTER JOIN ). Saya pribadi melewatkan kesempatan kerja karena memiliki pengetahuan yang lemah tentang OUTER JOINs sekali dan tidak akan membiarkan hal itu terjadi lagi!

BERGABUNG DIRI hanyalah operasi GABUNG di mana Anda menghubungkan tabel dengan dirinya sendiri. Cara Anda memilih untuk BERGABUNG dengan tabel itu sendiri dapat menggunakan INNER JOIN atau OUTER JOIN. Perhatikan bahwa dengan SELF JOIN , agar tidak membingungkan mesin SQL Anda, Anda harus gunakan alias tabel (fam dan per dari atas. Buat apa pun yang masuk akal untuk kueri Anda) atau tidak ada cara untuk membedakan versi yang berbeda dari tabel yang sama.

Sekarang setelah Anda memahami perbedaannya, buka pikiran Anda dengan baik dan luas dan sadari bahwa satu kueri dapat berisi semua jenis GABUNG yang berbeda sekaligus. Ini hanya masalah data apa yang Anda inginkan dan bagaimana Anda harus memutar dan membengkokkan kueri Anda untuk mendapatkannya. Jika Anda mendapati diri Anda menjalankan satu kueri dan mengambil hasil kueri itu dan menggunakannya sebagai input kueri lain, maka Anda mungkin dapat menggunakan JOIN untuk menjadikannya satu kueri.

Untuk bermain-main dengan SQL coba kunjungi W3Schools.com Ada database yang disimpan secara lokal di sana dengan sekelompok tabel yang dirancang untuk berhubungan satu sama lain dalam berbagai cara dan diisi dengan data! Anda dapat CREATE, DROP, INSERT, UPDATE dan SELECT semua yang Anda inginkan dan mengembalikan database kembali ke defaultnya kapan saja. Cobalah segala macam SQL untuk bereksperimen dengan berbagai trik. Saya sendiri telah belajar banyak di sana.

Maaf jika ini sedikit bertele-tele, tetapi saya pribadi berjuang dengan konsep GABUNG ketika saya mulai belajar SQL dan menjelaskan suatu konsep dengan menggunakan banyak konsep kompleks lainnya membuat saya terhambat. Terbaik untuk memulai dari bawah kadang-kadang.

Saya harap ini membantu. Jika Anda dapat memasukkan JOINs di saku belakang Anda, Anda dapat melakukan keajaiban dengan SQL!

Selamat bertanya!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah mungkin menggunakan sql%rowcount untuk SELECT?

  2. Menanyakan pada EAV SQL Design

  3. Koneksi ke Oracle melalui TNS tidak berfungsi

  4. Pencarian spasial Oracle dalam jarak jauh

  5. Bagaimana mengatasi ORA-29283 :operasi file tidak valid