SQLite - UNIONS Clause
Привет, будущие маги баз данных! Сегодня мы отправимся в увлекательное путешествие в мир SQLite и рассмотрим магическую claузу UNIONS. Как ваш добрый соседский компьютерный учитель, я буду вести вас через это приключение шаг за шагом. Так что возьмите ваши виртуальные палочки (клавиатуры), и давайте начнем!
Что такое UNION?
Представьте, у вас есть два отдельных списка ваших любимых вкусов мороженого - один с прошлого лета и один с этого лета. А что если бы вы хотели объединить эти списки в один超级 список всех ваших любимых вкусов? Именно это делает UNION в SQLite, но с таблицами баз данных вместо вкусов мороженого!
Claуза UNION в SQLite позволяет вам объединить результирующие наборы двух или более операторов SELECT. Это как создание большой вечеринки, где разные группы данных могут общаться и образовывать новую, большую группу.
Основная синтаксис
Основная синтаксис UNIONS выглядит так:
SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;
Давайте разберем это:
- У нас есть два оператора SELECT.
- Каждый оператор SELECT может запрашивать разные таблицы.
- Ключевое слово UNION находится между этими операторами, действуя как мост.
Важные правила
Прежде чем мы перейдем к примерам, давайте рассмотрим некоторые важные правила использования UNIONS:
- Количество и порядок столбцов во всех операторах SELECT должны быть такими же.
- Типы данных соответствующих столбцов должны быть совместимыми.
- По умолчанию 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 не только для развлечения - у них есть реальное применение! Вот несколько сценариев, где вы можете их использовать:
- Объединение данных из нескольких таблиц с аналогичными структурами (как в нашем примере с сотрудниками и подрядчиками).
- Создание отчетов, охватывающих разные временные периоды или категории.
- Объединение данных из разных баз данных или источников данных.
Давайте рассмотрим более сложный пример. Представьте, что мы управляем书店 и хотим увидеть все транзакции, будь то покупки или возвраты:
-- Создание и заполнение таблицы '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 для объединения покупок и возвратов, добавили столбец для различия типов транзакций и отсортировали результаты по дате.
Советы и хитрости
-
Сортировка результатов: Вы можете добавить claузу ORDER BY в конце вашего запроса UNION, чтобы отсортировать объединенные результаты.
-
Фильтрация объединенных результатов: Используйте claузу WHERE в каждом операторе SELECT для фильтрации отдельных таблиц, или оберните ваш запрос UNION в подзапрос и примените claузу WHERE для фильтрации объединенных результатов.
-
Использование псевдонимов столбцов: Если ваши столбцы имеют разные имена в разных таблицах, вы можете использовать псевдонимы, чтобы они matches:
SELECT name AS person, department FROM employees
UNION
SELECT contractor_name AS person, dept AS department FROM contractors;
- Объединение более чем двух таблиц: Вы не ограничены только двумя таблицами - вы можете последовательно добавлять 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