Объединение таблиц в SQLite

SQLiteSQLiteBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы узнаете, как объединять данные из нескольких таблиц в SQLite, используя методы объединения таблиц (table joining techniques). Мы рассмотрим INNER JOIN, LEFT JOIN, объединение нескольких таблиц и фильтрацию объединенных результатов. К концу этой лабораторной работы вы сможете эффективно извлекать и объединять данные с помощью SQLite.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sqlite(("SQLite")) -.-> sqlite/SQLiteGroup(["SQLite"]) sqlite/SQLiteGroup -.-> sqlite/init_db("Create SQLite Database") sqlite/SQLiteGroup -.-> sqlite/make_table("Create New Table") sqlite/SQLiteGroup -.-> sqlite/add_rows("Insert Multiple Rows") sqlite/SQLiteGroup -.-> sqlite/get_all("Select All Rows") sqlite/SQLiteGroup -.-> sqlite/query_where("Filter With WHERE") subgraph Lab Skills sqlite/init_db -.-> lab-552556{{"Объединение таблиц в SQLite"}} sqlite/make_table -.-> lab-552556{{"Объединение таблиц в SQLite"}} sqlite/add_rows -.-> lab-552556{{"Объединение таблиц в SQLite"}} sqlite/get_all -.-> lab-552556{{"Объединение таблиц в SQLite"}} sqlite/query_where -.-> lab-552556{{"Объединение таблиц в SQLite"}} end

Создание и заполнение таблиц

В этом шаге вы создадите две таблицы: employees (сотрудники) и departments (отделы), и заполните их примерами данных. Эти таблицы будут использоваться в последующих шагах для демонстрации методов объединения таблиц (table joining techniques).

Сначала откройте оболочку SQLite, выполнив следующую команду в терминале:

sqlite3 /home/labex/project/company.db

Эта команда открывает оболочку SQLite и подключается к файлу базы данных с именем company.db. Если файл не существует, SQLite создаст его.

Теперь создайте таблицу employees с помощью следующей SQL-команды:

CREATE TABLE employees (
    id INTEGER PRIMARY KEY,
    name TEXT,
    department_id INTEGER
);

Эта команда создает таблицу с именем employees с тремя столбцами: id, name и department_id. Столбец id является первичным ключом (primary key) и будет однозначно идентифицировать каждого сотрудника.

Далее создайте таблицу departments с помощью следующей SQL-команды:

CREATE TABLE departments (
    id INTEGER PRIMARY KEY,
    name TEXT
);

Эта команда создает таблицу с именем departments с двумя столбцами: id и name. Столбец id является первичным ключом и будет однозначно идентифицировать каждый отдел.

Теперь вставьте несколько примеров данных в таблицу employees:

INSERT INTO employees (name, department_id) VALUES
('Alice', 1),
('Bob', 2),
('Charlie', 1),
('David', 3),
('Eve', NULL);

Эта команда вставляет пять строк в таблицу employees. Каждая строка представляет сотрудника и соответствующий идентификатор отдела (department ID).

Наконец, вставьте примеры данных в таблицу departments:

INSERT INTO departments (name) VALUES
('Sales'),
('Marketing'),
('Engineering');

Эта команда вставляет три строки в таблицу departments. Каждая строка представляет отдел и его название.

Чтобы убедиться, что таблицы были созданы и заполнены правильно, вы можете выполнить следующую SQL-команду:

SELECT * FROM employees;

Ожидаемый вывод:

1|Alice|1
2|Bob|2
3|Charlie|1
4|David|3
5|Eve|

И:

SELECT * FROM departments;

Ожидаемый вывод:

1|Sales
2|Marketing
3|Engineering

Выполнение запросов INNER JOIN

В этом шаге вы узнаете, как использовать предложение INNER JOIN в SQLite. INNER JOIN возвращает строки, когда есть соответствие в обеих таблицах на основе указанного условия.

Основной синтаксис для INNER JOIN:

SELECT column1, column2 FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

В нашем случае мы хотим получить имена сотрудников вместе с названиями их отделов. Для этого выполните следующую SQL-команду:

SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;

Эта команда объединяет таблицы employees и departments на основе соответствия столбца department_id в employees столбцу id в departments. Затем она выбирает имя сотрудника из таблицы employees и название отдела из таблицы departments.

Ожидаемый вывод:

Alice|Sales
Bob|Marketing
Charlie|Sales
David|Engineering

Этот вывод показывает имя сотрудника и название соответствующего отдела. Обратите внимание, что Eve не включена в результат, потому что ее department_id имеет значение NULL, и нет соответствующего отдела. INNER JOIN возвращает только совпадающие строки.

Использование LEFT JOIN для необязательных данных

