Lấy dữ liệu từ các bảng liên quan trong Python

Hãy thực hiện một truy vấn để lấy tất cả người dùng cùng với thành phố của họ. Để làm điều này cần lệnh LEFT JOIN:

Cú pháp của nó trông như sau:

sqlSELECT các_trường FROM tên_bảng
  LEFT JOIN tên_bảng_liên_kết ON điều_kiện_liên_kết
WHERE điều_kiện_lựa_chọn

Hãy phân tích từng phần của cú pháp lệnh này.

Các trường

Vì việc lựa chọn diễn ra từ nhiều bảng, nên việc chọn tất cả các trường qua * sẽ không hoạt động. Truy vấn sau đây sẽ chọn các trường chỉ từ bảng chính, mà không phải từ bảng liên kết:

sqlSELECT *

Để dữ liệu được chọn từ tất cả các bảng, cần chỉ định tên bảng để lựa chọn trước *:

sqlSELECT users.*, cities.*

Hoặc có thể liệt kê các trường chúng ta cần với việc chỉ định tên bảng trước chúng:

sqlSELECT users.name, cities.name

Hai cách này có một vấn đề. Vấn đề là nếu các trường trong các bảng có tên giống nhau, thì trong mảng Python sẽ xảy ra xung đột tên và chỉ có một trường chiến thắng, còn trường thứ hai sẽ không có.

Để giải quyết vấn đề cần đổi tên các tên gây xung đột thông qua lệnh as:

sqlSELECT users.name, cities.name as city_name

Liên kết

Sau lệnh ON chúng ta phải chỉ định các trường từ hai bảng, thông qua đó thực hiện liên kết. Trong trường hợp của chúng ta, đó sẽ là trường id từ bảng thành phố và trường city_id từ bảng người dùng:

sqlON cities.id=users.city_id

Truy vấn

Cuối cùng, truy vấn để lấy người dùng cùng với thành phố của họ sẽ trông như sau:

sqlSELECT
  users.name, cities.name as city_name
FROM
  users
LEFT JOIN cities ON cities.id=users.city_id

Bài tập thực hành

Задание 1

Giả sử bạn có bảng sản phẩm và bảng danh mục của chúng. Viết truy vấn, lấy tên sản phẩm cùng với danh mục của chúng.