SQLite Kết nối: Bên trái tự nhiên, Bên trong, Kết nối chéo với bảng

⚡ Tóm tắt thông minh

SQLite Mệnh đề JOIN kết hợp các hàng từ hai hoặc nhiều bảng bằng cách sử dụng INNER JOIN, JOIN USING, NATURAL JOIN, LEFT OUTER JOIN và CROSS JOIN, cho phép bạn ghép các bản ghi liên quan theo các cột chung và đọc dữ liệu trên toàn bộ cơ sở dữ liệu đã được chuẩn hóa.

  • 🔗 Điều khoản kết nối: Mệnh đề JOIN liên kết hai hoặc nhiều bảng hoặc truy vấn con dựa trên một cột chung, được định nghĩa bằng điều kiện ON hoặc USING.
  • 🎯 THAM GIA INNER: INNER JOIN chỉ trả về các hàng có điều kiện kết nối khớp nhau trong cả hai bảng, loại bỏ các hàng không khớp.
  • 🧩 SỬ DỤNG VÀ TỰ NHIÊN: JOIN USING chỉ định một cột chung, trong khi NATURAL JOIN tự động khớp mọi cột có cùng tên.
  • ↩️ LIÊN KẾT NGOÀI TRÁI: LEFT OUTER JOIN giữ nguyên mọi hàng của bảng bên trái và điền các cột không khớp của bảng bên phải bằng giá trị NULL.
  • ✖️ THAM GIA CHÉO: CROSS JOIN trả về tích Descartes, ghép mỗi hàng của bảng bên trái với mỗi hàng của bảng bên phải.
  • 🤖 Hỗ trợ AI: Các công cụ chuyển đổi văn bản thành SQL bằng AI và GitHub Copilot tạo ra SQLite Truy vấn JOIN từ các lời nhắc bằng tiếng Anh đơn giản.

SQLite Tham gia

SQLite hỗ trợ các loại khác nhau của SQL Tham gia, như INNER JOIN, LEFT OUTER JOIN và CROSS JOIN. Mỗi loại THAM GIA được sử dụng cho một tình huống khác nhau như chúng ta sẽ thấy trong hướng dẫn này.

Giới thiệu về SQLite Điều khoản THAM GIA

Khi làm việc trên cơ sở dữ liệu có nhiều bảng, bạn thường cần lấy dữ liệu từ nhiều bảng này.

Với mệnh đề THAM GIA, bạn có thể liên kết hai hoặc nhiều bảng hoặc truy vấn con bằng cách nối chúng. Ngoài ra, bạn có thể xác định cột nào bạn cần liên kết các bảng và theo điều kiện nào.

Bất kỳ mệnh đề JOIN nào cũng phải có cú pháp sau:

SQLite Cú pháp mệnh đề THAM GIA

Mỗi mệnh đề nối có chứa:

  • Một bảng hoặc truy vấn con là bảng bên trái; bảng hoặc truy vấn con trước mệnh đề nối (ở bên trái của nó).
  • Toán tử THAM GIA – chỉ định loại liên kết (INNER JOIN, LEFT OUTER JOIN hoặc CROSS JOIN).
  • Ràng buộc tham gia - sau khi bạn chỉ định các bảng hoặc truy vấn con để tham gia, bạn cần chỉ định một ràng buộc tham gia, đây sẽ là điều kiện mà các hàng khớp với điều kiện đó sẽ được chọn tùy thuộc vào loại tham gia.

Lưu ý rằng, đối với tất cả những điều sau đây SQLite Ví dụ về bảng JOIN, bạn phải chạy sqlite3.exe và mở kết nối tới cơ sở dữ liệu mẫu như sau:

Bước 1) Ở bước này, hãy mở My Computer và điều hướng đến thư mục “C:\sqlite”, sau đó mở tệp “sqlite3.exe“:

Mở tệp sqlite3.exe từ thư mục sqlite.

Bước 2) Mở cơ sở dữ liệu “TutorialsSampleDB.db” bằng lệnh sau:

