Site icon Blog Dương Trạng

Bài 2: [Basic] Tất tần tật những gì về JOIN trong SQL

Bài 2: [Basic] Tất tần tật những gì về JOIN trong SQL

Bài 2: [Basic] Tất tần tật những gì về JOIN trong SQL

Trong SQL, mệnh đề JOIN được sử dụng để kết hợp các hàng từ hai hoặc nhiều bảng dựa trên một cột có liên quan giữa chúng. Có một số loại mệnh đề JOIN: ❤️

Trên đây mới chỉ outline và mô tả ngắn ngọn ý nghĩa của các loại JOIN. Ngoài những loại JOIN ở trên thì còn 1 số loại JOIN nữa như NATURAL JOIN (Postgres assist), vv.. nhưng nó sử dụng khá ít nên trong nội dung bài này mình sẽ không đề cập đến. Để tìm hiểu chi tiết hơn và thực hành qua các ví dụ cụ thể thì hãy cùng mình đi xuống các phần bên dưới nhé!

Interior be part of trong SQL là một cách để kết hợp dữ liệu từ hai hoặc nhiều bảng trong cơ sở dữ liệu quan hệ. Nó chỉ trả về những hàng có giá trị khớp trong cả hai bảng. Nói cách khác, inside be part of chỉ trả về các hàng có giá trị của các cột được chỉ định trong cả hai bảng khớp với nhau.

Cú pháp cơ bản cho phép nối bên trong như sau:

SELECT column1, column2, … FROM table1 JOIN table2 ON table1.column = table2.column;

Trong ví dụ này, table1 và table2 là tên của các bảng mà bạn muốn inside be part of, còn table1.column và table2.column là các cột mà bạn muốn khớp. Câu lệnh SELECT chỉ định cột nào bạn muốn truy xuất từ từ các bảng.

Bạn cũng có thể inside be part of nhiều bảng và cũng có thể sử dụng từ khóa “JOIN” thay vì “INNER JOIN” vì SQL hỗ trợ inside be part of ngầm định.

Dưới đây là một ví dụ về việc be part of 3 bảng lại với nhau:

SELECT orders.order_id, clients.title, merchandise.title FROM orders JOIN clients ON orders.customer_id = clients.customer_id JOIN merchandise ON orders.product_id = merchandise.product_id;

Truy vấn này lấy ra order_id, clients.title và merchandise.title cho mỗi đơn đặt hàng trong bảng “orders” bằng cách so khớp customer_id trong bảng “orders” với customer_id trong bảng “clients” và so khớp product_id trong bảng “orders” với product_id trong bảng “merchandise“.

Đây là một ví dụ về inside be part of trong SQL với một số dữ liệu mẫu:

– Pattern information for the “staff” desk CREATE TABLE staff ( employee_id INT, title VARCHAR(255), department_id INT ); INSERT INTO staff (employee_id, title, department_id) VALUES (1, ‘John Smith’, 1), (2, ‘Jane Doe’, 2), (3, ‘Bob Johnson’, 1); – Pattern information for the “departments” desk CREATE TABLE departments ( department_id INT, department_name VARCHAR(255) ); INSERT INTO departments (department_id, department_name) VALUES (1, ‘IT’), (2, ‘HR’), (3, ‘Advertising’); – Interior be part of the “staff” and “departments” tables SELECT staff.title, departments.department_name FROM staff JOIN departments ON staff.department_id = departments.department_id;

Bảng “staff” có 3 nhân viên với id 1,2,3, tên và id bộ phận của họ. Và bảng “departments” có 3 phòng ban với id 1,2,3 và tên phòng ban. Interior be part of thực hiện trên cột department_id trong cả hai bảng, do đó, chỉ những hàng có giá trị department_id khớp trong cả hai bảng mới được trả về. Câu lệnh SELECT chỉ định rằng chúng ta muốn truy xuất staff.title và department_name từ hai bảng.

Kết quả của truy vấn này sẽ là một bảng có hai cột, một cho staff.title và một cho department_name. Bảng kết quả sẽ chỉ chứa các hàng có giá trị department_id khớp với cả bảng “staff” và “departments“.

Identify | Department_Name John Smith | IT Jane Doe | HR

Nó chỉ chứa những hàng mà department_id khớp trong cả hai bảng là nhân viên John Smith và Jane Doe.

