Truy vấn dữ liệu từ nhiều bảng

Một phần của tài liệu Bài giảng hệ quản trị cơ sở dữ liệu (Trang 46 - 49)

II. Ngôn ngữ thao tác dữ liệu

2. Truy vấn dữ liệu từ nhiều bảng

Khi thiết kế CSDL ta phải chuẩn hóa các bảng lưu dữ liệu. Như vậy thông tin thường được chia nhỏ và lưu vào nhiều bảng. Các bảng này có mối quan hệ với nhau. Khi dữ liệu được truy vấn, các hoạt động liên kết được dùng để sử dụng những quan hệ này và lắp ghép lại thông tin gốc. Có 3 cách chính để liên kết các dòng dữ liệu từ hai bảng khác nhau.

a. Liên kết bng trong mnh đề Where

Giả sử bạn có 2 bảng là bảng KhachHang có cột khóa là MaKhachHang và bảng DonHang có cột MaKhachHang là khóa ngoại.

Tổng con của madonhang =2

Tổng con của madonhang =3

Bạn có thể truy vấn dữ liệu từ 2 bảng này thông qua khóa MaKhachHang, hoạt động liên kết được thực hiện trong mệnh đề Where như sau:

select donhang.madonhang, donhang.ngaydathang,khachhang.hodem + ' ' + khachhang.ten as [ho va ten]

from donhang,khachhang

where donhang.makhachhang = khachhang.makhachhang

Câu lệnh trên lấy dữ liệu trên cột Madonhang, Ngaydathang từ bảng DonHang và trên cột Hodem, Ten từ bảng KhachHang. Dấu bằng (=) trong mệnh đề Where cho biết chỉ lấy những dòng mà giá trị Makhachhang trong bảng DonHang bằng với Makhachhang trong bảng KhachHang.

b. Liên kết bng trong mnh đề From

Trong mệnh đề From hai bảng được liên kết thông qua phát biểu JOIN theo sau là từ khóa ON cùng cột tham chiếu. Thực hiện truy vấn sau bạn sẽ nhận được cùng kết quả như ví dụ trước.

select donhang.madonhang, donhang.ngaydathang,khachhang.hodem + ' ' + khachhang.ten as [ho va ten]

Mục đích của Inner Join là so khớp các dòng trong một bảng với các dòng tương ứng trong bảng khác mà ở đó các cột liên kết chứa cùng giá trị. Nếu một trong các cột của những bảng này có giá trị khác hoặc không có giá trị thì những dòng này không được trả về trong kết quả truy vấn.

c. Cách dùng OUTER JOIN

Công việc của Outer Join là trả về tất cả các dòng từ một bảng, sau đó so khớp những dòng này với các dòng trong những bảng tương ứng mà các cột liên kết có cùng giá trị. Các cột còn lại của bảng kia trong cột kết quả trả về sẽ có giá trị NULL. Sự khác nhau giữa Outer Join và Inner Join là các dòng khác nhau trong bảng đầu tiên vẫn được trả về bởi truy vấn.

Giả sử bạn được yêu cầu như sau: hãy cho xem tất cả các danh sách khách hàng và với những khách hàng đang có đơn hàng thì cho xem thông tin về đơn hàng đó. Bạn hãy cho xem tên của mỗi khách hàng và nếu khách hàng có đơn hàng thì cho xem ngày đặt hàng. Nghĩa là, nếu khách hàng không có đơn hàng nào thì cho xem tên của khách hàng mà thôi.

Để thực hiện yêu cầu trên bạn thực hiện OUTER JOIN như sau:

select khachhang.hodem + ' ' + khachhang.ten as [ho va ten], donhang.ngaydathang

from khachhang

left outer join donhang

on khachhang.makhachhang = donhang.makhachhang

Outer join luôn chiếu lên một bảng, đó là bảng mà bạn chọn nên tất cả các Giá trị NULL của cột ngaydathang cho biết đó là những dòng tồn tại trong bảng KhachHang nhưng không tìm thấy makhachhang trong bảng donhang.

Nếu bạn muốn chỉ trả về những khách hàng nào không có đơn hàng thì bạn thêm điều kiện trong mệnh đề WHERE như sau:

select khachhang.hodem + ' ' + khachhang.ten as [ho va ten], donhang.ngaydathang

from khachhang

left outer join donhang

on khachhang.makhachhang = donhang.makhachhang where donhang.ngaydathang is null

Thế còn Right Outer Join dùng cho mục đích gì? Dùng RIGHT ở vị trí của LEFT trong biểu thức này sẽ có cùng tác dụng nhưng ngược lại thứ tự của bảng và cột. Nghĩa là, bảng bên phải phát biểu JOIN sẽ là bảng mà bạn chọn tất cả các dòng. Nó sẽ so khớp các dòng này với dòng dữ liệu trong bảng bên trái, nếu không tìm thấy thì trả về giá trị NULL.

Như vậy hai phát biểu sau sẽ cho cùng kết quả.

select khachhang.hodem + ' ' + khachhang.ten as [ho va ten], donhang.ngaydathang

from khachhang

left outer join donhang

on khachhang.makhachhang = donhang.makhachhang

Truy vấn này sẽ cho cùng kết quả với truy vấn sau dùng Right Outer Join: select khachhang.hodem + ' ' + khachhang.ten as [ho va ten], donhang.ngaydathang

from donhang

right outer join khachhang

on khachhang.makhachhang = donhang.makhachhang

Một phần của tài liệu Bài giảng hệ quản trị cơ sở dữ liệu (Trang 46 - 49)

Tải bản đầy đủ (PDF)

(122 trang)