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. Trang 2/2 — câu 21–36.

Danh sách câu hỏi

36/36 câuHết danh sách
AComponent.pack(side= "LEFT")
BComponent.pack("Left ")
CComponent.pack(side=LEFT)
DComponent.pack(Left-side)
Lời giải
Đáp án đúng: "Component.pack(side=LEFT)". Trong tkinter, trình quản lý hình học pack xếp các widget dọc theo một cạnh của khung chứa; mặc định side bằng TOP nên các widget chồng từ trên xuống thành một cột, còn khi đặt side bằng LEFT chúng được xếp lần lượt từ trái sang phải trên cùng một hàng. LEFT là hằng số của tkinter, có được nhờ from tkinter import hoặc viết tkinter.LEFT, giá trị thực là chuỗi left viết thường. "Component.pack(side= "LEFT")" truyền chuỗi viết hoa, mà Tk chỉ nhận top, bottom, left, right viết thường nên báo lỗi bad side. "Component.pack("Left ")" truyền chuỗi làm đối số vị trí, nhưng đối số vị trí đầu tiên của pack là từ điển cấu hình, và chuỗi đó lại có chữ hoa cùng dấu cách thừa nên không phải giá trị cạnh hợp lệ. "Component.pack(Left-side)" bị Python hiểu là phép trừ giữa hai tên Left và side chưa định nghĩa, nên báo NameError.
Mở trang câu hỏi này →
AIt will remove the row "Cats".
BIt will move "Cats" to the end of the database.
CIt will remove the column "Cats".
DIt will remove the table "Cats".
Lời giải
Đáp án đúng: "It will remove the table "Cats".". Lệnh DROP TABLE trong SQL xoá hẳn một bảng khỏi cơ sở dữ liệu, gồm cả cấu trúc lẫn mọi dòng dữ liệu; phần IF EXISTS giúp lệnh không báo lỗi khi bảng chưa tồn tại, nên hay dùng ở đầu chương trình trước CREATE TABLE để tạo lại bảng sạch mỗi lần chạy. cur.execute chỉ là cách gửi câu SQL qua con trỏ của sqlite3. "It will remove the row "Cats"." sai vì xoá dòng dùng DELETE FROM ... WHERE, còn Cats ở đây là tên bảng. "It will move "Cats" to the end of the database." sai vì SQL không có khái niệm dời bảng về cuối cơ sở dữ liệu. "It will remove the column "Cats"." sai vì xoá cột phải dùng ALTER TABLE ... DROP COLUMN trên một bảng cụ thể.
Mở trang câu hỏi này →
ASERIAL
BASSERT_UNIQUE
CAUTOINCREMENT
DAUTO_INCREMENT
Lời giải
Đáp án đúng: "AUTOINCREMENT". Trong SQLite, khai báo id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE cho cột khoá chính khiến cơ sở dữ liệu tự cấp một số nguyên mới, lớn hơn các số đã dùng, mỗi khi ta INSERT mà không ghi giá trị cho cột đó; đây là mẫu tạo bảng quen thuộc trong PY4E. "AUTO_INCREMENT" có dấu gạch dưới là cú pháp của MySQL, SQLite không nhận từ này. "SERIAL" là kiểu cột tự tăng của PostgreSQL, không phải từ khoá của SQLite. "ASSERT_UNIQUE" không tồn tại trong SQL; muốn ràng buộc không trùng thì dùng UNIQUE, nhưng UNIQUE chỉ kiểm tra chứ không tự sinh giá trị. Lưu ý thêm: trong SQLite một cột INTEGER PRIMARY KEY vốn đã tự nhận giá trị khi bỏ trống; AUTOINCREMENT bảo đảm thêm rằng số đã cấp không bao giờ bị dùng lại.
Mở trang câu hỏi này →
AA function
BA method within a class
CA Python dictionary
DA file handle
Lời giải
Đáp án đúng: "A file handle". Con trỏ (cursor) lấy từ conn.cursor() trong sqlite3 đóng vai trò giống tay cầm tệp (file handle) trả về từ open(): ta gửi thao tác qua nó bằng cur.execute(...) giống như ghi vào tệp, rồi đọc kết quả qua nó bằng cách duyệt for row in cur hoặc gọi fetchone, fetchall giống như đọc từng dòng tệp; bản thân nó không chứa dữ liệu mà là cổng để truy cập cơ sở dữ liệu. "A function" sai vì cursor là một đối tượng có trạng thái, không phải hàm; ta gọi phương thức của nó chứ không gọi chính nó. "A method within a class" sai vì cursor() mới là phương thức của đối tượng kết nối, còn thứ nó trả về là một đối tượng. "A Python dictionary" sai vì cursor không lưu cặp khoá giá trị và không truy cập được bằng cur['ten'].
Mở trang câu hỏi này →
Asend()
Bsocket()
Cexecute()
Drun()
Lời giải
Đáp án đúng: "execute()". Với module sqlite3, ta mở kết nối bằng sqlite3.connect, lấy con trỏ bằng conn.cursor(), rồi gọi cur.execute với câu lệnh SQL và tuple tham số để chạy lệnh đó; với SELECT thì lặp trên cursor hoặc gọi fetchall() lấy kết quả, với lệnh thay đổi dữ liệu thì gọi conn.commit() để lưu. Đây là mẫu chuẩn của DB-API trong Python. "send()" là phương thức của đối tượng socket dùng để gửi bytes qua kết nối mạng, không có trên cursor. "socket()" là hàm tạo đối tượng socket trong module socket, thuộc lập trình mạng chứ không thuộc sqlite3. "run()" không có trên cursor của sqlite3; tên này gợi nhớ subprocess.run dùng để chạy một chương trình bên ngoài.
Mở trang câu hỏi này →
ASQLite
BPostgreSQL
CPySQL
DMySQL
Lời giải
Đáp án đúng: "SQLite". SQLite là hệ quản trị cơ sở dữ liệu nhỏ gọn, lưu toàn bộ cơ sở dữ liệu trong một tệp duy nhất và không cần máy chủ riêng; Python đi kèm sẵn mô-đun sqlite3 trong thư viện chuẩn, nên chỉ cần import sqlite3 rồi gọi sqlite3.connect('music.sqlite') là dùng được ngay. Phương án "PostgreSQL" là hệ quản trị mạnh theo mô hình máy khách và máy chủ, phải cài riêng và kết nối qua thư viện bên ngoài như psycopg2. Phương án "PySQL" không phải hệ cơ sở dữ liệu phổ biến nào đi kèm Python, chỉ là cái tên ghép Py với SQL. Phương án "MySQL" cũng là hệ quản trị máy khách và máy chủ, cần cài máy chủ riêng cùng thư viện kết nối riêng, không có sẵn trong bản cài Python.
Mở trang câu hỏi này →
AThe rows of the left table are connected to the rows in the right table when their primary key matches
BYou get no rows at all
CYou get all of the rows of the left table in the JOIN and NULLs in all of the columns of the right table
DThe number of rows you get is the number of rows in the first table times the number of rows in the second table
ELeaving out the ON clause when joining two tables in SQLite is a syntax error
Lời giải
Đáp án đúng: "The number of rows you get is the number of rows in the first table times the number of rows in the second table". JOIN không có ON thì không có điều kiện ghép, nên SQLite ghép mọi dòng bảng trái với mọi dòng bảng phải, tạo tích Đề-các (Cartesian product), tương đương CROSS JOIN: bảng 3 dòng ghép bảng 4 dòng cho 12 dòng. Mệnh đề ON chính là bộ lọc giữ lại những cặp có khoá ngoại khớp khoá chính. "The rows of the left table are connected to the rows in the right table when their primary key matches" mô tả JOIN có ON, ví dụ ON Track.album_id = Album.id. "You get no rows at all" sai vì thiếu điều kiện thì mọi cặp đều được giữ chứ không cặp nào bị loại. "You get all of the rows of the left table in the JOIN and NULLs in all of the columns of the right table" gần với kết quả của LEFT JOIN khi không có dòng nào khớp, không phải trường hợp này. "Leaving out the ON clause when joining two tables in SQLite is a syntax error" sai vì SQLite cho phép JOIN không ON và coi như CROSS JOIN.
Mở trang câu hỏi này →
AJOIN
BCONNECT
CBETWEEN
DAND
Lời giải
Đáp án đúng: "JOIN". Từ khoá JOIN ghép các dòng của hai (hoặc nhiều) bảng thành dòng kết quả, thường kèm mệnh đề ON để chỉ điều kiện nối, ví dụ khoá ngoại của bảng này bằng khoá chính của bảng kia: SELECT Track.title, Album.title FROM Track JOIN Album ON Track.album_id = Album.id. Thiếu ON thì JOIN tạo mọi cặp dòng có thể (tích Descartes). "CONNECT" sai vì SQL chuẩn không có từ khoá ghép bảng tên này; kết nối tới cơ sở dữ liệu là việc của hàm như sqlite3.connect phía Python. "BETWEEN" sai vì nó lọc giá trị nằm trong một khoảng ở mệnh đề WHERE. "AND" sai vì nó chỉ nối hai điều kiện logic, không tự ghép dòng của hai bảng.
Mở trang câu hỏi này →
AGROUP BY
BORDER BY
CWHERE
DSORT
Lời giải

