Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Databases
Code

SQL untuk Pemula: Bahagian 3 - Hubungan Pangkalan Data

by
Length:LongLanguages:

Malay (Melayu) translation by Fatimah (you can also view the original English article)

Hari ini, kami meneruskan perjalanan kami ke pangkalan data pangkalan data dunia dan SQL. Dalam bahagian tiga ini, kita akan mempelajari bagaimana bekerja dengan beberapa jadual yang mempunyai hubungan dengan satu sama lain. Pertama, kita akan pergi ke beberapa inti konsep, dan kemudian akan mulai bekerja dengan pertanyaan JOIN di SQL.

Anda juga boleh melihat pangkalan data SQL dalam aksi dengan memeriksa skrip SQL, aplikasi dan add-on di Envato Market.

Mengejar

Pengenalan

Ketika membuat pangkalan data, akal sehat mendikte kami menggunakan tabel-tabel terpisah untuk berbagai jenis entitas. Beberapa contoh adalah: pelanggan, pesanan, item, mesej dll ... Tapi kita juga harus memiliki relasi antara tabel-tabel tersebut. Contohnya, pelanggan membuat pesanan, dan pesanan mengandungi item. Relasi ini harus diwakili dalam pangkalan data. Juga, ketika mengambil data dengan SQL, kita perlu menggunakan beberapa jenis permintaan JOIN untuk mendapatkan apa yang kita perlukan.

Terdapat beberapa jenis relasi pangkalan data. Hari ini kita akan membahas berikut:

  • Relasi Satu hingga Satu
  • Relasi Satu Kepada Banyak dan Banyak Kepada Satu
  • Relasi Banyak Kepada Banyak
  • Relasi Rujukan Mandiri

Apabila memilih data dari beberapa jadual dengan hubungan ini, kami akan menggunakan pertanyaan JOIN. Ada beberapa jenis JOIN, dan kami akan belajar tentang hal berikut:

  • Cross Joins
  • Asli Bergabung
  • Inner Joins
  • Kiri (Luar) Bergabung
  • Kanan (Luar) Bergabung

Kita juga akan belajar tentang kalimat ON dan klausa MENGGUNAKAN.

Relasi Satu hingga Satu

Katakanlah Anda mempunyai satu jadual untuk pelanggan:

Kita dapat menempatkan pelanggan alamat maklumat pada tabel yang terpisah:

Sekarang kita mempunyai hubungan antara Pelanggan meja dan Alamat meja. Jika alamat masing-masing boleh menjadi milik satu pelanggan, hubungan ini adalah "Satu ke Satu". Perlu diingat bahawa hubungan semacam ini sangat tidak umum. Tabel awal kami yang disertakan alamat bersama dengan pelanggan dapat bekerja baik dalam banyak hal.

Harap maklum bahawa ada satu bidang yang bernama "address_id" di Pelanggan meja, yang mengacu pada rekod yang cocok dalam alamat Tabel. Ini disebut "Kunci Asing" dan digunakan untuk semua pangkalan data hubungan jenis. Kami akan membahas hal ini kemudian di dalam artikel. Kita boleh memvisualisasikan hubungan antara rekod pelanggan dan alamat seperti ini:

Kita boleh memvisualisasikan hubungan antara rekod pelanggan dan alamat seperti ini:

Harap maklum bahawa ada suatu relasi dapat opsional, seperti memiliki rekaman pelanggan yang telah ada yang berhubungan dengan alamat rekaman.

Relasi Satu Kepada Banyak dan Banyak Kepada Satu

Ini adalah jenis yang paling umum digunakan daripada hubungan. Perhatikan laman web e-dagang, dengan berikut:

  • Pelanggan boleh membuat banyak pesanan.
  • Pesanan boleh mengandungi banyak item.
  • Item boleh mempunyai deskripsi dalam banyak bahasa.

Dalam kes ini kita akan perlu untuk membuat perhubungan "One to Many". Berikut adalah contohnya:

Setiap pelanggan boleh memiliki zero, satu atau beberapa pesanan. Tetapi pesanan boleh hanya menjadi milik satu pelanggan.

Relasi Banyak Kepada Banyak

Dalam beberapa kes, anda mungkin perlu beberapa contoh hubungan di kedua-dua belah pihak. Contohnya, setiap pesanan boleh mengandungi beberapa item. Dan masing-masing item juga boleh dalam beberapa pesanan.

Untuk relasi ini, kita perlu membuat tambahan tabel:

ItemsPART_Orders hanya memiliki satu tujuan, dan itu adalah untuk mewujudkan hubungan "Banyak kepada Banyak" antara item dan pesanan.

Berikut adalah cara kita dapat memvisualisasikan hubungan semacam ini:

Jika anda ingin menyertakan item_order rekod pada grafik, ini boleh kelihatan seperti ini:

Relasi Rujukan Mandiri

