# Relationship

**Relationship** adalah hubungan antara dua atau lebih tabel dalam sebuah database. Relationship ini penting untuk mengelola data yang tersebar di beberapa tabel dan memungkinkan integrasi informasi secara efisien.

### **Jenis-Jenis Relationship:**

* **One-to-One:**

  * Setiap baris dalam tabel A berhubungan dengan satu baris dalam tabel B.
  * Contoh: Tabel `users` dengan tabel `user_profiles`, di mana setiap pengguna hanya memiliki satu profil.

  ```sql
  CREATE TABLE users (
      user_id INT PRIMARY KEY,
      username VARCHAR(50)
  );

  CREATE TABLE user_profiles (
      profile_id INT PRIMARY KEY,
      user_id INT,
      bio TEXT,
      FOREIGN KEY (user_id) REFERENCES users(user_id)
  );
  ```

  * Untuk menampilkan data antara dua tabel `users` dan `user_profiles`, kita bisa menggunakan SQL `INNER JOIN`, `LEFT JOIN`, atau `RIGHT JOIN` tergantung pada kebutuhan kita.

    Berikut ini adalah contoh menggunakan `INNER JOIN`, yang hanya akan menampilkan data jika ada kecocokan di kedua tabel:

    ```sql
    SELECT users.user_id, users.username, user_profiles.profile_id, user_profiles.bio
    FROM users
    INNER JOIN user_profiles ON users.user_id = user_profiles.user_id;
    ```

    #### Penjelasan:

    * **`INNER JOIN`**: Menggabungkan baris dari kedua tabel hanya jika ada kecocokan antara kolom `user_id` pada tabel `users` dengan kolom `user_id` pada tabel `user_profiles`.
    * **Hasilnya**: Query ini akan menampilkan data `user_id`, `username`, `profile_id`, dan `bio` dari kedua tabel yang memiliki `user_id` yang sama.

    Jika Anda ingin menampilkan semua pengguna, termasuk mereka yang tidak memiliki profil, Anda bisa menggunakan `LEFT JOIN`:

    ```sql
    SELECT users.user_id, users.username, user_profiles.profile_id, user_profiles.bio
    FROM users
    LEFT JOIN user_profiles ON users.user_id = user_profiles.user_id;
    ```

    #### Penjelasan:

    * **`LEFT JOIN`**: Mengambil semua data dari tabel `users`, dan data dari `user_profiles` yang cocok. Jika tidak ada kecocokan, kolom dari `user_profiles` akan berisi `NULL`.
* **One-to-Many :**

  * Setiap baris dalam tabel A berhubungan dengan banyak baris dalam tabel B.
  * Contoh: Tabel `authors` dengan tabel `books`, di mana seorang penulis bisa menulis banyak buku.

  ```sql
  CREATE TABLE authors (
      author_id INT PRIMARY KEY,
      name VARCHAR(100)
  );

  CREATE TABLE books (
      book_id INT PRIMARY KEY,
      title VARCHAR(100),
      author_id INT,
      FOREIGN KEY (author_id) REFERENCES authors(author_id)
  );
  ```

  * Berikut adalah contoh query untuk melakukan join antara tabel `authors` dan `books`, menggunakan `INNER JOIN`:

    ```sql
    SELECT authors.author_id, authors.name, books.book_id, books.title
    FROM authors
    INNER JOIN books ON authors.author_id = books.author_id;
    ```

    #### Penjelasan:

    * **`INNER JOIN`**: Menggabungkan baris dari kedua tabel hanya jika ada kecocokan antara kolom `author_id` pada tabel `authors` dengan kolom `author_id` pada tabel `books`.
    * **Hasilnya**: Query ini akan menampilkan data `author_id`, `name`, `book_id`, dan `title` dari kedua tabel yang memiliki `author_id` yang sama.

    Jika Anda ingin menampilkan semua penulis, termasuk mereka yang belum menulis buku, Anda bisa menggunakan `LEFT JOIN`:

    ```sql
    SELECT authors.author_id, authors.name, books.book_id, books.title
    FROM authors
    LEFT JOIN books ON authors.author_id = books.author_id;
    ```

    #### Penjelasan:

    * **`LEFT JOIN`**: Mengambil semua data dari tabel `authors`, dan data dari `books` yang cocok. Jika tidak ada kecocokan, kolom dari `books` akan berisi `NULL`.

    Sebaliknya, jika Anda ingin menampilkan semua buku, termasuk yang tidak memiliki penulis terkait (mungkin karena penulisnya dihapus), Anda bisa menggunakan `RIGHT JOIN`:

    ```sql
    SELECT authors.author_id, authors.name, books.book_id, books.title
    FROM authors
    RIGHT JOIN books ON authors.author_id = books.author_id;
    ```

    #### Penjelasan:

    * **`RIGHT JOIN`**: Mengambil semua data dari tabel `books`, dan data dari `authors` yang cocok. Jika tidak ada kecocokan, kolom dari `authors` akan berisi `NULL`.
