- •Функции субд.
- •Проектирование.
- •Реляционная и объектно-реляционная модели данных субд.
- •Реляционная алгебра.
- •Операции реляционной алгебры.
- •Взаимосвязь операций реляционной алгебры.
- •Нормальные формы отношений. 1нф, 2нф, 3нф, бкнф.
- •Приведение к третьей нормальной форме:
- •Представление операций реляционной алгебры средствами языка sql.
- •Структура языка sql. Оператор select. Типы соединений таблиц.
- •Соединение в sql.
- •Подзапросы в языке sql. Подзапросы с операторами select, update, insert, delete.
Соединение в 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 на местах столбцов другой таблицы.
Подзапросы в языке 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.
Функции в языке 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
