1ALTER TABLE — Changes the structure of an existing table, such as adding a column with ADD or removing one with DROP COLUMN. Existing rows keep their data and get empty (NULL) values in a new column.
2HAVING — Filters groups after GROUP BY using an aggregate condition, e.g. HAVING COUNT(*) > 2. WHERE filters rows before grouping. Order: WHERE, GROUP BY, HAVING.
3(SELECT ...) — A sub-select is a SELECT inside brackets in a WHERE clause. It runs first and its result is used by the outer query, e.g. to compare with an AVG or to match values using IN.
4open('data.bin', 'rb') — Opens a file in binary mode so read() returns raw bytes, not text. Use 'wb' to write bytes. Binary data is type bytes, not str, and read(n) reads n bytes.
5conn = sqlite3.connect("school.db") — Opens the SQLite database file school.db (creating it if missing) and returns a connection. Then conn.cursor() makes a cursor to run SQL, and conn.close() ends the connection.
6cursor.execute() — Runs an SQL statement from Python. Then fetchall() returns the result rows as tuples, and conn.commit() saves INSERT or UPDATE changes. Use ? placeholders for values.
7json.dumps() — Turns a Python dictionary or list into JSON text (double-quoted keys, braces, square brackets) ready to send. json.loads() does the reverse and turns JSON text back into Python data.
8requests.post(url, json=data) — Sends a Python dictionary to a web API as a JSON request body, unlike GET which only fetches data. Check the response with response.status_code.
9receive -> process -> display — A prototype pipeline: get external data into a variable, process it with a function, then show the result. Each step has its own function, called from main().
10one-time pad — A cipher that encrypts each letter with a random key letter. The key is as long as the message and is used once only, so it is unbreakable if used correctly.
11key = [random.randint(0, 25) for c in message] — Builds a one-time pad key by picking one random number from 0 to 25 for each character in the message, so the key is as long as the message. Never reuse a key.
12(m + k) % 26 — One-time pad: shift each message letter number m by the matching key number k, wrapping with % 26. To decrypt, subtract the same key values: (c - k) % 26. zip pairs each letter with its key.
13Security-impact evaluation — Judging a data exchange on five aspects: use, dissemination, storage, accuracy and ownership of data, with evidence for each, then recommending a fix.
14accuracy testing — Comparing the prototype's actual output with expected results worked out by hand from known data, to find wrong values such as rounding or conversion errors.
15reliability testing — Checking a prototype keeps working when the data source is offline, missing, empty, slow or sends malformed data, and gives consistent results on repeated runs.