Mở cơ sở dữ liệu TutorialsSampleDB

Bây giờ bạn đã sẵn sàng chạy bất kỳ loại truy vấn nào trên cơ sở dữ liệu.

SQLite INNER JOIN

SQLite Sơ đồ Venn INNER JOIN

Phép INNER JOIN chỉ trả về các hàng thỏa mãn điều kiện kết nối và loại bỏ tất cả các hàng khác không thỏa mãn điều kiện kết nối.

Ví dụ

Trong ví dụ sau, chúng ta sẽ kết hợp hai bảng “Students” và “Departments” bằng DepartmentId để lấy tên khoa/bộ môn cho mỗi sinh viên, như sau:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Giải thích mã

INNER JOIN hoạt động như sau:

  • Trong mệnh đề Select, bạn có thể chọn bất kỳ cột nào bạn muốn từ hai bảng được tham chiếu.
  • Mệnh đề INNER JOIN được viết sau bảng đầu tiên được tham chiếu bằng mệnh đề “From”.
  • Sau đó, điều kiện nối được chỉ định bằng BẬT.
  • Bí danh có thể được chỉ định cho các bảng được tham chiếu.
  • Từ INNER là tùy chọn, bạn chỉ cần viết THAM GIA.

Đầu ra

Phép nối INNER JOIN sẽ lấy các bản ghi từ cả hai bảng – bảng sinh viên và bảng phòng ban – khớp với điều kiện “Students.DepartmentId = Departments.DepartmentId”. Các hàng không khớp sẽ bị bỏ qua và không được bao gồm trong kết quả.

SQLite Ví dụ kết quả INNER JOIN

Đó là lý do tại sao chỉ có 8 sinh viên trong số 10 sinh viên thuộc các khoa CNTT, toán học và vật lý được trả về từ truy vấn này. Trong khi đó, sinh viên “Jena” và “George” không được bao gồm, vì họ có ID khoa là null, không khớp với cột departmentId trong bảng departments. Cụ thể như sau:

SQLite INNER JOIN các hàng khớp

SQLite THAM GIA… SỬ DỤNG

INNER JOIN có thể được viết bằng mệnh đề “USING” để tránh dư thừa, vì vậy thay vì viết “ON Students.DepartmentId = Departments.DepartmentId”, bạn chỉ cần viết “USING(DepartmentID)”.

Bạn có thể sử dụng “THAM GIA .. SỬ DỤNG” bất cứ khi nào các cột bạn sẽ so sánh trong điều kiện nối có cùng tên. Trong những trường hợp như vậy, không cần lặp lại chúng bằng điều kiện on và chỉ cần nêu tên cột và SQLite sẽ phát hiện ra điều đó.

Sự khác biệt giữa INNER JOIN và JOIN... SỬ DỤNG:

Với “JOIN … USING”, bạn không cần viết điều kiện kết nối, mà chỉ cần viết cột chung giữa hai bảng được kết nối. Thay vì viết table1 “INNER JOIN table2 ON table1.cola = table2.cola”, chúng ta viết như sau: “table1 JOIN table2 USING(cola)”.

Ví dụ

Trong ví dụ sau, chúng ta sẽ kết hợp hai bảng “Students” và “Departments” bằng DepartmentId để lấy tên khoa/bộ môn cho mỗi sinh viên, như sau:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments USING(DepartmentId);

Giải thích

  • Khác với ví dụ trước, chúng ta không viết “ON Students.DepartmentId = Departments.DepartmentId“. Chúng ta chỉ viết “USING(DepartmentId)“.
  • SQLite tự động suy ra điều kiện nối và so sánh DepartmentId từ cả hai bảng – Students và Departments.
  • Bạn có thể sử dụng cú pháp này bất cứ khi nào hai cột bạn đang so sánh có cùng tên.

Đầu ra

Điều này sẽ cho bạn kết quả chính xác giống như ví dụ trước:

SQLite Ví dụ kết quả JOIN USING

SQLite THAM GIA TỰ NHIÊN