Đáp án đúng: "ORDER BY". Mệnh đề ORDER BY đứng cuối câu SELECT để sắp xếp tập kết quả 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 title FROM Album ORDER BY title; thiếu nó thì cơ sở dữ liệu không bảo đảm thứ tự dòng trả về. "GROUP BY" gom các dòng có cùng giá trị thành nhóm để tính hàm tổng hợp như COUNT, SUM, AVG; chuẩn SQL không cam kết kết quả nhóm có thứ tự, nên muốn sắp xếp vẫn phải thêm 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ự. "SORT" không phải từ khoá SQL; nó gợi nhớ phương thức sort() của list hay hàm sorted() trong Python, dùng để sắp xếp dữ liệu sau khi đã lấy về.

Mở trang câu hỏi này →
Afield
Brow
Cattribute
Drelation
Lời giải
Đáp án đúng: "relation". Trong mô hình quan hệ (relational model) do Edgar F. Codd đề xuất, một bảng được gọi là quan hệ (relation): tập các bộ (tuple) có cùng cấu trúc thuộc tính; chính từ đó mà có tên cơ sở dữ liệu quan hệ. "field" sai vì trường (field) là một cột, tức một ô dữ liệu trong mỗi dòng, không phải cả bảng. "row" sai vì dòng tương ứng với bộ (tuple) hay bản ghi (record), là một phần tử của bảng. "attribute" sai vì thuộc tính (attribute) là tên gọi khác của cột hay trường. Nhóm tương ứng cần nhớ: relation ứng với table, tuple ứng với row, attribute ứng với column.
Mở trang câu hỏi này →
AName of user 2
BID of user 2
CFull recordset of user 2
DAn error occurred
Lời giải
Đáp án đúng: "Name of user 2". Câu truy vấn chỉ liệt kê đúng một cột sau SELECT là name, nên kết quả chỉ chứa giá trị của cột name; mệnh đề WHERE id=2 lọc ra dòng có id bằng 2, và vì đã bảo đảm có người dùng này, kết quả là một dòng chứa tên của người dùng số 2. Trong Python với sqlite3, gọi fetchone() sẽ nhận một tuple một phần tử như ('Chuck',). Phương án "ID of user 2" sai vì id chỉ dùng để lọc trong WHERE chứ không nằm trong danh sách cột được chọn. Phương án "Full recordset of user 2" chỉ đúng nếu viết SELECT * FROM Users WHERE id=2, khi đó mọi cột mới được trả về. Phương án "An error occurred" sai vì câu lệnh đúng cú pháp và dòng cần tìm chắc chắn tồn tại; kể cả khi không có dòng nào khớp, SQL cũng chỉ trả về tập rỗng chứ không báo lỗi.
Mở trang câu hỏi này →
AModel each "object" in the application as one or more tables
BUse a person's email address as their primary key
CNever repeat string data in more than one table in a data model
DUse integers as primary keys
Lời giải
Đáp án đúng: "Use a person's email address as their primary key". Khoá chính nên là giá trị ổn định, gọn và không mang ý nghĩa nghiệp vụ; địa chỉ email thì người dùng có thể đổi, mà khi khoá chính đổi, mọi khoá ngoại trỏ tới nó ở các bảng khác cũng phải đổi theo. Email còn là chuỗi dài nên so sánh và đánh chỉ mục chậm hơn số nguyên. Cách đúng là dùng id số nguyên làm khoá chính và đặt email là cột UNIQUE để tra cứu. "Model each "object" in the application as one or more tables" là quy tắc tốt: mỗi đối tượng như người dùng, bài hát, album có bảng riêng. "Never repeat string data in more than one table in a data model" là nguyên tắc chuẩn hoá (normalization): chuỗi chỉ lưu một lần, nơi khác tham chiếu tới nó bằng số. "Use integers as primary keys" là quy tắc tốt vì số nguyên gọn, so sánh nhanh và có thể để SQLite tự tăng. Ba quy tắc này đều nên làm nên không được chọn.
Mở trang câu hỏi này →
33What is the purpose of a primary key?4 lựa chọn
ATo look up a row based on a string that comes from outside the program
BTo look up a particular row in a table very quickly
CTo track the number of duplicate values in another column
DTo point to a particular row in another table
Lời giải
Đáp án đúng: "To look up a particular row in a table very quickly". Khoá chính (primary key), thường là cột id số nguyên tự tăng, định danh duy nhất mỗi dòng và được cơ sở dữ liệu lập chỉ mục, nên tìm đúng một dòng theo nó rất nhanh; các bảng khác cũng tham chiếu tới dòng qua giá trị này. "To look up a row based on a string that comes from outside the program" sai vì đó là vai trò của khoá logic (logical key), như cột email hay tên mà người dùng nhập vào để tìm, thường gắn UNIQUE. "To track the number of duplicate values in another column" sai vì khoá chính không đếm gì; đếm trùng làm bằng GROUP BY với COUNT. "To point to a particular row in another table" sai vì đó là định nghĩa khoá ngoại (foreign key), cột chứa giá trị khoá chính của bảng khác.
Mở trang câu hỏi này →
AAll the rows without a primary key will be updated
BIt is a syntax error
CAll the rows in the table are updated
DThe first row of the table will be updated
Lời giải
Đáp án đúng: "All the rows in the table are updated". UPDATE dùng SET để gán giá trị mới, còn WHERE chọn những dòng sẽ bị sửa; UPDATE Users SET name = 'Charles' WHERE email = 'csev@umich.edu' chỉ sửa dòng khớp. Thiếu WHERE, lệnh áp lên toàn bộ dòng, nên UPDATE Users SET name = 'Charles' biến tên của mọi người trong bảng thành Charles. Đây là lỗi tai hại và khó gỡ nếu chưa sao lưu. "All the rows without a primary key will be updated" sai vì khoá chính không đóng vai trò lọc; dòng nào cũng bị sửa như nhau. "It is a syntax error" sai vì WHERE là mệnh đề tuỳ chọn, câu lệnh không có nó vẫn hợp lệ và cơ sở dữ liệu thực thi mà không cảnh báo. "The first row of the table will be updated" sai vì SQL không ngầm giới hạn còn một dòng, và bảng quan hệ cũng không có khái niệm dòng đầu cố định khi chưa có ORDER BY.
Mở trang câu hỏi này →
AAPPEND
BJOIN
CCONSTRAINT
DCONNECT
Lời giải
Đáp án đúng: "JOIN". Trong cơ sở dữ liệu chuẩn hoá, dữ liệu được tách ra nhiều bảng và nối với nhau bằng khoá ngoại (foreign key) trỏ tới khoá chính của bảng khác; JOIN kèm điều kiện ON ghép lại các dòng đó lúc truy vấn, ví dụ Track JOIN Album ON Track.album_id = Album.id để mỗi bài hát hiện kèm tên album. "APPEND" không phải từ khoá SQL; nó gợi nhớ phương thức append() của list Python dùng thêm phần tử vào cuối danh sách. "CONSTRAINT" dùng để khai báo ràng buộc như PRIMARY KEY, FOREIGN KEY, UNIQUE khi tạo bảng; nó bảo đảm khoá ngoại hợp lệ nhưng không ghép dòng lúc truy vấn. "CONNECT" không phải từ khoá nối bảng; kết nối tới cơ sở dữ liệu trong Python là sqlite3.connect(), còn Oracle có CONNECT BY dành cho truy vấn phân cấp chứ không phải nối bảng theo khoá ngoại.
Mở trang câu hỏi này →
Đề bài
import sqlite3
connection = sqlite3.connection("people.db")
cursor = connection.cursor()
cursor.execute("SELECT * FROM People")
results = cursor.fetchall()
AquerySet
Blist
Ctuple
Ddict
Lời giải
Đáp án đúng: "list". Phương thức fetchall() của con trỏ sqlite3 lấy toàn bộ các dòng còn lại của kết quả truy vấn và trả về một list (danh sách), trong đó mỗi dòng mặc định là một tuple chứa giá trị các cột, chẳng hạn [('Alice', 25), ('Bob', 30)]; không có dòng nào thì trả về list rỗng. Cần lưu ý đoạn mã có lỗi tên: hàm mở kết nối đúng là sqlite3.connect, viết sqlite3.connection sẽ ném AttributeError; câu hỏi giả định đoạn mã chạy được. Phương án "querySet" gợi tới kiểu QuerySet của Django ORM, không thuộc sqlite3. Phương án "tuple" là kiểu của từng dòng bên trong kết quả, cũng là thứ fetchone() trả về, chứ không phải kiểu của cả kết quả fetchall(). Phương án "dict" chỉ đúng với từng dòng khi tự đặt connection.row_factory thành một hàm tạo dict, và ngay cả khi đó fetchall() vẫn trả về list các dict.
Mở trang câu hỏi này →