Cơ sở dữ liệu và SQL: câu hỏi luyện tập có giải thích

Câu hỏi trắc nghiệm Cơ sở dữ liệu và SQL miễn phí, có gợi ý và giải thích, ở ba mức độ: thuật ngữ và kiến thức chính, vận dụng khái niệm, tình huống và phân tích.

Bài tập miễn phíDễ

Ràng buộc nào bảo đảm một cột không bao giờ bị để trống (NULL)?

Bài tiếp theo →

Bạn luyện tập những gì

  1. Dễthuật ngữ và kiến thức chính
  2. Trung bìnhvận dụng khái niệm
  3. Khótình huống và phân tích

Học Cơ sở dữ liệu và SQL từ đầu

1Cơ sở dữ liệu quan hệ là gì

Một cơ sở dữ liệu quan hệ lưu dữ liệu trong các bảng. Một bảng giống bảng tính: mỗi hàng là một bản ghi, mỗi cột là một thuộc tính.

Một cửa hàng có thể có bảng customers với các cột id, name và city, và bảng orders với các cột id, customer_id và total.

Khóa chính là một cột, hoặc một tập các cột, xác định duy nhất từng hàng. Nó không bao giờ được lặp lại và không bao giờ để trống. Ở đây đó là id của mỗi bảng.

Khóa ngoại là một cột tham chiếu đến khóa chính của bảng khác. Trong orders, customer_id cho biết khách hàng nào đã đặt đơn.

Đây là cách các bảng được liên kết: một khách hàng có thể có nhiều đơn hàng, nhưng mỗi đơn hàng thuộc về một khách hàng. Đó là quan hệ một-nhiều.

SQL (Structured Query Language) là ngôn ngữ bạn dùng để tạo bảng, thay đổi dữ liệu và đặt câu hỏi về nó.

Tự kiểm tra Khóa chính là gì?
  1. Cột đầu tiên của mọi bảng
  2. Một chỉ mục làm cho việc tìm kiếm nhanh hơn
  3. Một cột hoặc một tập cột xác định duy nhất từng hàng
  4. Một cột tham chiếu đến một hàng trong bảng khác

Đáp số: Một cột hoặc một tập cột xác định duy nhất từng hàng. Khóa chính là duy nhất và không bao giờ NULL, nên nó chọn ra đúng một hàng. Một cột tham chiếu đến bảng khác là khóa ngoại.

2Đọc dữ liệu với SELECT

Hầu hết câu hỏi nói về câu lệnh SELECT. Nó được xây dựng từ các mệnh đề, luôn viết theo thứ tự này:

SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
  • SELECT liệt kê các cột bạn muốn. DISTINCT loại bỏ các hàng trùng lặp.
  • FROM nêu tên bảng, hoặc các bảng được nối với nhau.
  • WHERE chỉ giữ lại các hàng thỏa một điều kiện, ví dụ WHERE total > 20.
  • GROUP BY gộp các hàng có cùng giá trị vào một nhóm, để bạn có thể đếm hoặc cộng theo từng nhóm.
  • HAVING chỉ giữ lại các nhóm thỏa một điều kiện. Nó có thể dùng các hàm tổng hợp, còn WHERE thì không.
  • ORDER BY sắp xếp kết quả, mặc định tăng dần; thêm DESC để lớn nhất trước.

Các hàm tổng hợp tóm tắt nhiều hàng thành một giá trị: COUNT, SUM, AVG, MIN và MAX.

Cơ sở dữ liệu không chạy các mệnh đề theo thứ tự bạn viết. Nó chạy FROM trước, rồi WHERE, GROUP BY, HAVING, SELECT và cuối cùng là ORDER BY.

Các câu lệnh khác làm thay đổi dữ liệu: INSERT thêm hàng, UPDATE thay đổi hàng và DELETE xóa hàng. CREATE, ALTER và DROP thay đổi chính các bảng.

Tự kiểm tra Bạn chỉ muốn những khách hàng có hơn 5 đơn hàng. Mệnh đề nào lọc theo COUNT(*) > 5?
  1. DISTINCT
  2. HAVING
  3. ORDER BY
  4. WHERE

