Full Outer Join trong SQL Server | How Kteam

Dẫn nhập

Trong bài trước, chúng ta đã cùng nhau tìm hiểu về
INNER JOIN trong SQL. Khá giống bài trước, bài này
Kteam sẽ giới thiệu đến bạn một cách Join khác.

Đó là FULL OUTER 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:

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
  • Full Outer Join là gì?
  • Full Outer Join trong SQL.
  • Full Outer Join kết hợp điều kiện.
  • Cross Join trong SQL.

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	

Full Outer Join là gì?

FULL OUTER JOIN là mệnh đề truy vấn với kết quả trả về là tập hợp tất cả dữ liệu chung và riêng giữa thông qua điều kiện kết hợp hai bảng.

  • 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

    , chỉ tồn tại ở một trong hai bảng không có giá trị trùng khớp điều kiện kết hợp thì các trường ở bảng còn lại được

    mặc định NULL

    (Rỗng)

Mọi Full Outer Join đều bắt buộc phải có điều kiện kết hợp sau
ON

Tương tự Inner Join, ta cũng có thể liên tưởng đến Full Outer Join thông qua biểu đồ venn trong toán học về phép hợp hai tập hợp với A, B đại diện cho dữ liệu trong 2 Table. Full Outer Join chính là kết quả của phép toán
A hợp B.

howkteam, how, kteam, sql, server, inner join, full outer join, select from where, on, cross join, descartes

Full Outer Join 2 Table trong SQL

Cấu trúc:

SELECT
<Danh sách column>

FROM
<Table A> FULL
OUTER 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 Full Outer Join của Table A với các Table B.

Lưu ý:  

  • Full Outer Join có thể mang lại cho bạn một kết quả tổng quan về dữ liệu chung và riêng từ hai Table.
  • Tuy nhiên cần cẩn trọng trong mục đích sử dụng, do kết quả mang lại có thể rất lớn với các Table có số lượng record đồ sộ > tốc độ truy vấn bị ảnh hưởng.
  • Nếu bạn không xác định được các trường thuộc tính cần trả ra, đôi khi kết quả Full Outer Join sẽ làm bạn rất rối mắt.

Ví dụ

Để hiểu rõ hơn về FULL OUTER JOIN cũng như trường hợp truy vấn nào nên sử dụng Full 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:  Nhu cầu đặt ra khi bạn muốn chọn một giáo viên chưa chủ nhiệm đề tài nào để chủ nhiệm cho đề tài mới mà vẫn cần xem qua tất cả giáo viên và đề tài đã có chủ nhiệm.

Vậy cần xuất ra danh sách giáo viên nào đã chủ nhiệm đề tài, giáo viên nào chưa chủ nhiệm đề tài để có cái nhìn tổng quan nhất.

  • Ở đây ta chỉ chọn những thông tin chính cần thiết đáp ứng nhu cầu truy vấn
--Hiển thị các GV chủ nhiệm đề tài & chưa chủ nhiệm đề tài

SELECT GV.MAGV, GV.HOTEN, DT.MADT,DT.TENDT
FROM dbo.GIAOVIEN AS GV
FULL OUTER JOIN dbo.DETAI AS DT ON DT.GVCNDT = GV.MAGV

Kết quả trả về như sau giúp ta dễ dàng thấy được:

  • Giáo viên nào đã có chủ nhiệm đề tài? đó là đề tài gì?
  • Giáo viên nào

    chưa chủ nhiệm

    đề tài?

howkteam, how, kteam, sql, server, inner join, full outer join, select from where, on, cross join, descartes

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
FULL OUTER JOIN dbo.GIAOVIEN AS GV ON GV.MABM = BM.MABM

Ví dụ 3: Xuất danh sách giáo viên có người thân & chưa có người thân.

SELECT GV.MAGV,GV.HOTEN, NT.TEN
FROM dbo.GIAOVIEN AS GV
FULL OUTER JOIN dbo.NGUOITHAN AS NT ON NT.MAGV = GV.MAGV

Kteam khuyến khích các bạn tự thao tác câu lệnh trên Database sẵn có để hiểu rõ hơn kết quả cũng như cách truy vấn Full Outer Join.

Full Outer Join kết hợp điều kiện

Tương tự
Inner Join, FULL 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 nữ có người thân & chưa có người thân.

SELECT GV.MAGV,GV.HOTEN, NT.TEN
FROM dbo.GIAOVIEN AS GV
FULL OUTER JOIN dbo.NGUOITHAN AS NT ON NT.MAGV = GV.MAGV
WHERE GV.PHAI = N'NỮ'

Ví dụ 5:  Xuất thông tin bộ môn thuộc khoa CNTT đã 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
FULL OUTER JOIN dbo.GIAOVIEN AS GV ON GV.MABM = BM.MABM
WHERE BM.MAKHOA = 'CNTT'

Cross Join trong SQL

Trong bài này, Kteam đề cập đến CROSS JOIN nhằm tránh tình trạng một số bạn chưa nắm vững bị nhầm lần với Full Outer Join.

CROSS JOIN là một cách truy vấn tương tự truy vấn dữ liệu từ hai bảng, kết quả tra về là tập hợp tích Descartes của hai bảng đó.

  • Số Record kết quả sẽ bằng tích Record từ 2 bảng.
  • Cross join được khuyến khích sử dụng hơn truy vấn vì đạt chuẩn ANSI giúp rõ ràng trong cú pháp.

Cấu trúc

