Tóm tắt :trong hướng dẫn này, bạn sẽ tìm hiểu về các loại liên kết SQLite khác nhau để truy vấn dữ liệu từ hai hoặc nhiều bảng.
Để trình diễn, chúng tôi sẽ sử dụng artists
và albums
bảng từ cơ sở dữ liệu mẫu.
Một nghệ sĩ có thể có không hoặc nhiều album trong khi một album thuộc về một nghệ sĩ.
Để truy vấn dữ liệu từ cả artists
và albums
bảng, bạn sử dụng có thể sử dụng INNER JOIN
, LEFT JOIN
hoặc CROSS JOIN
mệnh đề. Mỗi mệnh đề nối xác định cách SQLite sử dụng dữ liệu từ một bảng để khớp với các hàng trong bảng khác.
Lưu ý rằng SQLite không hỗ trợ trực tiếp RIGHT JOIN
và FULL OUTER JOIN
.
SQLite INNER JOIN
Câu lệnh sau trả về tên album và tên nghệ sĩ của họ:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists
ON artists.ArtistId = albums.ArtistId;
Code language: SQL (Structured Query Language) (sql)
Đây là kết quả một phần:
Trong ví dụ này, INNER JOIN
mệnh đề khớp với từng hàng từ albums
bảng với mọi hàng từ artists
bảng dựa trên điều kiện tham gia (artists.ArtistId = albums.ArtistId
) được chỉ định sau ON
từ khóa.
Nếu điều kiện kết hợp đánh giá là true (hoặc 1), các cột của hàng từ cả albums
và artists
bảng được bao gồm trong tập kết quả.
Truy vấn này sử dụng bí danh bảng (l
cho albums
bảng và r
cho các nghệ sĩ artists
bảng) để rút ngắn truy vấn:
SELECT
l.Title,
r.Name
FROM
albums l
INNER JOIN artists r ON
r.ArtistId = l.ArtistId;
Code language: SQL (Structured Query Language) (sql)
Trong trường hợp tên cột của các bảng đã kết hợp giống nhau, ví dụ:ArtistId
, bạn có thể sử dụng USING
cú pháp như sau:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists USING(ArtistId);
Code language: SQL (Structured Query Language) (sql)
Mệnh đề USING(ArtistId)
tương đương với mệnh đề ON artists.ArtistId = albums.ArtistId
.
SQLite LEFT JOIN
Câu lệnh này chọn tên nghệ sĩ và tên album từ artists
và albums
bảng sử dụng LEFT JOIN
mệnh đề:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql)
Đây là kết quả:
LEFT JOIN
mệnh đề chọn dữ liệu bắt đầu từ bảng bên trái (artists
) và các hàng phù hợp trong bảng bên phải (albums
) dựa trên điều kiện tham gia (artists.ArtistId = albums.ArtistId
).
Phép nối bên trái trả về tất cả các hàng từ artists
bảng (hoặc bảng bên trái) và các hàng phù hợp từ albums
bảng (hoặc bảng bên phải).
Nếu một hàng từ bảng bên trái không có một hàng phù hợp trong bảng bên phải, thì SQLite sẽ bao gồm các cột của các hàng trong bảng bên trái và NULL
cho các cột của bảng bên phải.
Tương tự với INNER JOIN
, bạn có thể sử dụng USING
cú pháp cho điều kiện tham gia như sau:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums USING (ArtistId)
ORDER BY
Name;
Code language: SQL (Structured Query Language) (sql)
Nếu bạn muốn tìm nghệ sĩ không có bất kỳ album nào, bạn có thể thêm WHERE
như được hiển thị trong truy vấn sau:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
WHERE Title IS NULL
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql)
Hình ảnh này cho thấy đầu ra một phần:
Nói chung, loại truy vấn này cho phép bạn tìm các hàng có sẵn trong bảng bên trái nhưng không có các hàng tương ứng trong bảng bên phải.
Lưu ý rằng LEFT JOIN
và LEFT OUTER JOIN
là từ đồng nghĩa.
SQLite CROSS JOIN
CROSS JOIN
mệnh đề tạo ra một tích số Descartes của các hàng từ các bảng đã kết hợp.
Không giống như INNER JOIN
và LEFT JOIN
mệnh đề, một CROSS JOIN
không có điều kiện tham gia. Đây là cú pháp cơ bản của CROSS JOIN
mệnh đề:
SELECT
select_list
FROM table1
CROSS JOIN table2;
Code language: SQL (Structured Query Language) (sql)
CROSS JOIN
kết hợp mọi hàng từ bảng đầu tiên (table1
) với mọi hàng từ bảng thứ hai (table2
) để tạo thành tập kết quả.
Nếu bảng đầu tiên có N
hàng, bảng thứ hai có M
hàng, kết quả cuối cùng sẽ có NxM
hàng.
Một ví dụ thực tế về CROSS JOIN
mệnh đề là kết hợp hai tập dữ liệu để tạo thành một tập dữ liệu ban đầu để xử lý thêm. Ví dụ:bạn có một danh sách các sản phẩm và tháng và bạn muốn lập kế hoạch khi nào bạn có thể bán những sản phẩm nào.
Tập lệnh sau tạo ra các sản phẩm artists
và calendars
bảng:
CREATE TABLE products(
product text NOT null
);
INSERT INTO products(product)
VALUES('P1'),('P2'),('P3');
CREATE TABLE calendars(
y int NOT NULL,
m int NOT NULL
);
INSERT INTO calendars(y,m)
VALUES
(2019,1),
(2019,2),
(2019,3),
(2019,4),
(2019,5),
(2019,6),
(2019,7),
(2019,8),
(2019,9),
(2019,10),
(2019,11),
(2019,12);
Code language: SQL (Structured Query Language) (sql)
Truy vấn này sử dụng CROSS JOIN
mệnh đề kết hợp các sản phẩm với các tháng:
SELECT *
FROM products
CROSS JOIN calendars;
Code language: SQL (Structured Query Language) (sql)
Đây là kết quả:
Trong hướng dẫn này, bạn đã học được nhiều loại phép nối SQLite khác nhau cho phép bạn truy vấn từ nhiều bảng.