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 có 50 records và table B có 100 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:
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:
Dữ liệu bảng LOP:
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.
Để ý 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.
1 2 | 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.
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ó
1 2 3 | SELECT * FROM SINHVIEN, LOP WHERE TenLOP = 'TOAN' |
Để 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:
1 2 3 | SELECT * FROM SINHVIEN, LOP WHERE SINHVIEN.LopID = LOP.LopID |
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'
1 2 3 | 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.