Bài 12: SQL Joins - Học SQL Server cơ bản

Đăng bởi: Admin | Lượt xem: 2400 | Chuyên mục: SQL


1. Giới thiệu

Mệnh đề Joins trong SQL được sử dụng để kết hợp các bản ghi từ hai hoặc nhiều bảng trong một Database. Một JOIN là một phương tiện để kết hợp các trường từ hai bảng bằng việc sử dụng các giá trị chung của mỗi bảng.
Ta sử dụng cơ sở dữ liệu như sau:
-- 1/ Tạo DB + Sử dụng DB
	Create Database Bkit
	Go
	Use Bkit
	Go
	
-- 2/ Tạo các table + Khoá chính
	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 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
-- 3/ Tạo khoá ngoại			
--Tạo khóa ngoại ở bảng GIAOVIEN
	Alter table GIAOVIEN
		add constraint FK_HG9_MABM
		foreign key (MABM)
		references BOMON(MABM)
		go
-- 4/ Nhập data
--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 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
Ta có hai bảng như sau:
Dữ liệu hai bảng như sau:
Bảng GIAOVIEN:
Bảng BOMON:
Giả sử bây giờ, chúng ta cần hiển thị các thông tin bao gồm mã và tên giáo viên, đồng thời là mã bộ môn và tên bộ môn giáo viên đó đang giảng dạy, ta sử dụng câu lệnh sau:
SELECT GIAOVIEN.MAGV,GIAOVIEN.HOTEN,GIAOVIEN.MABM,BOMON.TENBM 
FROM GIAOVIEN,BOMON 
WHERE BOMON.MABM=GIAOVIEN.MABM
Kết quả thu được:
Ở đây, điều đáng chú ý là, JOIN được thực hiện trong mệnh đề WHERE. Một số toán tử có thể được sử dụng để kết hợp các bảng là: =, <, >, <>, <=, >=, !=, BETWEEN, LIKE, và NOT; tất cả toán tử này có thể được sử dụng để kết hợp các bảng. Tuy nhiên, toán tử được sử dụng phổ biến nhất là dấu bằng (=).
Các Join cơ bản trong SQL Server
  1. Inner Join.
  2. Left Join
  3. Right Join
  4. Full Join

3. Inner Join

Từ khóa INNER JOIN để chọn tất cả các dòng từ hai bảng miễn là có sự ăn khớp dữ liệu giữa các cột trong cả hai bảng.
Cú pháp:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
 
-- Có thể thay INNER JOIN bởi JOIN
-- Ý nghĩa và kết quả là như nhau.
 
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
Ví dụ, tương tự như phần giới thiệu, nhưng ở đây, chúng ta sử dụng cú pháp của Inner Join
SELECT GIAOVIEN.MAGV,GIAOVIEN.HOTEN,GIAOVIEN.MABM,BOMON.TENBM 
FROM GIAOVIEN INNER JOIN BOMON 
ON BOMON.MABM=GIAOVIEN.MABM
Kết quả thu được cũng tương tự như phần giới thiệu.

4. Left Join và Right Join

Từ khóa LEFT OUTER JOIN trả về tất cả các hàng (rows) từ bảng bên trái (table1), với các hàng tương ứng trong bảng bên phải (table2). Chấp nhận cả dữ liệu NULL ở bảng 2 nếu nó không khớp.
Cú pháp tương tự Inner Join nhưng thay Inner bằng Left.
Ví dụ, trong bảng BOMON có nhiều môn mà giáo viên trong bảng GIAOVIEN không giảng dạy, nếu sử dụng Inner Join thì khi hiển thị, những bộ môn đó sẽ không được hiển thị, như các ví dụ ở trên. 
Trong trường hợp này nếu muốn hiển thị cả những môn không có giáo viên giảng dạy, chúng ta sử dụng Left Join, với vai trò table1 là BOMON, table2 là GIAOVIEN.
Câu lệnh sẽ là:
SELECT GIAOVIEN.MAGV,GIAOVIEN.HOTEN,GIAOVIEN.MABM,BOMON.TENBM 
FROM BOMON LEFT JOIN GIAOVIEN 
ON BOMON.MABM=GIAOVIEN.MABM
Như các bạn có thể thấy, khi sử dụng left join, thì bảng kết quả sẽ hiển thị cả tên những môn không có giáo viên giảng dạy.
Right Join cũng có cách sử dụng tương tự, nhưng thay vì trả về tất cả các hàng (rows) từ bảng bên trái (table1) thì sẽ trả về tất cả các hàng (rows) từ bảng bên phải (table2).

5. Full Join

Full Join là sự kết hợp của Left Join và Right Join, trả về tất cả các hàng của 2 bảng.
Ví dụ:
SELECT GIAOVIEN.MAGV,GIAOVIEN.HOTEN,GIAOVIEN.MABM,BOMON.TENBM 
FROM BOMON FULL JOIN GIAOVIEN 
ON BOMON.MABM=GIAOVIEN.MABM
Như vậy, thông qua bài học này, mình đã giới thiệu đến các bạn những Join cơ bản trong SQL Server. Cảm ơn các bạn đã đọc.
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!