Seperti apa output dari pernyataan GABUNG?


8

Saya sudah lama ingin menggunakan gabungan, tetapi saya mengalami kesulitan memvisualisasikan output jadi saya tahu bagaimana menggunakannya.

Katakanlah saya punya 2 tabel:

CREATE TABLE Cities (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    city tinyblob
);

CREATE TABLE Users (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username TINYBLOB,
    city INT UNSIGNED,
    FOREIGN KEY (city) REFERENCES Cities (id)
);

Jika aplikasi saya menjalankan kueri SQL untuk mendapatkan data profil pengguna, bagaimana cara saya menggunakan gabungan untuk mendapatkan kota yang terkait dengan catatan pengguna, dan bagaimana catatan yang dihasilkan akan muncul?

Jawaban:


12

Setiap hasil dari operasi SQL secara fungsional adalah tabel baru, baik disimpan dalam disk atau dalam memori

Fungsi gabungan adalah untuk "Bergabung" dua tabel bersama menjadi tabel ketiga sintetis yang (biasanya) hanya ada dalam memori selama waktu itu adalah output ke aplikasi.

Alasan untuk menggunakan gabungan adalah untuk mengurangi Anomali Data , dengan memastikan bahwa data muncul di satu dan hanya satu tempat dalam database.

Pertimbangkan yang berikut ini:

Person ( ID Integer Primary Key, FName String, LName String, Address String, City String, ZipCode String)

Di sini, setiap kali pemerintah mengubah kode pos (yang terjadi terlalu sering untuk selera pengembang basis data * tabel orang perlu diperbarui sehingga semua kode pos lama dengan benar milik kota yang benar dan kode pos baru.

Dalam hal ini, kode pos yang sama ada dalam beberapa tupel tabel, dan jika tabel tersebut dapat diedit secara manual, akan mengalami anomali pembaruan yang parah karena kombinasi kode kota / kota baru dimasukkan tanpa basis data secara keseluruhan diperbarui.

Dengan memiliki tiga tabel sebagai gantinya, kami mendapatkan data yang sama, tetapi dengan peningkatan fleksibilitas dan keandalan (dengan mengorbankan beberapa kinerja, meskipun pertanyaan "denasionalisasi yang tepat" adalah topik untuk serangkaian jawaban lain.)

Person ( PersonID Integer Primary Key, FName String, LName String)

City ( CityID Integer Primary Key, City String, State String, ZipCode String )

Address ( AddressID Integer Primary Key, AddressLine1 String, CityID Integer References City, PersonID Integer References Person)`

Dan kita bisa mendapatkan satu "tabel" dari yang di atas melalui kueri berikut: SELECT Fname, Lname, AddressLine1, City, State, ZipCode FROM Person INNER JOIN Address USING (PersonID) INNER JOIN City USING (CityID)

Ini memungkinkan kami untuk memperbarui tabel individu setiap kali sesuatu yang spesifik tentang mereka berubah, tanpa merusak sisa data terkait.

An INNER JOINadalah tipe default dari join. Secara kasar itu mencatat: "gabungkan tupel di mana catatan ini dari tabel a cocok dengan catatan ini dari tabel b" Jenis gabungan lainnya adalah OUTER JOINSdan apa yang dikenal sebagai a CARTESIAN PRODUCT. Gabungan luar adalah "Ambil semuanya dari tabel kiri atau kanan (sebagaimana ditentukan) dan di mana tabel lainnya cocok, bergabunglah. Di mana tidak cocok, isi dengan nol" Dan produk kartesius (tanpa masuk ke aljabar relasional adalah: Ambil setiap kemungkinan kombinasi tupel di kedua tabel dan hasilkan dalam satu tabel, tanpa mencocokkan apa pun.

* Lebih dari tidak pernah, terutama dalam kasus memindahkan batas kode pos karena persekongkolan


6

Saya pikir Anda sedang mencari

SELECT username, cities.city FROM Users JOIN Cities ON (Cities.Id = Users.City)

yang akan memberi Anda

| username | city      |
| John     | Singapore |
| Toby     | London    |
| Eric     | Paris     |

tetapi jangan mengambil kata-kata saya untuk itu: cobalah di database Anda dan lihat apa yang Anda dapatkan!


3

Singkatnya, pernyataan SQL Anda akan -

SELECT FIELD1, FIELD2 .. FIELDN
FROM PARENT_TABLE 
  INNER JOIN CHILD_TABLE ON ( PARENT_TABLE.PARENT_KEY = CHILD_TABLE.FOREIGN_KEY)

Fields1 .. Fieldsn akan menjadi bidang yang ingin Anda ambil - dari salah satu atau kedua tabl.


Parenthesis tidak wajib, itu membuat kueri lebih sulit dibaca.
Spredzy

1
@Spredzy Reverse adalah kasus untuk saya, Parenthesis meningkatkan keterbacaan untuk saya
Sathyajith Bhat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.