THAM GIA TỰ NHIÊN tương tự như THAM GIA…USE, điểm khác biệt là nó tự động kiểm tra sự bằng nhau giữa các giá trị của mọi cột tồn tại trong cả hai bảng.

Sự khác biệt giữa INNER THAM GIA và THAM GIA TỰ NHIÊN:

  • Trong INNER JOIN, bạn phải chỉ định điều kiện kết nối mà INNER JOIN sử dụng để kết nối hai bảng. Trong khi đó, với Natural JOIN, bạn không cần viết điều kiện kết nối. Bạn chỉ cần viết tên của hai bảng mà không cần bất kỳ điều kiện nào. Sau đó, Natural JOIN sẽ tự động kiểm tra sự bằng nhau giữa các giá trị cho mỗi cột tồn tại trong cả hai bảng. Natural JOIN tự động suy ra điều kiện kết nối.
  • Trong THAM GIA TỰ NHIÊN, tất cả các cột từ cả hai bảng có cùng tên sẽ được khớp với nhau. Ví dụ: nếu chúng ta có hai bảng có hai tên cột chung (hai cột tồn tại cùng tên trong hai bảng), thì phép nối tự nhiên sẽ nối hai bảng bằng cách so sánh giá trị của cả hai cột chứ không chỉ từ một cột. cột.

Ví dụ

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
Natural JOIN Departments;

Giải thích

  • Chúng ta không cần phải viết điều kiện kết nối với tên cột (như chúng ta đã làm trong INNER JOIN). Chúng ta thậm chí không cần phải viết tên cột một lần nào (như chúng ta đã làm trong JOIN USING).
  • Phép nối tự nhiên sẽ quét cả hai cột từ hai bảng. Nó sẽ phát hiện ra rằng điều kiện phải bao gồm việc so sánh DepartmentId từ cả hai bảng Sinh viên và Phòng ban.

Đầu ra

Phép NATURAL JOIN sẽ cho ra kết quả chính xác giống như kết quả chúng ta nhận được từ các ví dụ INNER JOIN và JOIN USING, bởi vì trong ví dụ của chúng ta, cả ba truy vấn đều tương đương nhau. Tuy nhiên, trong một số trường hợp, kết quả của inner join sẽ khác với natural join. Ví dụ, nếu có nhiều bảng có cùng tên, thì natural join sẽ so khớp tất cả các cột với nhau. Tuy nhiên, inner join chỉ so khớp các cột trong điều kiện join.

SQLite Ví dụ kết quả NATURAL JOIN

SQLite THAM GIA BÊN NGOÀI TRÁI

Tiêu chuẩn SQL định nghĩa ba loại phép nối ngoài (OUTER JOIN): LEFT, RIGHT và FULL, nhưng SQLite chỉ hỗ trợ LEFT OUTER JOIN tự nhiên.

Trong LEFT OUTER JOIN, tất cả các giá trị của các cột bạn chọn từ bảng bên trái sẽ được bao gồm trong kết quả truy vấn, vì vậy bất kể giá trị đó có khớp với điều kiện kết nối hay không, nó vẫn sẽ được bao gồm trong kết quả.

Vì vậy, nếu bảng bên trái có 'n' hàng, kết quả truy vấn cũng sẽ có 'n' hàng. Tuy nhiên, đối với các giá trị của các cột đến từ bảng bên phải, nếu bất kỳ giá trị nào không khớp với điều kiện kết nối thì nó sẽ chứa giá trị "null".

Vì vậy, bạn sẽ nhận được số hàng tương đương với số hàng ở phép nối bên trái. Vì vậy, bạn sẽ nhận được các hàng khớp từ cả hai bảng (như kết quả INNER JOIN), cộng với các hàng không khớp từ bảng bên trái.

Ví dụ

