Skip to content · ⁨Passer au contenu⁩
Subjects · ⁨Sujets⁩
  • 1 Querying basics · ⁨Bases de requêtes⁩
    1.1

    SELECT et FROM

    English

    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 ;.
    Français

    Une base de données 数据库 stocke les données dans des tables 表. Une requête 查询 lit les données avec SELECT. SELECT * retourne toutes les colonnes ; FROM nomme la table.

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
    SELECT * FROM student;
    
    Une table stocke des enregistrements : chaque ligne est un enregistrement, chaque colonne est un champ
    Une table stocke des enregistrements : chaque ligne est un enregistrement, chaque colonne est un champ
    • Chaque ligne 行 est un enregistrement 记录. Les mots-clés SQL s'écrivent par habitude en MAJUSCULES.
    • Une instruction se termine par un point-virgule ;.
    1.2

    Choisir des colonnes

    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.
    Français

    Répertoriez les colonnes 列 que vous souhaitez, séparées par des virgules. Utilisez AS pour renommer une colonne dans le résultat (un alias 别名).

    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;
    

    Une colonne sélectionnée peut aussi être un calcul — associez-la à AS pour nommer la nouvelle colonne :

    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 élimine les valeurs dupliquées du résultat.
    1.3

    Filtrage avec 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.
    Français

    WHERE garde uniquement les lignes qui correspondent à une condition 条件. Comparez avec =, <> (différent de), <, >, <=, >=. Mettez du texte entre guillemets simples.

    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 exécute les parties dans cet ordre : FROM → WHERE → SELECT.

    Erreurs courantes

    • Mettez les valeurs textuelles entre guillemets simples : WHERE name = 'Ann' ; les noms de colonnes n'ont pas de guillemets.
    • SELECT * retourne toutes les colonnes — nommez uniquement les colonnes dont vous avez besoin.
    • WHERE filtre les lignes ; il vient après FROM.
  • 2 Filtering & logic · ⁨Filtrage & logique⁩
    2.1

    AND, OR, NOT · ⁨ET, OU, NON⁩

    English

    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 优先级.

    Français

    Combinez les conditions avec AND, OR, NOT. AND nécessite que tous les côtés soient vrais ; OR nécessite qu'au moins un côté soit vrai ; NOT inverse un côté. Utilisez des parenthèses pour définir la priorité 优先级.

    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 nécessite tous vrais ; OR nécessite au moins un ; NOT inverse un seul
    AND nécessite tous vrais ; OR nécessite au moins un ; NOT inverse un seul
    2.2

    LIKE, IN et 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).

    Français

    LIKE correspond à un motif de texte 模式 : % représente n'importe quel texte et _ représente un seul caractère — ce sont des caractères génériques 通配符.

    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
    
    Motif Correspond à
    'M%' commence par M
    '%a' finit par a
    '%an%' contient "an"
    'M_i' M, puis exactement un caractère, puis i

    IN correspond à un ensemble 集合 de valeurs ; BETWEEN correspond à une plage 范围 (extrémités incluses).

    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.
    Français

    NULL marque une valeur manquante 缺失值 — rien n'a été stocké dans cette cellule. NULL n'est pas 0 et n'est pas une chaîne vide. Une comparaison avec = ou <> ne correspond jamais ; testez avec IS NULL ou 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 ne retourne aucune ligne — pas même la ligne de Sam.
    • Un NULL en arithmétique donne un NULL : score + 5 reste NULL pour Sam.

    Erreurs courantes

    • Testez une valeur vide avec IS NULL, jamais = NULL.
    • Dans LIKE, % correspond à n'importe quel texte et _ correspond à un seul caractère : 'A%' signifie « commence par A ».
    • IN (1, 2, 3) est plus court que beaucoup de ORs ; BETWEEN a AND b inclut les deux extrémités.
  • 3 Sorting & limiting · ⁨Tri & limitation⁩
    3.1

    ORDER BY et LIMIT

    English

    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.
    Français

    ORDER BY trie 排序 les lignes du résultat. Ajoutez DESC pour un tri décroissant 降序 (de haut en bas) ; le tri croissant 升序 (de bas en haut) est par défaut.

    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;
    

    Tri par plusieurs colonnes

    Répertoriez plusieurs colonnes. En cas d'égalité 平局 dans la première colonne, la suivante fait office de critère de rupture.

    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 garde seulement les premières n lignes — associez-le à ORDER BY pour une liste des N premiers 前 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 peut aussi trier selon un alias ou un calcul : ORDER BY avg_score DESC.
    • Le texte se trie alphabétiquement : ORDER BY name exécute A → Z.

    Erreurs courantes

    • ORDER BY trie par défaut par ordre croissant ; ajoutez DESC pour un ordre décroissant.
    • ORDER BY intervient vers la fin, après WHERE et GROUP BY.
    • LIMIT limite le nombre de lignes retournées, mais seulement après le tri.
    ORDER BY trie ; LIMIT garde les n premières après tri
    ORDER BY trie ; LIMIT garde les n premières après tri
  • 4 Aggregates & grouping · ⁨Agrégats & groupement⁩
    4.1

    Fonctions agrégées

    English

    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
    Français

    Une fonction agrégée 聚合函数 convertit de nombreuses lignes en une seule valeur de résumé 汇总. Entourez une moyenne de ROUND(x, 2) pour l'arrondir.

    Fonction Donne
    COUNT(*) combien de lignes
    SUM(col) le total
    AVG(col) la moyenne arithmétique
    MIN(col) / MAX(col) la valeur la plus petite / la plus grande
    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 et 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.
    Français

    GROUP BY produit une ligne de résumé par groupe 组. HAVING filtre ces groupes — c'est comme WHERE, mais il s'exécute après le groupement.

    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 rassemble les lignes dans un seul bucket par valeur ; chaque bucket devient une ligne de résumé
    GROUP BY rassemble les lignes dans un seul bucket par valeur ; chaque bucket devient une ligne de résumé

    Peu importe l'ordre dans lequel vous les écrivez, SQL exécute toujours les clauses d'une requête dans le même ordre fixe :

    Étape Clause
    1 FROM (et tout JOIN)
    2 WHERE — filtre les lignes
    3 GROUP BY — forme les groupes
    4 HAVING — filtre les groupes
    5 SELECT — calcule les colonnes de sortie
    6 ORDER BY, puis LIMIT

    Erreurs courantes

    • Vous ne pouvez pas sélectionner une colonne simple à côté d'une agrégation sauf si elle est dans GROUP BY.
    • Filtrez les lignes avec WHERE (avant le groupement) et filtrez les groupes avec HAVING (après).
    • COUNT(*) compte les lignes ; COUNT(col) ignore les NULLs dans cette colonne.
  • 5 Joins
    5.1

    Clés et relations

    English

    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.

    Français

    Une clé primaire 主键 identifie de manière unique chaque ligne dans une table. Une clé étrangère 外键 dans une table pointe vers la clé primaire d'une autre — cela établit une relation 关系 entre elles.

    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.

    Français

    Un join 连接 combine des lignes de deux tables. INNER JOIN ... ON ... garde les lignes où les clés correspondent. Un alias court 别名 (s, c) garde la requête lisible.

    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 associe chaque clé étrangère à une clé primaire et combine les lignes correspondantes
    INNER JOIN associe chaque clé étrangère à une clé primaire et combine les lignes correspondantes
    5.3

    Joining avec groupement

    English

    Join first, then GROUP BY to summarise across the joined rows.

    Français

    Joignez d'abord, puis GROUP BY pour résumer sur les lignes jointes.

    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.
    Français

    Un INNER JOIN ne garde que les lignes correspondantes. Un LEFT JOIN 左连接 garde toutes les lignes de la table de gauche (première) ; là où il n'y a pas de correspondance, les colonnes de la table de droite reviennent en tant que 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 n'a pas de classe, mais la ligne apparaît quand même — avec class valant NULL.
    • Pour trouver uniquement les lignes sans correspondance, ajoutez WHERE c.id IS NULL.

    Erreurs courantes

    • Un join sans condition ON apparie chaque ligne avec chaque ligne (un joint cartésien).
    • Associez la clé étrangère à la clé primaire : ON orders.customer_id = customers.id.
    • Un INNER JOIN rejette les lignes qui n'ont pas de correspondance de l'autre côté ; utilisez un LEFT JOIN pour les garder.
  • 6 Modifying data · ⁨Modifier les données⁩
    6.1

    INSERT

    English

    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.
    Français

    INSERT INTO ... VALUES ... ajoute de nouvelles lignes 行. Nommez les colonnes, puis donnez les valeurs dans le même ordre. (Chaque bloc ci-dessous se termine par un SELECT pour que vous puissiez voir le résultat.)

    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 (...), (...); ajoute plusieurs lignes en une seule instruction.
    INSERT ajoute une nouvelle ligne à une table
    INSERT ajoute une nouvelle ligne à une table
    6.2

    UPDATE

    English

    UPDATE ... SET ... WHERE ... changes existing rows. Always add WHERE, or every row changes.

    Français

    UPDATE ... SET ... WHERE ... modifie des lignes existantes. Toujours ajouter WHERE, sinon toutes les lignes changent.

    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 DELETE without 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.
    Français

    DELETE FROM ... WHERE ... supprime des lignes. Sans WHERE, il vide entièrement la table 表.

    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;
    

    Erreurs courantes

    • UPDATE et DELETE sans WHERE modifient toutes les lignes — ajoutez toujours le WHERE.
    • Dans INSERT, les valeurs doivent correspondre à la liste des colonnes par ordre et type.
    • Testez d'abord un DELETE risqué comme un SELECT avec le même WHERE.
  • 7 Defining tables · ⁨Définir des tables⁩
    7.1

    CREATE TABLE & types de données

    English

    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).

    Français

    CREATE TABLE définit le schéma d'une table 表结构: les noms de colonnes et leurs types de données 数据类型. Les principaux types SQLite sont INTEGER, TEXT et REAL (un nombre décimal).

    CREATE TABLE student (id INTEGER, name TEXT, score REAL);
    INSERT INTO student VALUES (1, 'Mei', 88.5);
    SELECT * FROM student;
    
    CREATE TABLE nomme les colonnes et leurs types
    CREATE TABLE nomme les colonnes et leurs types
    7.2

    Clés & contraintes

    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.
    Français

    Une contrainte 约束 est une règle sur une colonne : PRIMARY KEY (une ID unique), NOT NULL (doit avoir une valeur), UNIQUE et DEFAULT (une valeur par défaut).

    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;
    

    Déclarez une clé étrangère avec REFERENCES — elle indique que la colonne pointe vers une clé primaire d'une autre table :

    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;
    
    • La forme longue est FOREIGN KEY (class_id) REFERENCES class(id) sur sa propre ligne.
    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.
    Français

    ALTER TABLE ... ADD COLUMN ... modifie le schéma d'une table existante. Un DEFAULT remplit la nouvelle colonne dans les anciennes lignes.

    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; renomme toute la table.
    • DROP TABLE student; supprime complètement la table — structure et données.

    Erreurs courantes

    • Chaque colonne nécessite un type de données (ex. INTEGER, TEXT).
    • Une PRIMARY KEY doit être unique et ne peut pas être NULL.
    • Une valeur de clé étrangère doit exister dans la table qu'elle pointe.
  • 8 Database design · ⁨Conception de base de données⁩
    8.1

    Relations & diagrammes entité-relationship

    English

    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:

    Français

    Les tables se connectent via des relations 关系. Le un-vers-beaucoup 一对多 est le plus courant : une classe a beaucoup d'étudiants. Le beaucoup-vers-beaucoup 多对多 nécessite une table de jonction 连接表 intermédiaire. Un diagramme entité-relationship 实体关系图 (diagramme ER) dessine chaque entité 实体 comme une boîte et chaque relation comme une ligne.

    Relation Exemple
    un-vers-un une personne et son passeport
    un-vers-beaucoup une classe et ses étudiants
    beaucoup-vers-beaucoup étudiants et clubs
    Le côté "beaucoup" porte la clé étrangère ; un lien beaucoup-vers-beaucoup nécessite une table de jonction
    Le côté "beaucoup" porte la clé étrangère ; un lien beaucoup-vers-beaucoup nécessite une table de jonction

    La table de jonction contient une ligne par lien. Ici, Mei est dans deux clubs, et Chess a deux membres :

    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

    Normalisation

    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.
    Français

    La normalisation 范式化 organise les tables pour éviter la redondance 冗余 (les mêmes données répétées) et les erreurs de mise à jour qu'elle provoque. Les trois premières formes normales 范式 :

    • 1NF : chaque cellule contient une valeur atomique 原子 unique — pas de listes dans une cellule.
    • 2NF : aucune colonne ne dépend uniquement d'une partie d'une clé composite 复合主键.
    • 3NF : aucune colonne ne dépend d'une autre colonne non-clé.
    Non normalisé (mauvais) Normalisé (mieux)
    student(name, club1, club2) student(name) + membership(student, club)

    Erreurs courantes

    • Séparez les groupes répétés dans leur propre table (normalisation) au lieu de nombreuses colonnes similaires.
    • Chaque table doit décrire UN SEUL type de chose.
    • Liez les tables avec une clé étrangère pointant vers la clé primaire d'une autre table.

Log in or create account · ⁨Se connecter ou créer un compte⁩

IGCSE, A-Level & AP