Ini digunakan apabila sebuah meja memerlukan untuk mempunyai hubungan dengan dirinya sendiri. Sebagai contoh, katakanlah anda mempunyai rujukan program. Pelanggan boleh merujuk pelanggan lain ke laman web anda. Jadual boleh kelihatan seperti ini:

Pelanggan 102 dan 103 dipujuk oleh pelanggan 101.

Ini sebenarnya juga boleh mirip dengan relasi "satu hingga banyak" kerana satu pelanggan dapat merujuk kepada beberapa pelanggan. Juga hal ini boleh divisualisasikan seperti tree structure:

Satu pelanggan boleh merujuk kepada zero, satu atau beberapa pelanggan. Setiap pelanggan boleh dirujuk juga dengan hanya satu pelanggan, atau tidak sama sekali.

Jika anda ingin membuat relasi mandiri relasi "banyak kepada banyak", Anda akan memerlukan tambahan tabel seperti yang kita bicarakan dalam bagian sebelumnya.

Kunci asing

Sejauh ini kami telah belajar tentang beberapa konsep. Sekarang adalah masa menghidupkan mereka dengan menggunakan SQL. Untuk bahagian ini, kita perlu memahami apa itu Kunci Asing.

Dalam contoh-contoh hubungan di atas, kami selalu mempunyai bidang ini "**** _ id" yang direferensikan sebuah kolom di tabel yang lain. Dalam contoh ini, customer_id dalam jadual Pesanan adalah kolom Asing Key:

Dengan pangkalan data seperti MySQL, ada dua cara untuk membuat kolom kunci asing:

Mendefinisikan Kunci Asing secara eksplisit

Mari kita buat pelanggan meja sederhana:

Sekarang jadual pesanan, yang akan mengandungi Kunci Asing:

Kedua kolom (customers.customer_id dan orders.customer_id) mesti dengan data struktur yang sama persis. Jika salah satunya adalah INT, yang lain tidak boleh BIGINT misalnya.

Harap dicatat bahawa di MySQL hanya mesin InnoDB yang mempunyai penuh sokongan untuk Kunci Asing. Tetapi mesin penyimpanan lain masih akan membolehkan anda untuk menentukan mereka tanpa ada kesalahan. Juga kolom Asing Key adalah yang diindeks secara automatik, kecuali jika anda menentukan indeks lain untuknya.

Tanpa Deklarasi Eksplisit

Pesanan jadual yang sama boleh dibuat tanpa menyatakan pelanggan_id untuk menjadi Kunci Asing secara eksplisit:

Ketika mengambil data dengan query JOIN, Anda masih bisa memperlakukan kolom ini sebagai Foreign Key walaupun database mesin tidak menyadari hubungan ini.

Kita akan belajar tentang pertanyaan JOIN lebih lanjut dalam artikel ini.

Memvisualisasikan Relasi

My favorite perisian saat ini untuk merancang pangkalan data dan memvisualisasikan hubungan Foreign Key adalah MySQL Workbench .

Setelah Anda merancang pangkalan data Anda, Anda dapat mengekspor SQL dan menjalankan pada server Anda. Hadir yang sangat berguna untuk pangkalan data pangkalan yang lebih besar dan lebih kompleks.

Pertanyaan PERCUMA

Untuk mengambil data dari pangkalan data yang mempunyai hubungan, kita sering perlu menggunakan JOIN query.

Sebelum kita mula, mari buat jadual dan beberapa data sampel untuk bekerja dengannya.

Kami mempunyai 4 pelanggan. Satu pelanggan mempunyai dua pesanan, dua pelanggan mempunyai satu pesanan masing-masing, dan satu pelanggan tidak memiliki pesanan. Sekarang mari kita lihat pelbagai jenis pertanyaan JOIN yang boleh kita jalankan di dalam jadual ini.

Cross Join

Ini adalah pertanyaan jenis lalai JOIN apabila tiada syarat yang ditetapkan.

Hasilnya adalah apa yang disebut "produk Cartesian" dari tabel. Itu bermakna bahawa setiap baris dari jadual pertama dicocokkan dengan setiap baris dari kedua tabel. Karena setiap tabel memiliki 4 baris, kami akhirnya mendapatkan hasil 16 baris.

Kata kunci JOIN secara opsyenal boleh diganti dengan koma sebagai gantinya.

Tentu saja hasil seperti ini biasanya tidak berguna. Jadi mari kita lihat jenis penggabungan lain.

Sertai semula jadi

Dengan pertanyaan seperti ini, jadual harus mempunyai kolom nama pencocokan. Dalam kes kami, kedua tabel mempunyai customer_id column. Jadi, MySQL akan memasukan rekod hanya apabila nilai dari kolom ini cocok pada dua rekod.

