Объединение таблиц SQL

Объединение или слияние таблиц

Здравствуйте и вновь добро пожаловать на занятия по теме «SQL для маркетологов».

До сих пор мы работали с таблицей «Действия клиента» – user_actions, содержащей имена клиентов, интересующий их продукт, предпринимаемое ими действие, будь то просмотр, добавление в корзину и покупка, а также цену. Но, разумеется, возникает необходимость и в наличии таблицы users – «Клиенты», которая может содержать такую информацию, как местоположение клиента, его возраст и любые другие данные, которые могут быть использованы для анализа.

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

Итак, первый тип объединения называется внутренним объединением. Тут появляются новые служебные слова – INNER JOIN, при помощи которых мы выбираем вторую таблицу для объединения, и ON, при помощи которого мы выбираем, как объединить две таблицы:

SELECT users.name, product, location

FROM user_actions

INNER JOIN users

ON user_actions.name = user.name;

Обратите внимание, что вы можете объединить несколько столбцов, хотя мы объединяем только один – «Имя».

А что в нашем примере случилось с Алисой и Кэрол? Они исчезли, поскольку Алиса не фигурирует в таблице «Действия клиента», а Кэрол нет в таблице «Клиенты». Именно поэтому объединение и называется внутренним.

Теперь рассмотрим внешние объединения.

При полном внешнем объединении единственное отличие в синтаксисе заключается в том, что вместо служебного слова INNER JOIN мы используем FULL OUTER JOIN:

SELECT users.name, product, location

FROM user_actions

FULL OUTER JOIN users

ON user_actions.name = user.name;

Здесь мы также объединяем по полю «Имя». Заметьте, что Алиса и Кэрол вновь появились, но по причине отсутствующей по ним информации соответствующие поля остаются пустыми. Обратите внимание, что SQLite не поддерживает полное внешнее объединение, но остальные базы данных SQL такую поддержку имеют.

Левое внешнее объединение имеет синтаксис

SELECT users.name, product, location

FROM user_actions

LEFT OUTER JOIN users

ON user_actions.name = user.name;

В этом случае Кэрол остаётся, а Алиса исчезает, поскольку Алиса была в правой таблице. SQLite поддерживает левое внешнее объединение.

И рассмотрим правое внешнее объединение – противоположность левому полному. Синтаксис:

SELECT users.name, product, location

FROM user_actions

RIGHT OUTER JOIN users

ON user_actions.name = user.name;

При этом Алиса остаётся, а Кэрол исчезает.

Как ни странно, но SQLite хотя поддерживает левое внешнее объединение, правое внешнее объединение оно не поддерживает.

Объединения в командной строке

Сейчас мы рассмотрим простой пример внутреннего объединения.

Для начала создадим таблицу «Клиенты» с полями name (текстовый формат), age (целочисленный формат) и location (текстовый формат):

create table users(name text, age integer, location text);

Теперь импортируем данные о клиентах из csv-файла:

.mode csv

.import users.csv users

Проверим, всё ли правильно:

select * from users;

Теперь совершим собственно внутреннее объединение:

select users.name, product, location from user_actions inner join users where user_actions.name = users.name

Обратите внимание, что мы должны указывать интересующее нас имя, иначе SQLite будет указывать на неоднозначность команды.

Андрей Никитенко
Андрей Никитенко
Задать вопрос эксперту
Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Share via
Copy link