Привет, посетитель сайта ZametkiNaPolyah.ru! Продолжаем изучать базы данных и наше знакомство с библиотекой SQLite3.В данной записи мы с вами разберемся с тем, как работает клаузула UNION в языке SQL и реляционных базах данных на примере библиотеки SQLite3. Отмечу, что UNION позволяет выполнять объединение результатов работы двух и более SQL предложений SELECT.  По умолчанию, если в результирующих таблицах встречаются эквивалентные строки, то в результате объединения одна строка будет отброшена. Если вам нужно, чтобы дублирующиеся строки не отбрасывались, используйте модификатор ALL: UNION ALL.

Объединение SQL запросов в базах данных: UNION и SELECT в SQLite

Объединение SQL запросов в базах данных: UNION и SELECT в SQLite

В это записи мы поговорим про особенности работы уточняющей фразы UNION в SQL на примере SQLite, а также рассмотрим несколько примеров объединения запросов SELECT при помощи клаузулы UNION.

Использование UNION для объединения SQL запросов в базах данных SQLite

Объединение SQL запросов SELECT в базах данных SQLite реализуется при помощи клаузулы UNION, как и во многих других реляционных СУБД. Объединенные запросы SELECT можно считать подзапросами, но это будет не совсем верно. Так же не стоит путать объединение запросов с объединением таблиц. Ключевое слово JOIN выполняет операцию объединение таблиц, в то время как объединение запросов выполняется при помощи UNION.

Объединение запросов SELECT при помощи уточняющей фразы UNION нельзя считать подзапросом SELECT хотя бы по той причине, что обычно подзапросы выполняются для связанных таблиц, например, при помощи ограничения внешнего ключа FOREIGN KEY. А объединение таблиц предикатом UNION выполняется для таблиц никак не связанных, но со схожей структурой.

В базах данных SQLite3 реализовано два варианта объединения запросов: первый вариант заключается в использование ключевого слова UNION и в результирующей таблице мы получаем неповторяющиеся строки, второй вариант заключается в использование фразы UNION ALL, в этом случае SQLite составит результирующую таблицу с повторениями.

Первый вариант выполняется несколько медленнее, так как, выполняя запрос на объединение UNION, SQLite сравнивает значения строк. Поэтому важно помнить, что SQLite – это СУБД с динамической типизацией данных, в которой понятие тип заменено на класс данных, а столбцам мы можем задать аффинированный тип данных, который используется лишь для сравнения значений.

При помощи клаузулы UNION мы можем объединять два и более запроса.  Но очень важно помнить, что для того, чтобы UNION корректно сработал нужно: чтобы результирующие таблицы каждого из SQL запросов имели одинаковое число столбцов, с одним и тем же типом данных и в той же самой последовательности. Хотя на счет типов данных и SQLite3 – спорный момент, так как тип данных может быть преобразован динамически.

Пожалуй, мы сказали всё, что нужно знать для использования команды SELECT и уточняющую фразу UNION, теперь вы представляете, как происходит объединение запросов в реляционных базах данных. Давайте теперь рассмотрим примеры использования SELECT и UNION.

Примеры использования SELECT и UNION в базах данных SQLite3. Как объединить два запроса SELECT

Примеры использования SELECT и UNION очень простые, потому что в объединение двух запросов ничего сложного нет. Давайте попробуем написать команду SELECT, использующую предикат UNION, но для начала мы создадим две таблицы в базе данных при помощи команды CREATE TABLE:

[php]

CREATE TABLE company1 (

id INTEGER PRIMARY KEY,

name TEXT NOT NULL,

pro TEXT NOT NULL,

sex TEXT NOT NULL,

sal REAL CHECK (sal > 15000)

);

CREATE TABLE company2 (

id INTEGER PRIMARY KEY,

name TEXT NOT NULL,

pro TEXT NOT NULL,

sex TEXT NOT NULL,

age INTEGER NOT NULL,

sal REAL CHECK (sal > 15000)

);

[/php]

Мы создали две практически идентичные таблицы, разница только в том, что во второй есть дополнительный столбец age. В обеих таблицах есть ограничения уровня столбца и ограничения уровня таблицы. Обе эти таблицы имеют ограничение первичного ключа PRIMARY KEY, который, ко всему прочему, является еще и индексом таблицы. Тем самым мы обеспечили целостность данных в нашей базе данных.

Теперь давайте добавим строки в таблицы, для этого есть команда INSERT INTO:

[php]

— Добавляем данные в первую таблицу

INSERT INTO company1 (name, pro, sex, sal)

VALUES (‘Пупкин Матвей’, 'Дантист', ‘м’, 55000.00);

INSERT INTO company1 (name, pro, sex, sal)

VALUES (‘Cумкин Денис’, 'Юрист', ‘м’, 35040.90);

INSERT INTO company1 (name, pro, sex, sal)

VALUES (‘Иванов Иван’, 'Младший юрист', ‘м’, 16000.00);

INSERT INTO company1 (name, pro, sex, sal)

VALUES (‘Маркова Ирина’, 'Бухгалтер', ‘ж’, 31200.10);

INSERT INTO company1 (name, pro, sex, sal)

VALUES (‘Петрова Алина’, 'Менеджер продаж', ‘ж’, 21200.10);

INSERT INTO company1 (name, pro, sex, sal)

VALUES (‘Михайлова Любовь’, 'Секретарь', ‘ж’, 16200.10);

INSERT INTO company1 (name, pro, sex, sal)

VALUES (‘Сидорова Инна’, 'Руководитель отдела обслуживания', ‘ж’, 66200.10);

INSERT INTO company1 (name, pro, sex, sal)

VALUES (‘Михайлова Любовь’, 'Документооборотчик', ‘ж’, 21200.10);-- добавляем строки во вторую таблицу

— обратите внимание: один и тот жеюрист работает в двух компаниях

INSERT INTO company2 (name, pro, sex, age, sal)

VALUES (‘Петрова Валентина’, 'Дантист', ‘ж’, 41, 48000.00);

INSERT INTO company2 (name, pro, sex, age, sal)

VALUES (‘Cумкин Денис’, 'Юрист', ‘м’, 29, 41040.90);

INSERT INTO company2 (name, pro, sex, age, sal)

VALUES (‘Замятин Олег’, 'Младший юрист', ‘м’, 21, 19000.00);

INSERT INTO company2 (name, pro, sex, age, sal)

VALUES (‘Мельдониева Вероника’, 'Терапевт', ‘ж’, 33, 39200.10);

[php]

А теперь сделаем объединение запросов, воспользовавшись командой SELECT и UNION:

[/php]

SELECT * FROM company1

UNION

SELECT * FROM company2;

[/php]

Мы не сможем объединить два этих запроса при помощи UNION, так как результирующие таблицы имеют разное число столбцов, давайте это исправим:

[php]

SELECT name, pro FROM company1

UNION

SELECT name, pro FROM company2;

name    pro

Cумкин Денис    Юрист

Маркова Ирина   Бухгалтер

Михайлова Любовь        Секретарь

Михайлова Любовь        Документооборотчик

Мельдониева Вероника    Терапевт

Пупкин Матвей   Дантист

Петрова Алина   Менеджер продаж

Петрова Валентина       Дантист

Сидорова Инна   Руководитель отдела обслуживания

Замятин Олег    Младший юрист

Иванов Иван     Младший юрист

[/php]

Объединение запросов с повторением строк: UNION ALL и SELECT в SQLite3

Обратите внимание на результат, объединив запросы, мы видим, что юрист Сумкин упомянут только один раз, так как информация о нем есть и в первой, и во второй таблице, давайте это исправим, скомбинировав UNION ALL и SELECT:

[php]

SELECT name, pro FROM company1

UNION ALL

SELECT name, pro FROM company2;

name    pro

Пупкин Матвей   Дантист

Cумкин Денис    Юрист

Иванов Иван     Младший юрист

Маркова Ирина   Бухгалтер

Петрова Алина   Менеджер продаж

Михайлова Любовь        Секретарь

Сидорова Инна   Руководитель отдела обслуживания

Михайлова Любовь        Документооборотчик

Петрова Валентина       Дантист

Cумкин Денис    Юрист

Замятин Олег    Младший юрист

Мельдониева Вероника    Терапевт

[/php]

Теперь мы объединили запросы и увидели в результате таблицу с повторяющимися строками, это произошла благодаря тому, что мы объединяли запросы при помощи фразы UNION ALL. Как видите, ничего сложного в том, что объединять SQL запросы в базах данных SQlite3 нет, нужно просто соблюдать правила UNION и следить за типом данных столбцов.

Возможно, эти записи вам покажутся интересными


Выберете удобный для себя способ, чтобы оставить комментарий

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Loading Disqus Comments ...