Đáp số: HAVING. Giá trị đếm chỉ tồn tại sau khi các hàng được gom nhóm, và HAVING lọc các nhóm. WHERE chạy trước khi gom nhóm, nên không thể dùng hàm tổng hợp như COUNT.

3Phép nối, chuẩn hóa và giao dịch

Một phép nối (join) kết hợp các hàng của hai bảng bằng một điều kiện, thường là khóa ngoại = khóa chính:

FROM customers c JOIN orders o ON o.customer_id = c.id
  • INNER JOIN (hoặc JOIN) chỉ giữ các hàng có khớp ở cả hai bảng.
  • LEFT JOIN giữ mọi hàng của bảng bên trái. Nơi không có khớp, các cột của bảng bên phải là NULL.
  • NULL nghĩa là một giá trị bị thiếu hoặc không xác định. Kiểm tra nó bằng IS NULL, không bao giờ bằng = NULL.

Chuẩn hóa tách các bảng để mỗi sự kiện chỉ được lưu một lần. Điều này tránh phải cập nhật cùng một sự kiện ở nhiều nơi.

  • 1NF: mỗi ô chứa một giá trị nguyên tử, không có nhóm lặp.
  • 2NF: 1NF, và mọi cột không khóa phụ thuộc vào toàn bộ khóa, không phụ thuộc vào một phần của khóa phức hợp.
  • 3NF: 2NF, và không cột không khóa nào phụ thuộc vào một cột không khóa khác.

Một giao dịch gom các câu lệnh thành một đơn vị. COMMIT làm cho nó vĩnh viễn và ROLLBACK hoàn tác nó. Giao dịch tuân theo ACID: tính nguyên tử (tất cả hoặc không gì cả), nhất quán, cô lập và bền vững.

Tự kiểm tra Một khách hàng chưa đặt đơn nào. Điều gì xảy ra với khách hàng đó trong customers LEFT JOIN orders?
  1. Khách hàng bị loại khỏi kết quả
  2. Khách hàng xuất hiện một lần cho mỗi đơn hàng trong bảng
  3. Khách hàng xuất hiện một lần, với NULL ở các cột đơn hàng
  4. Truy vấn thất bại với một lỗi

Đáp số: Khách hàng xuất hiện một lần, với NULL ở các cột đơn hàng. LEFT JOIN giữ mọi hàng của bảng bên trái và điền NULL vào phía bên phải bị thiếu. Loại khách hàng ra là điều INNER JOIN làm.

4Phương pháp từng bước

Để viết một truy vấn, hoặc để tìm một truy vấn cho trước trả về gì:

  1. Tìm các bảng chứa dữ liệu, và chúng được liên kết bằng khóa như thế nào.
  2. Viết FROM cùng các phép nối. Chọn LEFT JOIN khi các hàng không có khớp phải được giữ lại.
  3. Thêm WHERE cho các điều kiện trên từng hàng.
  4. Nếu câu hỏi nói “mỗi” hoặc “theo từng”, hãy thêm GROUP BY và hàm tổng hợp.
  5. Thêm HAVING cho các điều kiện trên hàm tổng hợp, rồi ORDER BY nếu thứ tự quan trọng.
  6. Kiểm tra kết quả trên một ví dụ nhỏ: liệt kê các hàng sau mỗi mệnh đề, theo thứ tự cơ sở dữ liệu chạy chúng.

Với câu hỏi lý thuyết, trước hết gọi tên khái niệm (một khóa, một loại phép nối, một dạng chuẩn, một tính chất ACID), rồi chọn phương án khớp với định nghĩa của nó.

5Một ví dụ có lời giải

Theo dõi từng bước. Hãy thử đoán bước tiếp theo trước khi mở nó.

Ví dụ có lời giải

Bảng customers có các hàng (1, Ana), (2, Ben) và (3, Cas). Bảng orders có các hàng (id, customer_id) = (10, 1), (11, 1), (12, 2) và (13, 1). Truy vấn này trả về gì? SELECT c.name, COUNT(o.id) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.name

