Câu hỏi: PRP201c - Phần 4: Đối tượng và cơ sở dữ liệu
36 câu trắc nghiệm kèm lời giải của môn PRP201c - Lập trình Python, xếp theo thứ tự nhập vào ngân hàng.
Danh sách câu hỏi
Đáp án đúng: "UPDATE Users SET name='new name' WHERE ...". Cú pháp chuẩn để sửa dữ liệu là UPDATE tên bảng, rồi SET cột bằng giá trị mới, rồi WHERE điều kiện; SET liệt kê các cột cần đổi, còn WHERE giới hạn những dòng bị ảnh hưởng, thiếu WHERE thì mọi dòng trong bảng đều bị đổi. "Users->name = 'new name' WHERE ..." dùng toán tử mũi tên kiểu truy cập thành viên của C hay PHP, không phải SQL, và thiếu hẳn từ khoá UPDATE. "Users.name='new name' WHERE ..." giống phép gán thuộc tính trong Python; SQL có cho viết tên bảng chấm tên cột để chỉ một cột trong truy vấn, nhưng không có lệnh nào bắt đầu bằng phép gán như vậy. "UPDATE Users (name) VALUES ('new name') WHERE ..." trộn cú pháp của INSERT INTO vào UPDATE; VALUES chỉ dùng khi chèn dòng mới, còn UPDATE bắt buộc dùng SET.
Đáp án đúng: "CREATE TABLE people; ". Câu lệnh tạo bảng mới trong SQL bắt đầu bằng hai từ khoá CREATE TABLE rồi tới tên bảng; trong thực tế còn kèm danh sách cột trong ngoặc, ví dụ CREATE TABLE people (name TEXT, email TEXT), và SQLite đòi ít nhất một cột mới chịu chạy. Dù viết rút gọn, đây là lựa chọn duy nhất dùng đúng cặp từ khoá tạo bảng. Phương án "MAKE people;" sai vì SQL không có từ khoá MAKE. Phương án "MAKE DATASET people;" cũng không tồn tại; dataset chỉ là khái niệm chung về tập dữ liệu chứ không phải lệnh SQL. Phương án "CREATE people; " thiếu từ chỉ loại đối tượng: sau CREATE phải nói rõ tạo gì, như TABLE, INDEX hay VIEW, nên câu này lỗi cú pháp.
Đáp án đúng: "DELETE". Lệnh DELETE FROM xoá các dòng dữ liệu khỏi bảng, thường kèm WHERE để chọn dòng cần xoá, ví dụ DELETE FROM Users WHERE email = 'ted@umich.edu'; bảng và cấu trúc cột vẫn còn nguyên. Nếu thiếu WHERE thì mọi dòng bị xoá nhưng bảng vẫn tồn tại. Phương án "REMOVE" không phải lệnh SQL. Phương án "COLLAPSE" cũng không phải lệnh SQL và không mang nghĩa gì trong ngôn ngữ truy vấn. Phương án "DROP" là lệnh có thật nhưng thuộc nhóm định nghĩa cấu trúc: DROP TABLE xoá luôn cả bảng, gồm cấu trúc lẫn toàn bộ dữ liệu, chứ không phải xoá dữ liệu bên trong một bảng vẫn còn đó; câu hỏi nói tới việc xoá dữ liệu khỏi bảng nên DELETE mới đúng.
Cursor.get()Cursor.execute()Cursor.run()Cursor.fetchmany()Đáp án đúng: "Cursor.execute()". Trong mô-đun sqlite3, đối tượng con trỏ (cursor) lấy từ conn.cursor(); Cursor.execute() gửi một câu SQL tới cơ sở dữ liệu để chạy, ví dụ cur.execute('SELECT title FROM Tracks'). Cần nói thẳng: Cursor.fetchmany() cũng là phương thức hợp lệ, dùng để lấy một số dòng kết quả sau khi truy vấn đã chạy, nên câu này lẽ ra cho chọn hai; vì chỉ được chọn một và câu dẫn nhấn trước hết vào việc thực thi câu lệnh SQL, đáp án lấy execute(), phương thức bắt buộc phải gọi trước khi có kết quả nào để lấy. Phương án "Cursor.fetchmany()" vì thế đúng một phần, phục vụ vế lấy kết quả chứ không thực thi câu lệnh. Phương án "Cursor.get()" không tồn tại trong sqlite3 hay trong chuẩn DB-API của Python. Phương án "Cursor.run()" cũng không tồn tại; thực thi câu lệnh luôn gọi qua execute, cùng các biến thể executemany và executescript.