Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
бд ответы.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
459.25 Кб
Скачать

26.Внутреннее и внешнее соединения join.

Для соединения таблиц с одноименными столбцами или таблицы с самой собой используются алиасы, задаваемые во фразе FROM через пробел после имени таблицы.

Например:

select t1.f1, t1.f2, t2.f1, t2.f2

from tbl1 t1, tbl1 t2

where t1.f1= t2.f2;

Внутреннее соединение (INNER JOIN)

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

Внешнее левое соединение LEFT JOIN [OUTER]

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

Рис. 3.5.  Внешнее левое соединение LEFT JOIN [OUTER]

Внешнее правое соединение RIGHT JOIN [OUTER]

При внешнем правом соединении в результирующий набор будут выбраны все строки из правой таблицы (указываемой второй). При совпадении значений по соединяемым (одноименным) столбцам значения первой таблицы заносятся в результирующий набор в соответствующие строки (рис. 3.6). При отсутствии совпадений в качестве значений первой таблицы проставляется значение NULL.

Рис. 3.6.  Внешнее правое соединение RIGHT JOIN [OUTER]

Полное внешнее соединение FULL JOIN [OUTER]

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

27.Вложенные запросы. Основные правила при задании подзапросов.

Запросы, отделенные круглыми скобками и входящие в состав конструкций HAVING, WHERE, FROM, SELECT и WITH внешнего запроса SELECT или каких-либо других перечисленных запросов, заключающих в себе эти конструкции, называются вложенными запросами.

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

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

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

SELECT * FROM Zakaz WHERE ZakNo = (SELECT ZakNo FROM Zakazchiki WHERE Name = Иванов И.И.) ORDER BY Date;.

Если результат вложенного запроса зависит от результата внешнего, то такой вложенный запрос называется связанным вложенным запросом. Иными словами, вложенный запрос является связанным, если в конструкциях WHERE, HAVING указан столбе, фигурирующий во внешнем запросе. Такая связь имеет название внешней ссылки. В связанных вложенных запросах названия столбцов записываются полностью. Если во внешней конструкции запроса и вложенной используется общая таблица, то столбцам присваиваются псевдонимы. Связанные вложенные запросы обрабатывается в порядке, обратном порядку чтения простых запросов, "снизу вверх", т.е. первой обрабатывается первая строка запроса, которая формирует результирующую таблицу. Затем из таблицы выбираются данные тех столбцов, которые удовлетворяют условиям вложенных запросов. Например, требуется подсчитать общее количество средств перечисленных от заказчиков, фамилии которых начинаются на букву А:

SELECT Z.ZakNo, SUM(Z.NachislSum) FROM Zakaz Z GROUP BY Z.ZakNo HAVING Z.ZakNo = (SELECT O.ZakNo FROM Zakazchiki O WHERE O.ZakNo = Z.ZakNo AND O.FName LIKE А%);.

Подзапрос - это запрос, помещенный внутри другого запроса; его называют также вложенным запросом. Подзапросы возвращают данные, которые используются основным запросом для дальнейшего ограничения выбираемой информации. Вложенный подзапрос - это оператор SELECT, заключенный в круглые скобки и вложенный в команду языка DML, и использующийся в качестве источника данных для параметров SELECT, FROM, WHERE и HAVING.

Каждый подзапрос в свою очередь может содержать в себе подзапрос и т.д. В каждой СУБД существуют ограничения на количество вложенных подзапросов, но обычно этих ограничений хватает, чтобы реализовать задачи любой известной сложности. Вложенные подзапросы всегда применяются тогда, когда для выполнения основного запроса необходимо использовать данные, находящиеся в той же или других таблицах, которые невозможно получить при помощи соединения таблиц.  Все подзапросы можно условно разделить на однострочные и многострочные, а также на простые и коррелированные. Однострочные подзапросы возвращают в качестве результата всегда одну строку, не больше и не меньше, поэтому над результатами выполнения таких запросов можно использовать операции сравнения. Многострочные запросы в общем случае могут вернуть любое количество строк, поэтому над результатами таких подзапросов нельзя использовать операции сравнения (если один из аргументов операции сравнения будет являться пустым множеством или множеством, состоящим более чем из одного элемента, то запрос завершиться с ошибкой). Для таких подзапросов применимы операторы IN и EXISTS.

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

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

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

Существует несколько правил, которым должны следовать подзапросы :  - Подзапросы должны быть заключены в круглые скобки.  - Предложение SELECT подзапроса , как правило , содержит только один столбец; исключением является случай, когда в сравнении участвует не-сколько столбцов основного запроса.  - Предложение ORDER BY может быть использовано только в основном запросе для выполнения всех действий, связанных с упорядочением данных в подзапросе , следует применять предложение GROUP BY.  - Подзапросы , возвращающие более одной строки данных, могут использоваться только с многозначными операторами, такими как, например, оператор IN.  - Не допускается использование в основном запросе оператора BETWEEN; этот оператор может быть использован только внутри подзапроса.  Базовый синтаксис подзапроса имеет следующий вид:  SELECT ИМЯ_СТОЛБЦА  FROM ТАБЛИЦА  WHERE ИМЯ_СТОЛБЦА = (SELECT ИМЯ_СТОЛБЦА  FROM ТАБЛИЦА  WHERE УСЛОВИЯ);

28.Коррелированные подзапросы.

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

Применение коррелированного подзапроса в условии WHERE

Предположим, что Вы хотите получить список всех OrderID, для которых покупатели приобрели не больше 10% от среднего объёма продаж каждого из товаров. Подобный анализ покажет тех покупателей, с которыми нужно связаться, чтобы выяснить причину столь низкого интереса к приобретённому товару. Для этих целей можно использовать коррелированный подзапрос, который будет помещён в предложении WHERE. Вот запрос, который вернет интересующий нас список товаров:

select distinct OrderId

from Northwind.dbo.[Order Details] OD

where

Quantity <= (select avg(Quantity) * .1

from Northwind.dbo.[Order Details]

where OD.ProductID = ProductID)

В приведённом выше запросе коррелированный подзапрос располагается в круглых скобках. Как Вы могли заметить, этот коррелированный подзапрос содержит ссылку на "OD.ProductID". Эта ссылка участвует в сравнении "ProductID" внешнего запроса с "ProductID" внутреннего запроса. Движок SQL Server будет исполнять внутренний запрос (коррелированный подзапрос) для каждой записи "[Order Details]". Этот внутренний запрос подсчитает среднее количество (Quantity) для записей каждого товара (ProductID), отобранных во внешнем запросе. Средствами коррелированного подзапроса будет определено, возвращает ли внутренний запрос значение, удовлетворяющее условию WHERE. Если да, то строка, возвращенная внешним запросом, будет включена в итоговую выборку всего запроса T-SQL.

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

select CompanyName, ContactName, Address,

City, Country, PostalCode from Northwind.dbo.Customers OuterC

where CustomerID in (

select top 2 InnerC.CustomerId

from Northwind.dbo.[Order Details] OD join Northwind.dbo.Orders O

on OD.OrderId = O.OrderID

join Northwind.dbo.Customers InnerC

on O.CustomerID = InnerC.CustomerId

Where Region = OuterC.Region

group by Region, InnerC.CustomerId

order by sum(UnitPrice * Quantity * (1-Discount)) desc

)

order by Region

Как видно из примера, внутренний запрос - коррелированный, потому что он ссылается на "OuterC", псевдоним использующейся во внешнем запросе таблицы "Northwind.DBO.Customer". Внутренний запрос использует значения поля "Region" для определения двух лучших покупателей в каждом регионе, ассоциированных со строкой внешнего запроса. В результирующую выборку попадут записи о тех двух "CustomerID" из внешнего запроса, которые попадут в число лучших покупателей.

29.Операторы подзапросов EXIST, ANY, ALL.

Оператор EXISTS используется, чтобы указать предикату, производить ли подзапросу вывод или нет. В этой главе вы узнаете, как использовать этот оператор со стандартными и (обычно) соотнесёнными подзапросами. EXISTS это оператор, который производит верное или неверное значение, другими словами, булево выражение .Это означает, что он может работать автономно в предикате или в комбинации с другими выражениями, использующими булевы операторы AND, OR и NOT. Он берет подзапрос как аргумент и оценивает его как верный, если тот производит любой вывод, или как неверный, если тот не делает этого. Этим он отличается от других операторов предиката, в которых он не может быть неизвестным. Результатом оператора EXISTS является TRUE или FALSE/,т.е. булево значение(логическое).

Во внешнем предикате определяет, что подзапрос вывел к-л. данные, и обращает в предикат TRUE, подзапрос(некорелированный) выполняется только 1 раз для всего внешнего запроса, и следовательно, всегда выводит единственное значение. Поскольку при таком использовании EXISTS обращает предикат в TRUE или FALSE сразу для всех строк, он не слишком полезен при извлечении конкретной информации. По этой причине он обычно применяется с коррелированными запросами. ANY и ALL напоминают EXISTS который воспринимает подзапросы как аргументы; однако они отличаются от EXISTS тем, что используются совместно с реляционными операторами. В этом отношении, они напоминают оператор IN когда тот используется с подзапросами; они берут все значения выведенные подзапросом и обрабатывают их как модуль. Однако, в отличие от IN, они могут использоваться только с подзапросами. Оператор ANY берет все значения выведенные подзапросом. Оператор ANY принимает все значения, выводимые подзапросом и обращается в TRUE, если хотя бы одно из них равно значению столбца в текущей строке внешнего запроса.

Оператор ALL - при использовании этого оператора предикат внешнего запроса обращается в TRUE, когда каждое из значений, выбранных подзапросом, удовлетворяет условию этого предиката. Он использовался главным образом с неравенствами, т.к. равенство некоторого значения всем результатам подзапроса возможно только в том случае, когда рез-ты идентичны. Реакция ANY ALL EXISTS на отсутствие результатов: эти операторы по-разному обрабатывают NULL-значения. Кроме того, ANY и ALL неодинаково реагируют на отсутствие результатов подзапроса. Если не учитывать эти различия, то запросы могут выдавать совершенно неожиданные результаты.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]