Ngân hàng câu hỏi của chương

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

20/36 câuCòn 16
AAscending
BDescending
CSORT
DORDER
Lời giải
Đáp án đúng: "Ascending". Mệnh đề ORDER BY trong SQL sắp xếp các dòng kết quả theo một hay nhiều cột; nếu không ghi gì sau tên cột thì cơ sở dữ liệu mặc định dùng ASC, tức thứ tự tăng dần (ascending): số nhỏ trước, chuỗi theo thứ tự chữ cái. Ví dụ SELECT name FROM Users ORDER BY name cho cùng kết quả với ORDER BY name ASC. "Descending" là thứ tự giảm dần, chỉ có khi ghi rõ từ khoá DESC sau tên cột, như ORDER BY age DESC để đưa người lớn tuổi nhất lên đầu. "SORT" không phải từ khoá của SQL chuẩn; SQL dùng ORDER BY để sắp xếp chứ không có lệnh SORT. "ORDER" chỉ là một nửa tên của mệnh đề ORDER BY, bản thân nó không phải một chế độ sắp xếp nên không thể là chế độ mặc định.
Mở trang câu hỏi này →
APostgres
BOracle
CSQL Server
DSQLite
EMySQL
Lời giải
Đáp án đúng: "SQLite". Phần cơ sở dữ liệu của PRP201c theo chương trình Python for Everybody (PY4E) dùng SQLite: một cơ sở dữ liệu nhúng, lưu toàn bộ dữ liệu trong một tệp duy nhất, có sẵn trong Python qua mô-đun sqlite3 và được xem bằng công cụ DB Browser for SQLite. Vì không cần cài máy chủ nên sinh viên chạy được ngay trên máy mình. "Postgres" (PostgreSQL) là hệ quản trị cơ sở dữ liệu mã nguồn mở mạnh, chạy theo mô hình máy chủ, cần cài đặt và cấu hình riêng. "Oracle" là hệ thương mại của hãng Oracle, dùng nhiều trong doanh nghiệp lớn. "SQL Server" là sản phẩm của Microsoft, cũng chạy dạng máy chủ. "MySQL" là hệ mã nguồn mở phổ biến cho web. Cả bốn hệ này đều dùng SQL gần giống nhau, nhưng không phải phần mềm được dùng trong lớp này.
Mở trang câu hỏi này →
ASELECT FROM Breed,Cats
BSELECT Cats FROM Breed
CFROM Cats SELECT Breed
DSELECT Breed FROM Cats
Lời giải
Đáp án đúng: "SELECT Breed FROM Cats". Cú pháp cơ bản của câu truy vấn SQL là SELECT danh sách cột FROM tên bảng: ngay sau SELECT là cột cần lấy, ở đây là cột Breed, còn sau FROM là bảng chứa cột đó, tức bảng Cats. Phương án "SELECT FROM Breed,Cats" bỏ trống danh sách cột và đặt cả tên cột lẫn tên bảng sau FROM như thể cả hai đều là bảng, nên câu lệnh lỗi cú pháp. Phương án "SELECT Cats FROM Breed" đảo vai trò, coi Cats là cột và Breed là bảng, trái với mô tả của câu hỏi. Phương án "FROM Cats SELECT Breed" đặt mệnh đề FROM lên trước; tuy về mặt logic hệ quản trị xử lý FROM trước, câu chữ SQL chuẩn vẫn bắt buộc SELECT đứng đầu nên câu này không chạy. Muốn lấy mọi cột của bảng thì viết SELECT * FROM Cats.
Mở trang câu hỏi này →
ADELETE FROM Cats WHERE name = 'Ruby'
BDELETE name='Ruby' FROM Cats
CDELETE ROW name='Ruby' FROM Cats
DDELETE FROM Cats WHERE name == 'Ruby'
Lời giải
Đáp án đúng: "DELETE FROM Cats WHERE name = 'Ruby'". Cú pháp chuẩn của SQL để xoá dòng là DELETE FROM tên bảng rồi WHERE điều kiện; mệnh đề WHERE chọn mọi dòng thoả điều kiện, nên tất cả các dòng có tên Ruby đều bị xoá, còn nếu bỏ WHERE thì cả bảng bị xoá sạch. So sánh bằng trong SQL dùng một dấu bằng và chuỗi đặt trong nháy đơn. "DELETE name='Ruby' FROM Cats" sai cú pháp vì DELETE không nhận tên cột hay điều kiện đứng trước FROM. "DELETE ROW name='Ruby' FROM Cats" cũng sai: SQL không có từ khoá ROW trong lệnh DELETE, bản thân DELETE vốn đã thao tác trên dòng. "DELETE FROM Cats WHERE name == 'Ruby'" dùng toán tử so sánh quen thuộc của Python; SQLite tình cờ chấp nhận hai dấu bằng như một cách viết khác của một dấu bằng, nhưng đó không phải SQL chuẩn và MySQL hay PostgreSQL sẽ báo lỗi cú pháp, nên cách viết đúng chuẩn vẫn là một dấu bằng.
Mở trang câu hỏi này →
AUse constraints
BAvoid using JOIN
CUse SELECT instead of DELETE
DRun rollback
Lời giải
Đáp án đúng: "Use constraints". Trong cơ sở dữ liệu quan hệ, ràng buộc (constraint) như khoá ngoại FOREIGN KEY kèm quy tắc ON DELETE RESTRICT hoặc NO ACTION buộc hệ quản trị từ chối lệnh xoá một dòng ở bảng cha khi vẫn còn dòng ở bảng con tham chiếu tới nó; đó là cơ chế toàn vẹn tham chiếu (referential integrity) do chính cơ sở dữ liệu thực thi, không phụ thuộc vào việc lập trình viên nhớ kiểm tra (SQLite cần bật PRAGMA foreign_keys = ON). "Avoid using JOIN" sai vì JOIN chỉ là cách ghép dòng khi đọc dữ liệu, không liên quan tới việc xoá. "Use SELECT instead of DELETE" sai vì SELECT chỉ đọc, đổi lệnh như vậy là bỏ luôn thao tác xoá chứ không bảo vệ dữ liệu liên kết. "Run rollback" sai vì rollback chỉ huỷ một giao dịch chưa commit sau khi đã lỡ xoá, không ngăn được việc xoá ngay từ đầu.
Mở trang câu hỏi này →
AINSERT INTO
BINSERT ROW
CADD ROW
DINSERT TABLE
Lời giải
Đáp án đúng: "INSERT INTO". Lệnh thêm dòng trong SQL có dạng INSERT INTO tên_bảng (cột1, cột2) VALUES (giá_trị1, giá_trị2); ví dụ INSERT INTO Users (name, email) VALUES ('Chuck', 'csev@umich.edu') thêm đúng một bản ghi mới vào bảng Users. Trong Python với sqlite3, ta gọi cur.execute với câu lệnh này kèm dấu hỏi làm chỗ giữ giá trị, rồi conn.commit() để ghi hẳn xuống tệp. "INSERT ROW" sai vì ROW không thuộc cú pháp; sau INSERT phải là INTO và tên bảng. "ADD ROW" không tồn tại trong SQL; ADD chỉ xuất hiện trong ALTER TABLE ... ADD COLUMN để thêm cột, không thêm dòng. "INSERT TABLE" cũng sai cú pháp: tạo bảng dùng CREATE TABLE, còn thêm dữ liệu phải qua INSERT INTO.
Mở trang câu hỏi này →
AUsers->name = 'new name' WHERE ...
BUsers.name='new name' WHERE ...
CUPDATE Users SET name='new name' WHERE ...
DUPDATE Users (name) VALUES ('new name') WHERE ...
Lời giả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.

