Thứ Sáu, 29 tháng 5, 2015

SQL - Bài 12: Kết trong SQL

Phép join trong SQL server là sử dụng câu lệnh truy vấn để lấy dữ liệu từ 2 hoặc nhiều bảng có quan hệ. Trong bảng được tạo ra sẽ có ràng buộc khóa ngoại kết nối đến mỗi bảng.

Nên xem lại phần 3 và phần 5 trong series, trước khi tiếp tục với video này

Trong SQL server, có những loại join sau đây:
1. CROSS JOIN
2. INNER JOIN
3. OUTER JOIN

Outer join cũng chia làm 3 loại sau:
1. Left Join hoặc Left Outer Join
2. Right Join hoặc Right Outer Join
3. Full Join hoặc Full Outer Join


Bây giờ chúng ta sẽ hiểu về tất cả các loại JOIN với các ví dụ và sự khác nhau giữa chúng.
Bảng Employee
Bảng Department 
Đoạn script để tạo ra 2 bảng này:
Create table tblDepartment
(
     ID int primary key,
     DepartmentName nvarchar(50),
     Location nvarchar(50),
     DepartmentHead nvarchar(50)
)
Go

Insert into tblDepartment values (1, 'IT', 'London', 'Rick')
Insert into tblDepartment values (2, 'Payroll', 'Delhi', 'Ron')
Insert into tblDepartment values (3, 'HR', 'New York', 'Christie')
Insert into tblDepartment values (4, 'Other Department', 'Sydney', 'Cindrella')
Go

Create table tblEmployee
(
     ID int primary key,
     Name nvarchar(50),
     Gender nvarchar(50),
     Salary int,
     DepartmentId int foreign key references tblDepartment(Id)
)
Go

Insert into tblEmployee values (1, 'Tom', 'Male', 4000, 1)
Insert into tblEmployee values (2, 'Pam', 'Female', 3000, 3)
Insert into tblEmployee values (3, 'John', 'Male', 3500, 1)
Insert into tblEmployee values (4, 'Sam', 'Male', 4500, 2)
Insert into tblEmployee values (5, 'Todd', 'Male', 2800, 2)
Insert into tblEmployee values (6, 'Ben', 'Male', 7000, 1)
Insert into tblEmployee values (7, 'Sara', 'Female', 4800, 3)
Insert into tblEmployee values (8, 'Valarie', 'Female', 5500, 1)
Insert into tblEmployee values (9, 'James', 'Male', 6500, NULL)
Insert into tblEmployee values (10, 'Russell', 'Male', 8800, NULL)
Go

Cấu trúc Join cơ bản như sau:
SELECT      ColumnList
FROM           LeftTableName
JOIN_TYPE  RightTableName
ON                 JoinCondition

CROSS JOIN, các bảng được tạo ra là tích đề các của 2 bảng được join. Ví dụ, trong bảng Employees chúng ta có 10 hảng và trong bảng Departments chúng ta có 4 hàng. Vậy nên, cross join giữa 2 bảng sẽ tạo ra 40 hàng. Cross Join không phải sử dụng mệnh đề ON

Câu lệnh truy vấn CROSS JOIN:
SELECT Name, Gender, Salary, DepartmentName
FROM tblEmployee
CROSS JOIN tblDepartment

JOIN hay INNER JOIN
Viết một truy vấn, lấy dữ liệu Name, Gender, Salary và DepartmentName từ bảng Empoyess và bảng Department. Bảng đưa ra của truy vấn trên phải như bên dưới. 


SELECT Name, Gender, Salary, DepartmentName
FROM tblEmployee
INNER JOIN tblDepartment
ON tblEmployee.DepartmentId = tblDepartment.Id

hoặc 

SELECT Name, Gender, Salary, DepartmentName
FROM tblEmployee
JOIN tblDepartment
ON tblEmployee.DepartmentId = tblDepartment.Id

Chú ý: JOIN và INNER JOIN có ý nghĩa như nhau, không có cái nào tốt hơn cái nào. Nhưng sẽ là tốt hơn nếu chúng ta sử dụng INNER JOIN, nó làm sáng tỏ mục đích của bạn.
Nếu bạn nhìn vào output, chúng ta chỉ có 8 hàng, nhưng trong bảng Empoyees, chúng ta có 10 hàng. Chúng ta không lấy 2 bản ghi JAMES và RUSSELL. Nó có nghĩa là DEPARTMENTID trong bảng Employees là NULL cho 2 giá trị employees và không khớp với cột ID trong bảng Departments

Vì vậy trong bảng tóm tắt, nó chỉ trả về các hàng kết hợp giữa 2 bảng. Không được loại bỏ chúng.

LEFT JOIN hoặc LEFT OUTER JOIN
Bây giờ nói tiếp, tôi muốn tất cả các dòng trong bảng Employees, thêm 2 bản ghi là JAMES và RUSSELL. Tôi muốn output như bên dưới
 
SELECT Name, Gender, Salary, DepartmentName
FROM tblEmployee
LEFT OUTER JOIN tblDepartment
ON tblEmployee.DepartmentId = tblDepartment.Id

Hoặc

SELECT Name, Gender, Salary, DepartmentName
FROM tblEmployee
LEFT JOIN tblDepartment
ON tblEmployee.DepartmentId = tblDepartment.Id

Chú ý: Khi bạn sử dụng Left Join hoặc Left Outer Join. Từ khóa Outer là không bắt buộc.
LEFT JOIN, trả tất cả những hàng kết hợp hoặc không kết hợp từ bảng bên trái. Trong thực tế INNER JOIN và LEFT JOIN được sử dụng rỗng rãi.

RIGHT JOIN hoặc RIGHT OUTER JOIN
Tôi muốn tất cả các hàng ở cột bên phải. Câu truy vấn để tạo ra các bảng như bên dưới:


SELECT Name, Gender, Salary, DepartmentName
FROM tblEmployee
RIGHT OUTER JOIN tblDepartment
ON tblEmployee.DepartmentId = tblDepartment.Id

Hoặc

SELECT Name, Gender, Salary, DepartmentName
FROM tblEmployee
RIGHT JOIN tblDepartment
ON tblEmployee.DepartmentId = tblDepartment.Id

Chú ý: Khi bạn sử dụng Right Join hoặc Right Outer Join. Từ khóa Outer là không bắt buộc.
RIGHT JOIN, trả tất cả những hàng kết hợp hoặc không kết hợp từ bảng bên phải.

FULL JOIN or FULL OUTER JOIN
I want all the rows from both the tables involved in the join. The query output should be, as shown below. 

FULL JOIN hoặc FULL OUTER JOIN
Tôi muốn tất cả các hàng từ 2 bảng liên quan đều tham gia. Kết quả truy vấn sẽ có như hình dưới đây

SELECT Name, Gender, Salary, DepartmentName
FROM tblEmployee
FULL OUTER JOIN tblDepartment
ON tblEmployee.DepartmentId = tblDepartment.Id

OR

SELECT Name, Gender, Salary, DepartmentName
FROM tblEmployee
FULL JOIN tblDepartment
ON tblEmployee.DepartmentId = tblDepartment.Id

Lưu ý: Chúng ta có thể sử dụng FULL OUTER JOIN hoặc FULL JOIN. Từ khóa OUTER là không bắt buộc.
FULL JOIN, trả về tất các hàng kết hợp từ bên trái và bên phải. Thêm vào cả những hàng không kết hợp.

Tóm gọn:

Không có nhận xét nào:

Đăng nhận xét