Thứ Tư, 26 tháng 7, 2023

INNER JOIN trong MySQL

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 :

inner-join-mysql-1.png

Bài viết này được đăng tại tranvanbinh.vn

Trong đó dữ liệu của bảng sinhvien như sau:

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

Và đây là dữ liệu của bảng lop:

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

Mục lục

  • 1. Tìm hiểu INEER JOIN trong MySQL
  • 2. INNER JOIN nhiều table trong MySQL
  • 3. Tránh lỗi ambiguous khi thực hiện INNER JOIN
  • 4. INNER JOIN với ALIAS
  • 5. Lời kết

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.

nner-join-mysql-2.png

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 đó:

  • t1t2 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.

mysql-inner-join-Venn-Diagram.png
Ảnh (Sưu tầm)

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éwink.

Cho sơ đồ cơ sở dữ liệu sau:

inner-join-multitable-1.png

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écheeky.

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ư MySQLSQL SERVERORACLE. 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ì?.

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
INNER JOIN trong MySQL, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master