Hướng dẫn sử dụng JOIN trong SQL Server. | How to use JOIN clause in SQL Server?

Mệnh đề JOIN (JOIN Clause) là mệnh đề được thường xuyên sử dụng trong việc truy vấn dữ liệu kết hợp giữ các bảng, tuy nhiên nó cũng tương đối khó sử dụng nếu không hiểu rõ cách hoạt động của nó. Bài viết này tôi sẽ hướng dẫn cách sử dụng JOIN trong SQL Server.

SQL JOIN là gì?

SQL JOIN là một mệnh đề của ngôn ngữ SQL được sử dụng để kết hợp các dòng dữ liệu của hai hay nhiều bảng dữ liệu khác nhau, dựa trên mối quan hệ chung giữa các trường(field hay có thể hiểu là column) giữa các bảng.

SQL JOIN quy định các kiểu quan hệ chung giữa các bảng thông qua các từ khóa join sau:
  • Inner Join
  • Left Join
  • Right Join
  • Full Join
Chúng ta sẽ tìm hiểu kỹ hơn về các loại JOIN này trong phần bên dưới, nhưng trước tiên ta cần chuẩn bị các bảng dữ liệu để thực hành, mà thông qua đó ta sẽ dẽ hiểu hơn.


Tạo bảng và dữ liệu:

CREATE DATABASE demo;
//---------------------------------
CREATE TABLE customers
(
customerid int,
customername varchar(255),
country varchar(255),
postalCode varchar(255),
city varchar(255),
address varchar(255)
);
//---------------------------------
INSERT INTO customers(customerid, customername, country, postalCode, city, address)
VALUES ('0001','Bui Ngoc Son','VN','1010','Ho Chi Minh','07 QL7 Tan Hung Thuan Q12 HCM');
INSERT INTO customers(customerid, customername, country, postalCode, city, address)
VALUES ('0002','Nguyen Tien Dung','VN','1020','Can Tho','11 Huong Lo 22 Ta Quang Xa Phi Yen CT');
INSERT INTO customers(customerid, customername, country, postalCode, city, address)
VALUES ('0003','Tran The Trung','VN','1020','Can Tho','22 Tinh Lo 17 Xa Tran Quang CT');
INSERT INTO customers(customerid, customername, country, postalCode, city, address)
VALUES ('0004','Vuong Min An','VN','1030','Phan Thiet','77 QL1A Xa Tan Hung PT');
INSERT INTO customers(customerid, customername, country, postalCode, city, address)
VALUES ('0005','Nguyen Thi Bich Lan','VN','1040','Vung Tau','88 QL1A Xa Binh Minh VT');

SELECT * FROM customers
//---------------------------------
//---------------------------------
CREATE TABLE orders
(
orderid int,
customerid int,
employeeid varchar(255),
orderdate varchar(255),
shipperid varchar(255)
);
//---------------------------------
INSERT INTO orders(orderid, customerid, employeeid, orderdate, shipperid)
VALUES ('0001','0001','EMP0001','2014-01-01','SHI0001');
INSERT INTO orders(orderid, customerid, employeeid, orderdate, shipperid)
VALUES ('0002','0003','EMP0002','2014-01-02','SHI0002');
INSERT INTO orders(orderid, customerid, employeeid, orderdate, shipperid)
VALUES ('0003','0004','EMP0003','2014-01-03','SHI0003');
INSERT INTO orders(orderid, customerid, employeeid, orderdate, shipperid)
VALUES ('0004','0005','EMP0004','2014-01-04','SHI0004');
INSERT INTO orders(orderid, customerid, employeeid, orderdate, shipperid)
VALUES ('0005','0001','EMP0005','2014-01-05','SHI0005');

SELECT * FROM orders


Sử dụng sql inner join:


Là từ khóa cho phép truy vấn tất cả các dòng từ hai hay nhiều bảng, mà các dòng dữ liệu trong các cột của các bảng có mối liên hệ là đồng nhất(giống nhau), nghĩa là nó chỉ lấy các dòng dữ liệu của khi dữ liệu trong các cột giữa các bảng phải giống nhau.

