Объединение таблиц SQL
Зачастую при работе с базой данных нам требуется сделать выборку данных сразу из нескольких таблиц. Данная статья раскрывает как осуществить объединение таблиц SQL.
Пример запроса сразу к двум таблицам:
1 | SELECT name, title FROM users, products; |
Пример запроса с одноимёнными полями:
На первом месте имя таблицы или псевдоним, а на втором название поля. Если имя поля уникальное для выбранных таблиц, то указывать таблицу или псевдоним не обязательно.
1 2 3 | SELECT users.id, name, products.id, title FROM users, products; -- или SELECT us.id, name, prod.id, title FROM users AS us, products AS prod; |
Объединение двух таблиц в одном запросе:
1 | SELECT u.name, o.price FROM users u, orders o WHERE o.user_id = u.id; |
Создание виртуального дубликата одной и той же таблицы:
1 | SELECT u.name, o.surname FROM users u, users o; |
Вложенные запросы
Используются для получения данных из разных таблиц.
1 2 3 4 5 6 7 | -- получение всех имён пользователей, которые делали заказы. -- Выбор данных идёт из разных таблиц -- Вложенный запрос должен возвращать только одно значение SELECT name FROM users WHERE id = (SELECT id_user FROM orders WHERE USER = users.name); -- Если подзапрос возвращает множество: SELECT name FROM users WHERE id IN (SELECT id_user FROM orders WHERE USER = users.name); |
Оператор EXISTS
Определяет подзапрос как true или false
1 2 3 4 5 | -- получение всех имён пользователей, которые делали заказ и сумма заказа > 1000 -- внешний запрос выполняется если подзапрос возвращает истину SELECT name FROM users WHERE EXISTS ( SELECT id_user FROM orders WHERE USER = users.name AND order_price > 1000 ); |
1 2 3 | SELECT * FROM users WHERE name = "Ivan" AND EXISTS ( SELECT id_user FROM orders WHERE order_price > 1000 ); |
Оператор UNION
Объединение полей из двух и более таблиц.
Результаты из таблиц будут выведены один под другим. То есть если в одной таблице 4 строки и в другой 4 строки, то в результирующей выборке будет 8 строк. Количество полей в обоих таблицах должно быть одинаковым!
1 | SELECT name FROM users UNION SELECT name FROM orders; |
Оператор JOIN
Бывает двух видов: внутреннее и внешнее объединение таблиц.
Оператор JOIN упрощает запрос и является альтернативой стандартного объединения данных из разных таблиц. INNER JOIN и JOIN это одно и тоже, оператор INNER может опускаться.
Внутреннее объединение INNER JOIN
Получение связанных данных из нескольких таблиц по определённому столбцу (связи полей). Не связанные данные пропускаются!
1 2 3 4 | -- внутреннее объединение с таблицей orders -- где после ON мы указываем связи между таблицами SELECT u.name, o.order FROM users u INNER JOIN orders o ON orders.user_id = users.id WHERE u.name = 'Ivan'; |
Внешнее объединение LEFT и RIGHT OUTER JOIN
Не связанные данные так же выведутся в результате запроса. Не связанные данные получат значение NULL.
-
Левое внешнее объединение:
1 2 3 4
-- таблица user будет находиться слева и из неё берутся все значения, -- а из таблицы orders берутся все связанные значения, а остальные заменяются на NULL SELECT u.name, o.order FROM users u LEFT OUTER JOIN orders o ON orders.user_id = users.id;
-
Правое внешнее объединение:
1 2 3 4
-- таблица orders будет находиться справа и из неё будут браться все значения, -- а из таблицы users берутся все связанные значения, а остальные заменяются на NULL SELECT u.name, o.order FROM users u RIGHT OUTER JOIN orders o ON orders.user_id = users.id;
4 января 2018 /
63427 Views /
10 комментариев