i. Giới thiệu
Mệnh đề Join trong SQL Server dùng để kết nối các bảng, view, sub query lại với nhau thông qua các foreign key hoặc các cột có giá trị tương ứng ở cả hai bảng, view hoặc các sub query.
ii. Chuẩn bị
Trước hết bạn hãy tạo ra hai table rất đơn giản và insert vào đó một ít dữ liệu như đoạn script sau:create table Item
(
MaHang nvarchar(20) primary key,
TenHang nvarchar(200)
)
insert Item(MaHang, TenHang)
values('NO1700', N'Điện thoại Nokia 1700'),
('NO1200', N'Điện thoại Nokia 1200'),
('IPHONE3', N'Điện thoại Iphone 3'),
('IPHONE4', N'Điện thoại Iphone 4'),
('IPHONE5', N'Điện thoại Iphone 5'),
('IPHONE6', N'Điện thoại Iphone 6')
create table OrderDetail
(
ID int identity primary key,
NgayDatHang datetime,
MaHang nvarchar(20),
SoLuong decimal(19,6) default 0 not null
)
insert OrderDetail(NgayDatHang, MaHang, SoLuong)
values('20140401', 'NO1700', 5),
('20140402', 'NO1700', 1),
('20140402', 'IPHONE3', 2),
('20140401', 'IPHONE4', 1),
('20140401','NO0001', 1000)
Chúng ta đã có 2 bảng dữ liệu với liên kết như trên, vậy nếu muốn truy xuất cùng lúc thông tin đặt hàng và thông tin hàng thì ta phải làm thế nào? Đây chính là nhiệm vụ của liên kết hay JOIN các bảng lại với nhau.
Trong SQL hỗ trợ các kiểu JOIN như sau:
1. INNER JOIN
INNER JOIN hay viết tắt là JOIN trả về kết quả là tập hợp dữ liệu từ 2 bảng trong đó giá trị dùng để join đều có ở cả 2 bảng, nói cách khác kiểu join này giống phép giao trong tập hợpHình minh họa
Câu truy vấn SQL cụ thể như sau:
SELECT t2.MaHang, t1.TenHang, t2.SoLuong
FROM Item t1 INNER JOIN OrderDetail t2 ON t1.MaHang = t2.MaHang
-- Hoặc dạng viết tắt
SELECT t2.MaHang, t1.TenHang, t2.SoLuong
FROM Item t1 JOIN OrderDetail t2 ON t1.MaHang = t2.MaHang
Kết quả là tập hợp sau:
Bốn mã hàng hóa ở cột MaHang đều có trong table Item và table OrderDetail.
2. OUTER JOIN
a. LEFT OUTER JOIN
Viết tắt: LEFT JOIN
Có thể diễn giải LEFT JOIN trong SQL như sau: "Lấy toàn bộ các dòng dữ liệu ở table bên trái và những dòng dữ liệu ở bảng bên phải CÓ giá trị MaHang tồn tại ở bảng bên trái.".
Kết quả minh họa như hình sau, kết quả trả về là hình oval màu xanh:
Có thể diễn giải LEFT JOIN trong SQL như sau: "Lấy toàn bộ các dòng dữ liệu ở table bên trái và những dòng dữ liệu ở bảng bên phải CÓ giá trị MaHang tồn tại ở bảng bên trái.".
Kết quả minh họa như hình sau, kết quả trả về là hình oval màu xanh:
Câu truy vấn như sau:
SELECT t1.MaHang, t1.TenHang, t2.SoLuong
FROM Item t1 LEFT JOIN OrderDetail t2 ON t1.MaHang = t2.MaHang
Kết quả trả về:
Một số dòng có SoLuong == null là do các MaHang này không tồn tại ở bảng bên phải (OrderDetail), nhưng có tồn tại ở bảng bên trái (Item).
Một số dòng có SoLuong == null là do các MaHang này không tồn tại ở bảng bên phải (OrderDetail), nhưng có tồn tại ở bảng bên trái (Item).
b. RIGHT OUTER JOIN
Viết tắt: RIGHT JOIN
Trái ngược với LEFT JOIN, RIGHT JOIN trong SQL Server lấy toàn bộ dữ liệu của bảng bên phải và dữ liệu của bảng bên trái nhưng giá trị cột JOIN cũng tồn tại trong bảng bên phải.
Trái ngược với LEFT JOIN, RIGHT JOIN trong SQL Server lấy toàn bộ dữ liệu của bảng bên phải và dữ liệu của bảng bên trái nhưng giá trị cột JOIN cũng tồn tại trong bảng bên phải.
c. FULL OUTER JOIN
Viết tắt: FULL JOIN
FULL OUTER JOIN trong SQL Server chính là kết quả gộp lại của cả hai table bên trái và bên phải.
Hình minh họa:
FULL OUTER JOIN trong SQL Server chính là kết quả gộp lại của cả hai table bên trái và bên phải.
Hình minh họa:
Câu truy vấn:
SELECT t1.MaHang, t1.TenHang, t2.SoLuong
FROM Item t1 FULL JOIN OrderDetail t2 ON t1.MaHang = t2.MaHang
Kết quả:
Quan sát kết quả trên có thể thấy:
Các dòng có MaHang = null là do bảng bên phải (OrderDetail) có giá trị nhưng table bên trái (Item) không có giá trị MaHang tương ứng.
Các dòng có SoLuong = null là do các mặt hàng IPHONE5, 6, NO1200 có trong bảng Item nhưng không có dòng nào tương ứng trong table OrderDetail.
Quan sát kết quả trên có thể thấy:
Các dòng có MaHang = null là do bảng bên phải (OrderDetail) có giá trị nhưng table bên trái (Item) không có giá trị MaHang tương ứng.
Các dòng có SoLuong = null là do các mặt hàng IPHONE5, 6, NO1200 có trong bảng Item nhưng không có dòng nào tương ứng trong table OrderDetail.
d. CROSS JOIN
CROSS JOIN trong SQL ít được sử dụng hơn so với các loại JOIN ở trên do tính ít ý nghĩa của nó, kết quả trả về của CROSS JOIN là lấy số dòng của bảng bên trái x số dòng của bảng bên phải. Ví dụ bảng Item có 6 dòng, bảng OrderDetail có 5 dòng, kết quả trả về là 30 dòng.Dữ liệu được nhân lên do cứ tương ứng với 1 dòng trong Item thì sẽ nối với toàn bộ 5 dòng trong OrderDetail mà không cần quan tâm đến tiêu chí so sánh nào (không có mệnh đề ON t1.ColumnA = t2.ColumnB như các kiểu JOIN khác). Cái này là phép nhân Đề các 2 quan hệ với nhau.
Câu truy vấn:
SELECT t1.*, t2.*
FROM Item t1 CROSS JOIN OrderDetail t2
Tương tự khi như ta viết:
Thường với những câu truy vấn này ta phải thêm điều kiện WHERE để hạn chế kết quả trả về.
Chỉ có liên kết các bảng với nhau mà đã có nhiều cách như vậy. Hy vọng bạn hiểu rõ chức năng của từng loại JOIN ở trên để sử dụng hợp lý.
Chúc bạn thành công!
(Nguồn: Big Data)
SELECT t1.*, t2.*Kết quả trả về:
FROM Item t1, OrderDetail t2
Thường với những câu truy vấn này ta phải thêm điều kiện WHERE để hạn chế kết quả trả về.
Chỉ có liên kết các bảng với nhau mà đã có nhiều cách như vậy. Hy vọng bạn hiểu rõ chức năng của từng loại JOIN ở trên để sử dụng hợp lý.
Chúc bạn thành công!
(Nguồn: Big Data)
0 nhận xét:
Đăng nhận xét