Phần 12: SQL Joins – Học SQL Server Basic

Phần 12: SQL Joins                        – Học SQL Server Basic

1. Giới thiệu

Mệnh đề Joins trong SQL được dùng để kết hợp những bản ghi từ 2 hay nhiều bảng trong 1 Database. 1 JOIN là 1 phương tiện để kết hợp các trường từ 2 bảng bằng việc sử dụng những giá trị chung của mỗi bảng.
Ta sử dụng cơ sở dữ liệu như dưới đây:
-- 1/ Tạo DB + Sử dụng DB
	Create Database Bkit
	Go
	Use Bkit
	Go
	
-- 2/ Tạo các desk + Khoá chính
	create desk BOMON
	(
		MABM nchar(4),
		TENBM nchar (50),
		PHONG char(3),
		DIENTHOAI char(11),
		TRUONGBM nchar(3),
		MAKHOA nchar (4),
		NGAYNHANCHUC date,
		major key (MABM)
	)
	go
	
	create desk GIAOVIEN
	(
		MAGV nchar(3),
		HOTEN nvarchar(50),
		LUONG float,
		PHAI nchar(3),
		NGSINH date,
		DIACHI nchar(50),
		GVQLCM nchar(3),
		MABM nchar(4),
		major key (MAGV)
	)
	go
-- 3/ Tạo khoá ngoại			
--Tạo khóa ngoại ở bảng GIAOVIEN
	Alter desk GIAOVIEN
		add constraint FK_HG9_MABM
		overseas key (MABM)
		references BOMON(MABM)
		go
-- 4/ Nhập knowledge
--Nhập knowledge 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 knowledge 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
	
--Update thêm dữ liệu cho bảng GIAOVIEN
	replace GIAOVIEN
	set MABM = 'MMT'
	the place (MAGV = '001')
	replace GIAOVIEN
	set MABM = 'HTTT'
	the place (MAGV = '002')
	replace GIAOVIEN
	set MABM = 'HTTT'
	the place (MAGV = '003')
	replace GIAOVIEN
	set MABM = 'VS'
	the place (MAGV = '004')
	replace GIAOVIEN
	set MABM = N'VLĐT'
	the place (MAGV = '005')
	replace GIAOVIEN
	set MABM = 'VS'
	the place (MAGV = '006')
	replace GIAOVIEN
	set MABM = 'HPT'
	the place (MAGV = '007')
	replace GIAOVIEN
	set MABM = 'HPT'
	the place (MAGV = '008')
	replace GIAOVIEN
	set MABM = 'MMT'
	the place (MAGV = '009')
	replace GIAOVIEN
	set MABM = 'HPT'
	the place (MAGV = '010')
	GO
Ta có 2 bảng như dưới đây:
Dữ liệu 2 bảng như dưới đây:
Bảng GIAOVIEN:
Bảng BOMON:
Giả sử hiện tại, ta cần hiển thị những thông tin gồm mã và tên giáo viên, bên cạnh đó là mã bộ môn và tên bộ môn giáo viên đó đang dạy học, 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ả nhận được:
Tại đây, điều đáng lưu ý là, JOIN được bắt đầu trong mệnh đề WHERE. Những toán tử có thể được dùng để kết hợp những bảng là: =, , , =, !=, BETWEEN, LIKE, và NOT; toàn bộ toán tử này có thể được dùng để kết hợp những bảng. Tuy nhiên, toán tử được dùng thông dụng nhất là dấu bằng (=).
Các Join căn 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 toàn bộ các dòng từ 2 bảng miễn là có sự ăn khớp dữ liệu giữa các cột trong cả 2 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 do 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ụ, giống nhau như phần giới thiệu, nhưng tại đây, 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ả nhận được cũng giống nhau như phần giới thiệu.

4. Left Join và Right Join

Từ khóa LEFT OUTER JOIN trả về toàn bộ các hàng (rows) từ bảng bên trái (table1), với những 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 như nó không khớp.
Cú pháp giống nhau 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 dạy học, nếu như sử dụng Inner Join thì khi hiển thị, các bộ môn đó sẽ không được hiển thị, như các ví dụ bên trên.
Trong trường hợp này nếu như muốn hiển thị cả những môn không có giáo viên dạy học, 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ư anh em có thể nhận thấy, khi sử dụng left be a part of, thì bảng kết quả sẽ hiện ra cả tên những môn không có giáo viên dạy học.
Right Join cũng có cách sử dụng giống nhau, nhưng thay vì trả về toàn bộ các hàng (rows) từ bảng bên trái (table1) thì sẽ trả về toàn bộ 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ề toàn bộ 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ư thế, qua bài học này, mình đã giới thiệu tới anh em những Join căn bản trong SQL Server. Cảm ơn anh em đã đọc.

admin

Leave a Reply

Your email address will not be published. Required fields are marked *