Trong bài này chúng ta tìm hiểu cách sử dụng
INNER JOIN
để kết hai bảng với nhau.
Ở bài tích đề cát chúng ta đã tìm hiểu cách truy vấn dữ liệu nhiều hơn một bảng, kết hợp mối quan hệ khóa ngoại để truy vấn thông tin. Và trường hợp này để xác định khóa ngoại chính xác thì ở
WHERE
ta thêm điều kiện để lọc.
Trong bài này chúng ta sử dụng ví dụ dưới đây để demo nhé. Có hai bảng
sinhvien
và lop
, bảng sinhvien
sẽ có một khóa ngoại là LopID
và tham chiếu đến bảng lop
có khóa chính là LopID
:
Trong đó dữ liệu của bảng
sinhvien
như sau:
Và đây là dữ liệu của bảng
lop
:1. Tìm hiểu INEER JOIN trong MySQL
Giả sử chúng ta cần viết một câu truy vấn xem danh sách sinh viên và lớp mà sinh viên đó đang học thì chúng ta dựa vào khóa ngoại (foreign key) của bảng
sinhvien
và khóa chính của bảng lop
để truy vấn. Chúng ta có hai cách giải.
Sử dụng phép tích đề cát
1
2
3
| SELECT * FROM sinhvien, lop WHERE sinhvien.LopID = lop.LopID |
Sử dụng INNER JOIN
1
2
| SELECT * FROM sinhvien INNER JOIN lop ON sinhvien.LopID = lop.LopID |
Cả hai câu truy vấn đề có kết quả giống nhau như hình dưới đây.
Vậy sự khác nhau giữa hai câu truy vấn trên là gì?
- Với phép tích thì sau khi tích hai bảng lại với nhau nó sẽ có tổng cộng là 10 x 3 = 30 records, sau đó ở mỗi record nó sẽ kiểm tra điều kiện nếu
sinhvien.LopID = lop.LopID
đúng thì record đó sẽ được chọn, ngược lại thì không được chọn. - Với
INNER JOIN
thì khác một xíu, trong quá trình thực hiện tích hai bảng nó sẽ kiểm tra điều kiện ởON
(tức làsinhvien.LopID = lop.LopID
), nếu đúng thì được chọn và sai thì bỏ qua
Như vậy xét về tốc độ truy vấn thì trường hợp sử dụng
INNER JOIN
sẽ nhanh hơn rất nhiều so với sử dụng phép tích.
Từ ví dụ trên ta rút ra được kết luận
INNER JOIN
sẽ được đặt ở FROM
theo cú pháp sau:
1
2
3
| SELECT column_list FROM t1 INNER JOIN t2 ON join_condition1 WHERE where_conditions; |
Trong đó:
- t1, t2 là bảng cần
JOIN
- join_condition1: Nếu TRUE thì record đó sẽ được chọn
Ta có thể ví phép
JOIN
giống như so sánh dữ liệu giữa hai bảng nếu có sự tương đồng thì được chọn và ngược lại thì không chọn như hình dưới đây.2. INNER JOIN nhiều table trong MySQL
Ở ví dụ phần 1 ta chỉ mới tìm hiểu cách
JOIN
hai bảng, tuy nhiên bạn có thể JOIN
nhiều bảng lại với nhau và tuân theo quy luật chạy từ trái qua phải, nếu bảng nào khai báo trước thì chạy trước và ngược lại sẽ chạy sau. Nếu bạn sử dụng cặp dấu ngoặc thì sẽ thực hiện trong ngoặc trước.
Cú pháp:
1
2
3
4
| SELECT column_list FROM t1 INNER JOIN t2 ON join_condition1 INNER JOIN t3 ON join_condition2 |
Làm vài ví dụ cho vui nhé .
Cho sơ đồ cơ sở dữ liệu sau:
Ví dụ 1: Hãy liệt kê danh sách sinh viên, thông tin lớp và khoa mà sinh viên đó đang học.
1
2
3
4
5
| SELECT * FROM sinhvien INNER JOIN lop ON sinhvien.LopID = lop.LopID INNER JOIN khoa ON sinhvien.KhoaID = khoa.KhoaId |
Ví dụ 2: Liệt kê danh sách sinh viên học lớp TOAN gồm các thông tin (thông tin sinh viên + thông tin khoa mà sinh viên đang học)
1
2
3
4
5
6
| SELECT * FROM sinhvien INNER JOIN lop ON sinhvien.LopID = lop.LopID INNER JOIN khoa ON sinhvien.KhoaID = khoa.KhoaId WHERE lop.TenLop = 'TOAN' |
Trong ví dụ này ta thêm điều kiện
lop.TenLop = 'TOAN'
ở WHERE
.
Các ví dụ này nếu ta sử dụng truy vấn lồng thì sẽ nhanh hơn nữa, tuy nhiên vấn đề này tôi sẽ trình bày sau nhé .
3. Tránh lỗi ambiguous khi thực hiện INNER JOIN
Ở các ví dụ trên các bạn thấy tên column ở các bảng trùng khá nhiều như
LopID
trùng ở bảng sinhvien
và lop, KhoaID
trùng ở bảng sinhvien
và khoa
. Vậy làm sao để phân biệt giữa các field?
Ví dụ câu truy vấn này chạy sẽ bị lỗi vì lý do ở
SELECT
nó không hiểu LopID
từ bảng nào.
1
2
| SELECT TenSV, TenLop, LopID FROM sinhvien INNER JOIN lop ON sinhvien.LopID = lop.LopID |
Nếu để ý kĩ thì bạn thấy ở
ON
đã sử dụng một cú pháp giúp phân biệt đó là tenbang.field
. Sửa lại câu truy vấn như sau và mọi thứ OK.
1
2
| SELECT TenSV, TenLop, lop.LopID FROM sinhvien INNER JOIN lop ON sinhvien.LopID = lop.LopID |
Như vậy với cột nào bị trùng thì ta phải sử dụng cú pháp
tenbang.tenfield
.4. INNER JOIN với ALIAS
Chúng ta đã được học cú pháp ALIAS và tác dụng của nó rồi nên bây giờ ta áp dụng vào lệnh
JOIN
luôn.
Các bạn xem câu truy vấn dưới đây:
1
2
| SELECT TenSV, TenLop, l.LopID FROM sinhvien AS sv INNER JOIN lop AS l ON sv.LopID = l.LopID |
Nhìn gọn hơn rất nhiều đúng không nào, cách này rất hữu ích khi tên bảng quá dài và join nhiều table.
5. Lời kết
JOIN khá quan trọng trong các hệ quản trị
CSDL
như MySQL
, SQL SERVER
, ORACLE
. Riêng với NO-SQL
thì JOIN
không tồn tại nhé các bạn. Còn NO-SQL
là gì thì bạn có thể xem qua bài MongoDB là gì?.
Nguồn: (code.freetuts.net)
0 nhận xét: