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

Соединение в sql.

Соединенная таблица ::= Перекрестное соединение | Естественное соединение | Соединение посредством предиката | Соединение объединения

Виды соединений в SQL:

  • Перекрестное соединение (Табл_А CROSS JOIN Табл_B | Табл_А, Табл_B ) возвращает декартово произведение таблиц.

  • Естественное соединение (Табл_А [NATURAL] JOIN Табл_B | Табл_А JOIN Табл_B USING Назв_Столбца1, Назв_Столбца1, ...) производится либо по всем совпадающим значениям совпадающих столбцов таблиц А и В, либо по указанным столбцам после USING.

  • Соединение посредством предиката (Табл_А JOIN Табл_B ON предикат) соединяет строки таблиц А и В, если истинен заданный предикат.

  • Соединение объединения (Табл_А UNION JOIN Табл_B) включает только те строки, для которых не найдено совпадений.

Естественное соединение и соединение посредством предиката имеет дополнительное разделение по способу обработки строк без совпадений:

  • Внутреннее ( ... [INNER] JOIN ...) содержит в результате только те строки, для которых найдено совпадение.

  • Внешнее содержит в результате все значения либо левой таблицы (... LEFT [OUTER] JOIN ...), либо правой (... RIGHT [OUTER] JOIN ...), либо обоих (... FULL [OUTER] JOIN ...) независимо от наличия совпадений, причем строки с совпадениями заполняются реальными значениями, а без совпадении – null на местах столбцов другой таблицы.

  1. Подзапросы в языке sql. Подзапросы с операторами select, update, insert, delete.

Подзапросом в языке SQL называется запрос, помещенный в инструкцию SELECT, INSERT, UPDATE или DELETE или в другой вложенный запрос. Подзапрос может быть везде, где разрешены выражения.

Виды подзапросов:

  • простые – подзапрос, не связанный по значению с внешним запросом. Выполнение такого запроса возможно один раз с последующей подстановкой результата в места появления этого подзапроса. Иерархия простых вложенных подзапросов выполняется от самого вложенного к самому внешнему.

  • коррелированные – подзапрос, связанный по значению с внешним запросом. Выполнение такого запроса возможно только после выполнения внешнего, т.к. для его выполнение необходимо знание значения/значений из внешнего. Иерархия коррелированных вложенных подзапросов выполняется от самого внешнего к самому вложенному, причем вычисление иерархии повторяется для каждого значения внешнего запроса.

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

Использования вложенных запросов:

  • Подзапросы с WHERE и ключевыми словами IN и EXISTS или модифицированными операторами сравнения. Подзапрос возвращает список, в котором IN и EXISTS проверяется наличие значения внешнего запроса. Например,

SELECT Name

FROM Production.Product

WHERE ProductSubcategoryID IN

(SELECT ProductSubcategoryID

FROM Production.ProductSubcategory

WHERE Name = 'Wheels')

  • Подзапросы с оператором сравнения. Подзапрос с помощью функции возвращает одно конкретное значение. По семантике схоже с фильтрацией по значениям групповой функции при операции GROUP BY. Например,

SELECT Name

FROM Production.Product as p

WHERE Price >

(SELECT AVG (Price)

FROM Archive.Product AS ap

p.Name = ap.Name)

  • Подзапросы с SELECT. Подзапрос возвращает одно значение, которые присваиваются в соответствующий столбец. По семантике для коррелированных подзапросов схоже с применением групповой функции при операции GROUP BY. Например,

SELECT Name,

(SELECT AVG(Price)

FROM Production.Product AS p1

WHERE p1.Name = p2.Name)

FROM Production.Product AS p2

  • Подзапросы c FROM или JOIN. Подзапрос возвращает временную таблицу, которая используется во внешнем запросе. Использование коррелированных запросов в этом случае невозможно. Например,

SELECT Name

FROM (SELECT Name, ProductSubcategoryID, Price

FROM Production.ProductSubcategory

WHERE Name = 'Wheels')

WHERE Price > 100

  • Подзапросы с SET. Подзапрос возвращает значение столбца или значение переменной. Например,

UPDATE Production.Product AS p

SET Price = (SELECT MAX(Price)

FROM Archive.Product ap

WHERE p.Name = ap.Name)

  • Подзапрос с VALUE. Подзапрос возвращает временную таблицу, которая используется для последующей вставки. Например,

INSERT INTO Archive.Product

VALUES (SELECT *

FROM Production.Product

WHERE ModificationDate < '17.05.2013')

Подзапрос с FROM можно использовать только с оператором SELECT. Остальные использования применимы с соответствующим ключевым словом, независимо от оператора языка SQL.

  1. Функции в языке SQL.

В SQL определены пять встроенных агрегатных функций:

  • COUNT вычисляет число различных не-NULL значений в столбце, если указано название столбца как аргумент, или число строк, если как аргумент передана *. Применимо к данным любого типа.

  • MIN и MAX ­вычисляют, соответственно, максимальное и минимальное значение в столбце, переданном в качестве аргумента. Применимо к строковым и числовым типам.

  • SUM и AVG вычисляют, соответственно, сумму и среднее значений в столбце, переданном в качестве аргумента.

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

Оператор группировки GROUP BY позволяет произвести группировку значений по значениям каких-то столбцов или расчетного выражения и применять агрегатные функции уже значениям внутри групп, а не элементам всего столбца сразу. Группировка в обоих случаях проводится по совпадающим значениям. Столбцы, участвующие в группировании, могут использоваться и в операторе SELECT.

В силу того, что оператор WHERE выполняется перед оператором GROUP BY, первый не может использоваться для фильтрации результатов последнего. С этой целью в SQL введен дополнительный оператор HAVING, предназначенный именно для этой цели. От WHERE его отличает лишь возможность использования агрегатных функций на группах для фильтрации, причем имена присвоенные этим агрегациям в выражении SELECT на уровне HAVING не видны.

Пример,

SELECT Name, AVG(Price) AS AvgPrice, MIN(Price) AS MinPrice

FROM Archive.Product

WHERE Name LIKE 'Wheel'

GROUP BY Name

HAVING MAX(Price) < 1000

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