Left be part of (còn được gọi là left outer be part of) trong SQL là một cách để kết hợp dữ liệu từ hai hoặc nhiều bảng trong cơ sở dữ liệu quan hệ, tương tự như inside be part of. Điểm khác biệt chính là left be part of trả về tất cả các hàng từ bảng bên trái (tức là bảng đầu tiên được chỉ định trong be part of), ngay cả khi không có kết quả khớp trong bảng bên phải (tức là bảng thứ hai được chỉ định trong be part of). Trong trường hợp khi tồn tại các file của table1 không có kết quả khớp với table2 thì các column choose của table2 sẽ được trả về bằng NULL .

Cú pháp cơ bản cho left be part of như sau:

SELECT column1, column2, … FROM table1 LEFT JOIN table2 ON table1.column = table2.column;

Trong ví dụ này, table1 là bảng bên trái và table2 là bảng bên phải, đồng thời table1.column và table2.column là các cột mà bạn muốn so khớp.

Đây là một ví dụ về left be part of trong SQL với một số dữ liệu mẫu:

– Pattern information for the “staff” desk CREATE TABLE staff ( employee_id INT, title VARCHAR(255), department_id INT ); INSERT INTO staff (employee_id, title, department_id) VALUES (1, ‘John Smith’, 1), (2, ‘Jane Doe’, 2), (3, ‘Bob Johnson’, 1), (4, ‘Marry’, NULL); – Pattern information for the “departments” desk CREATE TABLE departments ( department_id INT, department_name VARCHAR(255) ); INSERT INTO departments (department_id, department_name) VALUES (1, ‘IT’), (2, ‘HR’); – Left be part of the “staff” and “departments” tables SELECT staff.title, departments.department_name FROM staff LEFT JOIN departments ON staff.department_id = departments.department_id;

Trong ví dụ này, bảng “staff” có 4 nhân viên và id bộ phận của họ. Còn bảng “departments” có 2 phòng ban. Việc left be part of được thực hiện trên cột department_id trong cả hai bảng. Câu lệnh SELECT chỉ định rằng chúng ta muốn truy xuất staff.title và department_name từ hai bảng.

Kết quả của truy vấn này sẽ là một bảng có hai cột, một cho staff.title và một cho department_name. Bảng kết quả sẽ chứa tất cả các hàng của bảng “staff“, bất kể có trùng khớp trong bảng “departments” hay không. Nhân viên thứ tư, Marry không có department_id và khi sử dụng left be part of, nó sẽ vẫn hiển thị trong tập hợp kết quả nhưng với giá trị NULL trong cột department_name.

Identify | Department_Name John Smith | IT Jane Doe | HR Bob Johnson | IT Marry | NULL

Nó sẽ trả về tất cả các hàng từ bảng “staff” và chỉ những hàng phù hợp từ bảng “departments” và đối với các hàng chưa khớp trong bảng “departments” sẽ trả về NULL trong cột department_name.

Proper be part of (còn được gọi là proper outer be part of) trong SQL tương tự như left be part of, nhưng nó trả về tất cả các hàng từ bảng bên phải (tức là bảng thứ hai được chỉ định trong be part of), ngay cả khi không có kết quả khớp ở bảng bên trái (tức là bảng đầu tiên được chỉ định trong liên kết).Trong trường hợp khi tồn tại các file của table2 không có kết quả khớp với table1 thì các column choose của table1 sẽ được trả về bằng NULL .

Cú pháp cơ bản cho proper be part of như sau:

SELECT column1, column2, … FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;

Nó ít được sử dụng hơn left be part of và inside be part of, vì hầu hết thời gian, yêu cầu là truy xuất tất cả dữ liệu từ một bảng và dữ liệu phù hợp từ một bảng khác và left be part of được ưa thích hơn trong trường hợp đó.

Đây là một ví dụ về proper be part of trong SQL với một số dữ liệu mẫu:

– Pattern information for the “orders” desk CREATE TABLE orders ( order_id INT, customer_id INT, product_id INT ); INSERT INTO orders (order_id, customer_id, product_id) VALUES (1, 1, 1), (2, 2, 2), (3, 1, 2); – Pattern information for the “clients” desk CREATE TABLE clients ( customer_id INT, title VARCHAR(255) ); INSERT INTO clients (customer_id, title) VALUES (1, ‘John Smith’), (2, ‘Jane Doe’), (3, ‘Bob Johnson’); – Pattern information for the “merchandise” desk CREATE TABLE merchandise ( product_id INT, title VARCHAR(255) ); INSERT INTO merchandise (product_id, title) VALUES (1, ‘Product 1’), (2, ‘Product 2’), (3, ‘Product 3’); – Proper be part of the “orders” , “clients” and “merchandise” tables SELECT orders.order_id, merchandise.title, clients.title FROM orders RIGHT JOIN merchandise ON orders.product_id = merchandise.product_id RIGHT JOIN clients ON orders.customer_id = clients.customer_id;