1

Chạy FROM và phép nối

Mỗi khách hàng được ghép với các đơn hàng mang id của nó. Ana khớp với các đơn 10, 11 và 13. Ben khớp với đơn 12.

Cas không có đơn hàng nào. Vì đây là LEFT JOIN, Cas vẫn ở trong kết quả, với NULL cho o.id.

2

Liệt kê các hàng đã nối

  • Ana, 10
  • Ana, 11
  • Ana, 13
  • Ben, 12
  • Cas, NULL

Vậy là 5 hàng.

3

Gom nhóm theo name

GROUP BY c.name tạo ba nhóm: Ana với 3 hàng, Ben với 1 hàng và Cas với 1 hàng.

4

Đếm theo nhóm

COUNT(o.id) chỉ đếm các giá trị không phải NULL. Ana được 3 và Ben được 1.

Cas có một hàng, nhưng o.id của nó là NULL, nên Cas được 0.

5

Kiểm tra đáp án

Ana, Ben và Cas cộng lại có 3 + 1 + 0 = 4 đơn hàng, bằng số hàng trong orders. Nếu dùng COUNT(*) thay thế, Cas sẽ bị tính nhầm là 1, vì COUNT(*) đếm chính hàng đó.

Đáp số

Ana 3, Ben 1, Cas 0.

6Lỗi thường gặp

  • Dùng hàm tổng hợp trong WHERE. Các điều kiện trên COUNT, SUM hay AVG thuộc về HAVING.
  • Viết = NULL. Mọi so sánh với NULL đều không xác định; hãy dùng IS NULL hoặc IS NOT NULL.
  • Dùng INNER JOIN khi các hàng không có khớp phải được giữ lại. Hãy dùng LEFT JOIN.
  • Quên điều kiện nối. Không có ON, mỗi hàng được ghép với mọi hàng (phép nối chéo).
  • Chọn một cột vừa không có trong GROUP BY vừa không nằm trong một hàm tổng hợp.
  • Nhầm DELETE (xóa các hàng) với DROP TABLE (xóa cả bảng).
  • Chạy UPDATE hoặc DELETE mà không có WHERE. Nó thay đổi mọi hàng trong bảng.
Tự kiểm tra Một bảng có 10 hàng, và cột col là NULL ở mọi hàng. SELECT COUNT(col) trả về gì?
  1. 0
  2. 10
  3. 1
  4. NULL

Đáp số: 0. COUNT(col) chỉ đếm các giá trị không phải NULL, nên nó trả về 0. COUNT(*) đếm số hàng và sẽ trả về 10.

7Các câu hỏi thi trông như thế nào

  • Dễ: thuật ngữ và sự kiện chính. SELECT, WHERE, ORDER BY hay DELETE làm gì, khóa chính và khóa ngoại, NULL nghĩa là gì.
  • Trung bình: vận dụng khái niệm. Truy vấn đúng cho một tác vụ, WHERE so với HAVING, phép nối trong so với ngoài, các dạng chuẩn, ACID.
  • Khó: ca bài tập và phân tích. Truy vấn con, các mức cô lập và các dị thường của chúng, BCNF, hàm cửa sổ, chỉ mục và hiệu năng truy vấn, SQL injection.

Khi cho một truy vấn, hãy lần theo nó trên vài hàng theo thứ tự FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. Hầu hết bẫy xuất hiện trong ba hàng.

Học từng bước một trong ứng dụngHọc từng bước một trong ứng dụng

Câu hỏi ví dụ

Ví dụ 1Dễ

UNION làm gì với kết quả của hai truy vấn SELECT?

  1. ANối chúng cạnh nhau theo một khóa
  2. BChỉ giữ các hàng xuất hiện ở cả hai
  3. CKết hợp chúng thành một kết quả và loại bỏ các hàng trùng lặp
  4. DChỉ giữ các hàng có ở truy vấn thứ nhất mà không có ở truy vấn thứ hai
