Truy xuất dữ liệu nhiều bảng bằng mệnh đề Join trong SQL

Bài hôm nay mình sẽ hướng dẫn cách truy xuất dữ liệu từ nhiều bảng sử dụng mệnh đề JOIN trong SQL

Mục Lục:

1. Mệnh đề JOIN

Mệnh đề JOIN được sử dụng lấy dữ liệu các hàng từ hai hay nhiều bảng, dựa trên cột liên quan giữa chúng

Ví dụ: ta có 2 bảng sau

Bảng "Orders"

OrderID CustomerID OrderDate
10308 2 1996-09-18
10309 37 1996-09-19
10310 77 1996-09-20

Bảng "Customers"

CustomerID CustomerName ContactName Country
1 Alfreds Futterkiste Maria Anders Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Mexico
3 Antonio Moreno Taquería Antonio Moreno Mexico

Cột "CustomerID" trong bảng "Orders" dùng để chỉ "CustomerID" trong bảng "Customers". Mối quan hệ giữa hai bảng ở trên là cột "CustomerID".

Thực hiện truy vấn lấy OrderID, CustomerName, OrderDate

        SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
        FROM Orders
        INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
    

Kết quả

OrderID CustomerName OrderDate
10308 Ana Trujillo Emparedados y helados 9/18/1996
10365 Antonio Moreno Taquería 11/27/1996
10383 Around the Horn 12/16/1996
10355 Around the Horn 11/15/1996
10278 Berglunds snabbköp 8/12/1996

2. Các mệnh đề JOIN khác nhau trong SQL

  • (INNER) JOIN: Trả về các hàng khi có một so khớp (match) trong các bảng
  • LEFT (OUTER) JOIN: Trả về tất cả các hàng từ bảng bên trái, ngay cả khi không có so khớp nào trong bảng bên phải
  • RIGHT (OUTER) JOIN: Trả về tất cả các hàng từ bảng bên phải, ngay cả khi không có so khớp nào trong bảng bên trái
  • FULL (OUTER) JOIN: Trả về các hàng khi có một so khớp ở một trong các bảng

SQL INNER JOIN  SQL LEFT JOIN 

SQL RIGHT JOIN  SQL bên ngoài tham gia 

Mệnh đề INNER JOIN

Mệnh đề INNER JOIN chọn các bản ghi có giá trị phù hợp trong cả hai bảng.

Cú pháp:

        SELECT column_name(s)
        FROM table1
        INNER JOIN table2 ON table1.column_name = table2.column_name;
    

SQL INNER JOIN 

Ví dụ: ta có 2 bảng sau

Bảng "Orders"

OrderID CustomerID EmployeeID OrderDate ShipperID
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2

Bảng "Customers"

CustomerID CustomerName ContactName Address City PostalCode Country
1

Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

Ví dụ: Câu lệnh SQL sau đây sẽ chọn tất cả các đơn đặt hàng với thông tin khách hàng:

        SELECT Orders.OrderID, Customers.CustomerName
        FROM Orders
        INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
    

Mệnh đề LEFT (OUTER) JOIN

Mệnh đề LEFT (OUTER) JOIN trả về tất cả các bản ghi từ bảng bên trái (table1), và các bản ghi phù hợp từ bảng bên phải (table2). Kết quả là NULL từ phía bên phải, nếu không có kết hợp.

Cú pháp:

        SELECT column_name(s)
        FROM table1
        LEFT JOIN table2 ON table1.column_name = table2.column_name;
    

SQL INNER JOIN 

Ví dụ: ta có 2 bảng sau

Bảng "Customers"

CustomerID CustomerName ContactName Address City PostalCode Country
1

Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

Bảng "Orders"

OrderID CustomerID EmployeeID OrderDate ShipperID
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2

Ví dụ: Câu lệnh SQL sau đây sẽ chọn tất cả các khách hàng, và bất kỳ đơn đặt hàng nào họ có thể có:

        SELECT Customers.CustomerName, Orders.OrderID
        FROM Customers
        LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
        ORDER BY Customers.CustomerName;
    

Mệnh đề RIGHT (OUTER) JOIN

Mệnh đề RIGHT (OUTER) JOIN trả về tất cả các bản ghi từ bảng bên phải (table2), và các bản ghi phù hợp từ bảng bên trái (table1). Kết quả là NULL từ phía bên trái, nếu không có kết hợp.

Cú pháp:

        SELECT column_name(s)
        FROM table1
        RIGHT JOIN table2 ON table1.column_name = table2.column_name;
    

SQL INNER JOIN 

Ví dụ: ta có 2 bảng sau

Bảng "Orders"

OrderID CustomerID EmployeeID OrderDate ShipperID
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2

Bảng "Employees"

EmployeeID LastName FirstName BirthDate Photo
1 Davolio Nancy 12/8/1968 EmpID1.pic
2 Fuller Andrew 2/19/1952 EmpID2.pic
3 Leverling Janet 8/30/1963 EmpID3.pic

Ví dụ: Câu lệnh SQL sau đây sẽ trả lại tất cả nhân viên và bất kỳ đơn đặt hàng nào họ đã đặt:

        SELECT Orders.OrderID, Employees.LastName, Employees.FirstName
        FROM Orders
        RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
        ORDER BY Orders.OrderID;
    

Mệnh đề FULL (OUTER) JOIN

Mệnh đề FULL (OUTER) JOIN trả lại tất cả các bản ghi khi có kết quả trong bảng ghi trái (table1) hoặc bên phải (table2).

Cú pháp:

        SELECT column_name(s)
        FROM table1
        FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
    

SQL INNER JOIN 

Ví dụ: ta có 2 bảng sau

Bảng "Customers"

CustomerID CustomerName ContactName Address City PostalCode Country
1

Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

Bảng "Orders"

OrderID CustomerID EmployeeID OrderDate ShipperID
10308 2 7 1996-09-18 3
10309 37 3 1996-09-19 1
10310 77 8 1996-09-20 2

Ví dụ: Câu lệnh SQL sau đây sẽ chọn tất cả các khách hàng và tất cả các đơn đặt hàng:

        SELECT Customers.CustomerName, Orders.OrderID
        FROM Customers
        FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID
        ORDER BY Customers.CustomerName;
    

Mệnh đề Self JOIN

Mệnh đề Self JOIN được sử dụng để kết hợp một bảng với chính nó, khi nếu table đó là hai bảng dữ liệu, thay tên tạm thời cho ít nhất một bảng trong lệnh SQL.

Cú pháp:

        SELECT column_name(s)
        FROM table1 T1, table1 T2
        WHERE condition;
    

SQL INNER JOIN 

Ví dụ: ta có bảng sau

CustomerID CustomerName ContactName Address City PostalCode Country
1

Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

Ví dụ: Câu lệnh SQL lấy dữ liệu các khách hàng đến từ cùng một thành phố:

        SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
        FROM Customers A, Customers B
        WHERE A.CustomerID <> B.CustomerID
        AND A.City = B.City
        ORDER BY A.City;