Trong ví dụ này, bảng “orders” có 3 đơn hàng, bảng “clients” có 3 khách hàng và bảng “merchandise” có 3 sản phẩm. Việc proper be part of được thực hiện trên các cột product_id và customer_id trong cả hai bảng. Câu lệnh SELECT chỉ định rằng chúng ta muốn truy xuất order_id, merchandise.title và clients.title từ ba bảng.

Kết quả của truy vấn này sẽ là một bảng có ba cột, một cột dành cho order_id, một cột dành cho merchandise.title và một cột dành cho clients.title . Bảng kết quả sẽ chứa tất cả các hàng của bảng “merchandise” và “clients“, bất kể có khớp trong bảng “orders” hay không. Các hàng chưa khớp từ bảng “orders” sẽ có giá trị NULL cho cột order_id.

Order_id | Product_Name | Customer_Name 1 | Product 1 | John Smith 2 | Product 2 | Jane Doe 3 | Product 2 | John Smith NULL | Product 3 | Bob Johnson

Full outer be part of (hoặc full be part of) trong SQL là sự kết hợp của cả left be part of và proper be part of. Nó trả về tất cả các hàng từ cả hai bảng, ngay cả khi không có kết quả khớp trong bảng kia. Bảng kết quả sẽ chứa tất cả các hàng từ bảng bên trái, tất cả các hàng từ bảng bên phải và mọi hàng phù hợp từ cả hai bảng.

Full outer be part of không phải là thao tác SQL tiêu chuẩn, hệ thống cơ sở dữ liệu khác có thể hỗ trợ hoặc không hỗ trợ nó, đồng thời cú pháp về cách viết full outer be part of có thể khác nhau tùy theo cơ sở dữ liệu. Một số cơ sở dữ liệu sử dụng từ khóa FULL OUTER JOIN, một số sử dụng FULL JOIN.

Ví dụ, trong MySQL, bạn có thể mô phỏng FULL OUTER JOIN bằng cách sử dụng UNION của LEFT JOIN và RIGHT JOIN. Cú pháp cơ bản sẽ là:

SELECT column1, column2, … FROM table1 LEFT JOIN table2 ON table1.column = table2.column UNION SELECT column1, column2, … FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;

Ngoài ra, bạn có thể sử dụng một số cơ sở dữ liệu như OracleSQL Server có cú pháp FULL OUTER JOIN có thể được sử dụng:

SELECT column1, column2, … FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column;

Trong ví dụ này, table1 là bảng bên trái và table2 là bảng bên phải, đồng thời table1.columntable2.column là các cột mà bạn muốn so khớp.

Truy vấn này trả về tất cả các hàng từ cả hai bảng và bất kỳ hàng khớp nào từ cả hai bảng, với các hàng không khớp được thay thế bằng giá trị NULL.

Đây là một ví dụ về full outer be part of trong SQL với một số dữ liệu mẫu:

– Pattern information for the “staff” desk CREATE TABLE staff ( employee_id INT, title VARCHAR(255), department_id INT ); INSERT INTO staff (employee_id, title, department_id) VALUES (1, ‘John Smith’, 1), (2, ‘Jane Doe’, 2), (3, ‘Bob Johnson’, 1); – Pattern information for the “departments” desk CREATE TABLE departments ( department_id INT, department_name VARCHAR(255) ); INSERT INTO departments (department_id, department_name) VALUES (1, ‘IT’), (2, ‘HR’), (3, ‘Finance’); – Full outer be part of the “staff” and “departments” tables SELECT staff.title, departments.department_name FROM staff FULL OUTER JOIN departments ON staff.department_id = departments.department_id;

Trong ví dụ này, bảng “staff” có 3 nhân viên và bảng “departments” có 3 phòng ban. Việc full outer be part of được thực hiện trên cột department_id trong cả hai bảng. Câu lệnh SELECT chỉ định rằng chúng ta muốn truy xuất staff.title và department_name từ hai bảng.

Kết quả của truy vấn này sẽ là một bảng có hai cột, một cho staff.title và một cho department_name. Bảng kết quả sẽ chứa tất cả các hàng của bảng “staff“, cũng như tất cả các hàng của bảng “departments” và các hàng phù hợp sẽ được kết hợp thành một hàng. Nếu không có kết quả khớp trong bất kỳ bảng nào, nó sẽ trả về giá trị departments cho các cột staff.title hoặc department_name.

