Left - Right Join trong SQL Server
Sử dụng SQL server
Danh sách bài học
Left - Right Join trong SQL Server
Dẫn nhập
Trong bài trước, chúng ta đã cùng nhau tìm hiểu về FULL OUTER JOIN và CROSS JOIN trong SQL. Hai kiểu join này thường trả về tích kết quả lớn, tuy nhiên lưu ý công dụng của chúng lại hoàn toàn khác nhau.
Ở bài này, Kteam sẽ giới thiệu đến bạn một kiểu Join khác. Đó là HALF OUTER JOIN hay cụ thể hơn là LEFT JOIN & RIGHT JOIN.
Nội dung chính
Để theo dõi tốt nhất bài này, bạn nên xem qua bài:
- Khởi tạo DATABASE, TABLE trong SQL.
- Kiểu dữ liệu trong SQL.
- Insert, delete, update Table trong SQL.
- Tạo KHÓA CHÍNH, KHÓA NGOẠI trong SQL.
- Truy vấn có điều kiện trong SQL.
- INNER JOIN và FULL OUTER JOIN trong SQL
Trong bài này, chúng ta sẽ cùng nhau tìm hiểu một số vấn đề sau:
- Database mẫu
- Left Join & Right Join là gì?
- Left & Right Join kết hợp điều kiện.
Database mẫu
Để thao tác tốt với bài này, chúng ta sử dụng database HowKteam sau:
-- 1/ Tạo DB + Sử dụng DB
Create Database HowKteam
Go
Use HowKteam
Go
-- 2/ Tạo các table + Khoá chính
Create Table THAMGIADT
(
MAGV nchar(3),
MADT nchar(4),
STT int,
PHUCAP float,
KETQUA nvarchar(10),
Primary Key (MAGV,MADT,STT)
)
go
Create Table KHOA
(
MAKHOA nchar (4),
TENKHOA nvarchar (50),
NAMTL int,
PHONG char(3),
DIENTHOAI char(10),
TRUONGKHOA nchar(3),
NGAYNHANCHUC datetime,
primary key (MAKHOA)
)
go
create table BOMON
(
MABM nchar(4),
TENBM nchar (50),
PHONG char(3),
DIENTHOAI char(11),
TRUONGBM nchar(3),
MAKHOA nchar (4),
NGAYNHANCHUC date,
primary key (MABM)
)
go
create table CONGVIEC
(
MADT nchar(4),
SOTT int,
TENCV nvarchar(50),
NGAYBD datetime,
NGAYKT datetime,
primary key (MADT,SOTT)
)
go
create table DETAI
(
MADT nchar(4),
TENDT nvarchar(50),
CAPQL nchar(20),
KINHPHI float,
NGAYBD date,
NGAYKT date,
MACD nchar(4),
GVCNDT nchar(3),
primary key (MADT)
)
go
create table CHUDE
(
MACD nchar(4),
TENCD nvarchar(30),
primary key (MACD)
)
go
create table GIAOVIEN
(
MAGV nchar(3),
HOTEN nvarchar(50),
LUONG float,
PHAI nchar(3),
NGSINH date,
DIACHI nchar(50),
GVQLCM nchar(3),
MABM nchar(4),
primary key (MAGV)
)
go
create table NGUOITHAN
(
MAGV nchar(3),
TEN nchar(12),
NGSINH datetime,
PHAI nchar(3),
primary key (MAGV,TEN)
)
go
create table GV_DT
(
MAGV nchar(3),
DIENTHOAI char (10),
primary key (MAGV,DIENTHOAI)
)
go
-- 3/ Tạo khoá ngoại
--Tạo khoá ngoại ở bảng THAMGIADT
Alter table THAMGIADT
add constraint FK_HG1_MADT
foreign key (MADT, STT)
references CONGVIEC(MADT,SOTT)
go
--Tạo khóa ngoại ở bảng CONGVIEC
Alter table CONGVIEC
add constraint FK_HG2_MADT
foreign key (MADT)
references DETAI(MADT)
go
--Tạo khóa ngoại ở bảng DETAI
Alter table DETAI
add constraint FK_HG3_MACD
foreign key (MACD)
references CHUDE(MACD)
go
--Tạo khóa ngoại ở bảng DETAI
Alter table DETAI
add constraint FK_HG4_GVCNDT
foreign key (GVCNDT)
references GIAOVIEN(MAGV)
go
--Tạo khóa ngoại ở bảng THAMGIADT
Alter table THAMGIADT
add constraint FK_HG5_MAGV
foreign key (MAGV)
references GIAOVIEN(MAGV)
go
--Tạo khóa ngoại ở bảng GIAOVIEN
Alter table GIAOVIEN
add constraint FK_HG6_GVQLCM
foreign key (GVQLCM)
references GIAOVIEN(MAGV)
go
--Tạo khóa ngoại ở bảng KHOA
Alter table KHOA
add constraint FK_HG7_TRUONGKHOA
foreign key (TRUONGKHOA)
references GIAOVIEN(MAGV)
go
--Tạo khóa ngoại ở bảng NGUOITHAN
Alter table NGUOITHAN
add constraint FK_HG8_MAGV
foreign key (MAGV)
references GIAOVIEN(MAGV)
go
--Tạo khóa ngoại ở bảng GIAOVIEN
Alter table GIAOVIEN
add constraint FK_HG9_MABM
foreign key (MABM)
references BOMON(MABM)
go
--Tạo khóa ngoại ở bảng BOMON
Alter table BOMON
add constraint FK_HG10_MAKHOA
foreign key (MAKHOA)
references KHOA(MAKHOA)
go
--Tạo khóa ngoại ở bảng BOMON
Alter table BOMON
add constraint FK_HG11_TRUONGBM
foreign key (TRUONGBM)
references GIAOVIEN(MAGV)
go
--Tạo khóa ngoại ở bảng GV_DT
Alter table GV_DT
add constraint FK_HG12_MAGV
foreign key (MAGV)
references GIAOVIEN(MAGV)
go
-- 4/ Nhập data
--Nhập data cho bảng CHUDE
Insert Into CHUDE(MACD,TENCD)
values ('NCPT', N'Nghiên cứu phát triển')
Insert Into CHUDE(MACD,TENCD)
values ('QLGD', N'Quản lý giáo dục')
Insert Into CHUDE(MACD,TENCD)
values ('UDCN', N'Ứng dụng công nghệ')
go
--Nhập data cho bảng GIAOVIEN
Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
values ('001',N'Nguyễn Hoài An',2000.0,N'Nam','1973-02-15',N'25/3 Lạc Long Quân, Q.10,TP HCM')
Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
values ('002',N'Trần Trà Hương',2500.0,N'Nữ','1960-06-20',N'125 Trần Hưng Đạo, Q.1, TP HCM')
Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI,GVQLCM)
values ('003',N'Nguyễn Ngọc Ánh',2200.0,N'Nữ','1975-05-11',N'12/21 Võ Văn Ngân Thủ Đức, TP HCM',N'002')
Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
values ('004',N'Trương Nam Sơn',2300.0,N'Nam','1959-06-20',N'215 Lý Thường Kiệt,TP Biên Hòa')
Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
values ('005',N'Lý Hoàng Hà',2500.0,N'Nam','1954-10-23',N'22/5 Nguyễn Xí, Q.Bình Thạnh, TP HCM')
Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI,GVQLCM)
values ('006',N'Trần Bạch Tuyết',1500.0,N'Nữ','1980-05-20',N'127 Hùng Vương, TP Mỹ Tho',N'004')
Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI)
values ('007',N'Nguyễn An Trung',2100.0,N'Nam','1976-06-05',N'234 3/2, TP Biên Hòa')
Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI,GVQLCM)
values ('008',N'Trần Trung Hiếu',1800.0,N'Nam','1977-08-06',N'22/11 Lý Thường Kiệt,TP Mỹ Tho',N'007')
Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI,GVQLCM)
values ('009',N'Trần Hoàng nam',2000.0,N'Nam','1975-11-22',N'234 Trấn Não,An Phú, TP HCM',N'001')
Insert Into GIAOVIEN(MAGV,HOTEN,LUONG,PHAI,NGSINH,DIACHI,GVQLCM)
values ('010',N'Phạm Nam Thanh',1500.0,N'Nam','1980-12-12',N'221 Hùng Vương,Q.5, TP HCM',N'007')
go
--Nhập data cho bảng DETAI
Insert Into DETAI(MADT,TENDT,CAPQL,KINHPHI,NGAYBD,NGAYKT,MACD,GVCNDT)
values ('001',N'HTTT quản lý các trường ĐH',N'ĐHQG',20.0,'2007-10-20','2008-10-20',N'QLGD','002')
Insert Into DETAI(MADT,TENDT,CAPQL,KINHPHI,NGAYBD,NGAYKT,MACD,GVCNDT)
values ('002',N'HTTT quản lý giáo vụ cho một Khoa',N'Trường',20.0,'2000-10-12','2001-10-12',N'QLGD','002')
Insert Into DETAI(MADT,TENDT,CAPQL,KINHPHI,NGAYBD,NGAYKT,MACD,GVCNDT)
values ('003',N'Nghiên cứu chế tạo sợi Nanô Platin',N'ĐHQG',300.0,'2008-05-15','2010-05-15',N'NCPT','005')
Insert Into DETAI(MADT,TENDT,CAPQL,KINHPHI,NGAYBD,NGAYKT,MACD,GVCNDT)
values ('004',N'Tạo vật liệu sinh học bằng màng ối người',N'Nhà nước',100.0,'2007-01-01','2009-12-31',N'NCPT','004')
Insert Into DETAI(MADT,TENDT,CAPQL,KINHPHI,NGAYBD,NGAYKT,MACD,GVCNDT)
values ('005',N'Ứng dụng hóa học xanh',N'Trường',200.0,'2003-10-10','2004-12-10',N'UDCN','007')
Insert Into DETAI(MADT,TENDT,CAPQL,KINHPHI,NGAYBD,NGAYKT,MACD,GVCNDT)
values ('006',N'Nghiên cứu tế bào gốc',N'Nhà nước',4000.0,'2006-10-12','2009-10-12',N'NCPT','004')
Insert Into DETAI(MADT,TENDT,CAPQL,KINHPHI,NGAYBD,NGAYKT,MACD,GVCNDT)
values ('007',N'HTTT quản lý thư viện ở các trường ĐH',N'Trường',20.0,'2009-05-10','2010-05-10',N'QLGD','001')
go
--Nhập data cho bảng CONGVIEC
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('001',1,N'Khởi tạo và Lập kế hoạch','2007-10-20','2008-12-20')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('001',2,N'Xác định yêu cầu','2008-12-21','2008-03-21')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('001',3,N'Phân tích hệ thống','2008-03-22','2008-05-22')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('001',4,N'Thiết kế hệ thống','2008-05-23','2008-06-23')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('001',5,N'Cài đặt thử nghiệm','2008-06-24','2008-10-20')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('002',1,N'Khởi tạo và lập kế hoạch','2009-05-10','2009-07-10')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('002',2,N'Xác định yêu cầu','2009-07-11','2009-10-11')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('002',3,N'Phân tích hệ thống','2009-10-12','2009-12-20')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('002',4,N'Thiết kế hệ thống','2009-12-21','2010-03-22')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('002',5,N'Cài đặt thử nghiệm','2010-03-23','2010-05-10')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('006',1,N'Lấy mẫu','2006-10-20','2007-02-20')
Insert Into CONGVIEC(MADT,SOTT,TENCV,NGAYBD,NGAYKT)
values ('006',2,N'Nuôi cấy','2007-02-21','2008-09-21')
go
--Nhập data cho bảng THAMGIADT
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP)
values ('001','002',1,0.0)
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP)
values ('001','002',2,2.0)
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP,KETQUA)
values ('002','001',4,2.0,N'Đạt')
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP,KETQUA)
values ('003','001',1,1.0,N'Đạt')
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP,KETQUA)
values ('003','001',2,0.0,N'Đạt')
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP,KETQUA)
values ('003','001',4,1.0,N'Đạt')
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP)
values ('003','002',2,0.0)
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP,KETQUA)
values ('004','006',1,0.0,N'Đạt')
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP,KETQUA)
values ('004','006',2,1.0,N'Đạt')
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP,KETQUA)
values ('006','006',2,1.5,N'Đạt')
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP)
values ('009','002',3,0.5)
Insert Into THAMGIADT(MAGV,MADT,STT,PHUCAP)
values ('009','002',4,1.5)
go
--Nhập data cho bảng KHOA
Insert Into KHOA(MAKHOA,TENKHOA,NAMTL,PHONG,DIENTHOAI,TRUONGKHOA,NGAYNHANCHUC)
values (N'CNTT',N'Công nghệ thông tin',1995,'B11','0838123456','002','2005-02-20')
Insert Into KHOA(MAKHOA,TENKHOA,NAMTL,PHONG,DIENTHOAI,TRUONGKHOA,NGAYNHANCHUC)
values (N'HH',N'Hóa học',1980,'B41','0838456456','007','2001-10-15')
Insert Into KHOA(MAKHOA,TENKHOA,NAMTL,PHONG,DIENTHOAI,TRUONGKHOA,NGAYNHANCHUC)
values (N'SH',N'Sinh học',1980,'B31','0838454545','004','2000-10-11')
Insert Into KHOA(MAKHOA,TENKHOA,NAMTL,PHONG,DIENTHOAI,TRUONGKHOA,NGAYNHANCHUC)
values (N'VL',N'Vật lý',1976,'B21','0838223223','005','2003-09-18')
go
--Nhập data cho bảng NGUOITHAN
Insert Into NGUOITHAN(MAGV,TEN,NGSINH,PHAI)
values ('001',N'Hùng','1990-01-14',N'Nam')
Insert Into NGUOITHAN(MAGV,TEN,NGSINH,PHAI)
values ('001',N'Thủy','1994-12-08',N'Nữ')
Insert Into NGUOITHAN(MAGV,TEN,NGSINH,PHAI)
values ('003',N'Hà','1998-09-03',N'Nữ')
Insert Into NGUOITHAN(MAGV,TEN,NGSINH,PHAI)
values ('003',N'Thu','1998-09-03',N'Nữ')
Insert Into NGUOITHAN(MAGV,TEN,NGSINH,PHAI)
values ('007',N'Mai','2003-03-26',N'Nữ')
Insert Into NGUOITHAN(MAGV,TEN,NGSINH,PHAI)
values ('007',N'Vy','2000-02-14',N'Nữ')
Insert Into NGUOITHAN(MAGV,TEN,NGSINH,PHAI)
values ('008',N'Nam','1991-05-06',N'Nam')
Insert Into NGUOITHAN(MAGV,TEN,NGSINH,PHAI)
values ('009',N'An','1996-08-19',N'Nam')
Insert Into NGUOITHAN(MAGV,TEN,NGSINH,PHAI)
values ('010',N'Nguyệt','2006-01-14',N'Nữ')
go
--Nhập data cho bảng GV_DT
Insert Into GV_DT(MAGV,DIENTHOAI)
values ('001','0838912112')
Insert Into GV_DT(MAGV,DIENTHOAI)
values ('001','0903123123')
Insert Into GV_DT(MAGV,DIENTHOAI)
values ('002','0913454545')
Insert Into GV_DT(MAGV,DIENTHOAI)
values ('003','0838121212')
Insert Into GV_DT(MAGV,DIENTHOAI)
values ('003','0903656565')
Insert Into GV_DT(MAGV,DIENTHOAI)
values ('003','0937125125')
Insert Into GV_DT(MAGV,DIENTHOAI)
values ('006','0937888888')
Insert Into GV_DT(MAGV,DIENTHOAI)
values ('008','0653717171')
Insert Into GV_DT(MAGV,DIENTHOAI)
values ('008','0913232323')
go
--Nhập data cho bảng BOMON
Insert Into BOMON(MABM,TENBM,PHONG,DIENTHOAI,MAKHOA)
values (N'CNTT',N'Công nghệ tri thức','B15','0838126126',N'CNTT')
Insert Into BOMON(MABM,TENBM,PHONG,DIENTHOAI,MAKHOA)
values (N'HHC',N'Hóa hữu cơ','B44','0838222222',N'HH')
Insert Into BOMON(MABM,TENBM,PHONG,DIENTHOAI,MAKHOA)
values (N'HL',N'Hóa Lý','B42','0838878787',N'HH')
Insert Into BOMON(MABM,TENBM,PHONG,DIENTHOAI,TRUONGBM,MAKHOA,NGAYNHANCHUC)
values (N'HPT',N'Hóa phân tích','B43','0838777777','007',N'HH','2007-10-15')
Insert Into BOMON(MABM,TENBM,PHONG,DIENTHOAI,TRUONGBM,MAKHOA,NGAYNHANCHUC)
values (N'HTTT',N'Hệ thống thông tin','B13','0838125125','002',N'CNTT','2004-09-20')
Insert Into BOMON(MABM,TENBM,PHONG,DIENTHOAI,TRUONGBM,MAKHOA,NGAYNHANCHUC)
values (N'MMT',N'Mạng máy tính','B16','0838676767','001',N'CNTT','2005-05-15')
Insert Into BOMON(MABM,TENBM,PHONG,DIENTHOAI,MAKHOA)
values (N'SH',N'Sinh hóa','B33','0838898989',N'SH')
Insert Into BOMON(MABM,TENBM,PHONG,DIENTHOAI,MAKHOA)
values (N'VLĐT',N'Vật lý điện tử','B23','0838234234',N'VL')
Insert Into BOMON(MABM,TENBM,PHONG,DIENTHOAI,TRUONGBM,MAKHOA,NGAYNHANCHUC)
values (N'VLUD',N'Vật lý ứng dụng','B24','0838454545','005',N'VL','2006-02-18')
Insert Into BOMON(MABM,TENBM,PHONG,DIENTHOAI,TRUONGBM,MAKHOA,NGAYNHANCHUC)
values (N'VS',N'Vi Sinh','B32','0838909090','004',N'SH','2007-01-01')
go
--Cập nhật thêm dữ liệu cho bảng GIAOVIEN
update GIAOVIEN
set MABM = 'MMT'
where (MAGV = '001')
update GIAOVIEN
set MABM = 'HTTT'
where (MAGV = '002')
update GIAOVIEN
set MABM = 'HTTT'
where (MAGV = '003')
update GIAOVIEN
set MABM = 'VS'
where (MAGV = '004')
update GIAOVIEN
set MABM = N'VLĐT'
where (MAGV = '005')
update GIAOVIEN
set MABM = 'VS'
where (MAGV = '006')
update GIAOVIEN
set MABM = 'HPT'
where (MAGV = '007')
update GIAOVIEN
set MABM = 'HPT'
where (MAGV = '008')
update GIAOVIEN
set MABM = 'MMT'
where (MAGV = '009')
update GIAOVIEN
set MABM = 'HPT'
where (MAGV = '010')
GO
Left & Right Join là gì?
HALF OUTER JOIN gồm là mệnh đề truy vấn với kết quả trả về là tập hợp gồm tất cả dữ liệu của bảng chính với các dữ liệu thỏa điều kiện ở bảng phụ hoặc với NULL ở các dữ liệu không thỏa điều kiện ở bảng phụ.
HALF OUTER JOIN có hai loại, áp dụng trên hai bảng A,B cho trước là LEFT JOIN & RIGHT JOIN.
Phép truy vấn A LEFT JOIN B (hoặc B RIGHT JOIN A) trả về kết quả gồm:
- Các dữ liệu chung chính là truy vấn INNER JOIN trên hai bảng.
- Các dữ liệu riêng của bảng A mà không có giá trị trùng khớp ở bảng B, thì các trường thuộc tính của bảng B trong kết quả trả về mặc định là NULL.
- Không hiển thị các dữ liệu riêng chỉ tồn tại ở bảng B mà không tồn tại ở bảng A.
- Tương tự Inner Join, ta cũng có thể liên tưởng đến Half Outer Join thông qua biểu đồ venn trong toán học về phép toán hai tập hợp với A, B đại diện cho dữ liệu trong 2 Table. Half Outer Join chính là kết quả của phép toán A giao B hợp A hiệu B
Cấu trúc
SELECT <Danh sách column>
FROM <Table A> LEFT | RIGHT JOIN <Table B>
ON <Điều kiện kết hợp AB>
Trong đó:
- <danh sách column> tên các column cần hiển thị ở kết quả truy vấn. Các column được ngăn cách với nhau bằng dấu phẩy (,)
- <Table A>, <Table B> là tên các bảng để lấy dữ liệu khi truy vấn.
- <Điều kiện kết hợp AB> điều kiện để truy vấn Half Outer Join của Table A với các Table B.
Lưu ý:
- Mọi Half Outer Join đều bắt buộc phải có điều kiện kết hợp sau ON.
- Half Outer Join không có tính đối xứng giữa hai bảng như Inner Join và Full Outer Join mà có phân biệt thứ tự bảng nhập vào. Có nghĩa là kết quả trả về của phép truy vấn A Left Join B không giống B Left Join A.
- Tuy nhiên kết quả trả về của truy vấn A Left Join B giống B Right Join A.
- Vì vậy, để hạn chế nhầm lẫn Kteam khuyến khích bạn chọn dùng một trong hai loại Half Join để dễ dàng ngầm mặc định một bảng chính trước và một bảng phụ sau trong quá trình truy vấn.
Ví dụ
Để hiểu rõ hơn về HALF OUTER JOIN, chúng ta cùng thao tác một số ví dụ sau trên Database HowKteam ở đầu bài.
Ví dụ 1: Xuất ra danh sách giáo viên chủ nhiệm hoặc chưa chủ nhiệm đề tài. Ở đây ta chỉ chọn những thông tin chính cần thiết đáp ứng nhu cầu truy vấn
SELECT GV.MAGV, GV.HOTEN, DT.MADT,DT.TENDT
FROM dbo.GIAOVIEN AS GV
LEFT JOIN dbo.DETAI AS DT ON DT.GVCNDT = GV.MAGV
Hoặc
SELECT GV.MAGV, GV.HOTEN, DT.MADT,DT.TENDT
FROM dbo.DETAI AS DT
RIGHT JOIN dbo.GIAOVIEN AS GV ON GV.MAGV = DT.GVCNDT
Kết quả trả về như sau giúp ta dễ dàng thấy được tổng quan:
- Dữ liệu chung tồn tại ở hai bảng GiaoVien va DeTai
- Dữ liệu riêng chỉ tồn tại ở bảng GiaoVien, không tồn tại ở bảng DeTai nên các trường ở bảng DeTai hiển thị NULL
- Không hiện thị các dữ liệu chỉ tồn tại ở bảng DeTai mà không tồn tại ở bảng GiaoVien. (Hiện tại trong Database không có dữ liệu cho trường hợp này, bạn có thể thêm dữ liệu để tự kiểm tra kết quả của câu truy vấn).
Ví dụ 2: Xuất thông tin bộ môn đã có giáo viên dạy và chưa có giáo viên dạy.
SELECT BM.MABM, BM.TENBM, GV.MAGV,GV.HOTEN
FROM dbo.BOMON AS BM
LEFT JOIN dbo.GIAOVIEN AS GV ON GV.MABM = BM.MABM
Hoặc
SELECT BM.MABM, BM.TENBM, GV.MAGV,GV.HOTEN
FROM dbo.GIAOVIEN AS GV
RIGHT JOIN dbo.BOMON AS BM ON BM.MABM = GV.MABM
Ví dụ 3.1: Xuất ra danh sách giáo viên làm trưởng bộ môn hoặc không làm trưởng bộ môn
SELECT GV.MAGV, GV.HOTEN, BM.MABM, BM.TENBM
FROM dbo.BOMON AS BM
RIGHT JOIN dbo.GIAOVIEN AS GV ON GV.MAGV = BM.TRUONGBM
Ví dụ 3.2: Xuất ra danh sách bộ môn có trưởng bộ môn hoặc chưa có trưởng bộ môn
SELECT GV.MAGV, GV.HOTEN, BM.MABM, BM.TENBM
FROM dbo.GIAOVIEN AS GV
RIGHT JOIN dbo.BOMON AS BM ON GV.MAGV = BM.TRUONGBM
Lưu ý:
Ví dụ 3.1 và 3.2 trả về cùng sử dụng hai bảng giống nhau và cùng trả về các trường thuộc tính như nhau. Tuy nhiên, kết quả truy vấn nhằm đáp ứng hai nhu cầu khác nhau và thể hiện tính không đối xứng của Half Outer Join.
Half Outer Join kết hợp điều kiện
Tương tự Inner Join, HALF OUTER JOIN hoàn toàn có thể kết hợp với các điều kiện khác nếu cần bằng mệnh đề WHERE.
Ví dụ 4: Xuất ra danh sách những giáo viên nam có người thân & chưa có người thân.
SELECT GV.MAGV,GV.HOTEN, NT.TEN
FROM dbo.GIAOVIEN AS GV
LEFT JOIN dbo.NGUOITHAN AS NT ON NT.MAGV = GV.MAGV
WHERE GV.PHAI = N’NAM'
Ví dụ 5: Xuất thông tin bộ môn thuộc khoa Sinh Học (SH) đã có giáo viên dạy và chưa có giáo viên dạy
SELECT BM.MABM, BM.TENBM, GV.MAGV,GV.HOTEN
FROM dbo.BOMON AS BM
LEFT JOIN dbo.GIAOVIEN AS GV ON GV.MABM = BM.MABM
WHERE BM.MAKHOA = 'SH'
Hoặc
SELECT BM.MABM, BM.TENBM, GV.MAGV,GV.HOTEN
FROM dbo.GIAOVIEN AS GV
RIGHT JOIN dbo.BOMON AS BM ON GV.MABM = BM.MABM
WHERE BM.MAKHOA = 'SH'
Kết
Trong bài này, chúng ta đã tìm hiểu về LEFT JOIN & RIGHT JOIN trong SQL.
Bài sau, chúng ta sẽ bắt đầu với UNION TRONG SQL
Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của bạn để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử Thách – Không ngại khó”.
Tải xuống
Tài liệu
Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Left - Right Join trong SQL Server dưới dạng file PDF trong link bên dưới.
Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com
Đừng quên like và share để ủng hộ Kteam và tác giả nhé!
Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.
Nội dung bài viết
Tác giả/Dịch giả
Khóa học
Với hệ thống nhỏ, chúng ta hoàn toàn có thể lưu trữ dữ liệu bằng file để khi tắt ứng dụng dữ liệu chúng ta vẫn còn được lưu giữ. Nhưng với hệ thống lớn, truy vấn tìm kiếm, thao tác với dữ liệu trên file không còn dễ dàng và hiệu quả nữa. Và SQL ra đời để giải quyết vấn đề đó.
Chúng ta cùng nhau tìm hiểu về SQL và SQL Server thông qua serial HƯỚNG DẪN SỬ DỤNG SQL SERVER nhé!