Skip to content · ⁨Перейти к содержанию⁩
Subjects · ⁨Предметы⁩
  • 1 Querying basics · ⁨Основы запросов⁩
    1.1

    SELECT и 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 ;.
    Русский

    База данных хранит данные в таблицах. Запрос читает данные с помощью SELECT. SELECT * возвращает все столбцы; FROM называет таблицу.

    CREATE TABLE student (id INTEGER, name TEXT, score INTEGER);
    INSERT INTO student VALUES (1, 'Mei', 88), (2, 'Sam', 71);
    SELECT * FROM student;
    
    Таблица хранит записи: каждая строка — одна запись, каждый столбец — одно поле
    Таблица хранит записи: каждая строка — одна запись, каждый столбец — одно поле
    • Каждая строка — это одна запись. Ключевые слова SQL по привычке пишутся ЗАГЛАВНЫМИ БУКВАМИ.
    • Завершение запроса ставится после точки с запятой ;.
    1.2

    Выбор столбцов

    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.
    Русский

    Перечислите нужные столбцы, разделяя их запятыми. Используйте AS для переименования столбца в результате (алиас).

    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;
    

    Выбранный столбец также может быть вычислением — привяжите его к AS, чтобы назвать новый столбец:

    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 удаляет дубликаты из результата.
    1.3

    Фильтрация с 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.
    Русский

    WHERE оставляет только те строки, которые соответствуют условию. Сравнивайте с =, <> (не равно), <, >, <=, >=. Текст заключайте в одинарные кавычки.

    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 выполняет части запроса в этом порядке: FROM → WHERE → SELECT.

    Распространенные ошибки

    • Значения текста берите в одинарные кавычки: WHERE name = 'Ann'; названия столбцов кавычками не обводятся.
    • SELECT * возвращает все столбцы — указывайте только необходимые столбцы.
    • WHERE фильтрует строки; он располагается после FROM.
  • 2 Filtering & logic · ⁨Фильтрация и логика⁩
    2.1

    AND, OR, NOT

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

    Русский

    Объединяйте условия с помощью AND, OR, NOT. AND требует истинности всех условий; OR требует истинности хотя бы одного; NOT инвертирует одно условие. Используйте скобки для задания приоритета операций.

    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 требует всех истинных; OR требует любого; NOT инвертирует одно
    AND требует всех истинных; OR требует любого; NOT инвертирует одно
    2.2

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

    Русский

    LIKE совпадает с текстовым шаблоном: % обозначает любой текст, а _ — один символ; это подстановочные знаки (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%' начинается с M
    '%a' заканчивается на a
    '%an%' содержит "an"
    'M_i' M, затем ровно один символ, затем i

    IN совпадает с набором значений; BETWEEN совпадает с диапазоном (оба конца включены).

    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.
    Русский

    NULL помечает отсутствующее значение — в этой ячейке ничего не было сохранено. NULL не является 0 и не пустой строкой. Сравнение со = или <> никогда не даст совпадения; проверяйте с помощью IS NULL или 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 не вернёт ни одной строки — даже строку Сэма.
    • NULL в арифметических операциях даёт NULL: score + 5 останется NULL для Сэма.

    Распространенные ошибки

    • Проверяйте пустое значение с помощью IS NULL, никогда не = NULL.
    • В LIKE, % совпадает с любым текстом, а _ — с одним символом: 'A%' означает "начинается с A".
    • IN (1, 2, 3) короче многих OR; BETWEEN a AND b включает оба конца диапазона.
  • 3 Sorting & limiting · ⁨Сортировка и ограничение⁩
    3.1

    ORDER BY и 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.
    Русский

    ORDER BY сортирует строки результата. Добавьте DESC для нисходящего порядка (от высокого к низкому); по умолчанию используется восходящий (от низкого к высокому).

    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;
    

    Сортировка по нескольким столбцам

    Перечислите несколько столбцов. При равенстве значений в первом столбце разрыв решается следующим.

    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 (топ-N)

    LIMIT n оставляет только первые n строк — используйте его вместе с ORDER BY для получения списка топ-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 также может сортировать по алиасу или вычислению: ORDER BY avg_score DESC.
    • Текст сортируется алфавитно: ORDER BY name выводит от A до Z.

    Распространенные ошибки

    • ORDER BY сортирует по возрастанию по умолчанию; добавьте DESC для нисходящего порядка.
    • ORDER BY располагается ближе к концу запроса, после WHERE и GROUP BY.
    • LIMIT ограничивает количество возвращаемых строк, но только после сортировки.
    ORDER BY сортирует; LIMIT оставляет первые n после сортировки
    ORDER BY сортирует; LIMIT оставляет первые n после сортировки
  • 4 Aggregates & grouping · ⁨Агрегаты и группировка⁩
    4.1

    Агрегатные функции

    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
    Русский

    Агрегатная функция преобразует множество строк в одно сводное значение. Оберните среднее в ROUND(x, 2), чтобы округлить результат.

    Функция Дает
    COUNT(*) количество строк
    SUM(col) общая сумма
    AVG(col) среднее арифметическое
    MIN(col) / MAX(col) минимальное / максимальное значение
    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 и 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.
    Русский

    GROUP BY создает одну сводную строку для каждой группы. HAVING фильтрует эти группы — это похоже на WHERE, но выполняется после группировки.

    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 собирает строки в одну группу на каждое значение; каждая группа становится одной сводной строкой
    GROUP BY собирает строки в одну группу на каждое значение; каждая группа становится одной сводной строкой

    В каком бы порядке вы их ни написали, SQL всегда выполняет операторы запроса в одном и том же фиксированном порядке:

    Шаг Оператор
    1 FROM (и любой JOIN)
    2 WHERE — фильтрует строки
    3 GROUP BY — формирует группы
    4 HAVING — фильтрует группы
    5 SELECT — вычисляет столбцы вывода
    6 ORDER BY, затем LIMIT

    Распространенные ошибки

    • Вы не можете выбрать обычный столбец рядом с агрегатной функцией, если он не находится в GROUP BY.
    • Фильтруйте строки с помощью WHERE (до группировки) и фильтруйте группы с помощью HAVING (после).
    • COUNT(*) считает строки; COUNT(col) пропускает NULL в этом столбце.
  • 5 Joins · ⁨JOIN'ы⁩
    5.1

    Ключи и отношения

    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.

    Русский

    Первичный ключ однозначно идентифицирует каждую строку в таблице. Внешний ключ в одной таблице ссылается на первичный ключ другой таблицы — это устанавливает связь между ними.

    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.

    Русский

    Объединение (join) совмещает строки из двух таблиц. INNER JOIN ... ON ... оставляет только те строки, у которых ключи совпадают. Короткие псевдонимы (s, c) делают запрос более читаемым.

    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 сопоставляет каждый внешний ключ с первичным ключом и объединяет совпавшие строки
    INNER JOIN сопоставляет каждый внешний ключ с первичным ключом и объединяет совпавшие строки
    5.3

    Объединение с группировкой

    English

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

    Русский

    Сначала выполните join, затем GROUP BY для создания сводных данных по объединенным строкам.

    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.
    Русский

    INNER JOIN оставляет только совпавшие строки. LEFT JOIN сохраняет все строки левой (первой) таблицы; где нет совпадения, столбцы правой таблицы возвращаются как 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;
    
    • У Сэма нет класса, но строка все равно появляется — со значениями class, равными NULL.
    • Чтобы найти только несовпавшие строки, добавьте WHERE c.id IS NULL.

    Распространенные ошибки

    • Join без условия ON соединяет каждую строку с каждой (cross join).
    • Сопоставьте внешний ключ с первичным ключом: ON orders.customer_id = customers.id.
    • INNER JOIN отбрасывает строки, не имеющие совпадений на другой стороне; используйте LEFT JOIN, чтобы сохранить их.
  • 6 Modifying data · ⁨Изменение данных⁩
    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.
    Русский

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

    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 (...), (...); adds several rows in one statement.
    INSERT adds a new row to a table
    INSERT adds a new row to a table
    6.2

    UPDATE

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

    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.
    Русский

    DELETE FROM ... WHERE ... removes rows. Without WHERE it empties the whole 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;
    

    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.
  • 7 Defining tables · ⁨Определение таблиц⁩
    7.1

    CREATE TABLE & типы данных

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

    Русский

    CREATE TABLE определяет схему таблицы: имена столбцов и их типы данных. Основные типы SQLite — это INTEGER, TEXT и REAL (десятичное число).

    CREATE TABLE student (id INTEGER, name TEXT, score REAL);
    INSERT INTO student VALUES (1, 'Mei', 88.5);
    SELECT * FROM student;
    
    CREATE TABLE задает имена столбцов и их типы
    CREATE TABLE задает имена столбцов и их типы
    7.2

    Ключи и ограничения

    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.
    Русский

    Ограничение (constraint) — это правило для столбца: PRIMARY KEY (уникальный ID), NOT NULL (обязательное наличие значения), UNIQUE и DEFAULT (значение по умолчанию).

    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;
    

    Заявите внешний ключ с помощью REFERENCES — это фиксирует, что столбец ссылается на первичный ключ другой таблицы:

    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;
    
    • Полная форма записывается как FOREIGN KEY (class_id) REFERENCES class(id) отдельной строкой.
    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.
    Русский

    ALTER TABLE ... ADD COLUMN ... изменяет схему уже существующей таблицы. Значение в DEFAULT заполняет новый столбец в старых строках.

    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; переименовывает всю таблицу.
    • DROP TABLE student; полностью удаляет таблицу — структуру и данные.

    Распространенные ошибки

    • Каждый столбец требует типа данных (например, INTEGER, TEXT).
    • Первичный ключ должен быть уникальным и не может содержать NULL.
    • Значение внешнего ключа должно существовать в таблице, на которую оно указывает.
  • 8 Database design · ⁨Проектирование баз данных⁩
    8.1

    Отношения и ER-диаграммы

    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:

    Русский

    Таблицы связаны через отношения. «Один ко многим» — наиболее распространенный: один класс имеет много студентов. «Многие ко многим» требует промежуточной таблицы-связи. Диаграмма «сущность-связь» (ER diagram) изображает каждую сущность в виде прямоугольника, а каждую связь — в виде линии.

    Отношение Пример
    один к одному человек и его паспорт
    один ко многим класс и его студенты
    многие ко многим студенты и клубы
    На стороне «многие» находится внешний ключ; связь «многие ко многим» требует таблицы-связи
    На стороне «многие» находится внешний ключ; связь «многие ко многим» требует таблицы-связи

    Таблица-связь содержит по одной строке на каждую связь. Здесь Мэй состоит в двух клубах, а Шахматы — в двух участниках:

    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

    Нормализация

    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.
    Русский

    Нормализация организует таблицы во избежание избыточности (повторения одних и тех же данных) и ошибок при обновлении, которые она вызывает. Первые три нормальные формы:

    • 1NF: каждая ячейка содержит одно атомарное значение — никаких списков внутри ячейки.
    • 2NF: ни один столбец не зависит только от части составного ключа.
    • 3NF: ни один столбец не зависит от другого столбца, не являющегося ключом.
    Ненормализованная (плохо) Нормализованная (лучше)
    student(name, club1, club2) student(name) + membership(student, club)

    Распространенные ошибки

    • Разделите повторяющиеся группы в отдельную таблицу (нормализация) вместо множества похожих столбцов.
    • Каждая таблица должна описывать ОДИН вид объектов.
    • Соедините таблицы внешним ключом, который ссылается на первичный ключ другой таблицы.

Log in or create account · ⁨Войти или создать аккаунт⁩

IGCSE, A-Level & AP