Join table in DML

  • Bài viết này sẽ chia sẻ về những kiến thức về câu lệnh JOIN trong Database manipulation language. Với những câu queries đơn giản sẽ chỉ lấy dữ liệu trong 1 bảng. Tuy nhiên có những câu queries có thể truy vấn nhiều bảng cùng 1 thời điểm. Những câu queries truy vấn nhiều rows của cùng hoặc nhiều bảng khác nhau tại 1 thời điểm được gọi là các câu lệnh JOIN. Để dễ hình dung, chúng ta sẽ đi vào các ví dụ cụ thể. Giả sử chúng ta có 2 bảng weather và city với dữ liệu như sau:

Bảng weather:

city      | temp_lo | temp_hi | prcp |    date    |
---------------+---------+---------+------+------------
 Hayward       |      37 |      54 |      | 1994-11-29
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      43 |      57 |    0 | 1994-11-29
(3 rows)

Bảng city:

     name      | location
---------------+-----------
  San Francisco | (-194,53)
 San Francisco | (-194,53)
(2 rows)
  • Bạn muốn list tất cả các dữ liệu thời tiết với địa điểm của các thành phố tương ứng. Để làm điều này, bạn cần phải so sánh cột city của mỗi row của dữ liệu trong bảng weather với tên cột city của tất cả các rows trong bản city, và chọn ra các cặp rows có giá trị giống nhau. JOIN query là một khái niệm mang tính model, nó thương được thực hiện hiệu quả hơn so với cách so sánh mối cặp rows của các bảng khác nhau, nhưng việc này được ẩn đi với phía người dùng.

Dưới đây là câu query cho ví dụ được nêu ở trên:

SELECT * FROM weather, cities WHERE city = name;

Kết quả:

city | temp_lo | temp_hi | prcp | date | name | location

    San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
    San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
(2 rows)

Chúng ta có thể thấy 2 điều sau về kế quả trả về:

  • Ko có dữ liệu của city Hayward. Bởi vì nó ko có dữ liệu tương ứng trong bảng city cho Hayward, vì vậy nó sẽ bỏ những rows ko tương ứng trong bảng weather. Chúng ta có thể nhìn đuợc sự khác biệt ở ví dụ dưới.
  • Có 2 column hiển thị kêt quả city name, điều này là đúng vì danh sách các column ở bảng weather và city được nối tiếm nhau. Trên thực tế, người thực hiện sẽ không mong muốn điều này, mà kết quả trả về sẽ chỉ hiển thị chính xác những column cần thiết thay vì sử dụng SELECT *.

Ví dụ:

SELECT city, temp_lo, temp_hi, prcp, date, location FROM weather, cities WHERE city = name;

  • Khi mà tất cả các column name khác nhau, kết qủa sẽ tự động được phân tích và trả về chính xác cho người dùng. Nếu tên column bị trùng nhau, bạn cần chỉ chính xác cột đó thuộc bảng nào như ví dụ dưới đây:

SELECT weather.city, weather.temp_lo, weather.temp_hi, weather.prcp, weather.date, cities.location FROM weather, cities WHERE cities.name = weather.city;

  • Với cách viết như trên, câu query sẽ đảm bảo ko bị fail trong trường hợp 2 bảng có cúng column name. Và nó có thể đuợc thay thế nếu sử dụng câu lệnh JOIN. Cú pháp như sau:

SELECT * FROM weather INNER JOIN cities ON (weather.city = cities.name);

  • Cú pháp trên không thường được sử dụng nhưng nó sẽ giúp bạn hiểu được các vấn đề được trình bày tiếp theo.

  • Bây giờ chúng ta sẽ tìm hiểu làm thế nào để lấy dữ liệu của city Hayward. Những thứ mà chúng ta làm là scan mối row của bảng weather để tìm ra các row tương ứng với bảng city. Nêu ko tìm được dữ liệu trong bảng city, kêt quả trả về sẽ hiển thị giá trị rỗng với các column của bảng table. Thực hiện câu lệnh OUTER JOIN sẽ cho kết quả như sau:

SELECT * FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);

 city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------
 Hayward       |      37 |      54 |      | 1994-11-29 |               |
 San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
 San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
(3 rows)
  • Với câu query LEFT OUTER JOIN toàn bộ dữ liệu của bảng weather sẽ được lấy ra, các dữ liệu ko tương ứng bên bảng city sẽ được fill giá trị empty với các dữ liệu đó.

  • Chúng ta cũng có thể JOIN table với chính nó. Việc này gọi là SEFL JOIN. Ví dụ, giả sử chúng ta muốn tìm tất cả các dữ liệu thời tiết với dải nhiệt độ nằm trong dải nhiệt độ của các dữ liệu thời tiết khác. Chúng ta sẽ cần so sánh temp_lo và temp_hi columns của mỗi row trong bảng weather với temp_lo và temp_hi của các rows khác trong bảng này. Câu query sẽ dược thực hiên như sau:

SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high, W2.city, W2.temp_lo AS low, W2.temp_hi AS high FROM weather W1, weather W2 WHERE W1.temp_lo < W2.temp_lo AND W1.temp_hi > W2.temp_hi;

 city      | low | high |     city      | low | high
---------------+-----+------+---------------+-----+------
 San Francisco |  43 |   57 | San Francisco |  46 |   50
 Hayward       |  37 |   54 | San Francisco |  46 |   50
(2 rows)
  • Trên đây là nhứng chia sẻ về việc sử dụng JOIN query trong DML. Hi vọng bài viết này sẽ giúp bạn có thể query dữ liệu một cách dễ dàng khi vần lấy dữ liệu từ nhiều tables.

All Rights Reserved