Trong ví dụ sau, chúng ta sẽ thử “LEFT JOIN” để nối hai bảng “Students” và “Departments”:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students             -- this is the left table
LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Giải thích

  • SQLite Cú pháp LEFT JOIN giống như INNER JOIN; bạn viết LEFT THAM GIA giữa hai bảng và sau đó điều kiện nối sẽ xuất hiện sau mệnh đề ON.
  • Bảng đầu tiên sau mệnh đề from là bảng bên trái. Trong khi bảng thứ hai được chỉ định sau LEFT JOIN tự nhiên là bảng bên phải.
  • Mệnh đề OUTER là tùy chọn; LEFT tự nhiên OUTER JOIN cũng giống như LEFT JOIN.

Đầu ra

Như bạn thấy, tất cả các hàng từ bảng sinh viên đều được bao gồm, tổng cộng có 10 sinh viên. Ngay cả khi sinh viên thứ tư và sinh viên cuối cùng, Jena và George, có departmentIds không tồn tại trong bảng Departments, họ vẫn được bao gồm.

Trong những trường hợp này, giá trị departmentName của cả Jena và George sẽ là “null” vì bảng departments không có departmentName nào trùng khớp với giá trị departmentId của họ.

SQLite Ví dụ kết quả của LEFT OUTER JOIN

Chúng ta hãy cùng tìm hiểu sâu hơn về truy vấn trước đó sử dụng phép nối trái (left join) bằng sơ đồ Venn:

SQLite Sơ đồ Venn kết hợp ngoài bên trái

Phép nối LEFT JOIN sẽ trả về tất cả tên sinh viên từ bảng students, ngay cả khi sinh viên đó có mã khoa không tồn tại trong bảng departments. Vì vậy, truy vấn sẽ không chỉ trả về các hàng khớp như INNER JOIN, mà còn trả về phần bổ sung chứa các hàng không khớp từ bảng bên trái, tức là bảng students.

Lưu ý rằng bất kỳ tên sinh viên nào không có khoa trùng khớp sẽ có giá trị “null” cho tên khoa, vì không có giá trị khớp nào cho tên đó và các giá trị đó là giá trị trong các hàng không khớp.

SQLite THAM GIA

CROSS JOIN cung cấp tích Descartes cho các cột đã chọn của hai bảng đã nối, bằng cách khớp tất cả các giá trị từ bảng đầu tiên với tất cả các giá trị từ bảng thứ hai.

Vì vậy, với mọi giá trị trong bảng đầu tiên, bạn sẽ nhận được 'n' kết quả khớp từ bảng thứ hai trong đó n là số hàng của bảng thứ hai.

Khác với INNER JOIN và LEFT OUTER JOIN, với CROSS JOIN, bạn không cần phải chỉ định điều kiện kết nối, bởi vì SQLite Không cần đến nó cho phép CROSS JOIN.

SQLite Việc này sẽ tạo ra một tập hợp kết quả logic bằng cách kết hợp tất cả các giá trị từ bảng thứ nhất với tất cả các giá trị từ bảng thứ hai.

Ví dụ, nếu bạn chọn một cột từ bảng thứ nhất (colA) và một cột khác từ bảng thứ hai (colB). Cột colA chứa hai giá trị (1,2) và cột colB cũng chứa hai giá trị (3,4).

Khi đó kết quả của CROSS JOIN sẽ là bốn hàng:

  • Hai hàng bằng cách kết hợp giá trị đầu tiên từ colA là 1 với hai giá trị của colB (3,4) sẽ là (1,3), (1,4).
  • Tương tự như vậy, hai hàng bằng cách kết hợp giá trị thứ hai từ colA là 2 với hai giá trị của colB (3,4) là (2,3), (2,4).

Ví dụ

Trong truy vấn sau, chúng ta sẽ thử CROSS JOIN giữa các bảng Students và Departments:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
CROSS JOIN Departments;

Giải thích

  • Trong tạp chí SQLite chọn từ nhiều bảng, chúng tôi chỉ chọn hai cột “tên sinh viên” từ bảng sinh viên và “Tên bộ phận” từ bảng bộ phận.
  • Đối với phép nối chéo, chúng tôi không chỉ định bất kỳ điều kiện nối nào mà chỉ đơn giản là kết hợp hai bảng bằng phép nối chéo ở giữa chúng.

