Đầu ra của một câu lệnh THAM GIA trông như thế nào?


8

Tôi đã muốn sử dụng tham gia trong một thời gian, nhưng tôi gặp khó khăn khi hình dung đầu ra để tôi biết làm thế nào để sử dụng nó.

Giả sử tôi có 2 bảng:

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)
);

Nếu ứng dụng của tôi chạy một truy vấn SQL để lấy dữ liệu hồ sơ của người dùng, làm thế nào tôi sử dụng phép nối để thành phố được liên kết với bản ghi của người dùng và bản ghi xuất ra sẽ xuất hiện như thế nào?

Câu trả lời:


12

Mỗi kết quả từ một hoạt động SQL là một bảng mới, cho dù nó được lưu trữ trên đĩa hay trong bộ nhớ

Chức năng của phép nối là "Nối" hai bảng lại với nhau thành bảng thứ ba tổng hợp (thường) chỉ tồn tại trong bộ nhớ trong suốt thời gian nó xuất ra ứng dụng.

Lý do để sử dụng phép nối là để giảm sự bất thường của dữ liệu , bằng cách đảm bảo rằng dữ liệu xuất hiện ở một và chỉ một nơi trong cơ sở dữ liệu.

Hãy xem xét những điều sau đây:

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

Ở đây, bất cứ khi nào chính phủ thay đổi mã zip (điều này xảy ra quá thường xuyên đối với thị hiếu của nhà phát triển cơ sở dữ liệu * thì bảng người sẽ cần được cập nhật sao cho tất cả các mã zip cũ thuộc đúng thành phố và mã zip mới.

Trong trường hợp này, cùng một mã zip nằm trong nhiều bộ dữ liệu của bảng và nếu bảng có thể chỉnh sửa theo cách thủ công, sẽ phải chịu sự bất thường cập nhật nghiêm trọng khi các kết hợp mã thành phố / mã zip mới được nhập mà không có toàn bộ cơ sở dữ liệu được cập nhật.

Thay vào đó, có ba bảng, chúng tôi nhận được cùng một dữ liệu, nhưng với độ linh hoạt và độ tin cậy cao hơn (với chi phí của một số hiệu suất, mặc dù các câu hỏi về "không chuẩn hóa phù hợp" là một chủ đề cho một loạt câu trả lời khác.)

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)`

Và chúng ta có thể lấy một "bảng" duy nhất ở trên thông qua truy vấn sau: SELECT Fname, Lname, AddressLine1, City, State, ZipCode FROM Person INNER JOIN Address USING (PersonID) INNER JOIN City USING (CityID)

Điều này cho phép chúng tôi cập nhật các bảng riêng lẻ bất cứ khi nào một cái gì đó cụ thể về chúng thay đổi, mà không làm hỏng phần còn lại của dữ liệu liên quan.

An INNER JOINlà loại tham gia mặc định. Nói một cách đơn giản, nó lưu ý: "kết hợp các bộ dữ liệu trong đó bản ghi này từ bảng a khớp với bản ghi này từ bảng b" Các loại liên kết khác là OUTER JOINSvà những gì được gọi là a CARTESIAN PRODUCT. Một kết nối bên ngoài là "Lấy mọi thứ từ bảng bên trái hoặc bên phải (như được chỉ định) và nơi bảng khác khớp với nhau, tham gia vào nó. Nếu không khớp, hãy điền vào đó bằng null" Và một sản phẩm cartesian (không đi vào đại số quan hệ là: Lấy mọi sự kết hợp có thể của các bộ dữ liệu trong cả hai bảng và xuất chúng thành một bảng, mà không khớp với bất cứ thứ gì.

* Hơn bao giờ hết, đặc biệt là trong trường hợp di chuyển các ranh giới của mã zip vì sự vui vẻ


6

Tôi nghĩ bạn đang tìm kiếm

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

cái nào sẽ cho bạn

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

nhưng đừng hiểu ý tôi: hãy thử nó trên cơ sở dữ liệu của bạn và xem những gì bạn nhận được!


3

Tóm lại, câu lệnh SQL của bạn sẽ là -

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

Các trường1 .. Các trường sẽ là các trường mà bạn muốn tìm nạp - từ một hoặc cả hai tab.


Dấu ngoặc đơn không bắt buộc, nó làm cho truy vấn khó đọc hơn.
Spredzy

1
@Spredzy Đảo ngược trường hợp của tôi, ngoặc đơn tăng khả năng đọc cho tôi
Sathyajith Bhat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.