
- •Языки манипулирования реляционными данными (Data Manipulation Languages, dml)
- •1). Реляционная алгебра.
- •2). Реляционное исчисление.
- •3). Языки, ориентированные на преобразования.
- •4). Графически языки.
- •Язык структурированных запросов sql (Structured Query Language)
- •Однотабличные запросы-выборки
- •Многотабличные запросы-выборки
- •1). Задание соединения таблиц в предложении where.
- •2). Задание соединения таблиц в предложении from.
- •3). Подчиненные запросы.
- •4). Запросы объединения.
- •Вычисляемые поля.
- •1). Комбинирование значений в текстовых полях.
- •2). Расчет числовых значений и дат.
- •3). Вычисление итоговых значений.
- •4). Подчиненные запросы.
- •Запросы с параметрами.
- •Запросы-изменения
- •1). Запрос на создание таблицы.
- •2). Запрос на добавление записей.
- •3). Запрос на обновление.
- •4). Запрос на удаление.
- •Язык определения реляционных данных (Data Definition Language, ddl)
Многотабличные запросы-выборки
Большинство запросов формируется для извлечения данных более, чем из одной таблицы. В этом случае участниками запроса являются несколько таблиц.
Способы создания многотабличных запросов:
1). Задание соединения таблиц в предложении where.
В предложении FROM перечисляются через запятую таблицы-участницы запроса.
В предложении WHERE указывается условие соединения (равенство полей соединяемых таблиц, по которым выполняется соединение).
Пример: В какие пункты были совершены рейсы 16.10.19?
SELECT [Пункт назначения]
FROM Рейс, Вылет
WHERE Рейс.[Номер рейса] = Вылет.[Номер рейса]
AND ([Реальная дата] = #10/16/19#)
Замечания:
1). FROM осуществляет декартово произведение отношений, а WHERE производит выборку из него.
2). Условие Рейс.[Номер рейса] = Вылет.[Номер рейса] ограничивает выборку только теми записями, которые имеют одинаковые значения полей Номер рейса и в таблице Рейс, и в таблице Вылет.
3). Если в запросе используются одноименные поля из разных таблиц, то для уточнения перед именем поля через точку указывается имя таблицы.
4). Результатом запроса является необновляемый набор записей.
2). Задание соединения таблиц в предложении from.
Условие соединения и сами таблицы указываются в предложении FROM.
Используется ключевое слово JOIN с указанием типа соединения.
SELECT [Пункт назначения]
FROM Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]
WHERE ([Реальная дата] = #10/16/19#)
Замечания:
1). Запись Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса] означает внутреннюю связь таблицы Рейс с таблицей Вылет.
2). Результатом запроса является обновляемый набор записей.
Типы соединений:
INNER JOIN – внутреннее соединение, при котором записи из двух таблиц соединяются и добавляются в результирующий набор только в том случае, если значения в связанных полях равны.
LEFT JOIN – левое внешнее соединение, при котором все записи из таблицы, указанной в левой части предложения LEFT JOIN, включаются в результирующий набор, даже если в таблице, указанной в правой части, нет соответствующих им записей.
Записи из таблицы, указанной в правой части, участвуют в соединении только в том случае, если связанные поля имеют совпадающие значения.
RIGHT JOIN – правой внешнее соединение аналогично LEFT JOIN, только наоборот.
Замечание:
1). Стандарт ANSI не поддерживает внешнее соединение, но оно поддерживается многими СУБД.
Пример: Вывести информацию о плановых датах вылета всех рейсов с указанием пунктов назначения.
SELECT Рейс.[Номер рейса], [Пункт назначения], [Плановая дата]
FROM Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]
Ответ:
-
Номер рейса
Пункт назначения
Плановая дата
12345
Москва
16.10.19
12345
Москва
17.10.19
12345
Москва
18.10.19
67890
Киев
16.10.19
67890
Киев
18.10.19
77777
Астрахань
16.10.19
77777
Астрахань
17.10.19
89898
Москва
16.10.19
SELECT Рейс.[Номер рейса], [Пункт назначения], [Плановая дата]
FROM Рейс LEFT JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]
Ответ:
-
Номер рейса
Пункт назначения
Плановая дата
12345
Москва
16.10.19
12345
Москва
17.10.19
12345
Москва
18.10.19
55555
Владивосток
67890
Киев
16.10.19
67890
Киев
18.10.19
77777
Астрахань
16.10.19
77777
Астрахань
17.10.19
89898
Москва
16.10.19
Для получения такого же результата с помощью RIGHT JOIN надо соединение выполнить следующим образом:
FROM Вылет RIGHT JOIN Рейс ON Рейс.[Номер рейса] = Вылет.[Номер рейса]
Предикат DISTINCTROW – для исключения из результирующего набора записей, основанных на целиком повторяющихся записях, а не отдельных повторяющихся полях.
DISTINCTROW – для сравнения записей применяются все поля исходной таблицы независимо от того, какие из этих полей включены в запрос.
DISTINCT – для сравнения записей используются данные только тех полей, которые включены в запрос.
Пример: В какие города планировались когда-либо рейсы?
SELECT [Пункт назначения]
FROM Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]
Ответ:
-
Пункт назначения
Москва
Москва
Москва
Киев
Киев
Астрахань
Астрахань
Москва
Обновляемый набор записей.
SELECT DISTINCT [Пункт назначения]
FROM Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]
Ответ:
-
Пункт назначения
Астрахань
Киев
Москва
Необновляемый набор записей
Для сравнения использовались данные только тех полей, которые включены в запрос.
SELECT DISTINCTROW [Пункт назначения]
FROM Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]
Ответ:
-
Пункт назначения
Москва
Киев
Астрахань
Москва
Обновляемый набор записей.
Для сравнения использовались все поля исходных таблиц, независимо от того, какие из этих полей включены в запрос.
Запрос может быть построен и более чем на двух таблицах.
Пример: Вывести список пассажиров, улетевших в Москву 16.10.19 или 17.10.19.
SELECT [Паспортные данные]
FROM (Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса])
INNER JOIN Пассажир ON (Вылет.[Номер рейса] = Пассажир.[Номер рейса])
AND (Вылет.[Плановая дата] = Пассажир.[Дата вылета])
WHERE [Пункт назначения] = ‘Москва’
AND ([Реальная дата] = #10/16/19# OR Реальная дата] = #10/17/19#)