Seperti yang anda lihat, customer_id ini hanya dipaparkan sekali saat ini, karena database mesin memperlakukan ini sebagai kolom umum. Kita boleh melihat dua pesanan yang dilakukan oleh Adam, dan dua pesanan lain oleh Joe dan Sandy. Akhirnya kami mendapat beberapa maklumat berguna.

Sertai dalaman

Semasa penggabungan dengan kondisi yang ditentukan, Inner Join dilakukan. Dalam kes ini, akan menjadi ide yang baik untuk memiliki customer_id lapangan yang cocok pada kedua tabel. Hasilnya harus sama dengan Natural Join.

Hasil yang sama kecuali terdapat sedikit perbezaan. Kolom customer_id ini diulang dua kali, sekali untuk setiap tabel. Alasannya adalah, kita hanya menanyakan pangkalan data untuk mencocokkan nilai-nilai pada dua kolom. Tetapi itu benar-benar tidak menyadari bahawa mereka mewakili maklumat yang sama.

Mari kita tambahkan beberapa kondisi lagi ke pertanyaan.

Kali ini kami hanya menerima pesanan lebih daripada $ 15.

Klausa ON

Sebelum pindah ke penggabungan jenis lain, kita perlu melihat pada Klausa ON. Ini berguna untuk menempatkan kondisi JOIN di klausa terpisah.

Sekarang kita boleh membedakan kondisi JOIN dari klausa kondisi WHERE. Tetapi ada juga sedikit perbezaan dalam fungsi. Kita akan melihatnya di contoh-contoh LEFT JOIN.

Klausa MENGGUNAKAN

Klausa MENGGUNAKAN mirip dengan klausa ON, tapi lebih pendek. Jika kolom dengan nama yang sama pada kedua tabel, kita boleh menentukannya di sini.

Pada kenyataannya, ini adalah serupa dengan GABUNGAN NATURAL, sehingga dengan kolom yang bergabung (customer_id) tidak diulang dua kali dalam hasilnya.

Kiri (Luar) Sertai

LEFT JOIN adalah jenis Outer Join. Dalam pertanyaan ini, jika tidak terdapat kesesuaian dari kedua jadual, rekod dari jadual pertama masih dipaparkan.

Walaupun Andy tidak mempunyai pesanan, rekodnya masih dipaparkan. Nilai-nilai di bawah kolom dari jadual kedua adalah ditetapkan ke NULL.

Ini juga berguna untuk mencari rekod yang tidak mempunyai hubungan. Contohnya, kita boleh mencari pelanggan yang belum membuat pesanan.

Semua yang kita lakukan adalah mencari NULL nilai untuk order_id.

Juga perhatikan bahwa kata kunci OUTER adalah pilihan. Anda hanya boleh menggunakan LEAD JOIN, bukan LEFT OUTER JOIN.

Bersyarat

Sekarang mari kita lihat satu pertanyaan dengan keadaan.

Jadi apa yang terjadi dengan Andy dan Sandy? KIRI BERGABUNG seharusnya mengembalikan pelanggan yang tidak sesuai pesanan. Masalahnya adalah bahawa di klausa WHERE memblokir hasil tersebut. Untuk mendapatkan mereka, kita boleh cuba masukkan kondisi NULL juga.

Kita punya Andy tetapi tidak Sandy. Ini masih tidak kelihatan benar. Untuk mendapatkan apa yang kita mahu, kita perlu menggunakan Klausa ON.

Sekarang kita mempunyai semua orang, dan semua pesanan di atas $ 15. Seperti yang saya katakan sebelumnya, klausa ON kadang-kadang mempunyai sedikit fungsi yang berbeza dari klausa WHERE. i Outer Join seperti yang satu ini, baris akan dimasukkan bahkan jika mereka tidak sesuai dengan klausa kondisi ON.

Kanan (Luar) Sertai

RIGHT OUTER JOIN bekerja persis sama, tetapi urutan tabel terbalik.

Pada masa ini kami tidak mempunyai hasil NULL kerana setiap pesanan mempunyai kesesuaian dengan pelanggan rekod. Kita boleh mengubah urutan dari jadual dan mendapatkan hasil yang sama seperti yang kita lakukan dari LEFT OUTER JOIN.

Kini kita mempunyai nilai NULL nilai karena pelanggan meja ada di sisi kanan penggabungan.

Kesimpulan

Terima kasih telah membaca artikel ini. Saya harap anda menikmatinya! Silakan tinggalkan komentar dan pertanyaan, dan miliki hari yang besar!

Jangan lupa untuk menyemak skrip SQL, aplikasi dan tambahan kami di Pasar Envato. Anda akan mendapat rasa dari apa yang mungkin dengan pangkalan data SQL, dan anda mungkin menemukan penyelesaian yang tepat untuk membantu Anda dengan perkembangan proyek Anda saat ini.

Ikuti kami di Twitter , atau berlangganan ke Nettuts + RSS Feed untuk tutorial web pembangunan terbaik di web

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.