SELECT
<Danh sách column>

FROM
<Table A> CROSS JOIN
<Table B>

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.

Lưu ý:

  • Dù cũng mang lại kết quả tổng quan nhưng CROSS JOIN không cho kết quả giống FULL OUTER JOIN.
  • Như trong các bài trước đề cập, vì là tích Descartes các dữ liệu nên tốc độ truy vấn của Cross Join sẽ chậm và sự bùng nổ bản ghi sẽ là rất lớn. Tuy nhiên vẫn có trường hợp cần sử dụng CROSS JOIN mà Kteam sẽ đề cập ngay ở ví dụ phía dưới.

Ví dụ:

Trong Database đang sử dụng, chúng ta không có trường hợp áp dụng CROSS JOIN hiệu quả hay cần thiết, vì vậy chúng ta dùng một Database đơn giản sau

Database CHIANHOM

CREATE DATABASE CHIANHOM
GO

USE CHIANHOM
GO

CREATE TABLE NHOM_A
(
	MAHS CHAR(4),
	TENHS NVARCHAR(50)
)
CREATE TABLE NHOM_B
(
	MAHS CHAR(4),
	TENHS NVARCHAR(50)
)

CREATE TABLE MONTHI
(
	MAMH CHAR(4),
	TENMH NVARCHAR(100)
)


INSERT INTO dbo.NHOM_A
        ( MAHS, TENHS )
VALUES  ( 'A01', -- MAHS - char(4)
          N'Trần Kim Long'  -- TENHS - nvarchar(50)
          )
INSERT INTO dbo.NHOM_A
        ( MAHS, TENHS )
VALUES  ( 'A02', -- MAHS - char(4)
          N'Nguyễn Đoàn Ngọc Giàu'  -- TENHS - nvarchar(50)
          )
INSERT INTO dbo.NHOM_A
        ( MAHS, TENHS )
VALUES  ( 'A03', -- MAHS - char(4)
          N'Trần Thị Như Quỳnh'  -- TENHS - nvarchar(50)
		  )

INSERT INTO dbo.NHOM_B
        ( MAHS, TENHS )
VALUES  ( 'B01', -- MAHS - char(4)
          N'Trần Thành Vi Thanh'  -- TENHS - nvarchar(50)
          )
INSERT INTO dbo.NHOM_B
        ( MAHS, TENHS )
VALUES  ( 'B02', -- MAHS - char(4)
          N'Phạm Thành'  -- TENHS - nvarchar(50)
          )

INSERT INTO dbo.MONTHI 
        ( MAMH, TENMH )
VALUES  ( '001', -- MAMH - char(4)
          N'Toán'  -- TENMH - nvarchar(100)
          )
INSERT INTO dbo.MONTHI 
        ( MAMH, TENMH )
VALUES  ( '002', -- MAMH - char(4)
          N'Văn'  -- TENMH - nvarchar(100)
          )
INSERT INTO dbo.MONTHI 
        ( MAMH, TENMH )
VALUES  ( '003', -- MAMH - char(4)
          N'Tiếng Anh'  -- TENMH - nvarchar(100)
          )

	 
SELECT * FROM dbo.NHOM_A
SELECT * FROM dbo.NHOM_B
SELECT * FROM dbo.MONTHI

Nhu cầu truy vấn

Ví dụ 6: Cần một danh sách chia nhóm cho môn học nào đó mà mỗi cá nhân ở nhóm A đều phải lần lượt chung nhóm với một cá nhân ở nhóm B. Ta sử dụng Cross Join

SELECT * FROM dbo.NHOM_A
CROSS JOIN dbo.NHOM_B

Kết quả trả về là một danh sách mà mỗi cá nhân ở nhóm A đề làm việc với một cá nhân ở nhóm B

howkteam, how, kteam, sql, server, inner join, full outer join, select from where, on, cross join, descartes

Ví dụ 7: Ngoài ra, có thể dùng trong trường hợp nhu cần lập một danh sách thi mà mỗi học sinh ở nhóm A đều phải tham gia tất cả các môn trong table MONTHI.

SELECT * FROM dbo.NHOM_A
CROSS JOIN dbo.MONTHI

Cross join kết hợp điều kiện

Tương tự Full Outer Join, Cross Join cũng có thể kết hợp với điều kiện bằng mệnh đề
WHERE

Ví dụ 8: Nhu cần xuất một danh sách thi mà mỗi học sinh có họ ‘Trần’ ở nhóm A đều phải tham gia tất cả các môn trong table MONTHI.

SELECT * FROM dbo.NHOM_A
CROSS JOIN dbo.MONTHI
WHERE dbo.NHOM_A.TENHS LIKE N'Trần%'

Các ví dụ trên chỉ mang tính minh họa để bạn hiểu rõ hơn về truy vấn CROSS JOIN, tuy trường hợp thực tế và cấu trúc Database và nhu cầu truy vấn mà bạn lựa chọn có nên sử dụng CROSS JOIN.

Kết

Trong bài này, chúng ta đã tìm hiểu về FULL OUTER JOIN và CROSS JOIN trong SQL Server.

Bài sau, chúng ta sẽ tìm hiểu về HALF OUTER JOIN hay cụ thể là

LEFT JOIN & RIGHT JOIN JOIN 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

Project

Nếu việc thực hành theo hướng dẫn không diễn ra suôn sẻ như mong muốn. Bạn cũng có thể tải xuống PROJECT THAM KHẢO ở link bên dưới!

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.