Identify | Department_Name John Smith | IT Jane Doe | HR Bob Johnson | IT NULL | Finance

Cross be part of, còn được gọi là tích Đề-các, trong SQL trả về tổ hợp của tất cả các hàng từ bảng đầu tiên với tất cả các hàng từ bảng thứ hai. Điều này có nghĩa là số hàng trong bảng kết quả là tích của số hàng trong bảng đầu tiên và số hàng trong bảng thứ hai.

Cú pháp cơ bản của cross be part of như sau:

SELECT column1, column2, … FROM table1 CROSS JOIN table2

Điều đáng chú ý là số lượng hàng kết quả trong cross be part of có thể tăng theo cấp số nhân với số lượng hàng trong mỗi bảng. Thông thường, bạn không nên sử dụng cross be part of, trừ khi bạn có yêu cầu hoặc nhu cầu cụ thể về nó, vì nó có thể tạo ra một tập hợp kết quả rất lớn và chiếm nhiều bộ nhớ.

Đây là một ví dụ về cross be part of:

SELECT colours.coloration, sizes.dimension FROM colours CROSS JOIN sizes;

Trong ví dụ này, bảng “colours” có 4 màu và bảng “sizes” có 6 kích cỡ. cross be part of được thực hiện mà không có bất kỳ điều kiện bổ sung nào. Câu lệnh SELECT xác định rằng chúng ta muốn truy xuất màu sắc và kích thước.

Kết quả của truy vấn này sẽ là một bảng có hai cột, một cho coloration và một cho dimension. Bảng kết quả sẽ chứa 24 hàng, kết hợp màu sắc và kích thước 4×6

Coloration | Measurement Purple | Small Purple | Medium Purple | Massive Purple | X-Massive Purple | XX-Massive Purple | XXX-Massive Inexperienced | Small Inexperienced | Medium …

Self be part of trong SQL là một kiểu be part of trong đó một bảng được nối với chính nó, thường sử dụng các bí danh để phân biệt giữa hai thể hiện của bảng. Điều này hữu ích khi một bảng có mối quan hệ với chính nó, chẳng hạn như khi một bảng chứa mối quan hệ cha-con hoặc mối quan hệ phân cấp.

Cú pháp cơ bản self be part of như sau:

SELECT column1, column2, … FROM table1 t1 JOIN table1 t2 ON t1.column = t2.column

Trong ví dụ này, table1 là tên của bảng được be part of, t1 là bí danh cho phiên bản đầu tiên của bảng và t2 là bí danh cho phiên bản thứ hai của bảng. t1.column và t2.column là các cột mà bạn muốn so khớp.

SELECT e1.title, e2.title FROM staff e1 JOIN staff e2 ON e1.manager_id = e2.employee_id

Trong ví dụ này, bảng “staff” có quan hệ tự tham chiếu, mỗi nhân viên có một cột manager_id tham chiếu đến một employee_id trên cùng một bảng. Việc nối được thực hiện trên các cột manager_id và employee_id của cùng một bảng. Câu lệnh SELECT chỉ định rằng chúng ta muốn truy xuất tên của nhân viên và người quản lý của anh ta.

Kết quả của truy vấn này sẽ là một bảng có hai cột, một cho tên của nhân viên và một cho tên của người quản lý. Bảng kết quả sẽ chứa tất cả tên nhân viên cùng với tên người quản lý của họ, những nhân viên không có người quản lý sẽ có giá trị NULL cho cột tên người quản lý.

Self be part of là một cách mạnh mẽ để truy vấn dữ liệu phân cấp hoặc đệ quy được lưu trữ trong một bảng và nó có thể được sử dụng trong các tình huống khác nhau như truy vấn mối quan hệ giữa nhân viên và người quản lý, sơ đồ tổ chức và nhiều trường hợp sử dụng khác.

Ở trên mình đã giới thiệu với các bạn các loại JOIN trong SQL kèm các ví dụ thực tiễn để dễ hình dung nhất có thể. Các bạn có thể tìm hiểu ở những nguồn khác để có thể so sánh và bổ sung kiến thức cho bản thân nhé. Nếu trong quá trình viết bài mình có sai sót hoặc bạn thắc mắc có thể remark vào bài viết này giúp mình nhé. Mình vẫn tiếp tục ra những bài viết mới trong collection này mong các bạn ủng hộ. Cảm ơn mọi người

Exit mobile version