Truy vấn bằng SQL
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| SQL/ˌes kjuː ˈel/ | Ngôn ngữ truy vấn có cấu trúc |
| JOIN/dʒɔɪn/ | kết nối |
| GROUP BY/ɡruːp baɪ/ | nhóm theo |
Hai khóa học khác nhau chia sẻ cùng một tiêu đề
- Hai khóa học đều mang tên Robotics. Nếu chỉ nhóm theo tiêu đề sẽ gộp chung các lần đăng ký của chúng và che đi thực tế rằng chúng là hai khóa học khác nhau.
- SQL mô tả kết quả dữ liệu bạn muốn thu được. Hãy kiểm tra danh tính dòng và đầu ra dự kiến trước khi tin vào một số lượng đếm hợp lý.
Theo dõi mối quan hệ trong câu lệnh JOIN
- Một câu lệnh JOIN kết hợp các dòng dựa trên một mối quan hệ như
e.course_id = c.id. Hãy viết rõ ràng mối quan hệ mà bạn mong muốn. - Một cross join ghép mỗi dòng ở phía bên này với mọi dòng ở phía bên kia. Trong SQLite, một câu lệnh join không có ràng buộc có thể tạo ra tích Cartesian; các hệ thống SQL khác có thể từ chối nếu thiếu điều kiện join.
Trong SQLite, phép nối không bị ràng buộc ghép ba môn học với ba hồ sơ đăng ký. Nó có thể tạo ra bao nhiêu cặp?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Tích chéo có 3 × 3 hàng, trước bất kỳ bộ lọc nào sau đó.
Giữ lại các khóa học không có sinh viên đăng ký
- Một left join giữ lại tất cả các khóa học, bao gồm cả những khóa học không có lần đăng ký nào khớp. Các trường đăng ký không khớp của nó sẽ có giá trị null.
- Đếm
e.student_id, bao gồm các giá trị khác NULL, thay vìCOUNT(*), vốn cũng đếm cả dòng không khớp còn lại. Khóa học trống nên báo cáo là không.
Biểu thức nào sau đây đếm chính xác zero (không có) hồ sơ đăng ký cho một khóa học không khớp trong phép nối trái?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
COUNT của trường nullable không khớp sẽ loại bỏ giá trị null; COUNT(*) đếm toàn bộ hàng được giữ lại.
Chạy một truy vấn với các đáp án đã biết
- Chạy toàn bộ tập lệnh này trong cơ sở dữ liệu SQLite cục bộ. Hai khóa học Robotics có ID khác nhau, và Art không có người đăng ký.
- GROUP BY nhóm theo cả ID khóa học và tiêu đề. Số dòng dự kiến là
(7, Robotics, 1),(8, Robotics, 2)và(9, Art, 0).
CREATE TABLE courses (id INTEGER PRIMARY KEY, title TEXT NOT NULL);
CREATE TABLE enrolments (student_id INTEGER, course_id INTEGER);
INSERT INTO courses VALUES (7, 'Robotics'), (8, 'Robotics'), (9, 'Art');
INSERT INTO enrolments VALUES (1, 7), (1, 8), (2, 8);
SELECT c.id, c.title, COUNT(e.student_id) AS enrolled
FROM courses AS c
LEFT JOIN enrolments AS e ON e.course_id = c.id
GROUP BY c.id, c.title
ORDER BY c.id;
Hoàn thành clause dùng để nhóm theo danh tính và tiêu đề môn: ____ c.id, c.title
Difficulty 1/5 · 100 coins + a small bonus on first completion today
GROUP BY xác định các nhóm. Việc bao gồm ID giúp phân tách các môn có cùng tiêu đề nhưng khác nhau.
Số lượng hồ sơ đăng ký nào mà câu truy vấn đầy đủ trả về cho các ID khóa học 7, 8 và 9?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Dữ liệu mẫu có một kết quả khớp với 7, hai kết quả với 8 và không có kết quả nào với 9.
Lọc dòng và nhóm ở các giai đoạn khác nhau
WHERElọc các dòng đầu vào trước khi nhóm.HAVINGlọc các nhóm bằng điều kiện nhưCOUNT(e.student_id) >= 2.- Trong ví dụ này, việc thêm điều kiện HAVING trước ORDER BY chỉ trả về khóa học 8. Lọc
e.student_idtrong WHERE có thể loại bỏ các dòng không khớp mà bạn muốn giữ lại.
Clause nào lọc các nhóm chỉ giữ lại những nhóm có ít nhất hai sinh viên đăng ký?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
HAVING áp dụng điều kiện lên các nhóm; WHERE lọc dữ liệu đầu vào trước khi tạo nhóm.
Giải thích việc sử dụng WHERE và HAVING thông qua ví dụ về số lượng khóa học.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
WHERE lọc các hàng; HAVING kiểm tra số lượng của từng nhóm.
Sử dụng các trường hợp biên để xác minh kết quả
- Kiểm tra các tiêu đề lặp lại, số lượng matches bằng 0 và nhiều matches so với các giá trị đã biết. Một kết quả trông có vẻ hợp lý là chưa đủ.
- Giải thích các trường được chọn, điều kiện join, cách nhóm và phép đếm. Quyết định xem các dòng quan hệ trùng lặp có hợp lệ hay nên bị ngăn chặn bởi schema.
Join dựa trên mối quan hệ, nhóm theo danh tính, và đếm đối tượng mong muốn. Một tập dữ liệu nhỏ, đã biết giúp dễ dàng nhận ra các truy vấn sai.
Một số lượng hợp lý là bằng chứng đủ để khẳng định truy vấn SQL chính xác.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
So sánh với số hàng dự kiến đã biết, bao gồm cả trường hợp không khớp và các tiêu đề bị lặp.
Phân nhóm chỉ theo tiêu đề sẽ giữ riêng biệt hai khóa học Robot.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Các tiêu đề giống nhau tạo thành một nhóm. Hãy phân nhóm theo cả danh tính của khóa học.