Mở trang câu hỏi này →
ASELECT
BGET
CFETCH
DFIND
Lời giải
Đáp án đúng: "SELECT". SELECT là lệnh truy vấn của SQL để lấy (retrieve) các dòng: SELECT danh sách cột FROM tên bảng, có thể kèm WHERE để lọc, và kết quả là một tập dòng; trong Python với sqlite3, ta gọi cur.execute với câu SELECT rồi lặp trên cursor hoặc gọi fetchall() để nhận các dòng. "GET" là phương thức của HTTP dùng để yêu cầu tài nguyên từ máy chủ web, không phải lệnh SQL. "FETCH" trong SQL chuẩn chỉ xuất hiện trong ngữ cảnh con trỏ cơ sở dữ liệu hoặc mệnh đề FETCH FIRST để giới hạn số dòng, luôn đi kèm một câu SELECT chứ không tự lấy dòng; trong sqlite3 của Python, fetchone và fetchall là phương thức của cursor. "FIND" không phải từ khoá SQL; nó gợi nhớ phương thức find() của chuỗi Python hoặc lệnh find của MongoDB.
Mở trang câu hỏi này →
A!=
B<>
CNOT
DBoth != and <>
Lời giải
Đáp án đúng: "Both != and <>". Trong SQL, <> là toán tử khác (not equal) theo chuẩn ANSI SQL, còn != là cách viết tương đương được hầu hết hệ quản trị cơ sở dữ liệu hỗ trợ, gồm SQLite, MySQL, PostgreSQL và SQL Server; WHERE age <> 18 và WHERE age != 18 cho cùng một kết quả. Vì cả hai ký hiệu đều kiểm tra sự khác nhau nên phương án gộp này là đầy đủ nhất. Phương án "!=" đúng nhưng chỉ nêu một trong hai cách viết, chọn riêng nó là bỏ sót ký hiệu chuẩn. Phương án "<>" cũng đúng nhưng chưa đầy đủ vì bỏ sót cách viết quen thuộc với lập trình viên Python. Phương án "NOT" là toán tử logic phủ định cả một điều kiện, ví dụ WHERE NOT age = 18; nó đảo kết quả đúng sai của điều kiện đứng sau chứ bản thân không phải toán tử so sánh khác.
Mở trang câu hỏi này →
AMAKE people;
BCREATE TABLE people;
CMAKE DATASET people;
DCREATE people;
Lời giải

