Bài 16: Phép tích đề cát trong MySQL

Tích đề cát trong MySQL có nghĩa là truy vấn trên nhiều table trong cùng một câu SELECT và kêt quả trả về có thể là một trong số các fields của các table đó. Phép tích này ít khi được sử dụng trong MySQL mà thay vào đó sẽ sử dụng lệnh JOIN (sẽ học sau) để thay thế vì tốc độ query sẽ nhanh hơn.

Phép tích đề cát thường được dùng trong trường hợp hai table có mối quan hệ khóa ngoại (Foreign Key).

1. Tìm hiểu phép tích đề cát trong MySQL

Giả sử table A 50 recordstable B100 records thì kết quả trả về tối đa của phép tích này là 50 * 100 = 5000 records. Tại sao tôi lại nói là tối đa? Lý do là kết quả là bao nhiêu sẽ phụ thuộc vào mệnh đề WHERE nữa. Về tài nguyên cần để thực hiện cho phép tích khá là cao nên ta rất ít khi sử dụng nó, hầu như là không sử dụng luôn.

Để hiểu rõ hơn thì chúng ta làm một ví dụ nhé.

Cho sơ đồ CSDL như sau:

phep-tich-de-cat.png

Trong sơ đồ này chúng ta có hai khóa chính và một khóa ngoại.

Dữ liệu bảng SINHVIEN:

data-bang-sinh-vien-tich-de-cat.png

Dữ liệu bảng LOP:

data-bang-lop-tich-de-cat.png

Bây giờ nếu chúng ta tích hai bảng này lại thì kết quả sẽ là 10 * 3 = 30 records. Nhưng nếu chúng ta truy vấn thêm điều kiện thì sẽ khác, ví dụ tích với điều kiện tên lớp là 'TOÁN' thì kết quả là 1 * 10 = 10 records như hình dưới đây.

result-tich-de-cat-php.png

Để ý kỹ hơn thì các bạn thấy khi chúng ta tích đề cát nếu SELECT * thì kết quả nó sẽ trả về tổng số các fields của hai bảng luôn. Ok bây giờ chúng ta tìm hiểu cú pháp và một vài ví dụ về câu SQL tích đề cát luôn nhé.

2. Cú pháp tích đề cát trong MySQL

Để tích hai bảng với nhau thì trong lệnh FROM chúng ta chỉ cần khai báo hai bảng cách nhau bởi dấu phẩy.

SELECT * 
FROM SINHVIEN, LOP

Như ở bài khóa ngoại tôi đã trình bày thì đối với sơ đồ trên bảng SINHVIEN gọi là bảng con và bảng LOP gọi là bảng cha. Mỗi SINHVIEN phải thuộc một LOP nào đó và mỗi LOP có thể có nhiều SINHVIEN.

Ví dụ 1: Lấy danh sách sinh viên thuộc lớp TOÁN thì ta phải làm thế nào?

Chúng ta sẽ sử dụng tích đề cát để nhân hai bảng lại với nhau, sau đó dựa vào kết quả của phép nhân này nó sẽ lọc theo điều kiện là TenLop = TOÁN. Trường hợp này chúng ta có 

SELECT * 
FROM SINHVIEN, LOP
WHERE TenLOP = 'TOAN'

Ví dụ 2: Lấy danh sách sinh viên và tên lớp mà sinh viên đó đang học?

Để giải bài này thì chúng ta dựa vào khóa ngoại, nghĩa là trong hai bảng SINHVIEN và LOP nếu LopID bên bảng SINHVIEN = LopID trong bảng LOP thì kết quả đúng, câu SQL như sau:

SELECT * 
FROM SINHVIEN, LOP
WHERE SINHVIEN.LopID = LOP.LopID

Ví dụ 3: Lấy tên các sinh viên thuộc lớp CNTT

Bài này hơi khó vì chúng ta phải sử dụng hai điều kiện:

  • Để xác định sinh viên học lớp nào thì chúng ta sử dụng SINHVIEN.LopID = LOP.LopID
  • Nhưng để xác định tên lớp là CNTT nữa thì chúng ta phải thêm một điều kiện LOP.TenLop = 'CNTT'

SELECT SINHVIEN.TenSV
FROM SINHVIEN, LOP
WHERE SINHVIEN.LopID = LOP.LopID AND LOP.TenLop = 'CNTT'

Vậy ta có kết luận:

  • Sử dụng dấu phẩy để tích các bảng với nhau trong lệnh SELECT
  • Sử dụng lệnh WHERE để thiết lập điều kiện cho câu truy vấn trong phép tích đề cát.
  • Trong trường hợp hai bảng có tên column trùng nhau thì ban phải sử dụng cú pháp table_name.column để tránh xung đột. Như ví dụ trên thì LopID đã bị trùng cho cả hai bảng nên ở WHERE tôi có khai báo là SINHVIEN.LopID = LOP.LopID

3. Lời kết

Bài tích đề cát này là nền tảng để bạn học các kiến thức cao hơn như INNER JOIN, LEFT JOIN, RIGHT JOIN. Ở các bài đó bạn sẽ thấy chúng ta không nên sử dụng phép tích để cát để viết câu truy vấn. Bài này tôi sẽ dừng ở đây, chúc bạn học tốt.

Hãy để lại link bài viết gốc khi chia sẻ bài viết này, mình sẽ report DMCA với những website lấy nội dung mà không để nguồn hoặc copy bài với số lượng lớn.

Nguồn: freetuts.net

Profile photo of adminTheHalfHeart

TheHalfHeart

Có sở thích viết tuts nên đã từng tham gia viết ở một số diễn đàn, đến năm 2014 mới có điều kiện sáng lập ra freetuts.net. Sinh năm 90 và có 1 vợ 2 con, thích ca hát và lập trình.

ĐĂNG BÌNH LUẬN: Đăng câu hỏi trên Group Facebook để được hỗ trợ nhanh nhất.