Hiện các gợi ý
  1. Cả hai truy vấn phải có cùng số cột tương thích.
  2. Hai đáp án sai đã bị gạch bỏ. Một trong hai đáp án còn lại là đúng.
Hiện đáp án và phần giải thích

Vì sao đây là đáp án

UNION xếp chồng các hàng của cả hai truy vấn và loại bỏ trùng lặp; UNION ALL giữ lại các hàng trùng.

Đáp số

C · Kết hợp chúng thành một kết quả và loại bỏ các hàng trùng lặp
Ví dụ 2Trung bình

SELECT SUM(amount) FROM orders trả về gì khi mệnh đề WHERE không khớp hàng nào?

  1. AMột lỗi
  2. B0
  3. CNULL
  4. DMột chuỗi rỗng
Hiện các gợi ý
  1. SUM khác COUNT ở điểm này.
  2. Hai đáp án sai đã bị gạch bỏ. Một trong hai đáp án còn lại là đúng.
Hiện đáp án và phần giải thích

Vì sao đây là đáp án

SUM, AVG, MIN và MAX trả về NULL trên tập rỗng, trong khi COUNT trả về 0; COALESCE(SUM(amount), 0) cho ra 0 thay thế.

Đáp số

C · NULL
Ví dụ 3Khó

SELECT name, dept, AVG(salary) OVER (PARTITION BY dept) FROM emp trả về gì?

  1. AChỉ những nhân viên có lương cao hơn mức trung bình phòng ban
  2. BMọi hàng nhân viên cùng với mức lương trung bình của phòng ban của họ
  3. CMột lỗi vì name không nằm trong GROUP BY
  4. DMột hàng cho mỗi phòng ban với mức lương trung bình của nó
Hiện các gợi ý
  1. Hàm cửa sổ không gộp các hàng lại.
  2. Hai đáp án sai đã bị gạch bỏ. Một trong hai đáp án còn lại là đúng.
Hiện đáp án và phần giải thích

Vì sao đây là đáp án

Khác với GROUP BY, hàm cửa sổ giữ mọi hàng đầu vào và thêm một giá trị được tính trên phân vùng của nó, ở đây là phòng ban.

Đáp số

B · Mọi hàng nhân viên cùng với mức lương trung bình của phòng ban của họ

Câu hỏi thường gặp

Cơ sở dữ liệu và SQL là gì?

Một cơ sở dữ liệu quan hệ lưu dữ liệu trong các bảng. Một bảng giống bảng tính: mỗi hàng là một bản ghi, mỗi cột là một thuộc tính.

Một cửa hàng có thể có bảng customers với các cột id, name và city, và bảng orders với các cột id, customer_id và total.

Làm thế nào để học Cơ sở dữ liệu và SQL từng bước?
  1. Cơ sở dữ liệu quan hệ là gì
  2. Đọc dữ liệu với SELECT
  3. Phép nối, chuẩn hóa và giao dịch
  4. Phương pháp từng bước
  5. Một ví dụ có lời giải
  6. Lỗi thường gặp
  7. Các câu hỏi thi trông như thế nào
Các bài tập Cơ sở dữ liệu và SQL bao gồm những gì?
  • Dễ: thuật ngữ và kiến thức chính
  • Trung bình: vận dụng khái niệm
  • Khó: tình huống và phân tích

Mỗi câu hỏi có bốn phương án, và chỉ một phương án đúng. Bí rồi? Hãy mở một gợi ý nhỏ trước, và chỉ xem giải thích đầy đủ khi cần.

Cách luyện tập hoạt động

  • Mỗi câu hỏi có bốn phương án, và chỉ một phương án đúng.
  • Bí rồi? Hãy mở một gợi ý nhỏ trước, và chỉ xem giải thích đầy đủ khi cần.
  • Tiến độ, lỗi sai và các bài đã lưu của bạn được giữ lại, để bạn xem lại trước kỳ thi.

Các môn học có chủ đề này

Thêm chủ đề trong Khoa học máy tính

Phiếu bài tập in được