Đầu ra

Như bạn có thể thấy, kết quả là 40 hàng; 10 giá trị từ bảng students khớp với 4 department từ bảng department. Như sau:

  • Bốn giá trị của bốn khoa trong bảng khoa khớp với sinh viên đầu tiên Michel.
  • Bốn giá trị từ bốn khoa trong bảng khoa trùng khớp với sinh viên thứ hai tên John.
  • Bốn giá trị cho bốn khoa từ bảng khoa được đối chiếu với sinh viên thứ ba tên Jack… và cứ thế tiếp tục.

SQLite Ví dụ kết quả CROSS JOIN

Câu Hỏi Thường Gặp

SQLite Đã thêm hỗ trợ RIGHT JOIN và FULL OUTER JOIN trong phiên bản 3.39.0, phát hành năm 2022. Trên các bản dựng cũ hơn, bạn mô phỏng RIGHT JOIN bằng cách hoán đổi.ping Kết hợp các bảng trong phép LEFT JOIN và phép FULL OUTER JOIN bằng cách kết hợp hai phép LEFT JOIN với UNION.

Phép nối tự tham chiếu (self join) kết nối một bảng với chính nó bằng cách sử dụng bí danh bảng, do đó một bản sao đóng vai trò là bảng bên trái và bản sao khác là bảng bên phải. Nó hữu ích để so sánh các hàng trong cùng một bảng, chẳng hạn như ghép nối nhân viên với người quản lý của họ.

Đúng vậy. Bạn có thể kết hợp nhiều mệnh đề JOIN trong một câu lệnh SELECT duy nhất, mỗi mệnh đề có điều kiện ON hoặc USING riêng, ví dụ: FROM A JOIN B ON … JOIN C ON …. SQLite Kết hợp các bảng từ trái sang phải thành một tập kết quả duy nhất.

Viết riêng từ khóa JOIN cũng tương đương với INNER JOIN. SQLiteCả hai đều chỉ giữ lại những hàng thỏa mãn điều kiện ON hoặc USING, do đó những hàng không khớp sẽ bị loại bỏ. Từ khóa INNER là tùy chọn, khiến cho JOIN và INNER JOIN có thể thay thế cho nhau.

Việc tạo chỉ mục trên các cột được sử dụng trong điều kiện kết nối cho phép SQLite Việc khớp các hàng mà không cần quét toàn bộ bảng giúp tăng tốc độ các phép nối trên các tập dữ liệu lớn. Lập chỉ mục các cột khóa ngoại và chạy ANALYZE để làm mới số liệu thống kê sẽ cải thiện hơn nữa hiệu suất truy vấn nối.

Phép nối INNER JOIN chỉ trả về các hàng khớp nhau trong cả hai bảng. Phép nối LEFT OUTER JOIN trả về mọi hàng từ bảng bên trái cộng với các hàng khớp từ bảng bên phải, điền các cột không khớp ở bảng bên phải bằng giá trị NULL. Vì vậy, phép nối LEFT JOIN không bao giờ loại bỏ các hàng từ bảng bên trái.

Đúng vậy. Trợ lý AI chuyển văn bản thành SQL sẽ biến các yêu cầu bằng tiếng Anh thông thường thành... SQLite Các câu lệnh INNER, LEFT, NATURAL và CROSS JOIN. Việc cung cấp tên bảng, tên cột và mối quan hệ giữa các bảng sẽ cải thiện độ chính xác, và mọi câu lệnh JOIN được tạo ra cần được xem xét và kiểm tra trước khi chạy trên dữ liệu thực.

Trợ lý GitHub gợi ý SQLite Truy vấn JOIN trực tiếp trong trình soạn thảo như VS CodeNó hoàn thành các lệnh INNER JOIN, LEFT JOIN, và các mệnh đề ON hoặc USING. Nó đọc lược đồ và các bình luận gần đó, vì vậy các đề xuất của nó sử dụng lại tên bảng và cột thực của bạn.

Tóm tắt bài viết này với: