Các bảng tham gia SQLite: Bên trong, Tự nhiên, Bên ngoài Bên trái, Chéo (Ví dụ)

Mục lục:

Anonim

SQLite hỗ trợ các loại SQL Joins khác nhau, như INNER JOIN, LEFT OUTER JOIN và CROSS JOIN. Mỗi loại JOIN đượ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.

Trong hướng dẫn này, bạn sẽ học-

  • Giới thiệu về mệnh đề SQLite JOIN
  • THAM GIA INNER
  • THAM GIA… SỬ DỤNG
  • THIÊN NHIÊN THAM GIA
  • THAM GIA BÊN NGOÀI TRÁI
  • THAM GIA CROSS

Giới thiệu về mệnh đề SQLite JOIN

Khi bạn đang 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 đề JOIN, 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 phải có cú pháp sau:

Mỗi mệnh đề nối bao gồm:

  • Một bảng hoặc một 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ử JOIN - chỉ định kiểu tham gia (INNER JOIN, LEFT OUTER JOIN, hoặc CROSS JOIN).
  • Tham gia ràng buộc - 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 nối, đó sẽ là điều kiện mà các hàng phù hợp phù hợp với điều kiện đó sẽ được chọn tùy thuộc vào kiểu tham gia.

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

Bước 1) Trong bước này,

  1. Mở Máy tính của tôi và điều hướng đến thư mục sau " C: \ sqlite " và
  2. Sau đó, mở " sqlite3.exe ":

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

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

INNER JOIN chỉ trả về các hàng phù hợp với điều kiện nối và loại bỏ tất cả các hàng khác không phù hợp với điều kiện nối.

Thí dụ

Trong ví dụ sau, chúng ta sẽ nối hai bảng " Sinh viên " và " Phòng ban " với DepartmentId để lấy tên khoa cho từng sinh viên, như sau:

LỰA CHỌNHọc sinh. Tên học sinh,Phòng ban Tên khoaTỪ sinh viênINNER JOIN Các phòng ban trên sinh viên.DepartmentId = Department.DepartmentId;

Giải thích mã:

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

  • Trong mệnh đề Chọn, bạn có thể chọn bất kỳ cột nào bạn muốn chọ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 với mệnh đề "Từ".
  • Sau đó, điều kiện tham gia được chỉ định với ON.
  • Bí danh có thể được chỉ định cho các bảng tham chiếu.
  • Từ INNER là tùy chọn, bạn chỉ có thể viết JOIN.

Đầu ra:

  • INNER JOIN tạo ra các bản ghi từ cả hai - sinh viên và các bảng của khoa phù hợp với điều kiện là " S tudents.DepartmentId = Department.DepartmentId ". Các hàng chưa khớp sẽ bị bỏ qua và không được đưa vào kết quả.
  • Đó là lý do tại sao chỉ có 8 sinh viên trong số 10 sinh viên được trả về từ truy vấn này với các khoa CNTT, toán và vật lý. Trong khi các sinh viên "Jena" và "George" không được đưa vào, vì họ có Id bộ phận rỗng, không khớp với cột DepartmentId trong bảng các khoa. Như sau:

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 = Department.DepartmentId", bạn chỉ có thể viết "USING (DepartmentID)".

Bạn có thể sử dụng "JOIN ... USING" 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 cách sử dụng điều kiện 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… USING:

Với "THAM GIA

… SỬ DỤNG "bạn không viết điều kiện tham gia, bạn chỉ viết cột tham gia chung giữa hai bảng đã tham gia, thay vì viết table1" INNER JOIN table2 ON table1.cola = table2.cola ", chúng tôi viết nó giống như" table1 THAM GIA table2 USING (cola) ”.

Thí dụ

Trong ví dụ sau, chúng ta sẽ nối hai bảng " Sinh viên " và " Phòng ban " với DepartmentId để lấy tên khoa cho từng sinh viên, như sau:

LỰA CHỌNHọc sinh. Tên học sinh,Phòng ban Tên khoaTỪ sinh viênINNER JOIN Các bộ phận SỬ DỤNG (DepartmentId);

Giải trình

  • Không giống như ví dụ trước, chúng tôi không viết " ON Students.DepartmentId = Department.DepartmentId ". Chúng tôi vừa viết " SỬ DỤNG (DepartmentId) ".
  • SQLite tự động suy ra điều kiện kết hợp và so sánh DepartmentId từ cả hai bảng - Sinh viên và Phòng ban.
  • 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ẽ cung cấp cho bạn kết quả chính xác giống như ví dụ trước:

SQLite NATURAL JOIN

NATURAL JOIN tương tự như JOIN… USING, sự khác biệt là nó tự động kiểm tra sự bình đẳng 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 JOIN và NATURAL JOIN:

  • I n INNER JOIN, bạn phải chỉ định một điều kiện nối mà phép nối bên trong sử dụng để nối hai bảng. Trong khi trong phép nối tự nhiên, bạn không viết điều kiện tham gia. Bạn chỉ cần viết tên hai bảng mà không cần bất kỳ điều kiện nào. Sau đó, phép nối tự nhiên sẽ tự động kiểm tra sự bình đẳng giữa các giá trị cho mọi cột tồn tại trong cả hai bảng. Tham gia tự nhiên suy ra điều kiện tham gia tự động.
  • Trong NATURAL JOIN, tất cả các cột từ cả hai bảng có cùng tên sẽ được so 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.

Thí dụ

LỰA CHỌNHọc sinh. Tên học sinh,Phòng ban Tên khoaTỪ sinh viênCác phòng ban tự nhiên;

Giải trình

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

Đầu ra

  • Natural JOIN sẽ cung cấp cho bạn đầu ra chính xác giống như đầu ra mà chúng tôi nhận được từ INNER JOIN và các ví dụ JOIN USING. Bởi vì trong ví dụ của chúng tôi, cả ba truy vấn đều tương đương nhau. Nhưng trong một số trường hợp, đầu ra sẽ khác với phép nối bên trong sau đó ở phép nối tự nhiên. Ví dụ: nếu có nhiều bảng có cùng tên, thì phép nối tự nhiên sẽ khớp tất cả các cột với nhau. Tuy nhiên, phép nối bên trong sẽ chỉ khớp với các cột trong điều kiện nối (chi tiết hơn ở phần tiếp theo; sự khác biệt giữa phép nối bên trong và phép nối tự nhiên).

SQLite LEFT OUTER THAM GIA

Tiêu chuẩn SQL định nghĩa ba loại OUTER JOIN: LEFT, RIGHT và FULL nhưng SQLite chỉ hỗ trợ LEFT OUTER JOIN.

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

Vì vậy, nếu bảng bên trái có 'n' hàng, kết quả của truy vấn sẽ có 'n' hàng. Tuy nhiên, đối với 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 phù hợp với điều kiện nối, nó sẽ chứa giá trị "null".

Vì vậy, bạn sẽ nhận được một số hàng tương đương với số hàng trong phép nối bên trái. Vì vậy, bạn sẽ nhận được các hàng phù hợ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.

Thí dụ

Trong ví dụ sau, chúng ta sẽ thử "LEFT JOIN" để nối hai bảng "Sinh viên" và "Phòng ban":

LỰA CHỌNHọc sinh. Tên học sinh,Phòng ban Tên khoaTỪ Học sinh - đây là bảng bên tráiTHAM GIA TRÁI các phòng ban trên sinh viên.DepartmentId = Department.DepartmentId;

Giải trình

  • Cú pháp LEFT JOIN giống như INNER JOIN; bạn viết THAM GIA TRÁI giữa hai bảng và sau đó điều kiện nối xuất hiện sau mệnh đề BẬT.
  • 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 phép nối bên trái là bảng bên phải.
  • Mệnh đề OUTER là tùy chọn; LEFT OUTER JOIN giống như LEFT JOIN.

Đầu ra

  • Như bạn có thể thấy tất cả các hàng từ bảng học sinh được bao gồm tổng cộng 10 học sinh. Ngay cả khi Id của khoa thứ tư và sinh viên cuối cùng, Jena và George không tồn tại trong bảng Khoa, chúng cũng được bao gồm.
  • Và trong những trường hợp này, giá trị DepartmentName cho cả Jena và George sẽ là "null" vì bảng phòng ban không có tên phòng ban khớp với giá trị DepartmentId của chúng.

Hãy cung cấp cho truy vấn trước bằng cách sử dụng kết hợp bên trái để giải thích sâu hơn bằng cách sử dụng sơ đồ Van:

LEFT JOIN sẽ cung cấp cho tất cả các tên sinh viên từ bảng sinh viên ngay cả khi sinh viên có id khoa không tồn tại trong bảng phòng ban. Vì vậy, truy vấn sẽ không chỉ cung cấp cho bạn các hàng phù hợp dưới dạng INNER JOIN, mà sẽ cung cấp cho bạn phần bổ sung có các hàng không khớp từ bảng bên trái là bảng sinh viên.

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

SQLite CROSS JOIN

CROSS JOIN cung cấp tích số 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' so khớp từ bảng thứ hai, trong đó n là số hàng của bảng thứ hai.

Không giống như INNER JOIN và LEFT OUTER JOIN, với CROSS JOIN, bạn không cần chỉ định điều kiện nối vì SQLite không cần điều kiện này cho CROSS JOIN.

SQLite sẽ dẫn đến kết quả lôgic được thiết lập bằng cách kết hợ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í dụ: nếu bạn đã chọn một cột từ bảng đầu tiên (colA) và một cột khác từ bảng thứ hai (colB). ColA chứa hai giá trị (1,2) và colB cũng chứa hai giá trị (3,4).

Sau đó, 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).

Thí dụ

Trong truy vấn sau, chúng tôi sẽ thử CROSS JOIN giữa các bảng Sinh viên và Phòng ban:

LỰA CHỌNHọc sinh. Tên học sinh,Phòng ban Tên khoaTỪ sinh viênCác phòng ban CROSS JOIN;

Giải trình

  • Trong mệnh đề select, 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 phòng ban.
  • Đối với phép nối chéo, chúng tôi không chỉ định bất kỳ điều kiện liên kết nào chỉ là hai bảng được kết hợp với CROSS JOIN ở giữa chúng.

Đầu ra:

Như bạn thấy, kết quả là 40 hàng; 10 giá trị từ bảng sinh viên khớp với 4 phòng ban từ bảng phòng ban. Như sau:

  • Bốn giá trị cho bốn phòng ban từ bảng các khoa phù hợp với sinh viên đầu tiên Michel.
  • Bốn giá trị cho Bốn phòng ban từ bảng các phòng ban khớp với sinh viên thứ hai John.
  • Bốn giá trị cho Bốn phòng ban từ bảng phòng ban khớp với sinh viên thứ ba Jack.

    … và như thế.

Tóm lược

Sử dụng SQLite JOINs, bạn có thể liên kết một hoặc nhiều bảng hoặc truy vấn con với nhau để chọn cột từ cả hai bảng hoặc truy vấn con.