SQLite - UNIONS Clause

Привет, будущие маги баз данных! Сегодня мы отправимся в увлекательное путешествие в мир SQLite и рассмотрим магическую claузу UNIONS. Как ваш добрый соседский компьютерный учитель, я буду вести вас через это приключение шаг за шагом. Так что возьмите ваши виртуальные палочки (клавиатуры), и давайте начнем!

SQLite - UNIONS Clause

Что такое UNION?

Представьте, у вас есть два отдельных списка ваших любимых вкусов мороженого - один с прошлого лета и один с этого лета. А что если бы вы хотели объединить эти списки в один超级 список всех ваших любимых вкусов? Именно это делает UNION в SQLite, но с таблицами баз данных вместо вкусов мороженого!

Claуза UNION в SQLite позволяет вам объединить результирующие наборы двух или более операторов SELECT. Это как создание большой вечеринки, где разные группы данных могут общаться и образовывать новую, большую группу.

Основная синтаксис

Основная синтаксис UNIONS выглядит так:

SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;

Давайте разберем это:

  1. У нас есть два оператора SELECT.
  2. Каждый оператор SELECT может запрашивать разные таблицы.
  3. Ключевое слово UNION находится между этими операторами, действуя как мост.

Важные правила

Прежде чем мы перейдем к примерам, давайте рассмотрим некоторые важные правила использования UNIONS:

  1. Количество и порядок столбцов во всех операторах SELECT должны быть такими же.
  2. Типы данных соответствующих столбцов должны быть совместимыми.
  3. По умолчанию UNION удаляет дублирующиеся строки (мы увидим, как это изменить позже).

UNION в действии

Давайте создадим примерные таблицы и посмотрим, как работает UNION!

-- Создание и заполнение таблицы 'employees'
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT
);

INSERT INTO employees (name, department) VALUES
('Алиса', 'HR'),
('Боб', 'IT'),
('Чарли', 'Финансы');

-- Создание и заполнение таблицы 'contractors'
CREATE TABLE contractors (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT
);

INSERT INTO contractors (name, department) VALUES
('Дэвид', 'Маркетинг'),
('Ева', 'IT'),
('Франк', 'HR');

Теперь давайте используем UNION для объединения этих таблиц:

SELECT name, department FROM employees
UNION
SELECT name, department FROM contractors;

Этот запрос вернет:

Алиса    HR
Боб      IT
Чарли    Финансы
Дэвид    Маркетинг
Ева      IT
Франк    HR

Что здесь произошло? Claуза UNION объединила результаты с обеих таблиц, дав нам полный список всех работников (сотрудников и подрядчиков) без duplicatов.

Магия удаления дубликатов

Обратите внимание на что-то интересное? Даже несмотря на то, что у нас есть два человека в отделе HR (Алиса и Франк), они оба appear в нашем результате. Это потому, что UNION автоматически удаляет дублирующиеся строки на основе всех значений столбцов.

Если бы у нас был кто-то с exact же именем и отделом в обеих таблицах, UNION показал бы их только один раз. Например:

INSERT INTO contractors (name, department) VALUES ('Алиса', 'HR');

SELECT name, department FROM employees
UNION
SELECT name, department FROM contractors;

Это дало бы нам такой же результат, как и раньше, без дополнительного 'Алиса' в HR.

Claуза UNION ALL

Иногда вам может понадобиться сохранить все строки, даже если они дублируются. Вот где comes в handy UNION ALL. Это как сказать базе данных: "Я хочу всех на этой вечеринке, даже если у них есть двойники!"

Давайте изменим наш предыдущий запрос:

SELECT name, department FROM employees
UNION ALL
SELECT name, department FROM contractors;

Теперь мы получаем:

Алиса    HR
Боб      IT
Чарли    Финансы
Дэвид    Маркетинг
Ева      IT
Франк    HR
Алиса    HR

Смотрите, как у нас теперь есть два entries для 'Алиса' в HR? UNION ALL сохраняет все строки, regardless of duplication.

Практические приложения