Thí dụ bảng TABLE_01 cột 001 có dữ liệu là [A, B, C, D] và bảng TABLE_02 cột 001 có dữ liệu là [A, C, D] thì khi sử dụng inner join thì dữ liệu lấy ra sẽ là [A, C, D] đồng nhất giữa 2 bảng.

Ta sẽ thực hành một ví dụ trên hai dữ liệu trên là "order" và "customers", yêu cầu là lọc ra thông tin các cột "customername, customerid, orderid" mà trong đó trong giá trị trong cột "customerid" của bảng "customers" có tồn trong bảng "order".


Để thực hiện được yêu cầu trên ta sẽ sử dụng INNER JOIN để xử lý, ta làm như sau:

SELECT customers.customername, customers.customerid, orders.orderid
FROM customers
INNER JOIN orders
ON customers.customerid=orders.customerid
ORDER BY customers.customername;

Sau khi chay câu truy vấn inner join sẽ được kết quả như sau:



Sử dụng sql left join:


Từ khóa LEFT JOIN trả về tất cả các dòng dữ liệu của bảng bên trái(bảng 1), và các dòng dữ liệu tương ứng có  trong bảng bên phải(bảng 2). Kết quả là NULL khi giá trị ở bảng bên phải(bảng 2) không có dữ liệu tương ứng.

Tiếp tục sử dụng hai bảng dữ liệu trên để thể hiện cách thức hoạt động của mên đề SQL LEFT JOIN, trong việc truy vấn dữ liệu, ta sẽ có cú pháp như sau:

SELECT customers.customername, customers.customerid, orders.orderid
FROM customers
LEFT JOIN orders
ON customers.customerid=orders.customerid
ORDER BY customers.customername;

Kết quả sau khi thực thi câu truy vấn trên sẽ là:


Như bạn thấy dòng "customerid" có giá trị là 2 không có tòn tại trong bảng "order" nên giá trị của "orderid" sẽ được trả về "NULL".


Sử dụng sql right join:

Từ khóa RIGHT JOIN trả về tất cả các dòng dữ liệu của bảng bên phải(bảng 2), và các dòng dữ liệu tương ứng có trong bảng bên trái(bảng1). Kết quả là NULL khi giá trị ở bảng bên trái(bảng 1) không có dữ liệu tương ứng.

À quên mất dữ liệu bảng "order" có tồn tại đầy đủ giá trị "customerid" trong bảng "customer" nên không hiển thị được giá trị NULL, bạn thêm một dòng chèn dữ liệu sau vào nha.

INSERT INTO orders(orderid, customerid, employeeid, orderdate, shipperid)
VALUES ('0005','0007','EMP0006','2014-01-05','SHI0006');

Tiếp theo sử dung câu truy vấn SQL RIGHT JOIN sau:

SELECT customers.customername, customers.customerid, orders.orderid, orders.customerid as orders_customerid
FROM customers
RIGHT JOIN orders
ON customers.customerid=orders.customerid
ORDER BY customers.customername;

Kết quả sau khi thực thi, ta sẽ có được bảng dữ liệu sau:


Như bạn thấy trên hình "customerid" có giá trị là 7 chỉ tồn tại ở bảng "orders" nên giá trị trả về của các cột từ bảng "customer" sẽ trả về là "NULL".


Sử dụng sql full join:

Từ khóa FULL JOIN trả về tất cả các dòng dữ liệu của cả hai bảng, trường hợp dữ liệu chỉ tồn tại trong một bảng thì nó sẽ trả về giá trị là NULL.

Ta sử dung dùng mệnh đề SQL FULL JOIN như sau:

SELECT customers.customername, customers.customerid, orders.orderid, orders.customerid as orders_customerid
FROM customers
FULL JOIN orders
ON customers.customerid=orders.customerid
ORDER BY customers.customername;

Kết quả trả về sẽ như bảng dữ liệu bên dưới:




Write: +Bui Ngoc Son






No comments:

Post a Comment