Как вывести значения из разных таблиц sql
Перейти к содержимому

Как вывести значения из разных таблиц sql

  • автор:

Использование в запросе нескольких источников записей

т.е. соединяются только те строки таблиц, у которых в указанных полях находятся равные значения (эквисоединение). Естественно, могут быть использованы любые условия, хотя эквисоединение используется чаще всего, поскольку эта операция воссоздает некую сущность, декомпозированную на две других в результате процедуры нормализации.

Если разные таблицы имеют столбцы с одинаковыми именами, то для однозначности требуется использовать точечную нотацию:

В тех случаях, когда это не вызывает неоднозначности, использование данной нотации не является обязательным.

model maker
1232 A
1260 E

Иногда в предложении FROM требуется указать одну и ту же таблицу несколько раз. В этом случае обязательным является переименование.

model_1 model_2
1232 1233
1232 1260

Обратите внимание, что в этом случае в других предложениях оператора SELECT уже нельзя использовать квалификатор Product, поскольку таблица Product уже не используется. Вместо него используется псевдоним prod. Кроме того, ссылаться теперь можно только на те поля таблицы Product, которые перечислены в подзапросе.

Явные операции соединения

В предложении FROM может быть указана явная операция соединения двух и более таблиц. Среди ряда операций соединения, описанных в стандарте языка SQL, многими серверами баз данных поддерживается лишь операция соединения по предикату. Синтаксис соединения по предикату имеет вид:

Соединение может быть либо внутренним (INNER), либо одним из внешних (OUTER). Служебные слова INNER и OUTER можно опускать, поскольку внешнее соединение однозначно определяется его типом — LEFT (левое), RIGHT (правое) или FULL (полное), а просто JOIN будет означать внутреннее соединение.

Предикат определяет условие соединения строк из разных таблиц. При этом INNER JOIN означает, что в результирующий набор попадут только те соединения строк двух таблиц, для которых значение предиката равно TRUE. Как правило, предикат определяет эквисоединение по внешнему и первичному ключам соединяемых таблиц, хотя это не обязательно.

maker model_1 model_2 price
A 1232 1232 600.0
A 1232 1232 400.0
A 1232 1232 350.0
A 1232 1232 350.0
A 1233 1233 600.0
A 1233 1233 950.0
A 1233 1233 980.0
B 1121 1121 850.0
B 1121 1121 850.0
B 1121 1121 850.0
E 1260 1260 350.0

Внешнее соединение LEFT JOIN означает, что помимо строк, для которых выполняется условие предиката, в результирующий набор попадут все остальные строки из первой таблицы (левой). При этом отсутствующие значения полей из правой таблицы будут заполнены NULL-значениями.

maker model_1 model_2 price
A 1232 1232 600.0
A 1232 1232 400.0
A 1232 1232 350.0
A 1232 1232 350.0
A 1233 1233 600.0
A 1233 1233 950.0
A 1233 1233 980.0
B 1121 1121 850.0
B 1121 1121 850.0
B 1121 1121 850.0
E 2111 NULL NULL
E 2112 NULL NULL
E 1260 1260 350.0

Поскольку моделей 2111 и 2112 из таблицы Product нет в таблице PC, в полях из таблицы PC содержится NULL.
Соединение RIGHT JOIN обратно соединению LEFT JOIN, т.е. в результирующий набор попадут все строки из второй таблицы, которые будут соединяться только с теми строками из первой таблицы, для которых выполняется условие соединения. В нашем случае левое соединение

Product LEFT JOIN PC ON PC.model = Product.model

будет эквивалентно правому соединению

PC RIGHT JOIN Product ON PC.model = Product.model

a b c d
1 2 NULL NULL
2 1 2 4
NULL NULL 3 3

Заметим, что это соединение симметрично, т.е. «A FULL JOIN B» эквивалентно «B FULL JOIN A». Обратите также внимание на обозначение A.*, что означает «все поля таблицы А».

SQL — Урок 6. Объединение таблиц (внутреннее объединение)

Предположим, мы хотим узнать, какие темы, и какими авторами были созданы. Для этого проще всего обратиться к таблице Темы (topics):

Но, что если нам необходимо, чтобы в ответе на запрос были не идентификаторы авторов, а их имена? Вложенные запросы нам не помогут, т.к. в конечном итоге они выдают данные из одной таблицы. А нам надо получить данные из двух таблиц (Темы и Пользователи) и объединить их в одну. Запросы, которые позволяют это сделать, в SQL называются Объединениями.

Синтаксис самого простого объединения следующий:

SELECT имена_столбцов_таблицы_1, имена_столбцов_таблицы_2 FROM имя_таблицы_1, имя_таблицы_2;

Давайте создадим простое объединение:

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

Чтобы результирующая таблица выглядела так, как мы хотели, необходимо указать условие объединения. Мы связываем наши таблицы по идентификатору автора, это и будет нашим условием. Т.е. мы укажем в запросе, что необходимо выводить только те строки, в которых значения поля id_author таблицы topics совпадают со значениями поля id_user таблицы users:

На схеме будет понятнее:

Т.е. мы в запросе сделали следующее условие: если в обеих таблицах есть одинаковые идентификаторы, то строки с этим идентификатором необходимо объединить в одну результирующую строку.

    Если в одной из объединяемых таблиц есть строка с идентификатором, которого нет в другой объединяемой таблице, то в результирующей таблице строки с таким идентификатором не будет. В нашем примере есть пользователь Oleg (id=5), но он не создавал тем, поэтому в результате запроса его нет.

Вообще, корректный синтаксис объединения с условием выглядит так:

SELECT имя_таблицы_1.имя_столбца1_таблицы_1, имя_таблицы_1.имя_столбца2_таблицы_1, имя_таблицы_2.имя_столбца1_таблицы_2, имя_таблицы_2.имя_столбца2_таблицы_2 FROM имя_таблицы_1, имя_таблицы_2 WHERE имя_таблицы_1.имя_столбца_по_которому_объединяем = имя_таблицы_2.имя_столбца_по_которому_объединяем;

Если имя столбца уникально, то название таблицы можно опустить (как мы делали в примере), но делать это не рекомендуется.

Как вы понимаете, объединения дают возможность выбирать любую информацию из любых таблиц, причем объединяемых таблиц может быть и три, и четыре, да и условие для объединения может быть не одно.

Для примера давайте создадим запрос, который покажет нам все сообщения, к каким темам они относятся и авторов этих сообщений. Конечно, вся эта информация хранится в таблице Сообщения (posts):

Но чтобы вместо идентификаторов отображались имена и названия, нам придется сделать объединение трех таблиц:

Т.е. мы объединили таблицы Сообщения и Пользователи условием posts.id_author=users.id_user, а таблицы Сообщения и Темы — условием posts.id_topic=topics.id_topic

Объединения, которые мы сегодня рассматривали, называются Внутренними объединениями. Такие объединения связывают строки одной таблицы со строками другой таблицы (а может еще и третьей таблицы). Но бывают ситуации, когда необходимо, чтобы в результат были включены строки, не имеющие связанных. Например, когда мы создавали запрос, какие темы и какими авторами были созданы, пользователь Oleg в результирующую таблицу не попал, т.к. тем не создавал, а потому и связанной строки в объединяемой таблице не имел.

Поэтому, если нам потребуется составить несколько иной запрос — вывести всех пользователей и темы, которые они создавали, если таковые имеются — то нам придется воспользоваться Внешним объединением, позволяющим выводить все строки одной таблицы и имеющиеся связанные с ними строки из другой таблицы. О таких объединениях мы и будем говорить в следующем уроке.

Программирование на Python для начинающих

Онлайн-курс. Освойте востребованную профессию с зарплатой от 70 000 руб в месяц!

Теперь нажмите кнопку, что бы не забыть адрес и вернуться к нам снова.

Как вывести значения из разных таблиц sql

В предыдущих статьях описывалась работа только с одной таблицей базы данных. В реальности же очень часто приходится делать выборку из нескольких таблиц, каким-то образом объединяя их. В данной статье вы узнаете основные способы соединения таблиц.

Например, если мы хотим получить информацию о тратах на покупки, мы можем её получить следующим образом:

MySQL
SELECT family_member, amount * unit_price AS price FROM Payments 
family_member price
1 2000
2 2100
3 100
4 350
4 300
5 100
2 120
2 5500
5 230
3 2200
2 66000
1 40
3 100
3 1200

В поле family_member полученной выборки отображаются идентификаторы записей из таблицы Payments , но для нас они мало что значат.

Вместо этих идентификаторов было бы гораздо нагляднее выводить имена тех, кто покупал (поле member_name из таблицы FamilyMember ). Ровно для этого и существует объединение таблиц и оператор JOIN .

MySQL
SELECT поля_таблиц FROM таблица_1 [INNER] | [[LEFT | RIGHT | FULL][OUTER]] JOIN таблица_2 ON условие_соединения [INNER] | [[LEFT | RIGHT | FULL][OUTER]] JOIN таблица_n ON условие_соединения] 

Как можно увидеть по структуре, соединение бывает:

  • внутренним INNER (по умолчанию)
  • внешним OUTER , при этом внешнее соединение делится на левое LEFT , правое RIGHT и полное FULL

С более подробными деталями, чем отличается внутреннее соединение от внешнего и как они работают, мы познакомимся в следующих статьях.

Пока нам достаточно лишь знать, что для вышеописанного примера с запросом на покупки нам понадобится именно запрос с внутренним соединением, который будет выглядеть следующим образом:

MySQL
SELECT family_member, member_name, amount * unit_price AS price FROM Payments INNER JOIN FamilyMembers ON Payments.family_member = FamilyMembers.member_id 
family_member member_name price
1 Headley Quincey 2000
2 Flavia Quincey 2100
3 Andie Quincey 100
4 Lela Quincey 350
4 Lela Quincey 300
5 Annie Quincey 100
2 Flavia Quincey 120
2 Flavia Quincey 5500
5 Annie Quincey 230
3 Andie Quincey 2200
2 Flavia Quincey 66000
1 Headley Quincey 40
3 Andie Quincey 100
3 Andie Quincey 1200

В данном запросе мы сопоставляем записи из таблицы Payments и записи из таблицы FamilyMembers .

Чтобы сопоставление работало, мы указываем как именно записи из двух разных таблиц должны находить друг друга. Это условие указывается после ON :

MySQL
ON Payments.family_member = FamilyMembers.member_id 

В нашем случае поле family_member указывает на идентификатор в таблице FamilyMembers и таким образом помогает однозначному сопоставлению.

В большинстве случаев условием соединения является равенство столбцов таблиц (таблица_1.поле = таблица_2.поле), однако точно так же можно использовать и другие операторы сравнения.

Как вывести две колонки из двух разных таблиц в одном запросе?

Две таблицы из разных БД в одном запросе
Вообщем как это можно организовать. Не хотелось просто что бы одинаковые поля были в двух.

SQL Уникальность на две колонки из разных таблиц
Сделать уникальность на две колонки внутри одной таблицы, нет проблем: CREATE TABLE IF NOT EXISTS.

Выгрузка данных с разных таблиц в одном запросе
Подскажите как сделать. Есть две таблицы: Users и UserData. В таблице UserData есть ссылка на id .

Проблема при подсчете строк из разных таблиц в одном запросе
Всем доброго времени суток! Возникла проблема от которой уже мозг кипит. Суть вот в чем: у нас.

1312 / 944 / 144
Регистрация: 17.01.2013
Сообщений: 2,348

"Колонки" . хмм. лежат. ну, пусть будет "лежат". так вот, они "лежат" в своих таблицах в хаотическом порядке и извлекаются так, как это удобно серверу.
То есть один и тот же запрос сегодня выведет их в таком порядке, а завтра (или через секунду) может вывести совершенно в другом.

Для того, чтобы извлечь данные в нужном вам порядке, необходимо в запросе указать этот порядок явным образом (ORDER BY . ).

Задачу в вашей постановке можно решить только в том случае, если неважно, какое имя будет сопоставлено той или иной фамилии.

Добавить комментарий

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