* **Many-to-Many:**

  * Banyak baris dalam tabel A berhubungan dengan banyak baris dalam tabel B.
  * Contoh: Tabel `students` dengan tabel `courses`, di mana seorang siswa bisa mengambil banyak kursus, dan satu kursus bisa diikuti oleh banyak siswa. Ini biasanya diimplementasikan dengan tabel ketiga (tabel penghubung).

  ```sql
  CREATE TABLE students (
      student_id INT PRIMARY KEY,
      name VARCHAR(100)
  );

  CREATE TABLE courses (
      course_id INT PRIMARY KEY,
      course_name VARCHAR(100)
  );

  CREATE TABLE student_courses (
      student_id INT,
      course_id INT,
      FOREIGN KEY (student_id) REFERENCES students(student_id),
      FOREIGN KEY (course_id) REFERENCES courses(course_id),
      PRIMARY KEY (student_id, course_id)
  );
  ```
* Berikut adalah contoh query untuk melakukan join antara tabel `students`, `courses`, dan `student_courses`, untuk menampilkan informasi mengenai siswa dan kursus yang mereka ikuti:
  * **Menggunakan `INNER JOIN`**

    Query ini akan menampilkan semua siswa yang terdaftar dalam kursus tertentu:

    ```sql
    SELECT students.student_id, students.name, courses.course_id, courses.course_name
    FROM students
    INNER JOIN student_courses ON students.student_id = student_courses.student_id
    INNER JOIN courses ON student_courses.course_id = courses.course_id;
    ```

    #### Penjelasan:

    * **`INNER JOIN`** digunakan untuk menggabungkan tabel `students` dengan `student_courses`, kemudian menggabungkannya dengan tabel `courses`.
      * Query ini menampilkan data `student_id`, `name`, `course_id`, dan `course_name` untuk semua siswa yang telah terdaftar dalam kursus.
  * **Menggunakan `LEFT JOIN`**

    Jika Anda ingin menampilkan semua siswa, termasuk mereka yang belum terdaftar dalam kursus apa pun, Anda bisa menggunakan `LEFT JOIN`:

    ```sql
    SELECT students.student_id, students.name, courses.course_id, courses.course_name
    FROM students
    LEFT JOIN student_courses ON students.student_id = student_courses.student_id
    LEFT JOIN courses ON student_courses.course_id = courses.course_id;
    ```

    #### Penjelasan:

    * **`LEFT JOIN`** memastikan bahwa semua siswa akan ditampilkan, bahkan jika mereka belum terdaftar dalam kursus. Jika seorang siswa belum terdaftar dalam kursus, kolom yang terkait dengan kursus akan berisi `NULL`.
  * **Menggunakan `RIGHT JOIN`**

    Sebaliknya, jika Anda ingin menampilkan semua kursus, termasuk kursus yang belum diambil oleh siswa mana pun, Anda bisa menggunakan `RIGHT JOIN`:

    ```sql
    SELECT students.student_id, students.name, courses.course_id, courses.course_name
    FROM students
    RIGHT JOIN student_courses ON students.student_id = student_courses.student_id
    RIGHT JOIN courses ON student_courses.course_id = courses.course_id;
    ```

    #### Penjelasan:

    * **`RIGHT JOIN`** memastikan bahwa semua kursus akan ditampilkan, bahkan jika tidak ada siswa yang terdaftar dalam kursus tersebut. Jika tidak ada siswa yang terdaftar, kolom yang terkait dengan siswa akan berisi `NULL`.

Dengan memahami jenis-jenis relationship ini, kita bisa merancang database yang lebih terstruktur dan efisien dalam mengelola data yang saling berhubungan.
