Trong chương này chúng ta sẽ tìm hiểu về cách truy vấn dữ liệu trên nhiều bảng sử dụng các loại mệnh đề JOIN trong SQL Server.
Với mệnh đề SELECT… FROM kết hợp mệnh đề JOIN cho phép bạn liên kết hai bảng có quan hệ với nhau để lấy ra các dữ liệu chung. Điểm quan trọng giữa những bảng này phải có các cột quan hệ chung nhau va thứ tự quan hệ khi bạn chỉ định giữa các bảng cũng sẽ làm ảnh hưởng đến kết quả của truy vấn.
Bằng cách sử dụng JOIN bạn có thể lấy dữ liệu từ nhiều table dựa trên mối quan hệ logic giữa các table (logical relationship). Có những loại JOIN như sau:
Thứ tự từ trái sang phải: Inner Join, Left Outer Join, Right Outer Join, Full Outer Join
Kết thúc chương này các bạn có thể :
Trình bày và thực hành được truy vấn trên nhiều bảng với Inner Join Trình bày và thực hành được truy vấn trên nhiều bảng với Outer Join Trình bày và thực hành được truy vấn trên nhiều bảng với Cross Join Trình bày và thực hành được truy vấn kết hợp dữ liệu sử dụng Union Trình bày và thực hành được truy vấn tạo bảng với Select…Into
Trình bày và thực hành được truy vấn sử dụng mệnh đề : Group By, Having, Merge, Intersect...
Trang 57
Dùng Inner Join để select data từ 2 hay nhiều tables trong đó giá trị của các cột được join phải xuất hiện ở cả 2 tables tức là phần gạch chéo trên hình và
dùng để chỉ định việc so sánh giá trị trong các cột của các bảng là tương đương (dữ liệu đều có ở cả hai bảng). Hệ thống sẽ trả về các mẫu tin thỏa điều kiện quan hệ ở cả hai bảng. Ví dụ:
SELECTTOP 10 ProductName, CategoryName
FROM Products AS P INNERJOIN Categories AS C
ON P.CategoryID=C.CategoryID
ORDERBY ProductName
Dùng Left Outer Join để select data từ 2 hay nhiều tables trong đó tất cả cột bên table thứ nhất và không tồn tại bên table thứ hai sẽ được select cộng với các giá trị của các cột được inner join. Số cột select được sẽ bằng với số cột của table thứ nhất. Tức là phần tô màu đỏ trên hình.
Ví dụ:
SELECT ProductName, CategoryName
FROM Products AS P LEFTJOIN Categories AS C
ON P.CategoryID=C.CategoryID
ORDERBY ProductName
3.1 Truy vấn dữ liệu sử dụng INNER JOIN
Trang 58
Dùng Right Outer Join để select data từ 2 hay nhiều tables trong đó tất cả cột bên table thứ hai và không tồn tại bên table thứ nhất sẽ được select cộng với các giá trị của các cột được inner join. Số cột select được sẽ bằng với số cột của table thứ hai. Tức là phần tô màu đỏ trên hình.
Ví dụ:
SELECT ProductName, CategoryName
FROM Products AS P RIGHT JOIN Categories AS C
ON P.CategoryID=C.CategoryID
ORDERBY ProductName
Dùng Cross Join ghép data từ hai table trong đó số dòng thu được bằng với số dòng của table thứ nhất nhân với số dòng của table thứ hai.
Ví dụ:
SELECTTOP 5 * FROM dbo.Products
CROSSJOIN dbo.Categories
Lưu ý : trong câu lệnh này không có keyword "On".
3.3 Truy vấn dữ liệu sử dụng RIGHT OUTER JOIN
3.4 Truy vấn dữ liệu sử dụng CROSS JOIN
Trang 59
Việc kết hợp dữ liệu của hai truy vấn SELECT FROM bằng mệnh đề UNION cho phép bạn có thể tạo ra một tập hợp các mẫu tin từ các mẫu tin có trong câu lệnh SELECT FROM thứ nhất và các mẫu tin có trong câu lệnh SELECT FROM thứ hai. Khác với việc liên kết dữ liệu bằng mệnh đề JOIN, mệnh đề UNION thực ra chỉ thực hiện việc thêm vào các dòng dữ liệu trong câu lệnh SELECT FROM thứ nhất vào cuối các dòng dữ liệu trong câu lệnh SELECT FROM thứ hai.
Thông thường bạn sử dụng mệnh đề UNION dùng để nối dữ liệu từ các bảng khác nhau trong cơ sở dữ liệu thành một bộ các mẫu tin liên tục nhau. Các cột chỉ định trong hai câu lệnh SELECT FROM phải có cùng kiểu dữ liệu tương thích thứ tự như nhau, tổng số các cột phải bằng nhau. Việc định dạng tiêu đề của các cột tính toán chỉ cần thực hiện trong câu lệnh truy vấn đầu tiên.
Kết hợp các kết quả của hai hay nhiều truy vấn thành một tập kết quả duy nhất mà bao gồm tất cả các dòng thuộc về tất cả các truy vấn trong union. Các hoạt động UNION khác nhau từ cách sử dụng join để kết hợp cột từ hai table.
Trang 60
Ví dụ:
CREATE TABLE UnionTest1
(
idcol intIDENTITY,
col2 char(3), );
CREATE TABLE UnionTest2
(
idcol intIDENTITY,
col4 char(3), );
INSERTINTO UnionTest1 VALUES ('AAA'); INSERTINTO UnionTest1 VALUES ('BBB'); INSERTINTO UnionTest1 VALUES ('CCC');
SELECT* FROM UnionTest1;
INSERTINTO UnionTest2 VALUES ('CCC'); INSERTINTO UnionTest2 VALUES ('DDD'); INSERTINTO UnionTest2 VALUES ('EEE');
Trang 61 SELECT col2 FROM UnionTest1
UNION
SELECT col4 FROM UnionTest2;
UNION ALL
SELECT col2 FROM UnionTest1
UNIONALL
SELECT col4 FROM UnionTest2;