Trắc nghiệm Tin học 11 Kết nối tri thức Bài 23: Thực hành truy xuất dữ liệu qua liên kết các bảng - Đề 07
Trắc nghiệm Tin học 11 Kết nối tri thức Bài 23: Thực hành truy xuất dữ liệu qua liên kết các bảng - Đề 07 được xây dựng với nhiều câu hỏi chất lượng, sát với nội dung chương trình học, giúp bạn dễ dàng ôn tập và kiểm tra kiến thức hiệu quả. Hãy cùng bắt đầu làm bài tập trắc nghiệm ngay để nâng cao hiểu biết và chuẩn bị tốt cho kỳ thi sắp tới!
Câu 1: Giả sử bạn có hai bảng trong cơ sở dữ liệu quản lý thư viện: `Sach` (chứa `MaSach`, `TenSach`, `MaTacGia`) và `TacGia` (chứa `MaTacGia`, `TenTacGia`). Để lấy danh sách tên sách và tên tác giả tương ứng, bạn cần sử dụng mệnh đề SQL nào để kết nối hai bảng này dựa trên cột `MaTacGia` chung?
- A. WHERE
- B. JOIN
- C. GROUP BY
- D. ORDER BY
Câu 2: Cho câu lệnh SQL sau: `SELECT A.TenCot1, B.TenCot2 FROM BangA INNER JOIN BangB ON A.KhoaChung = B.KhoaChung;`. Kết quả của câu lệnh này sẽ bao gồm những bản ghi nào?
- A. Tất cả bản ghi từ BangA.
- B. Tất cả bản ghi từ BangB.
- C. Chỉ các bản ghi có giá trị KhoaChung tồn tại ở cả BangA và BangB.
- D. Tất cả bản ghi từ cả BangA và BangB.
Câu 3: Bạn muốn lấy danh sách tất cả các tác giả từ bảng `TacGia` và, nếu có, tên các cuốn sách mà họ đã viết từ bảng `Sach`. Ngay cả những tác giả chưa có cuốn sách nào cũng phải xuất hiện trong danh sách. Loại JOIN nào phù hợp nhất trong trường hợp này?
- A. LEFT JOIN
- B. INNER JOIN
- C. RIGHT JOIN
- D. FULL OUTER JOIN
Câu 4: Trong một cơ sở dữ liệu quản lý đơn hàng, có hai bảng: `DonHang` (chứa `MaDonHang`, `MaKhachHang`, `NgayDat`) và `KhachHang` (chứa `MaKhachHang`, `TenKhachHang`, `DiaChi`). Để lấy danh sách tất cả đơn hàng kèm tên khách hàng đặt đơn đó, câu lệnh SQL nào sau đây là đúng?
- A. SELECT DonHang.*, KhachHang.TenKhachHang FROM DonHang, KhachHang WHERE DonHang.MaKhachHang = KhachHang.MaKhachHang;
- B. SELECT MaDonHang, NgayDat, TenKhachHang FROM DonHang JOIN KhachHang ON DonHang.MaKhachHang = KhachHang.MaKhachHang;
- C. SELECT DonHang.MaDonHang, DonHang.NgayDat, KhachHang.TenKhachHang FROM DonHang INNER JOIN KhachHang ON DonHang.MaKhachHang = KhachHang.MaKhachHang;
- D. Tất cả các câu lệnh trên đều đúng cú pháp và cho kết quả tương tự.
Câu 5: Cho hai bảng `SanPham` (`MaSP`, `TenSP`, `MaLoaiSP`) và `LoaiSanPham` (`MaLoaiSP`, `TenLoai`). Bạn muốn lấy danh sách tên sản phẩm cùng với tên loại sản phẩm của chúng. Tuy nhiên, bạn CHỈ muốn hiển thị các sản phẩm thuộc loại "Điện tử". Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT SanPham.TenSP, LoaiSanPham.TenLoai FROM SanPham, LoaiSanPham WHERE SanPham.MaLoaiSP = LoaiSanPham.MaLoaiSP AND LoaiSanPham.MaLoai = "Điện tử";
- B. SELECT SanPham.TenSP, LoaiSanPham.TenLoai FROM SanPham JOIN LoaiSanPham ON SanPham.MaLoaiSP = LoaiSanPham.MaLoaiSP WHERE LoaiSanPham.TenLoai = "Điện tử";
- C. Cả A và B đều đúng.
- D. SELECT SanPham.TenSP, LoaiSanPham.TenLoai FROM SanPham WHERE LoaiSanPham.TenLoai = "Điện tử";
Câu 6: Khi thực hiện `LEFT JOIN` giữa `BangA` (bên trái) và `BangB` (bên phải) trên điều kiện `A.Khoa = B.Khoa`, nếu có một bản ghi trong `BangA` không có bản ghi tương ứng trong `BangB`, thì các cột từ `BangB` trong kết quả của bản ghi đó sẽ có giá trị là gì?
- A. Giá trị mặc định (nếu có).
- B. NULL.
- C. Một chuỗi rỗng ("").
- D. Không có giá trị (không hiển thị cột).
Câu 7: Bạn có ba bảng: `SinhVien` (`MaSV`, `TenSV`), `DangKyHoc` (`MaSV`, `MaMonHoc`), và `MonHoc` (`MaMonHoc`, `TenMonHoc`). Để lấy danh sách tên sinh viên và tên các môn học mà họ đã đăng ký, bạn cần thực hiện bao nhiêu phép `JOIN`?
- A. Một.
- B. Hai.
- C. Ba.
- D. Không cần JOIN nếu các bảng có quan hệ.
Câu 8: Cho câu lệnh SQL: `SELECT O.OrderID, C.CustomerName FROM Orders O JOIN Customers C ON O.CustomerID = C.CustomerID WHERE C.City = "London";`. Câu lệnh này có mục đích gì?
- A. Lấy tất cả đơn hàng và tên khách hàng.
- B. Lấy tất cả khách hàng và các đơn hàng của họ.
- C. Lấy các đơn hàng được đặt tại thành phố "London".
- D. Lấy mã đơn hàng và tên của các khách hàng sống ở "London" đã đặt đơn hàng.
Câu 9: Khi kết nối hai bảng `A` và `B` bằng `INNER JOIN` trên điều kiện `A.ID = B.ID`, giả sử có một bản ghi trong `A` có `ID = 5` nhưng không có bản ghi nào trong `B` có `ID = 5`. Bản ghi này sẽ xuất hiện trong kết quả truy vấn không?
- A. Có, nó sẽ xuất hiện với giá trị NULL cho các cột của B.
- B. Không, vì không có sự trùng khớp ở bảng B.
- C. Có, nó sẽ xuất hiện với giá trị mặc định cho các cột của B.
- D. Chỉ khi sử dụng bí danh (alias).
Câu 10: Đâu là lý do chính khiến việc sử dụng `JOIN` thay vì chỉ dùng `WHERE` với nhiều bảng trong mệnh đề `FROM` được khuyến khích trong các hệ quản trị CSDL hiện đại?
- A. Cú pháp `JOIN` rõ ràng, dễ đọc và giúp tối ưu hóa hiệu quả hơn.
- B. Cú pháp `WHERE` với nhiều bảng chỉ hoạt động với `INNER JOIN`.
- C. Cú pháp `JOIN` luôn nhanh hơn.
- D. Cú pháp `WHERE` với nhiều bảng đã lỗi thời và không còn được hỗ trợ.
Câu 11: Bạn có bảng `NhanVien` (`MaNV`, `TenNV`, `MaPhongBan`) và `PhongBan` (`MaPhongBan`, `TenPhongBan`). Bạn muốn lấy danh sách tên nhân viên và tên phòng ban của họ. Tuy nhiên, bạn phát hiện có một số nhân viên chưa được gán mã phòng ban (MaPhongBan là NULL). Bạn muốn hiển thị tất cả nhân viên, kể cả những người chưa có phòng ban. Câu lệnh SQL nào sau đây phù hợp?
- A. SELECT NhanVien.TenNV, PhongBan.TenPhongBan FROM NhanVien LEFT JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;
- B. SELECT NhanVien.TenNV, PhongBan.TenPhongBan FROM NhanVien INNER JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;
- C. SELECT NhanVien.TenNV, PhongBan.TenPhongBan FROM NhanVien RIGHT JOIN PhongBan ON NhanVien.MaPhongBan = PhongBan.MaPhongBan;
- D. SELECT NhanVien.TenNV, PhongBan.TenPhongBan FROM NhanVien, PhongBan WHERE NhanVien.MaPhongBan = PhongBan.MaPhongBan;
Câu 12: Trong truy vấn dữ liệu từ nhiều bảng sử dụng `JOIN`, tại sao việc sử dụng bí danh (alias) cho tên bảng lại hữu ích?
- A. Để đổi tên vĩnh viễn bảng trong cơ sở dữ liệu.
- B. Để bắt buộc sử dụng `INNER JOIN`.
- C. Để ẩn các cột không cần thiết.
- D. Để rút gọn tên bảng, làm câu lệnh dễ đọc và tránh xung đột tên cột.
Câu 13: Bạn muốn lấy danh sách tất cả các phòng ban từ bảng `PhongBan` và, nếu có, tên nhân viên làm việc trong phòng ban đó từ bảng `NhanVien`. Ngay cả những phòng ban chưa có nhân viên nào cũng phải xuất hiện trong danh sách. Loại JOIN nào phù hợp nhất trong trường hợp này?
- A. LEFT JOIN
- B. INNER JOIN
- C. RIGHT JOIN
- D. CROSS JOIN
Câu 14: Cho hai bảng `Students` (`StudentID`, `Name`) và `Courses` (`CourseID`, `CourseName`), cùng bảng liên kết `Enrollments` (`EnrollmentID`, `StudentID`, `CourseID`). Để lấy danh sách tên sinh viên và tên các khóa học họ đã đăng ký, câu lệnh SQL nào sau đây là chính xác?
- A. SELECT S.Name, C.CourseName FROM Students S, Courses C, Enrollments E WHERE S.StudentID = E.StudentID AND C.CourseID = E.CourseID;
- B. SELECT S.Name, C.CourseName FROM Students S JOIN Enrollments E ON S.StudentID = E.StudentID JOIN Courses C ON E.CourseID = C.CourseID;
- C. SELECT S.Name, C.CourseName FROM Students S INNER JOIN Courses C ON S.StudentID = C.StudentID;
- D. SELECT S.Name, C.CourseName FROM Students S LEFT JOIN Enrollments E ON S.StudentID = E.StudentID WHERE E.CourseID IS NOT NULL;
Câu 15: Khi thực hiện `LEFT JOIN` giữa bảng `A` và bảng `B` trên cột `ID`, và bạn muốn chỉ hiển thị các bản ghi từ bảng `A` mà KHÔNG có bản ghi tương ứng trong bảng `B`, bạn sẽ thêm điều kiện lọc nào vào cuối câu lệnh JOIN?
- A. WHERE B.ID IS NULL
- B. WHERE B.ID IS NOT NULL
- C. WHERE A.ID = B.ID
- D. WHERE NOT EXISTS (SELECT 1 FROM B WHERE B.ID = A.ID)
Câu 16: Trong câu lệnh `SELECT O.OrderID, C.CustomerName FROM Orders O JOIN Customers C ON O.CustomerID = C.CustomerID;`, chữ "O" và "C" sau tên bảng `Orders` và `Customers` được gọi là gì?
- A. Tham số
- B. Biến
- C. Chỉ mục
- D. Bí danh (Alias)
Câu 17: Bạn có hai bảng `Products` (`ProductID`, `ProductName`) và `OrderItems` (`OrderItemID`, `OrderID`, `ProductID`, `Quantity`). Bạn muốn lấy danh sách tất cả sản phẩm và tổng số lượng đã được đặt cho mỗi sản phẩm. Nếu một sản phẩm chưa từng được đặt, nó vẫn phải xuất hiện với tổng số lượng là 0 hoặc NULL. Câu lệnh SQL nào sau đây phù hợp nhất?
- A. SELECT P.ProductName, SUM(OI.Quantity) FROM Products P JOIN OrderItems OI ON P.ProductID = OI.ProductID GROUP BY P.ProductName;
- B. SELECT P.ProductName, COALESCE(SUM(OI.Quantity), 0) FROM Products P LEFT JOIN OrderItems OI ON P.ProductID = OI.ProductID GROUP BY P.ProductName;
- C. SELECT P.ProductName, SUM(OI.Quantity) FROM Products P LEFT JOIN OrderItems OI ON P.ProductID = OI.ProductID;
- D. SELECT P.ProductName, SUM(OI.Quantity) FROM OrderItems OI RIGHT JOIN Products P ON P.ProductID = OI.ProductID GROUP BY P.ProductName;
Câu 18: Trong câu lệnh `SELECT * FROM BangA JOIN BangB ON BangA.ID = BangB.ID;`, ký tự `*` có ý nghĩa gì khi sử dụng với JOIN?
- A. Chọn tất cả các cột từ tất cả các bảng tham gia JOIN.
- B. Chọn tất cả các cột chỉ từ bảng đầu tiên được liệt kê.
- C. Chọn tất cả các cột chỉ từ bảng thứ hai được liệt kê.
- D. Chọn tất cả các cột ngoại trừ các cột khóa chung.
Câu 19: Giả sử bạn có bảng `Customers` (`CustomerID`, `Name`) và bảng `Invoices` (`InvoiceID`, `CustomerID`, `Amount`). Bạn muốn tìm tất cả khách hàng chưa có hóa đơn nào. Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT C.Name FROM Customers C INNER JOIN Invoices I ON C.CustomerID = I.CustomerID WHERE I.InvoiceID IS NULL;
- B. SELECT C.Name FROM Customers C, Invoices I WHERE C.CustomerID = I.CustomerID AND I.InvoiceID IS NULL;
- C. SELECT C.Name FROM Customers C LEFT JOIN Invoices I ON C.CustomerID = I.CustomerID WHERE I.InvoiceID IS NULL;
- D. SELECT C.Name FROM Customers C WHERE C.CustomerID NOT IN (SELECT CustomerID FROM Invoices);
Câu 20: Khi nối hai bảng `Orders` và `Customers` bằng `INNER JOIN` trên `CustomerID`, và bạn muốn sắp xếp kết quả theo tên khách hàng theo thứ tự bảng chữ cái, bạn sẽ thêm mệnh đề nào vào cuối câu lệnh?
- A. ORDER BY Customers.CustomerName ASC;
- B. GROUP BY Customers.CustomerName;
- C. SORT BY Customers.CustomerName;
- D. FILTER BY Customers.CustomerName;
Câu 21: Bạn có bảng `Employees` (`EmployeeID`, `Name`, `ManagerID`) trong đó `ManagerID` tham chiếu đến `EmployeeID` của người quản lý (trong cùng bảng `Employees`). Để lấy danh sách nhân viên và tên người quản lý trực tiếp của họ, bạn cần sử dụng kỹ thuật JOIN nào?
- A. CROSS JOIN
- B. INNER JOIN giữa hai bảng khác nhau
- C. FULL OUTER JOIN
- D. SELF JOIN (nối bảng với chính nó)
Câu 22: Câu lệnh SQL nào dưới đây có thể gây ra lỗi "Column "..." is ambiguous" nếu không sử dụng tiền tố tên bảng hoặc bí danh, giả sử cả hai bảng `Products` và `Categories` đều có cột `Name`?
- A. SELECT P.ProductName, C.CategoryName FROM Products P JOIN Categories C ON P.CategoryID = C.CategoryID;
- B. SELECT Name FROM Products JOIN Categories ON Products.CategoryID = Categories.CategoryID;
- C. SELECT Products.ProductName, Categories.CategoryName FROM Products JOIN Categories ON Products.CategoryID = Categories.CategoryID;
- D. SELECT * FROM Products JOIN Categories ON Products.CategoryID = Categories.CategoryID;
Câu 23: Bạn có bảng `Orders` (`OrderID`, `CustomerID`) và bảng `OrderDetails` (`OrderDetailID`, `OrderID`, `ProductID`, `Quantity`). Bạn muốn tìm tổng số lượng sản phẩm đã được đặt cho mỗi đơn hàng. Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT O.OrderID, SUM(OD.Quantity) FROM Orders O JOIN OrderDetails OD ON O.OrderID = OD.OrderID GROUP BY O.OrderID;
- B. SELECT O.OrderID, SUM(OD.Quantity) FROM Orders O, OrderDetails OD WHERE O.OrderID = OD.OrderID;
- C. SELECT O.OrderID, SUM(OD.Quantity) FROM Orders O LEFT JOIN OrderDetails OD ON O.OrderID = OD.OrderID;
- D. SELECT OrderID, Quantity FROM OrderDetails GROUP BY OrderID;
Câu 24: Trong một truy vấn sử dụng `INNER JOIN`, nếu một bản ghi ở bảng thứ nhất không có bản ghi tương ứng ở bảng thứ hai theo điều kiện JOIN, bản ghi đó sẽ:
- A. Xuất hiện trong kết quả với giá trị NULL ở các cột của bảng thứ hai.
- B. Xuất hiện trong kết quả với giá trị mặc định ở các cột của bảng thứ hai.
- C. Không xuất hiện trong kết quả.
- D. Gây ra lỗi cú pháp.
Câu 25: Bạn có bảng `Products` (`ProductID`, `ProductName`) và bảng `Suppliers` (`SupplierID`, `SupplierName`), cùng bảng liên kết `ProductSuppliers` (`ProductID`, `SupplierID`). Bạn muốn lấy danh sách tất cả sản phẩm và tên nhà cung cấp của chúng, bao gồm cả những sản phẩm chưa có nhà cung cấp nào. Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT P.ProductName, S.SupplierName FROM Products P LEFT JOIN ProductSuppliers PS ON P.ProductID = PS.ProductID LEFT JOIN Suppliers S ON PS.SupplierID = S.SupplierID;
- B. SELECT P.ProductName, S.SupplierName FROM Products P INNER JOIN ProductSuppliers PS ON P.ProductID = PS.ProductID INNER JOIN Suppliers S ON PS.SupplierID = S.SupplierID;
- C. SELECT P.ProductName, S.SupplierName FROM Products P LEFT JOIN Suppliers S ON P.SupplierID = S.SupplierID;
- D. SELECT P.ProductName, S.SupplierName FROM Products P JOIN Suppliers S ON P.ProductID = S.SupplierID;
Câu 26: Mệnh đề `ON` trong câu lệnh `JOIN` được sử dụng để làm gì?
- A. Lọc các hàng sau khi JOIN.
- B. Nhóm các hàng có cùng giá trị.
- C. Xác định điều kiện để kết hợp các hàng từ các bảng.
- D. Sắp xếp kết quả truy vấn.
Câu 27: Bạn muốn lấy danh sách tên khách hàng và số lượng đơn hàng mà mỗi khách hàng đã đặt. Có hai bảng `Customers` (`CustomerID`, `Name`) và `Orders` (`OrderID`, `CustomerID`). Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT C.Name, COUNT(O.OrderID) FROM Customers C LEFT JOIN Orders O ON C.CustomerID = O.CustomerID GROUP BY C.Name;
- B. SELECT C.Name, COUNT(O.OrderID) FROM Customers C INNER JOIN Orders O ON C.CustomerID = O.CustomerID GROUP BY C.Name;
- C. SELECT C.Name, COUNT(*) FROM Customers C, Orders O WHERE C.CustomerID = O.CustomerID GROUP BY C.Name;
- D. SELECT C.Name, COUNT(O.OrderID) FROM Customers C LEFT JOIN Orders O ON C.CustomerID = O.CustomerID;
Câu 28: Khi nào thì kết quả của `INNER JOIN` và `LEFT JOIN` giữa hai bảng `A` và `B` trên điều kiện `A.Khoa = B.Khoa` là giống nhau?
- A. Khi bảng A có nhiều bản ghi hơn bảng B.
- B. Khi bảng B có nhiều bản ghi hơn bảng A.
- C. Khi không có bản ghi nào trong A không có bản ghi tương ứng trong B.
- D. Khi mọi bản ghi trong bảng bên trái (A) đều có bản ghi tương ứng trong bảng bên phải (B) theo điều kiện JOIN.
Câu 29: Bạn có hai bảng: `Teachers` (`TeacherID`, `Name`) và `Courses` (`CourseID`, `CourseName`, `TeacherID`). Bạn muốn lấy danh sách tên các giáo viên và số lượng khóa học mà mỗi giáo viên đang dạy. Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT T.Name, COUNT(C.CourseID) FROM Teachers T INNER JOIN Courses C ON T.TeacherID = C.TeacherID GROUP BY T.Name;
- B. SELECT T.Name, COUNT(C.CourseID) FROM Teachers T LEFT JOIN Courses C ON T.TeacherID = C.TeacherID;
- C. SELECT T.Name, COUNT(C.CourseID) FROM Teachers T LEFT JOIN Courses C ON T.TeacherID = C.TeacherID GROUP BY T.Name;
- D. SELECT T.Name, COUNT(*) FROM Teachers T, Courses C WHERE T.TeacherID = C.TeacherID GROUP BY T.Name;
Câu 30: Giả sử bạn có bảng `Movies` (`MovieID`, `Title`) và `Genres` (`GenreID`, `GenreName`), cùng bảng liên kết `MovieGenres` (`MovieID`, `GenreID`). Bạn muốn tìm tất cả các bộ phim thuộc thể loại "Science Fiction". Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT M.Title FROM Movies M JOIN Genres G ON M.GenreID = G.GenreID WHERE G.GenreName = "Science Fiction";
- B. SELECT M.Title FROM Movies M JOIN MovieGenres MG ON M.MovieID = MG.MovieID JOIN Genres G ON MG.GenreID = G.GenreID WHERE G.GenreName = "Science Fiction";
- C. SELECT M.Title FROM Movies M, Genres G WHERE G.GenreName = "Science Fiction";
- D. SELECT M.Title FROM Movies M LEFT JOIN MovieGenres MG ON M.MovieID = MG.MovieID WHERE MG.GenreID IN (SELECT GenreID FROM Genres WHERE GenreName = "Science Fiction");
Câu 31: Bạn có bảng `Employees` (`EmployeeID`, `Name`, `DepartmentID`) và `Departments` (`DepartmentID`, `DepartmentName`). Bạn muốn lấy danh sách tất cả các phòng ban, kể cả những phòng ban chưa có nhân viên nào. Câu lệnh SQL nào sau đây phù hợp?
- A. SELECT D.DepartmentName, E.Name FROM Employees E INNER JOIN Departments D ON E.DepartmentID = D.DepartmentID;
- B. SELECT D.DepartmentName, E.Name FROM Employees E LEFT JOIN Departments D ON E.DepartmentID = D.DepartmentID;
- C. SELECT D.DepartmentName, E.Name FROM Employees E RIGHT JOIN Departments D ON E.DepartmentID = D.DepartmentID;
- D. SELECT D.DepartmentName FROM Departments D WHERE D.DepartmentID NOT IN (SELECT DepartmentID FROM Employees);
Câu 32: Trong câu lệnh `SELECT T1.ColA, T2.ColB FROM Table1 T1 INNER JOIN Table2 T2 ON T1.ID = T2.ID;`, nếu cả hai bảng `Table1` và `Table2` đều có cột tên là `Description`, để chọn cột `Description` từ `Table1`, bạn phải viết như thế nào trong mệnh đề `SELECT`?
- A. T1.Description
- B. Description
- C. Table1.Description
- D. T2.Description
Câu 33: Bạn muốn lấy danh sách tên tất cả các sản phẩm (từ bảng `Products`) và tên danh mục của chúng (từ bảng `Categories`), bao gồm cả những sản phẩm chưa được phân loại và những danh mục chưa có sản phẩm nào. Loại JOIN nào phù hợp nhất?
- A. INNER JOIN
- B. LEFT JOIN
- C. RIGHT JOIN
- D. FULL OUTER JOIN
Câu 34: Cho câu lệnh SQL: `SELECT A.Col1, B.Col2 FROM TableA A LEFT JOIN TableB B ON A.ID = B.ID WHERE B.Col2 IS NOT NULL;`. Câu lệnh này thực chất tương đương với loại JOIN nào?
- A. INNER JOIN
- B. RIGHT JOIN
- C. FULL OUTER JOIN
- D. CROSS JOIN
Câu 35: Để kết nối hai bảng `Orders` và `Shippers` dựa trên cột `ShipperID` chung, nhưng chỉ lấy các đơn hàng được vận chuyển bởi công ty "Speedy Express", câu lệnh SQL nào sau đây là đúng?
- A. SELECT * FROM Orders O JOIN Shippers S ON O.ShipperID = S.ShipperID AND S.ShipperName = "Speedy Express";
- B. SELECT * FROM Orders O JOIN Shippers S ON O.ShipperID = S.ShipperID WHERE S.ShipperName = "Speedy Express";
- C. SELECT * FROM Orders WHERE ShipperID IN (SELECT ShipperID FROM Shippers WHERE ShipperName = "Speedy Express");
- D. Tất cả các câu lệnh trên đều đúng cú pháp và cho kết quả tương tự.
Câu 36: Bạn có bảng `Customers` (`CustomerID`, `Name`) và `Payments` (`PaymentID`, `CustomerID`, `Amount`, `PaymentDate`). Bạn muốn lấy danh sách các khách hàng và tổng số tiền họ đã thanh toán sau ngày "2023-01-01". Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT C.Name, COALESCE(SUM(P.Amount), 0) FROM Customers C LEFT JOIN Payments P ON C.CustomerID = P.CustomerID WHERE P.PaymentDate > "2023-01-01" OR P.PaymentID IS NULL GROUP BY C.Name;
- B. SELECT C.Name, SUM(P.Amount) FROM Customers C JOIN Payments P ON C.CustomerID = P.CustomerID WHERE P.PaymentDate > "2023-01-01" GROUP BY C.Name;
- C. SELECT C.Name, SUM(P.Amount) FROM Customers C LEFT JOIN Payments P ON C.CustomerID = P.CustomerID AND P.PaymentDate > "2023-01-01" GROUP BY C.Name;
- D. SELECT C.Name, SUM(P.Amount) FROM Customers C LEFT JOIN Payments P ON C.CustomerID = P.CustomerID WHERE P.PaymentDate > "2023-01-01" GROUP BY C.Name;
Câu 37: Sự khác biệt cơ bản giữa `INNER JOIN` và `LEFT JOIN` nằm ở cách xử lý các bản ghi như thế nào?
- A. INNER JOIN nhanh hơn LEFT JOIN.
- B. INNER JOIN chỉ trả về các bản ghi có sự trùng khớp ở cả hai bảng, LEFT JOIN trả về tất cả bản ghi từ bảng bên trái và các bản ghi trùng khớp từ bảng bên phải.
- C. LEFT JOIN yêu cầu khóa chính, INNER JOIN không cần.
- D. INNER JOIN chỉ dùng cho 2 bảng, LEFT JOIN có thể dùng cho nhiều hơn 2 bảng.
Câu 38: Khi thực hiện truy vấn JOIN trên các bảng có kích thước rất lớn, yếu tố nào sau đây có ảnh hưởng đáng kể đến hiệu suất truy vấn?
- A. Số lượng cột được chọn trong mệnh đề SELECT.
- B. Thứ tự viết các mệnh đề SELECT, FROM, JOIN.
- C. Sử dụng bí danh (alias) cho các bảng.
- D. Việc có chỉ mục (index) trên các cột được sử dụng trong điều kiện JOIN và WHERE.
Câu 39: Bạn có bảng `Products` (`ProductID`, `ProductName`, `SupplierID`) và bảng `Suppliers` (`SupplierID`, `SupplierName`). Bạn muốn lấy danh sách tên sản phẩm và tên nhà cung cấp của chúng, NHƯNG chỉ lấy các sản phẩm có giá bán lớn hơn 100000 (giả sử có cột `Price` trong bảng `Products`). Câu lệnh SQL nào sau đây là đúng?
- A. SELECT P.ProductName, S.SupplierName FROM Products P JOIN Suppliers S ON P.SupplierID = S.SupplierID WHERE P.Price > 100000;
- B. SELECT P.ProductName, S.SupplierName FROM Products P JOIN Suppliers S ON P.SupplierID = S.SupplierID AND P.Price > 100000;
- C. SELECT P.ProductName, S.SupplierName FROM Products P WHERE P.Price > 100000 JOIN Suppliers S ON P.SupplierID = S.SupplierID;
- D. SELECT P.ProductName, S.SupplierName FROM Products P WHERE P.Price > 100000;
Câu 40: Trong một cơ sở dữ liệu quản lý dự án, có các bảng `Projects` (`ProjectID`, `ProjectName`), `Tasks` (`TaskID`, `ProjectID`, `TaskName`), và `Employees` (`EmployeeID`, `EmployeeName`), cùng bảng liên kết `ProjectAssignments` (`ProjectID`, `EmployeeID`). Để lấy danh sách tên dự án và tên các nhân viên được phân công vào dự án đó, câu lệnh SQL nào sau đây là chính xác?
- A. SELECT P.ProjectName, E.EmployeeName FROM Projects P JOIN Employees E ON P.ProjectID = E.ProjectID;
- B. SELECT P.ProjectName, E.EmployeeName FROM Projects P JOIN ProjectAssignments PA ON P.ProjectID = PA.ProjectID WHERE PA.EmployeeID IN (SELECT EmployeeID FROM Employees);
- C. SELECT P.ProjectName, E.EmployeeName FROM Projects P JOIN ProjectAssignments PA ON P.ProjectID = PA.ProjectID JOIN Employees E ON PA.EmployeeID = E.EmployeeID;
- D. SELECT P.ProjectName, E.EmployeeName FROM Projects P, ProjectAssignments PA, Employees E WHERE P.ProjectID = PA.ProjectID AND PA.EmployeeID = E.EmployeeID;
Câu 41: Bạn muốn tìm tất cả các sản phẩm (từ bảng `Products`) chưa từng xuất hiện trong bất kỳ chi tiết đơn hàng nào (từ bảng `OrderItems`). Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT P.ProductName FROM Products P INNER JOIN OrderItems OI ON P.ProductID = OI.ProductID WHERE OI.ProductID IS NULL;
- B. SELECT P.ProductName FROM Products P WHERE P.ProductID NOT IN (SELECT ProductID FROM OrderItems WHERE ProductID IS NOT NULL);
- C. SELECT P.ProductName FROM Products P, OrderItems OI WHERE P.ProductID = OI.ProductID AND OI.ProductID IS NULL;
- D. SELECT P.ProductName FROM Products P LEFT JOIN OrderItems OI ON P.ProductID = OI.ProductID WHERE OI.ProductID IS NULL;
Câu 42: Trong một truy vấn JOIN giữa hai bảng, điều gì xảy ra nếu không có bất kỳ bản ghi nào trong bảng thứ nhất khớp với bất kỳ bản ghi nào trong bảng thứ hai dựa trên điều kiện `ON` khi sử dụng `INNER JOIN`?
- A. Truy vấn trả về một tập hợp kết quả rỗng (không có hàng nào).
- B. Truy vấn trả về tất cả các hàng từ bảng thứ nhất với giá trị NULL ở các cột của bảng thứ hai.
- C. Truy vấn trả về tất cả các hàng từ cả hai bảng.
- D. Truy vấn báo lỗi cú pháp.
Câu 43: Bạn có bảng `Authors` (`AuthorID`, `Name`) và `Books` (`BookID`, `Title`, `AuthorID`). Bạn muốn lấy tên tất cả các tác giả và, nếu có, tên cuốn sách đầu tiên (theo thứ tự bảng chữ cái của tên sách) của mỗi tác giả. Câu lệnh SQL nào sau đây có thể giúp thực hiện điều này, sử dụng kỹ thuật JOIN và hàm tổng hợp/nhóm?
- A. SELECT A.Name, B.Title FROM Authors A JOIN Books B ON A.AuthorID = B.AuthorID GROUP BY A.Name;
- B. SELECT A.Name, MIN(B.Title) FROM Authors A LEFT JOIN Books B ON A.AuthorID = B.AuthorID GROUP BY A.Name;
- C. SELECT A.Name, B.Title FROM Authors A LEFT JOIN Books B ON A.AuthorID = B.AuthorID ORDER BY A.Name, B.Title LIMIT 1;
- D. SELECT A.Name, FIRST(B.Title) FROM Authors A LEFT JOIN Books B ON A.AuthorID = B.AuthorID GROUP BY A.Name;
Câu 44: Bạn có hai bảng `Students` (`StudentID`, `Name`) và `Grades` (`GradeID`, `StudentID`, `Subject`, `Score`). Bạn muốn lấy danh sách tên sinh viên và điểm trung bình của họ trong môn "Math". Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT S.Name, AVG(G.Score) FROM Students S JOIN Grades G ON S.StudentID = G.StudentID WHERE G.Subject = "Math" GROUP BY S.Name;
- B. SELECT S.Name, AVG(G.Score) FROM Students S LEFT JOIN Grades G ON S.StudentID = G.StudentID WHERE G.Subject = "Math" GROUP BY S.Name;
- C. SELECT S.Name, AVG(G.Score) FROM Students S, Grades G WHERE S.StudentID = G.StudentID AND G.Subject = "Math" GROUP BY S.Name;
- D. Cả A và C đều đúng.
Câu 45: Mục đích chính của việc sử dụng các bảng liên kết (linking tables) trong thiết kế cơ sở dữ liệu quan hệ là gì?
- A. Để lưu trữ dữ liệu tạm thời.
- B. Để cải thiện tốc độ truy vấn các bảng đơn lẻ.
- C. Để biểu diễn mối quan hệ nhiều-nhiều (Many-to-Many) giữa hai bảng khác.
- D. Để sao lưu dữ liệu tự động.
Câu 46: Bạn có bảng `Employees` (`EmployeeID`, `Name`) và bảng `Projects` (`ProjectID`, `ProjectName`), cùng bảng liên kết `Assignments` (`AssignmentID`, `EmployeeID`, `ProjectID`, `Role`). Bạn muốn lấy danh sách tên nhân viên và tên dự án mà họ đang tham gia với vai trò "Lead". Câu lệnh SQL nào sau đây thực hiện được điều này?
- A. SELECT E.Name, P.ProjectName FROM Employees E JOIN Assignments A ON E.EmployeeID = A.EmployeeID JOIN Projects P ON A.ProjectID = P.ProjectID WHERE A.Role = "Lead";
- B. SELECT E.Name, P.ProjectName FROM Employees E, Assignments A, Projects P WHERE E.EmployeeID = A.EmployeeID AND A.ProjectID = P.ProjectID AND A.Role = "Lead";
- C. SELECT E.Name, P.ProjectName FROM Employees E LEFT JOIN Assignments A ON E.EmployeeID = A.EmployeeID LEFT JOIN Projects P ON A.ProjectID = P.ProjectID WHERE A.Role = "Lead";
- D. Cả A và B đều đúng.