UNION и UNION ALL не только для развлечения - у них есть реальное применение! Вот несколько сценариев, где вы можете их использовать:

  1. Объединение данных из нескольких таблиц с аналогичными структурами (как в нашем примере с сотрудниками и подрядчиками).
  2. Создание отчетов, охватывающих разные временные периоды или категории.
  3. Объединение данных из разных баз данных или источников данных.

Давайте рассмотрим более сложный пример. Представьте, что мы управляем书店 и хотим увидеть все транзакции, будь то покупки или возвраты:

-- Создание и заполнение таблицы 'purchases'
CREATE TABLE purchases (
id INTEGER PRIMARY KEY,
book_title TEXT,
amount DECIMAL(10, 2),
transaction_date DATE
);

INSERT INTO purchases (book_title, amount, transaction_date) VALUES
('Великий Гэтсби', 15.99, '2023-06-01'),
('Убить пересмешника', 12.50, '2023-06-02'),
('1984', 10.99, '2023-06-03');

-- Создание и заполнение таблицы 'returns'
CREATE TABLE returns (
id INTEGER PRIMARY KEY,
book_title TEXT,
amount DECIMAL(10, 2),
transaction_date DATE
);

INSERT INTO returns (book_title, amount, transaction_date) VALUES
('Великий Гэтсби', -15.99, '2023-06-05'),
('Гордость и предубеждение', -14.99, '2023-06-06');

-- Объединение покупок и возвратов
SELECT book_title, amount, transaction_date, 'Покупка' as transaction_type
FROM purchases
UNION ALL
SELECT book_title, amount, transaction_date, 'Возврат' as transaction_type
FROM returns
ORDER BY transaction_date;

Этот запрос даст нам:

Великий Гэтсби       15.99   2023-06-01  Покупка
Убить пересмешника  12.50   2023-06-02  Покупка
1984                 10.99   2023-06-03  Покупка
Великий Гэтсби      -15.99   2023-06-05  Возврат
Гордость и предубеждение -14.99   2023-06-06  Возврат

Здесь мы использовали UNION ALL для объединения покупок и возвратов, добавили столбец для различия типов транзакций и отсортировали результаты по дате.

Советы и хитрости

  1. Сортировка результатов: Вы можете добавить claузу ORDER BY в конце вашего запроса UNION, чтобы отсортировать объединенные результаты.

  2. Фильтрация объединенных результатов: Используйте claузу WHERE в каждом операторе SELECT для фильтрации отдельных таблиц, или оберните ваш запрос UNION в подзапрос и примените claузу WHERE для фильтрации объединенных результатов.

  3. Использование псевдонимов столбцов: Если ваши столбцы имеют разные имена в разных таблицах, вы можете использовать псевдонимы, чтобы они matches:

SELECT name AS person, department FROM employees
UNION
SELECT contractor_name AS person, dept AS department FROM contractors;
  1. Объединение более чем двух таблиц: Вы не ограничены только двумя таблицами - вы можете последовательно добавлять multiple UNION или UNION ALL clauses для объединения многих таблиц.

Общие методы

Вот таблица, резюмирующая общие методы, связанные с UNION в SQLite:

Метод Описание Пример
UNION Объединяет результаты двух или более операторов SELECT и удаляет дубликаты SELECT * FROM table1 UNION SELECT * FROM table2
UNION ALL Объединяет результаты двух или более операторов SELECT и сохраняет все строки, включая дубликаты SELECT * FROM table1 UNION ALL SELECT * FROM table2
ORDER BY Используется с UNION для сортировки объединенных результатов (SELECT * FROM table1 UNION SELECT * FROM table2) ORDER BY column_name
WHERE Используется в отдельных операторах SELECT для фильтрации результатов перед объединением SELECT * FROM table1 WHERE condition UNION SELECT * FROM table2 WHERE condition

И вот оно, друзья! Вы только что повысили свои навыки SQLite, освоив claузу UNION. Помните, что практика делает perfect, так что не бойтесь экспериментировать с этими запросами на своих собственных наборах данных. Удачи в query и пусть ваши UNIONы всегда будут успешными!

Credits: Image by storyset