В этом шаге вы узнаете, как использовать LEFT JOIN в SQLite. LEFT JOIN (или LEFT OUTER JOIN) возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице нет соответствия, для столбцов правой таблицы возвращаются значения NULL. Это полезно, когда вы хотите получить все записи из одной таблицы и включить связанные данные из другой таблицы, если они существуют.

Основной синтаксис для LEFT JOIN:

SELECT column1, column2 FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Чтобы получить всех сотрудников и названия их отделов, даже если сотруднику не назначен отдел, выполните следующую SQL-команду:

SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;

Эта команда объединяет таблицы employees и departments на основе соответствия столбца department_id в employees столбцу id в departments. Она выбирает имя сотрудника из таблицы employees и название отдела из таблицы departments. Поскольку это LEFT JOIN, будут перечислены все сотрудники.

Ожидаемый вывод:

Alice|Sales
Bob|Marketing
Charlie|Sales
David|Engineering
Eve|

Обратите внимание, что Eve указана, но название отдела пустое (NULL), потому что ее department_id имеет значение NULL, и нет соответствующего отдела. Это демонстрирует, как LEFT JOIN включает все строки из левой таблицы (employees), даже если в правой таблице (departments) нет соответствия.

Объединение нескольких таблиц

В этом шаге вы узнаете, как объединять несколько таблиц в SQLite. Объединение более двух таблиц включает в себя объединение данных из нескольких связанных таблиц с использованием нескольких предложений JOIN.

Сначала давайте добавим новую таблицу под названием locations для хранения местоположений отделов. Выполните следующую SQL-команду, чтобы создать таблицу locations:

CREATE TABLE locations (
    id INTEGER PRIMARY KEY,
    department_id INTEGER,
    city TEXT
);

Эта команда создает таблицу с именем locations с тремя столбцами: id, department_id и city.

Далее, вставьте некоторые примеры данных в таблицу locations:

INSERT INTO locations (department_id, city) VALUES
(1, 'New York'),
(2, 'Los Angeles'),
(3, 'Chicago');

Теперь давайте объединим все три таблицы, чтобы получить имена сотрудников, названия отделов и местоположения отделов. Выполните следующую SQL-команду:

SELECT employees.name, departments.name, locations.city
FROM employees
INNER JOIN departments ON employees.department_id = departments.id
INNER JOIN locations ON departments.id = locations.department_id;

Этот запрос сначала объединяет employees и departments на основе employees.department_id = departments.id. Затем он объединяет результат с таблицей locations на основе departments.id = locations.department_id. Это связывает сотрудников с их отделами, а затем с местоположением этих отделов.

Ожидаемый вывод:

Alice|Sales|New York
Bob|Marketing|Los Angeles
Charlie|Sales|New York
David|Engineering|Chicago

Это показывает имя каждого сотрудника, название его отдела и город, в котором расположен его отдел. Eve не включена, потому что ей не назначен отдел.

Фильтрация объединенных результатов

В этом шаге вы узнаете, как фильтровать результаты объединенных таблиц с помощью предложения WHERE в SQLite. Фильтрация позволяет извлекать только те строки, которые соответствуют определенным критериям после операции объединения (join operation).

Чтобы получить имена сотрудников, работающих в отделе продаж (Sales department), выполните следующую SQL-команду:

SELECT employees.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id
WHERE departments.name = 'Sales';

Этот запрос объединяет таблицы employees и departments, а затем фильтрует результаты, чтобы включить только сотрудников, у которых название отдела — 'Sales'.

Ожидаемый вывод:

Alice
Charlie

Это показывает, что Alice и Charlie работают в отделе продаж.

Теперь давайте получим имена сотрудников, работающих в отделах, расположенных в Нью-Йорке (New York). Выполните следующую SQL-команду:

SELECT employees.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id
INNER JOIN locations ON departments.id = locations.department_id
WHERE locations.city = 'New York';

Этот запрос объединяет все три таблицы, а затем фильтрует результаты, чтобы включить только сотрудников, у которых местоположение отдела — Нью-Йорк.

Ожидаемый вывод:

Alice
Charlie

Опять же, Alice и Charlie — единственные сотрудники в отделах, расположенных в Нью-Йорке.

Итог

В этой лабораторной работе вы научились объединять данные из нескольких таблиц в SQLite, используя методы объединения таблиц (table joining techniques). Вы изучили INNER JOIN, который возвращает строки, когда есть совпадение в обеих таблицах, и LEFT JOIN, который возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Вы также узнали, как объединять несколько таблиц и фильтровать объединенные результаты с помощью предложения WHERE. Эти навыки позволят вам эффективно извлекать и объединять данные с помощью SQLite.