Đá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.

Mở trang câu hỏi này →
AGROUP BY
BORDER BY
CWHERE
DNone of these
Lời giải
Đáp án đúng: "ORDER BY". Mệnh đề ORDER BY sắp xếp tập kết quả của truy vấn theo một hay nhiều cột, tăng dần với ASC (mặc định) hoặc giảm dần với DESC, ví dụ SELECT name FROM Users ORDER BY name. Không có ORDER BY thì cơ sở dữ liệu không bảo đảm thứ tự nào. "GROUP BY" gom các dòng có cùng giá trị thành từng nhóm để tính hàm tổng hợp như COUNT hay SUM; một số hệ có thể tình cờ trả kết quả theo thứ tự nhóm nhưng chuẩn SQL không cam kết điều đó, nên muốn sắp xếp vẫn phải dùng ORDER BY. "WHERE" lọc dòng theo điều kiện, chỉ quyết định dòng nào được lấy chứ không đổi thứ tự. "None of these" sai vì đã có từ khoá đúng làm đúng việc sắp xếp.
Mở trang câu hỏi này →
AAbility to store data in a format that can be sent across a network
BAbility to execute Python code within the file
CAbility to quickly convert data to HTML
DAbility to scan large amounts of data quickly
Lời giải
Đáp án đúng: "Ability to scan large amounts of data quickly". Tệp phẳng (flat file) như tệp văn bản hay CSV buộc chương trình đọc tuần tự từ đầu tới cuối mới tìm được dữ liệu cần; cơ sở dữ liệu quan hệ (relational database) tổ chức dữ liệu thành bảng, có chỉ mục (index) và bộ tối ưu truy vấn, nên tìm, lọc, sắp xếp một lượng dữ liệu lớn nhanh hơn nhiều, lại liên kết được nhiều bảng với nhau qua khoá. Phương án "Ability to store data in a format that can be sent across a network" không phải lợi thế riêng, vì tệp phẳng cũng gửi qua mạng được. Phương án "Ability to execute Python code within the file" sai: cơ sở dữ liệu lưu dữ liệu và chạy câu lệnh SQL, không chạy mã Python nằm bên trong tệp. Phương án "Ability to quickly convert data to HTML" không phải chức năng của cơ sở dữ liệu; chuyển dữ liệu sang HTML là việc của chương trình hiển thị.
Mở trang câu hỏi này →
AAll the rows without a primary key will be deleted
BThe first row of the table will be deleted
CIt is a syntax error
DAll the rows in the table are deleted
Lời giải
Đáp án đúng: "All the rows in the table are deleted". WHERE là bộ lọc chọn những dòng mà lệnh tác động; DELETE FROM Users WHERE email = 'ted@umich.edu' chỉ xoá các dòng khớp điều kiện. Bỏ WHERE thì không còn bộ lọc, lệnh áp lên mọi dòng, nên DELETE FROM Users xoá sạch dữ liệu nhưng vẫn giữ bảng và cấu trúc cột (khác DROP TABLE xoá cả bảng). Vì vậy nên thử bằng SELECT với cùng WHERE trước khi xoá. "All the rows without a primary key will be deleted" sai vì khoá chính không liên quan tới việc lọc; dòng có hay không có khoá chính đều bị xoá như nhau. "The first row of the table will be deleted" sai vì SQL không ngầm giới hạn còn một dòng, và bảng quan hệ vốn không có thứ tự dòng cố định. "It is a syntax error" sai vì DELETE không có WHERE là câu lệnh hoàn toàn hợp lệ, chính vì thế mà nó nguy hiểm.
Mở trang câu hỏi này →
ASELECT all FROM Users
BRETRIEVE * FROM Users
CSELECT * FROM Users
DRETRIEVE all FROM User
Lời giải
Đáp án đúng: "SELECT * FROM Users". Trong SQL, lệnh đọc dữ liệu là SELECT, theo sau là danh sách cột cần lấy; dấu sao * là ký tự đại diện nghĩa là mọi cột, và khi không có mệnh đề WHERE thì mọi dòng (record) của bảng Users đều được trả về. "SELECT all FROM Users" sai vì all không phải ký hiệu cho mọi cột; ALL trong SQL là từ khoá đối lập với DISTINCT (giữ cả dòng trùng), đứng một mình như vậy sẽ bị hiểu là tên cột all và báo lỗi nếu bảng không có cột đó. "RETRIEVE * FROM Users" sai vì SQL không có lệnh RETRIEVE. "RETRIEVE all FROM User" sai vì vừa dùng lệnh không tồn tại vừa sai tên bảng, User thay vì Users.
Mở trang câu hỏi này →
AADD ROW
BINSERT ROW
CINSERT INTO
DINSERT AFTER
Lời giải
Đáp án đúng: "INSERT INTO". Lệnh chèn dòng mới có dạng INSERT INTO tên bảng, danh sách cột trong ngoặc, rồi VALUES với danh sách giá trị tương ứng; trong sqlite3 của Python thường dùng dấu hỏi làm chỗ giữ tham số trong câu lệnh, truyền giá trị thật dưới dạng tuple vào cur.execute, rồi gọi conn.commit() để lưu thay đổi. "ADD ROW" không phải cú pháp SQL; từ ADD chỉ xuất hiện trong ALTER TABLE để thêm cột hoặc ràng buộc. "INSERT ROW" sai vì sau INSERT phải là INTO; MySQL cho phép lược INTO nhưng không hệ nào có từ ROW ở đây. "INSERT AFTER" sai vì bảng quan hệ không có thứ tự vị trí dòng nên không có khái niệm chèn sau một dòng nào đó; từ AFTER chỉ gặp trong định nghĩa trigger hoặc khi thêm cột trong MySQL.
Mở trang câu hỏi này →
ADELETE
BREMOVE
CCOLLAPSE
DDROP
Lời giải

Đá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.

Mở trang câu hỏi này →
AUI/UX Designer
BDatabase Administrator
CDeveloper
DProject Manager
Lời giải
Đáp án đúng: "Database Administrator". Trong môi trường vận hành trực tuyến, cơ sở dữ liệu production chứa dữ liệu thật của người dùng, nên quyền truy cập trực tiếp được giới hạn cho Database Administrator (DBA, quản trị viên cơ sở dữ liệu), người chịu trách nhiệm sao lưu, phân quyền, tối ưu và giữ an toàn dữ liệu. Các vai trò khác làm việc với dữ liệu thông qua ứng dụng hoặc bản sao. "UI/UX Designer" thiết kế giao diện và trải nghiệm người dùng, không cần chạm vào dữ liệu thật. "Developer" viết mã làm việc với cơ sở dữ liệu nhưng thường chạy trên môi trường phát triển hoặc kiểm thử; mã của họ chạm tới production qua ứng dụng đã triển khai chứ bản thân họ không vào thẳng, để tránh sửa nhầm dữ liệu thật. Ở nhóm nhỏ có khi một người kiêm cả hai vai trò, nhưng câu hỏi nói về cách tổ chức điển hình. "Project Manager" quản lý tiến độ, nhân sự và phạm vi dự án, xem số liệu qua báo cáo chứ không truy cập cơ sở dữ liệu.
Mở trang câu hỏi này →
Atablename/columnname
Btablename.columnname
Ctablename->columnname
Dtablename['columnname']
Lời giải
Đáp án đúng: "tablename.columnname". Khi JOIN nhiều bảng có cột trùng tên (ví dụ cả Album và Track đều có cột id hoặc title), SQL phân biệt bằng tên đầy đủ (qualified name) gồm tên bảng, dấu chấm rồi tên cột, như Album.title và Track.title; có thể đặt bí danh ngắn bằng AS rồi viết a.title. "tablename/columnname" sai vì dấu gạch chéo trong SQL là phép chia. "tablename->columnname" sai vì -> không phải cú pháp tham chiếu cột chuẩn; trong SQLite và PostgreSQL nó là toán tử trích phần tử JSON. "tablename['columnname']" sai vì đó là cú pháp truy cập phần tử của từ điển trong Python, không phải SQL; trong Python ta có thể đọc kết quả theo cách đó với một số thư viện nhưng câu lệnh SQL thì không.
Mở trang câu hỏi này →
Arelation
Brows
Cattribute
Dview
Lời giải
Đáp án đúng: "relation". Trong mô hình quan hệ do Edgar F. Codd đề xuất, một bảng được gọi là relation (quan hệ): tập hợp các bộ (tuple) có cùng cấu trúc cột; chính tên gọi cơ sở dữ liệu quan hệ cũng xuất phát từ đây, chứ không phải từ việc các bảng liên kết với nhau. "rows" là các dòng của bảng, tương ứng với tuple hay record trong thuật ngữ quan hệ, là thành phần của bảng chứ không phải bản thân bảng. "attribute" là thuộc tính, tức một cột (field) của bảng, mỗi cột có tên và kiểu dữ liệu. "view" là bảng ảo được định nghĩa bằng một câu truy vấn lưu sẵn; khi truy vấn nó trông giống bảng nhưng không lưu dữ liệu riêng, nên không phải từ đồng nghĩa với table.
Mở trang câu hỏi này →
ACursor.get()
BCursor.execute()
CCursor.run()
DCursor.fetchmany()
Lời giải

Đá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.

Mở trang câu hỏi này →