14. Работа с подзапросами, временными таблицами и табличными переменными

Запрос SELECT может быть вложен в любую из команд INSERT , UPDATE , DELETE и, конечно, других команд SELECT . Большинство подзапросов могут быть реализованы с помощью объединений. Однако это не всегда возможно. Однако, если есть такая возможность, мы должны просто использовать соединения. Это улучшит производительность запроса и, следовательно, время его выполнения.
Синтаксис самого подзапроса довольно прост. Каждый из них заключен в круглые скобки, и каждый может содержать любое количество подзапросов. Как обычно, единственным ограничением является здравый смысл и возможности нашего сервера. Время, например. Теперь мы напишем сценарий, который возвращает всех заместителей председателя в компании AdventureWorks .

ВЫБЕРИТЕ FirstName, LastName
ОТ персоны.Контакт
ГДЕ (ContactID В
(ВЫБЕРИТЕ ContactID
FROM HumanResources.Employee
ГДЕ (название НРАВИТСЯ '% вице-президент%')))

Вложенный запрос возвращает все контакты из таблицы Employee в схеме HumanResources, которые занимают должности заместителя председателя. Затем внешний вопрос выбирает имена и фамилии тех людей, которые имеют ContactID в результатах внутренних запросов. Вы можете перевести это следующим образом.

ВЫБЕРИТЕ FirstName, LastName
ОТ персоны.Контакт
ГДЕ УКАЗАНО контактный номер (1001, 1052, 1010)

Где числа в наборе (в круглых скобках) являются результатами запроса, возвращающего соответствующий ContactID .
Мы смогли бы достичь того же результата с помощью объединений. Альтернативный запрос будет:

ВЫБЕРИТЕ Person.Contact.FirstName, Person.Contact.LastName
ОТ ЛИЦА. КОНТАКТ ВНУТРЕННЯЯ РЕШЕНИЕ
HumanResources.Employee ON Person.Contact.ContactID = HumanResources.Employee.ContactID
ГДЕ (HumanResources.Employee.Title LIKE '% вице-президент%')

В первом и втором примерах подзапросов они возвращали только один столбец. В таких случаях вы можете использовать операторы =, <,>, <=,> =, <>. Однако подзапросы могут также возвращать много строк, которые можно использовать для проверки существования значения. В этом случае мы используем ключевое слово EXISTS в предложении WHERE .

ВЫБЕРИТЕ FirstName, LastName
ОТ персоны.Контакт
ГДЕ СУЩЕСТВУЕТ
(Выберите контакт, название
FROM HumanResources.Employee
ГДЕ (Person.Contact.ContactID = ContactID) И (Название НРАВИТСЯ '% вице-президент%'))

В предложении WHERE у нас есть прямой подзапрос, который возвращает таблицу со строками. Команда EXISTS проверяет, возвращается ли какое-либо значение внутренним запросом. Если это так, он возвращает внешний запрос и печатает имя и фамилию, в противном случае он пропускает запись. Здесь мы можем видеть довольно специфическое предложение WHERE во подзапросах во внутреннем запросе. Он берет значения из внешней таблицы запросов и сравнивает их со значением, возвращаемым подзапросом. При отправке ограничений в подзапросах следует помнить одно очень важное правило. Все значения, которые происходят из внешних запросов, видны во внутренних запросах, но не наоборот! Организация ограничений, которые применяются к подзапросам.

  1. его нельзя использовать в предложении ORDER BY (это просто не имеет смысла, если вы все равно выбираете набор данных)
  2. внутренний запрос должен быть заключен в скобки
  3. в предложении WHERE IN не может быть более одного столбца

@ @ HOME

Для тех, кто только начинает свое приключение с подзапросов SQL, они не кажутся слишком обнадеживающими. Однако понимание механизма создания вложенных запросов является довольно важной проблемой при работе с профессиональными базами данных. Игнорирование этого раздела может иногда препятствовать загрузке правильных данных.

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

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

ВЫБЕРИТЕ ContactID
INTO #tblTeorary
FROM HumanResources.Employee
ГДЕ (название НРАВИТСЯ '% вице-президент%')
ВЫБЕРИТЕ Person.Contact.FirstName, Person.Contact.LastName
FROM Person.Contact ВНУТРЕННИЙ ПРИСОЕДИНЯЙТЕСЬ #tblTeven ON Person.Contact.ContactID = # tblTeven.ContactID

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

Как упоминалось ранее, структура, аналогичная временным таблицам, является табличными переменными. Табличные переменные - это новый тип данных, который был представлен в MS SQL Server 2005 . Теперь у нас есть возможность объявить переменную, которая будет отражать все таблицы.

ОБЪЯВИТЬ @tblTeorary TABLE (ContactID int)
INSERT INTO @tblTeven (HumanResources.Employee.ContactID)
SELECT HumanResources.Employee.ContactID
FROM HumanResources.Employee
ГДЕ (название НРАВИТСЯ '% вице-президент%')
ВЫБЕРИТЕ Person.Contact.FirstName, Person.Contact.LastName
ОТ персоны.Контакт
ГДЕ Person.Contact.ContactID IN
(
ВЫБЕРИТЕ ContactID
ОТ @tblTeorary
)

Первый этап - объявление переменной типа таблицы. Объявление выполняется следующим образом: сначала ключевое слово DECLARE, затем имя переменной (имена переменных в SQL Server всегда предшествуют @), затем тип переменной. Тип переменной, конечно, может варьироваться в зависимости от необходимости. В нашем случае, поскольку мы использовали табличную переменную, мы должны поставить имя и тип столбца в обычных круглых скобках. Если вы хотите, чтобы наша таблица содержала более одного столбца, разделяйте записи запятой. Затем мы используем переменную, как обычную таблицу.

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

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

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

Похожие

Samsung Galaxy J3 (2016)
... ия тестов для премиум-модели будет на короткое время прервана с интересной ценой, выгодным смартфоном из предложения HGSPOT s"> Серия тестов для премиум-модели будет на короткое время прервана с интересной ценой, выгодным смартфоном из предложения HGSPOT s. Это смартфон Samsung Galaxy J3 (2016) от Samsung, который по довольно доступной цене предлагает солидный экран и характерный дизайн Samsung. Что бы ни делала Galaxy J3,
iPad Air 2 с iOS 9 и работающий в Windows
Новая мобильная система Apple полна новых продуктов, которые вы можете жить в Польше смотреть только на скриншотах , Однако это не меняет того факта, что iOS 9 является действительно изысканной системой. Хотя Тим Кук и Джони Айв фактически копируют конкурентные решения, высококачественное и усовершенствованное программное обеспечение Apple