This page needs a recent browser (with SharedArrayBuffer support). Please update Chrome, Edge, Firefox or Safari to the latest version. · Trang này cần trình duyệt gần đây (hỗ trợ SharedArrayBuffer). Vui lòng cập nhật Chrome, Edge, Firefox hoặc Safari lên phiên bản mới nhất.
A database 数据库 keeps data in tables 表. A query 查询 reads data with SELECT. SELECT * returns every column; FROM names the table.
Each row 行 is one record 记录. SQL keywords are written in UPPERCASE by habit.
A statement ends with a semicolon ;.
Tiếng Việt
Cơ sở dữ liệu giữ dữ liệu trong các bảng. Một câu truy vấn đọc dữ liệu bằng SELECT. SELECT * trả về mọi cột; FROM tên bảng.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
SELECT * FROM student;
Một bảng lưu trữ bản ghi: mỗi hàng là một bản ghi, mỗi cột là một trường
Mỗi hàng là một bản ghi. Các từ khóa SQL thường được viết HOA theo thói quen.
Một câu lệnh kết thúc bằng dấu chấm phẩy ;.
1.2
Chọn các cột
English
List the columns 列 you want, separated by commas. Use AS to rename a column in the result (an alias 别名).
A selected column can also be a calculation — pair it with AS to name the new column:
SELECT DISTINCT col removes duplicate values from the result.
Tiếng Việt
Liệt kê các cột bạn muốn, ngăn cách nhau bằng dấu phẩy. Sử dụng AS để đổi tên một cột trong kết quả (tên thay thế).
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
SELECT name, score AS mark FROM student;
Một cột được chọn cũng có thể là phép tính — ghép nó với AS để đặt tên cho cột mới:
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
SELECT name, score + 5 AS bonus FROM student;
SELECT DISTINCT col loại bỏ các giá trị trùng lặp khỏi kết quả.
1.3
Lọc bằng WHERE
English
WHERE keeps only the rows that match a condition 条件. Compare with =, <> (not equal), <, >, <=, >=. Put text in single quotes.
SQL runs the parts in this order: FROM → WHERE → SELECT.
Common mistakes
Put text values in single quotes: WHERE name = 'Ann'; column names have no quotes.
SELECT * returns every column — name only the columns you need.
WHERE filters rows; it comes after FROM.
Tiếng Việt
WHERE chỉ giữ lại các hàng khớp với điều kiện. So sánh với =, <> (không bằng), <, >, <=, >=. Đặt văn bản trong dấu ngoặc kép đơn.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71), (3, 'Ana', 95);
SELECT name, score FROM student WHERE score >= 80;
SQL thực thi các phần theo thứ tự này: FROM → WHERE → SELECT.
Lỗi thường gặp
Đặt giá trị văn bản trong dấu ngoặc kép đơn: WHERE name = 'Ann'; tên cột không cần dấu ngoặc.
SELECT * trả về mọi cột — chỉ nên nêu rõ những cột bạn cần.
Combine conditions with AND, OR, NOT. AND needs all sides true; OR needs any side true; NOT reverses one. Use brackets to set the precedence 优先级.
Tiếng Việt
Kết hợp các điều kiện bằng AND, OR, NOT. AND cần tất cả các vế đúng; OR cần bất kỳ vế nào đúng; NOT đảo ngược một vế. Sử dụng dấu ngoặc để xác định thứ tự ưu tiên.
CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
SELECT name FROM student WHERE form = '11A' AND score >= 90;
AND cần tất cả đúng; OR cần bất kỳ; NOT đảo ngược một vế
2.2
LIKE, IN và BETWEEN
English
LIKE matches a text pattern 模式: % stands for any text and _ for one character — these are wildcards 通配符.
Pattern
Matches
'M%'
starts with M
'%a'
ends with a
'%an%'
contains "an"
'M_i'
M, then exactly one character, then i
IN matches a set 集合 of values; BETWEEN matches a range 范围 (both ends included).
Tiếng Việt
LIKE khớp một mẫu văn bản: % đại diện cho bất kỳ đoạn văn bản nào và _ cho một ký tự — đây là các ký tự đại diện (wildcards).
CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
SELECT name FROM student WHERE name LIKE 'M%'; -- starts with M
Mẫu
Khớp
'M%'
bắt đầu bằng M
'%a'
kết thúc bằng a
'%an%'
chứa "an"
'M_i'
M, sau đó đúng một ký tự, sau đó i
IN khớp một tập hợp các giá trị; BETWEEN khớp một khoảng (bao gồm cả hai đầu múi).
CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
SELECT name, score FROM student
WHERE form IN ('11A', '11C') AND score BETWEEN 80 AND 100;
2.3
NULL
English
NULL marks a missing value 缺失值 — nothing was stored in that cell. NULL is not 0 and not an empty string. A comparison with = or <> never matches it; test with IS NULL or IS NOT NULL.
WHERE score = NULL returns no rows at all — not even Sam's row.
A NULL in arithmetic gives NULL: score + 5 stays NULL for Sam.
Common mistakes
Test for an empty value with IS NULL, never = NULL.
In LIKE, % matches any text and _ matches one character: 'A%' means "starts with A".
IN (1, 2, 3) is shorter than many ORs; BETWEEN a AND b includes both ends.
Tiếng Việt
NULL đánh dấu một giá trị bị thiếu — không có gì được lưu trong ô đó. NULL không phải là 0 và cũng không phải chuỗi rỗng. Phép so sánh với = hoặc <> sẽ không bao giờ khớp với nó; hãy kiểm tra bằng IS NULL hoặc IS NOT NULL.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', NULL), (3, 'Ana', 95);
SELECT name FROM student WHERE score IS NULL;
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', NULL), (3, 'Ana', 95);
SELECT name, score FROM student WHERE score IS NOT NULL;
WHERE score = NULL trả về hoàn toàn không có hàng nào — thậm chí cả hàng của Sam cũng không có.
Một NULL trong phép toán học sẽ tạo ra NULL: score + 5 vẫn giữ nguyên là NULL đối với Sam.
Lỗi thường gặp
Kiểm tra xem giá trị có trống hay không bằng IS NULL, tuyệt đối không dùng = NULL.
Trong LIKE, % khớp bất kỳ đoạn văn bản nào và _ khớp một ký tự: 'A%' có nghĩa là "bắt đầu bằng A".
IN (1, 2, 3) ngắn hơn nhiều ORs; BETWEEN a AND b bao gồm cả hai đầu múi.
ORDER BY sorts 排序 the result rows. Add DESC for descending 降序 (high to low); the default is ascending 升序 (low to high).
Sort by more than one column
List several columns. A tie 平局 in the first column is broken by the next.
LIMIT (top-N)
LIMIT n keeps only the first n rows — pair it with ORDER BY for a top-N 前 N 名 list.
ORDER BY can also sort by an alias or a calculation: ORDER BY avg_score DESC.
Text sorts alphabetically: ORDER BY name runs A → Z.
Common mistakes
ORDER BY sorts ascending by default; add DESC for descending.
ORDER BY comes near the end, after WHERE and GROUP BY.
LIMIT caps how many rows come back, but only after sorting.
Tiếng Việt
ORDER BY sắp xếp các hàng kết quả. Thêm DESC để sắp xếp giảm dần (cao đến thấp); mặc định là tăng dần (thấp đến cao).
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei',88),(2,'Sam',71),(3,'Ana',95);
SELECT name, score FROM student ORDER BY score DESC;
Sắp xếp theo nhiều hơn một cột
Liệt kê nhiều cột. Nếu có kết quả giống nhau ở cột đầu tiên, sẽ được phân biệt bởi cột tiếp theo.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei',88),(2,'Sam',88),(3,'Ana',95);
SELECT name, score FROM student ORDER BY score DESC, name ASC;
LIMIT (Top-N)
LIMIT n chỉ giữ lại n hàng đầu tiên — ghép nó với ORDER BY để tạo danh sách Top-N.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei',88),(2,'Sam',71),(3,'Ana',95);
SELECT name, score FROM student ORDER BY score DESC LIMIT 2;
ORDER BY cũng có thể sắp xếp theo tên thay thế hoặc phép tính: ORDER BY avg_score DESC.
Văn bản sắp xếp theo thứ tự chữ cái: ORDER BY name chạy từ A → Z.
Lỗi thường gặp
ORDER BY sắp xếp tăng dần theo mặc định; thêm DESC để sắp xếp giảm dần.
ORDER BY nằm gần cuối, sau WHERE và GROUP BY.
LIMIT giới hạn số lượng hàng trả về, nhưng chỉ sau khi đã sắp xếp.
ORDER BY sắp xếp; LIMIT giữ n hàng đầu tiên sau khi sắp xếp
An aggregate function 聚合函数 turns many rows into one summary 汇总 value. Wrap an average in ROUND(x, 2) to tidy it.
Function
Gives
COUNT(*)
how many rows
SUM(col)
the total
AVG(col)
the mean average
MIN(col) / MAX(col)
the smallest / largest value
Tiếng Việt
Một hàm tổng hợp biến nhiều hàng thành một giá trị tóm tắt. Bọc giá trị trung bình trong ROUND(x, 2) để làm tròn đẹp mắt.
Hàm
Trả về
COUNT(*)
số lượng hàng
SUM(col)
tổng cộng
AVG(col)
giá trị trung bình
MIN(col) / MAX(col)
giá trị nhỏ nhất / lớn nhất
CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
SELECT COUNT(*), ROUND(AVG(score), 2), MAX(score) FROM student;
4.2
GROUP BY và HAVING
English
GROUP BY makes one summary row per group 组. HAVING filters those groups — it is like WHERE, but it runs after grouping.
Whatever order you write them in, SQL always runs the clauses of a query in the same fixed order:
Step
Clause
1
FROM (and any JOIN)
2
WHERE — filter rows
3
GROUP BY — form groups
4
HAVING — filter groups
5
SELECT — compute the output columns
6
ORDER BY, then LIMIT
Common mistakes
You cannot select a plain column beside an aggregate unless it is in GROUP BY.
Filter rows with WHERE (before grouping) and filter groups with HAVING (after).
COUNT(*) counts rows; COUNT(col) skips NULLs in that column.
Tiếng Việt
GROUP BY tạo ra một hàng tóm tắt cho mỗi nhóm. HAVING lọc các nhóm đó — nó giống như WHERE, nhưng chạy sau khi nhóm.
CREATE TABLE student (id INTEGER, name TEXT, form TEXT, score INTEGER);
INSERT INTO student VALUES (1,'Mei','11A',88),(2,'Sam','11B',71),(3,'Ana','11A',95);
SELECT form, COUNT(*) AS n, ROUND(AVG(score), 2) AS avg_score
FROM student
GROUP BY form
HAVING COUNT(*) > 1;
GROUP BY gom các hàng vào một bucket cho mỗi giá trị; mỗi bucket trở thành một hàng tóm tắt
Dù bạn viết chúng theo thứ tự nào, SQL luôn thực thi các mệnh lệnh của truy vấn theo cùng một thứ tự cố định:
Bước
Mệnh lệnh
1
FROM (và bất kỳ JOIN nào)
2
WHERE — lọc các hàng
3
GROUP BY — tạo các nhóm
4
HAVING — lọc các nhóm
5
SELECT — tính toán các cột kết quả
6
ORDER BY, sau đó LIMIT
Lỗi thường gặp
Bạn không thể chọn một cột thường bên cạnh hàm tổng hợp trừ khi nó nằm trong GROUP BY.
Lọc hàng với WHERE (trước khi nhóm) và lọc nhóm với HAVING (sau khi nhóm).
COUNT(*) đếm số hàng; COUNT(col) bỏ qua NULL trong cột đó.
A primary key 主键 uniquely names each row in a table. A foreign key 外键 in one table points to the primary key of another — that builds a relationship 关系 between them.
Tiếng Việt
Khóa chính đặt tên duy nhất cho mỗi hàng trong bảng. Khóa ngoại trong một bảng trỏ đến khóa chính của bảng khác — điều này xây dựng mối liên hệ giữa chúng.
CREATE TABLE class (id INTEGER, name TEXT);
CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', 2);
SELECT * FROM student;
5.2
INNER JOIN
English
A join 连接 combines rows from two tables. INNER JOIN ... ON ... keeps rows where the keys match. A short alias 别名 (s, c) keeps the query readable.
Tiếng Việt
JOIN kết hợp các hàng từ hai bảng. INNER JOIN ... ON ... giữ lại các hàng có khóa khớp nhau. Một biệt danh ngắn (s, c) giúp truy vấn dễ đọc hơn.
CREATE TABLE class (id INTEGER, name TEXT);
CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', 2);
SELECT s.name, c.name AS class
FROM student s INNER JOIN class c ON s.class_id = c.id;
INNER JOIN khớp mỗi khóa ngoại với khóa chính và kết hợp các hàng đã khớp
5.3
Join với grouping
English
Join first, then GROUP BY to summarise across the joined rows.
Tiếng Việt
Join trước, sau đó GROUP BY để tóm tắt trên các hàng đã join.
CREATE TABLE class (id INTEGER, name TEXT);
CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', 2), (3, 'Ana', 1);
SELECT c.name AS class, COUNT(*) AS n
FROM student s INNER JOIN class c ON s.class_id = c.id
GROUP BY c.name;
5.4
LEFT JOIN
English
An INNER JOIN keeps only matched rows. A LEFT JOIN 左连接 keeps every row of the left (first) table; where there is no match, the right table's columns come back as NULL.
Sam has no class, but the row still appears — with class as NULL.
To find only the unmatched rows, add WHERE c.id IS NULL.
Common mistakes
A join with no ON condition pairs every row with every row (a cross join).
Match the foreign key to the primary key: ON orders.customer_id = customers.id.
An INNER JOIN drops rows that have no match on the other side; use a LEFT JOIN to keep them.
Tiếng Việt
INNER JOIN chỉ giữ lại các hàng đã khớp. Một LEFT JOIN giữ mọi hàng của bảng trái (bảng đầu tiên); nơi không có sự khớp, các cột của bảng phải trả về là NULL.
CREATE TABLE class (id INTEGER, name TEXT);
CREATE TABLE student (id INTEGER, name TEXT, class_id INTEGER);
INSERT INTO class VALUES (1, 'Maths'), (2, 'Art');
INSERT INTO student VALUES (1, 'Mei', 1), (2, 'Sam', NULL);
SELECT s.name, c.name AS class
FROM student s LEFT JOIN class c ON s.class_id = c.id;
Sam không có lớp học, nhưng hàng vẫn xuất hiện — với class là NULL.
Để tìm chỉ các hàng chưa khớp, thêm WHERE c.id IS NULL.
Lỗi thường gặp
Một join không có điều kiện ON ghép mọi hàng với mọi hàng (cross join).
Khớp khóa ngoại với khóa chính: ON orders.customer_id = customers.id.
INNER JOIN loại bỏ các hàng không có sự khớp ở phía kia; hãy dùng LEFT JOIN để giữ lại chúng.
INSERT INTO ... VALUES ... adds new rows 行. Name the columns, then give the values in the same order. (Each block below ends with a SELECT so you can see the result.)
INSERT INTO t VALUES (...), (...); adds several rows in one statement.
Tiếng Việt
INSERT INTO ... VALUES ... thêm các hàng mới. Đặt tên các cột, sau đó cung cấp các giá trị theo cùng thứ tự. (Mỗi khối dưới đây kết thúc bằng một SELECT để bạn thấy kết quả.)
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student (id, name, score) VALUES (1, 'Mei', 88);
INSERT INTO student VALUES (2, 'Sam', 71);
SELECT * FROM student;
INSERT INTO t VALUES (...), (...); thêm nhiều hàng trong một câu lệnh.
INSERT thêm một hàng mới vào bảng
6.2
UPDATE
English
UPDATE ... SET ... WHERE ... changes existing rows. Always add WHERE, or every row changes.
Tiếng Việt
UPDATE ... SET ... WHERE ... thay đổi các hàng đã tồn tại. Luôn thêm WHERE, hoặc mọi hàng sẽ bị thay đổi.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
UPDATE student SET score = 75 WHERE name = 'Sam';
SELECT * FROM student;
6.3
DELETE
English
DELETE FROM ... WHERE ... removes rows. Without WHERE it empties the whole table 表.
Common mistakes
UPDATE and DELETEwithout a WHERE change every row — always add the WHERE.
In INSERT, the values must line up with the column list in order and type.
Test a risky DELETE first as a SELECT with the same WHERE.
Tiếng Việt
DELETE FROM ... WHERE ... xóa các hàng. Không có WHERE thì nó sẽ làm trống toàn bộ bảng.
CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
DELETE FROM student WHERE score < 80;
SELECT * FROM student;
Lỗi thường gặp
UPDATE và DELETEkhông cóWHERE sẽ thay đổi mọi hàng — luôn thêm WHERE.
Trong INSERT, các giá trị phải thẳng hàng với danh sách cột theo thứ tự và kiểu dữ liệu.
Kiểm tra một DELETE rủi ro trước như một SELECT với cùng WHERE.
CREATE TABLE defines a table's schema 表结构: the column names and their data types 数据类型. The main SQLite types are INTEGER, TEXT, and REAL (a decimal number).
Tiếng Việt
CREATE TABLE xác định schema của bảng: tên các cột và kiểu dữ liệu của chúng. Các loại SQLite chính là INTEGER, TEXT, và REAL (một số thập phân).
CREATE TABLE student (id INTEGER, name TEXT, score REAL);
INSERT INTO student VALUES (1, 'Mei', 88.5);
SELECT * FROM student;
CREATE TABLE đặt tên các cột và kiểu của chúng
7.2
Keys & constraints
English
A constraint 约束 is a rule on a column: PRIMARY KEY (a unique id), NOT NULL (must have a value), UNIQUE, and DEFAULT (a fallback value).
Declare a foreign key with REFERENCES — it records that the column points at another table's primary key:
The long form is FOREIGN KEY (class_id) REFERENCES class(id) on its own line.
Tiếng Việt
Constraint là quy tắc trên một cột: PRIMARY KEY (id duy nhất), NOT NULL (phải có giá trị), UNIQUE, và DEFAULT (giá trị dự phòng).
CREATE TABLE student (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
score INTEGER DEFAULT 0
);
INSERT INTO student (id, name) VALUES (1, 'Mei');
SELECT * FROM student;
Khai báo khóa ngoại với REFERENCES — nó ghi nhận rằng cột đó trỏ đến khóa chính của bảng khác:
CREATE TABLE class (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE student (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
class_id INTEGER REFERENCES class(id)
);
INSERT INTO class VALUES (1, 'Maths');
INSERT INTO student VALUES (1, 'Mei', 1);
SELECT s.name, c.name AS class
FROM student s INNER JOIN class c ON s.class_id = c.id;
Dạng dài là FOREIGN KEY (class_id) REFERENCES class(id) trên dòng riêng.
7.3
ALTER TABLE
English
ALTER TABLE ... ADD COLUMN ... changes the schema of a table that already exists. A DEFAULT fills the new column in the old rows.
ALTER TABLE student RENAME TO pupil; renames the whole table.
DROP TABLE student; deletes the table completely — structure and data.
Common mistakes
Every column needs a data type (e.g. INTEGER, TEXT).
A PRIMARY KEY must be unique and cannot be NULL.
A foreign key value must exist in the table it points to.
Tiếng Việt
ALTER TABLE ... ADD COLUMN ... thay đổi schema của một bảng đã tồn tại. Một DEFAULT điền vào cột mới trong các hàng cũ.
CREATE TABLE student (id INTEGER, name TEXT);
INSERT INTO student VALUES (1, 'Mei');
ALTER TABLE student ADD COLUMN score INTEGER DEFAULT 0;
SELECT * FROM student;
ALTER TABLE student RENAME TO pupil; đổi tên toàn bộ bảng.
DROP TABLE student; xóa bảng hoàn toàn — cả cấu trúc và dữ liệu.
Tables connect through relationships 关系. One-to-many 一对多 is the most common: one class has many students. Many-to-many 多对多 needs a join table 连接表 in the middle. An entity-relationship diagram 实体关系图 (ER diagram) draws each entity 实体 as a box and each relationship as a line.
Relationship
Example
one-to-one
a person and their passport
one-to-many
a class and its students
many-to-many
students and clubs
The join table holds one row per link. Here Mei is in two clubs, and Chess has two members:
Tiếng Việt
Các bảng kết nối thông qua các quan hệ. Một-nhiều là phổ biến nhất: một lớp có nhiều học sinh. Nhiều-nhiều cần một bảng join ở giữa. Sơ đồ thực thể-quan hệ (ER diagram) vẽ mỗi thực thể dưới dạng hộp và mỗi quan hệ dưới dạng đường nối.
Quan hệ
Ví dụ
một-với-một
một người và hộ chiếu của họ
một-với-nhiều
một lớp và học sinh của nó
nhiều-với-nhiều
học sinh và câu lạc bộ
Phía "nhiều" mang khóa ngoại; liên kết nhiều-nhiều cần bảng join
Bảng join chứa một hàng cho mỗi liên kết. Ở đây Mei tham gia hai câu lạc bộ, và Chess có hai thành viên:
CREATE TABLE student (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE club (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE membership (student_id INTEGER, club_id INTEGER);
INSERT INTO student VALUES (1, 'Mei'), (2, 'Sam');
INSERT INTO club VALUES (1, 'Chess'), (2, 'Art');
INSERT INTO membership VALUES (1, 1), (1, 2), (2, 1);
SELECT s.name, c.name AS club
FROM membership m
INNER JOIN student s ON m.student_id = s.id
INNER JOIN club c ON m.club_id = c.id;
8.2
Chuẩn hóa
English
Normalisation 范式化 organises tables to avoid redundancy 冗余 (the same data repeated) and the update mistakes it causes. The first three normal forms 范式:
1NF: every cell holds one atomic 原子 value — no lists inside a cell.
2NF: no column depends on only part of a composite key 复合主键.
3NF: no column depends on another non-key column.
Unnormalised (bad)
Normalised (better)
student(name, club1, club2)
student(name) + membership(student, club)
Common mistakes
Split repeating groups into their own table (normalisation) instead of many similar columns.
Each table should describe ONE kind of thing.
Link tables with a foreign key that points to another table's primary key.
Tiếng Việt
Chuẩn hóa tổ chức các bảng để tránh trùng lặp (cùng dữ liệu được lặp lại) và những lỗi cập nhật gây ra bởi nó. Ba chuẩn hóa đầu tiên:
1NF: mỗi ô chứa một giá tử nguyên — không có danh sách nào bên trong ô.
2NF: không có cột nào phụ thuộc vào chỉ một phần của khóa tổng hợp.
3NF: không có cột nào phụ thuộc vào một cột không phải khóa khác.
Không chuẩn hóa (tệ)
Đã chuẩn hóa (tốt hơn)
student(name, club1, club2)
student(name) + membership(student, club)
Lỗi thường gặp
Chia các nhóm lặp lại thành bảng riêng (chuẩn hóa) thay vì nhiều cột tương tự nhau.
Mỗi bảng nên mô tả MỘT loại đối tượng.
Liên kết các bảng với khóa ngoại trỏ đến khóa chính của bảng khác.
Pick one and the site follows you — notes, papers, videos and practice all open on it. · Chọn một môn và trang sẽ điều hướng theo — ghi chú, tài liệu, video và bài tập đều mở ở đó.
Type to search notes, lessons, code, vocabulary and past-paper questions across every subject. · Nhập để tìm ghi chú, bài học, mã, từ vựng và câu hỏi đề thi cũ trên mọi môn học.