Найти тему
Калинкин

Как запросить несколько таблиц в SQL

Прочитайте это руководство по SQL, чтобы узнать, когда использовать SELECT, JOIN, подвыборки и UNION для доступа к нескольким таблицам с помощью одной инструкции.

SQL запросы
SQL запросы

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

Самым последним обозначением синтаксиса SQL является SQL: 2016 ISO, но за десятилетия мало что изменилось для этих базовых операторов запроса. Однако важно отметить, что некоторые базы данных имеют уникальные усовершенствования, которые при неправильном применении могут привести к неожиданным результатам. Пожалуйста, обратитесь к документации вашего производителя, чтобы убедиться, что вы используете правильный диалект для вашей системы.

Используя SELECT

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

SELECT table1.column1, table2.column2 FROM table1, table2 WHERE table1.column1 = table2.column1;

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

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

Этот базовый синтаксис представляет собой простое ВНУТРЕННЕЕ соединение. Некоторые базы данных обрабатывают это точно так же, как явное объединение.

Предложение WHERE выражает критерии — возвращает только те записи, значение в table1.column1 которых равно значению в table2.column1. Результатом является временная таблица, которая содержит значения из двух таблиц, где запись удовлетворяет выражению WHERE.

Стоит отметить, что ваши условия для сравнения не обязательно должны быть результирующим набором. В приведенном выше примере table1.column1 и table2.column1 используются для объединения таблиц, но возвращаются только значения из table2.column2.

Включить более двух таблиц с помощью И (and)

Вы можете расширить эту функциональность до более чем двух таблиц, используя ключевые слова AND в предложении WHERE. Вы также можете использовать такую комбинацию таблиц, чтобы ограничить свои результаты, фактически не возвращая столбцы из каждой таблицы. Например:

SELECT table1.column1, table2.column2 FROM table1, table2, table3 WHERE table1.column1 = table2.column1 AND table1.column1 = table3.column1;

Это использует AND для включения двух условий в предложение WHERE.

Данные поступают из table1.column1 и table2.column2, но только при выполнении обоих условий в предложении WHERE. Table3.column1 ограничивает возвращаемые данные, даже если никакие данные из этой таблицы не попадают в результирующий набор. Обратите внимание, что на table3 должна быть ссылка в предложении FROM .

Имейте в виду, однако, что этот метод запроса нескольких таблиц фактически является подразумеваемым объединением. Ваша база данных может обрабатывать данные по-разному, в зависимости от используемого механизма оптимизации. Кроме того, пренебрежение определением характера корреляции с предложением WHERE может привести к нежелательным результатам, таким как возврат неправильного поля в столбце, связанного со всеми возможными результатами остальной части запроса, как при ПЕРЕКРЕСТНОМ СОЕДИНЕНИИ.

Если вас устраивает, как ваша база данных обрабатывает инструкции такого типа, и вы объединяете две или всего несколько таблиц, простая инструкция SELECT будет соответствовать вашим потребностям.

Используя JOIN

JOIN работает так же, как оператор SELECT выше: он возвращает результирующий набор со столбцами из разных таблиц. Преимущество использования явного ОБЪЕДИНЕНИЯ перед подразумеваемым заключается в том, что оно обеспечивает больший контроль над вашим результирующим набором и, возможно, повышает производительность, когда задействовано много таблиц.

Существует несколько типов JOIN — LEFT, RIGHT, and FULL OUTER; INNER; and CROSS. Тип, который вы используете, определяется результатами, которые вы хотите видеть. Например, использование LEFT OUTER JOIN вернет все соответствующие строки из первой перечисленной таблицы, при этом строки из второй перечисленной таблицы могут быть удалены, если в них нет информации, которая соответствует первой таблице.

Это отличается от INNER JOIN объединения или подразумеваемого JOIN. INNER JOIN вернет только строки, для которых есть данные в обеих таблицах. Сравните следующий запрос после использования JOIN вместо WHERE:

SELECT table1.column1, table2.column2 FROM table1 INNER JOIN table2
ON table1.column1 = table2.column1;

Сопоставляющий столбец остается тем же самым, table2.column1, даже если запрос не извлекает данные из этого столбца.

Использование подзапросов

Подзапросы, или операторы subselect, - это способ использования результирующего набора в качестве ресурса в другом запросе для ограничения или уточнения результатов. Альтернативой часто являются множественные запросы или нежелательные манипуляции с необработанными данными.

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

SELECT column1 FROM table1 WHERE EXISTS ( SELECT column1 FROM table2 WHERE table1.column1 = table2.column1 );

Одна таблица, table1, содержит возвращаемые данные, в то время как другая, table2, предоставляет значение сравнения для определения данных, фактически возвращенных из table1.

Одним из важных соображений при использовании подзапросов является производительность. Удобство имеет свою цену, и в зависимости от размера, количества и сложности таблиц и инструкций, которые вы используете, вы можете разрешить своему приложению обрабатывать обработку.

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

Используя UNION

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

SELECT column1, column2, column3 FROM table1 UNION SELECT column1, column2, column3 FROM table2;

Этот оператор объединяет данные из table1 и table2 и возвращает результирующий набор с тремя столбцами, содержащими данные из обоих запросов. Нет соединения или условия, которым нужно соответствовать.

По умолчанию оператор UNION будет пропускать дубликаты между таблицами, если не используется ключевое слово UNION ALL.

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

SELECT column1, column2 as Two, column3 as Three FROM table1 UNION SELECT column1, column4 as Two, column5 as Three FROM table2;

Результирующий набор будет состоять из трех столбцов, column1, Two и Three, где два содержат значения из table1.column2 и table2.column4, а три содержат значения из table1.column3 и table2.column5.

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

Когда использовать SELECT, JOIN, UNION или подзапросы

Когда дело доходит до запросов к базе данных, обычно существует множество способов решения одной и той же проблемы, но один из них обычно оказывается более эффективным, чем другие. Мы рассмотрели некоторые из наиболее часто используемых методов консолидации данных в нескольких таблицах. Хотя некоторые из этих параметров могут повлиять на производительность, практика поможет вам понять, когда целесообразно использовать каждый тип запроса.