Self join là gì? Tìm hiểu về câu lệnh self join trong SQL Server

Self join trong SQL là một trường hợp đặc biệt của phép nối. Trong khi cú pháp các hàm join khác phải liên kết 2 bảng trở lên để thể hiện dữ liệu chung thì self join chỉ tự liên kết với chính nó. Vậy thì self join trong SQL server là gì? Cùng Comdy tìm hiểu chi tiết trong bài viết này nhé.

SQL self join là gì?

SQL self join là gì
Self join sql là phép nối thực hiện trên hai bảng ảo của chính mình

Self join sql là phép nối thực hiện trên hai bảng ảo của chính mình. Điều này thường xảy ra khi bạn có một bảng chứa thông tin về các mục có mối quan hệ với chính nó.

Ví dụ, giả sử bạn có một bảng “Employees” với các cột như “EmployeeID”, “Name”, và “ManagerID” (ID của quản lý). Trong trường hợp này, bạn có thể sử dụng self join để kết nối các nhân viên với quản lý của họ. Cụ thể, bạn có thể so sánh “ManagerID” của mỗi nhân viên với “EmployeeID” để trích xuất thông tin về quản lý của từng nhân viên.

Cú pháp Self Join trong SQL Server

Như đã biết, self-join là một hàm hàm join trong sql. Nó cho phép bạn join một bảng vào chính nó. Nó rất hữu ích để truy vấn dữ liệu phân cấp hoặc so sánh các bản ghi trong cùng một bảng.

Self Join sử dụng mệnh đề INNER JOIN hoặc LEFT JOIN. Vì truy vấn sử dụng tham chiếu đến cùng một bảng, nên bí danh bảng được sử dụng để gán các tên khác nhau cho cùng một bảng trong truy vấn.

Lưu ý: việc tham chiếu đến cùng một bảng nhiều lần trong một truy vấn mà không sử dụng bí danh bảng sẽ dẫn đến lỗi.

Sau đây minh họa cú pháp join bảng T với chính nó:

SELECT
    select_list
FROM
    T t1
[INNER | LEFT]  JOIN T t2 ON
    join_predicate;

Truy vấn tham chiếu bảng T hai lần. Các bí danh bảng t1 và t2 được sử dụng để gán các tên bảng T khác nhau trong truy vấn.

Ví dụ Self Join trong SQL Server

Ví dụ Self Join trong SQL Server
Lấy ví dụ về hàm Self Join trong SQL Server

Hãy lấy một số ví dụ để tìm hiểu cách thức self join hoạt động trong SQL Server.

Sử dụng Self Join trong SQL để truy vấn dữ liệu phân cấp

Bảng staffs lưu trữ các thông tin nhân viên như id, tên, họ và email. Nó cũng có một cột có tên là manager_id để chỉ định người quản lý trực tiếp. Ví dụ, Mireya báo cáo lên Fabiola vì giá trị trong manager_id của  Mireya là Fabiola.

Fabiola không có người quản lý nên cột id người quản lý có NULL.

Để biết ai báo cáo cho ai, bạn sử dụng self join được trình bày trong truy vấn sau:

SELECT
    e.first_name + ' ' + e.last_name employee,
    m.first_name + ' ' + m.last_name manager
FROM
    sales.staffs e
INNER JOIN sales.staffs m ON m.staff_id = e.manager_id
ORDER BY
    manager;

Trong ví dụ này, chúng tôi đã tham chiếu bảng staffs hai lần: bí danh e cho nhân viên và bí danh m cho người quản lý. Biểu thức join khớp mối quan hệ nhân viên với người quản lý bằng cách sử dụng các giá trị trong cột e.manager_id và cột m.staff_id.

Cột nhân viên không có Fabiola Jackson vì hiệu ứng của mệnh đề INNER JOIN. Nếu bạn thay thế mệnh đề INNER JOIN bằng mệnh đề  LEFT JOIN như trong truy vấn sau, bạn sẽ nhận được tập kết quả bao gồm Fabiola Jackson trong cột nhân viên:

SELECT
    e.first_name + ' ' + e.last_name employee,
    m.first_name + ' ' + m.last_name manager
FROM
    sales.staffs e
LEFT JOIN sales.staffs m ON m.staff_id = e.manager_id
ORDER BY
    manager;

Sử dụng Self Join trong SQL để so sánh các bản ghi trong bảng

Sử dụng Self Join để so sánh các bản ghi
Ví dụ về việc sử dụng câu lệnh Self Join để so sánh các bản ghi trong bảng

Câu lệnh sau đây sử dụng self join để tìm các khách hàng có địa chỉ trong cùng thành phố.

SELECT
    c1.city,
    c1.first_name + ' ' + c1.last_name customer_1,
    c2.first_name + ' ' + c2.last_name customer_2
FROM
    sales.customers c1
INNER JOIN sales.customers c2 ON c1.customer_id > c2.customer_id
    AND c1.city = c2.city
ORDER BY
    city,
    customer_1,
    customer_2;

Điều kiện sau đây đảm bảo rằng câu lệnh không so sánh cùng một khách hàng:

c1.customer_id > c2.customer_id

Và điều kiện sau đây để khớp thành phố của hai khách hàng:

AND c1.city = c2.city

Lưu ý: nếu bạn thay đổi toán tử lớn hơn (>) bằng toán tử không bằng (<>), bạn sẽ nhận được nhiều bản ghi hơn:

SELECT
    c1.city,
    c1.first_name + ' ' + c1.last_name customer_1,
    c2.first_name + ' ' + c2.last_name customer_2
FROM
    sales.customers c1
INNER JOIN sales.customers c2 ON c1.customer_id <> c2.customer_id
AND c1.city = c2.city
ORDER BY
    city,
    customer_1,
    customer_2;

Chúng ta hãy xem sự khác biệt giữa > và <> trong mệnh đề ON bằng cách giới hạn ở một thành phố để dễ so sánh hơn.

Truy vấn sau đây trả về các khách hàng có địa chỉ ở Albany:

SELECT 
   customer_id, first_name + ' ' + last_name c, 
   city
FROM 
   sales.customers
WHERE
   city = 'Albany'
ORDER BY 
   c;

Truy vấn này sử dụng toán tử > trong mệnh đề ON:

SELECT
    c1.city,
    c1.first_name + ' ' + c1.last_name customer_1,
    c2.first_name + ' ' + c2.last_name customer_2
FROM
    sales.customers c1
INNER JOIN sales.customers c2 ON c1.customer_id > c2.customer_id
    AND c1.city = c2.city
WHERE c1.city = 'Albany'
ORDER BY
    c1.city,
    customer_1,
    customer_2;

Truy vấn này sử dụng toán tử <> trong mệnh đề ON:

SELECT
    c1.city,
    c1.first_name + ' ' + c1.last_name customer_1,
    c2.first_name + ' ' + c2.last_name customer_2
FROM
    sales.customers c1
INNER JOIN sales.customers c2 ON c1.customer_id <> c2.customer_id
    AND c1.city = c2.city
WHERE c1.city = 'Albany'
ORDER BY
    c1.city,
    customer_1,
    customer_2;

Cú pháp câu lệnh left join trong SQL

Cú pháp câu lệnh left join trong SQL
LEFT JOIN trong SQL được sử dụng để kết hợp các hàng từ bảng bên trái với các hàng tương ứng từ bảng bên phải

Câu lệnh LEFT JOIN trong SQL được sử dụng để kết hợp các hàng từ bảng bên trái với các hàng tương ứng từ bảng bên phải, dựa trên một điều kiện join. Nếu không có hàng nào trong bảng bên phải tương ứng với điều kiện join, thì kết quả vẫn bao gồm các hàng từ bảng bên trái, nhưng các giá trị cho các cột của bảng bên phải sẽ là NULL.

Cú pháp:

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

Self insert là gì?

Thuật ngữ “self insert” trong ngữ cảnh của cơ sở dữ liệu có thể không phải là một thuật ngữ chính thức hoặc rõ ràng. Tuy nhiên, có thể hiểu “self insert” theo cách đơn giản là việc chèn (insert) dữ liệu vào cùng một bảng từ dữ liệu hiện có trong bảng đó.

Inner join là gì?

Inner join là gì
Inner join trong SQL là phép nối giữa hai bảng dựa trên một điều kiện so sánh và trả về các hàng có giá trị khớp trong cả hai bảng

Inner join trong SQL là phép nối (join) giữa hai bảng dựa trên một điều kiện so sánh và trả về các hàng có giá trị khớp trong cả hai bảng. Cụ thể, câu lệnh join trong sql này sẽ chỉ trả về các dòng khi có ít nhất một cặp giá trị trong cột được xác định bởi điều kiện join mà thỏa mãn.

Cú pháp:

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

Trong đó:

  • table1 và table2 là tên của hai bảng bạn muốn nối.
  • column_name là tên cột bạn muốn sử dụng để kết nối (join) hai bảng.

join in là gì?

Đây không phải là một kiểu nối bảng trong SQL. Nếu như join là gia nhập vào tỏo chức để trở thành thành viên thì join in là tham gia vào hoạt động hiện đang được diễn ra.

Cách join nhiều bảng trong SQL như thế nào?

Để kết hợp nhiều bảng trong SQL, bạn có thể sử dụng nhiều câu lệnh JOIN để liên kết các bảng theo các điều kiện join khác nhau.

Ví dụ:

Giả sử bạn có ba bảng: “Orders”, “Customers”, và “Products”. Bảng “Orders” có cột “CustomerID” để liên kết với “Customers”, và cột “ProductID” để liên kết với “Products”. Bạn muốn lấy thông tin về đơn đặt hàng, tên khách hàng, và tên sản phẩm.

SELECT Orders.OrderID, Customers.CustomerName, Products.ProductName
FROM Orders
JOIN Customers ON Orders.CustomerID = Customers.CustomerID
JOIN Products ON Orders.ProductID = Products.ProductID;

Kết lại

Trên đây là toàn bộ chia sẻ của Comdy về câu lệnh self join trong SQL và một số câu lệnh nối bảng khác. Đây quả thực là công cụ hữu ích giúp quá trình truy xuất dữ liệu của bạn nhanh chóng và hiệu quả. Hi vọng thông tin trong bài viết này là ý nghĩa với mọi người. Xin cám ơn!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *