Подзапросы. База данных, используемая в примерах

Содержание

Слайд 2

База данных, используемая в примерах

Задание на объединение:
вывести все путевки туриста Иванова

База данных, используемая в примерах Задание на объединение: вывести все путевки туриста Иванова (ПунктНазначения, Фамилия).

(ПунктНазначения, Фамилия).

Слайд 3

Подзапрос – это оператор SELECT, вложенный в:
предложение WHERE или HAVING другого оператора

Подзапрос – это оператор SELECT, вложенный в: предложение WHERE или HAVING другого
SELECT;
оператор INSERT, UPDATE или DELETE;
другой подзапрос.

Слайд 4

Подзапрос

Некорреллированный
(не зависит от внешнего запроса)

Корреллированный
(зависит от внешнего запроса)

Пример:

Вывести сумму, которую заплатил за

Подзапрос Некорреллированный (не зависит от внешнего запроса) Корреллированный (зависит от внешнего запроса)
поездку турист Иванов

Слайд 5

Некорреллированный подзапрос:

SELECT Сумма
FROM Оплата
WHERE КодТуриста IN
(SELECT КодТуриста
FROM Туристы
WHERE Фамилия =

Некорреллированный подзапрос: SELECT Сумма FROM Оплата WHERE КодТуриста IN (SELECT КодТуриста FROM
‘Иванов’);

Слайд 6

Корреллированный подзапрос:

SELECT Сумма
FROM Оплата
WHERE ‘Иванов’ IN
(SELECT Фамилия
FROM Туристы
WHERE Оплата.КодТуриста =

Корреллированный подзапрос: SELECT Сумма FROM Оплата WHERE ‘Иванов’ IN (SELECT Фамилия FROM
Туристы.КодТуриста);

Слайд 7

Большинство подзапросов могут быть заменены запросом на объединение таблиц

SELECT Сумма
FROM Оплата, Туристы
WHERE

Большинство подзапросов могут быть заменены запросом на объединение таблиц SELECT Сумма FROM
Фамилия = ‘Иванов’ ;
Ошибка?

Запрос на объединение таблиц:

Слайд 8

Некоторые выборки гораздо удобнее представлять в виде подзапросов, чем в виде объединения,

Некоторые выборки гораздо удобнее представлять в виде подзапросов, чем в виде объединения,
например, при необходимости самообъединения таблиц.

Пример:

Вывести всех туристов (фамилия, имя и отчество), телефоны которых совпадают с телефоном Журавлева Юрия Петровича

Слайд 9

Самообъединение:

SELECT тур1.Фамилия, тур1.Имя, тур1.Отчество
FROM Туристы тур1, Туристы тур2
WHERE тур1.Телефон = тур2.Телефон and

Самообъединение: SELECT тур1.Фамилия, тур1.Имя, тур1.Отчество FROM Туристы тур1, Туристы тур2 WHERE тур1.Телефон
тур2.Фамилия = ‘Журавлев’ and тур2.Имя = ‘Юрий’ and тур2.Отчество = ‘Петрович’;

Слайд 10

Подзапрос (какой?некорр/корр):

SELECT Фамилия, Имя, Отчество
FROM Туристы
WHERE Телефон IN
(SELECT Телефон
FROM

Подзапрос (какой?некорр/корр): SELECT Фамилия, Имя, Отчество FROM Туристы WHERE Телефон IN (SELECT
Туристы
WHERE Фамилия = ‘Журавлев’ and Имя = ‘Юрий’ and Отчество = ‘Петрович’);

Слайд 11

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

Обычно : Подзапросы используются, когда необходимо сравнивать значения агрегирующей функции с другими

Объединения используются, когда отображается информация из нескольких таблиц

Слайд 12

Для написания подзапроса используются следующие операторы:

IN (или NOT IN);
операторы сравнения с использованием

Для написания подзапроса используются следующие операторы: IN (или NOT IN); операторы сравнения
или без использования ANY или ALL ;
EXISTS (или NOT EXISTS).

Слайд 13

ANY и ALL

> ALL означает больше самого большого
> ANY - больше хотя

ANY и ALL > ALL означает больше самого большого > ANY -
бы одного из значений
< ALL – меньше самого меньшего
< ANY – меньше хотя бы одного из значений
= ANY – равно одному из значений (аналогичен оператору IN)

Слайд 14

SELECT Фамилия, Имя, Отчество
FROM Оплата, Туристы
WHERE Оплата.КодТуриста = Туристы.КодТуриста and Сумма >

SELECT Фамилия, Имя, Отчество FROM Оплата, Туристы WHERE Оплата.КодТуриста = Туристы.КодТуриста and
ALL (SELECT Сумма FROM Оплата, Туристы WHERE Оплата.КодТуриста = Туристы.КодТуриста and Фамилия = ‘Иванов’);

Пример : Кто из туристов заплатил за путевку больше, чем любой из Ивановых

Слайд 15

При использовании операторов сравнения без ANY или ALL необходимо, чтобы подзапрос возвращал

При использовании операторов сравнения без ANY или ALL необходимо, чтобы подзапрос возвращал
только единственное значение. Например, следующий запрос этого не гарантирует:

SELECT Фамилия, Имя, Отчество
FROM Туристы
WHERE Телефон =
(SELECT Телефон
FROM Туристы
WHERE Фамилия = ‘Журавлев’);
Исправить!

Слайд 16

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

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

SELECT КодТуриста
FROM Оплата
WHERE Сумма =
(SELECT max(Сумма)
FROM Оплата);

Слайд 17

Кроме того, при использовании операторов сравнения (с использованием или без использования ALL

Кроме того, при использовании операторов сравнения (с использованием или без использования ALL
или ANY) нужно гарантировать, что в подзапросе не будет нулевых значений, т.к. их нельзя сравнивать с другими значениями.

Слайд 18

EXISTS

Это запросы, выполняющие проверку на существование.
Например запрос «Вывести фамилию, имя и отчество

EXISTS Это запросы, выполняющие проверку на существование. Например запрос «Вывести фамилию, имя
туристов, если среди них есть турист Иванов» можно выполнить следующим образом:

Слайд 19

SELECT Фамилия, Имя, Отчество
FROM Туристы
WHERE EXISTS
(SELECT *
FROM Оплата
WHERE Туристы.Фамилия

SELECT Фамилия, Имя, Отчество FROM Туристы WHERE EXISTS (SELECT * FROM Оплата
= ‘Иванов’);
Чего в этом запросе не хватает?

Слайд 20

Или запрос «Вывести фамилию, имя и отчество туристов, если среди них нет

Или запрос «Вывести фамилию, имя и отчество туристов, если среди них нет
должников» можно выполнить следующим образом:

SELECT Фамилия, Имя, Отчество
FROM Туристы
WHERE NOT EXISTS
(SELECT *
FROM Оплата
WHERE Cумма == 0 or Сумма == NULL);
А что в этом запросе неправильно?

Слайд 21

Подзапросы с разным уровнем вложения

Пример: Вывести фамилии туристов, которые отправились в Париж.

Подзапросы с разным уровнем вложения Пример: Вывести фамилии туристов, которые отправились в Париж.

Слайд 22

SELECT Фамилия
FROM Туристы
WHERE КодТуриста IN
(SELECT КодТуриста
FROM Оплата
WHERE КодПутевки

SELECT Фамилия FROM Туристы WHERE КодТуриста IN (SELECT КодТуриста FROM Оплата WHERE
IN
(SELECT КодПутевки
FROM Путевка
WHERE ПунктНазначения = ‘Париж’));

Слайд 23

Подзапросы в операторе UPDATE

Пример: Уменьшить всем Ивановым сумму, оплаченную за путевку в

Подзапросы в операторе UPDATE Пример: Уменьшить всем Ивановым сумму, оплаченную за путевку
2 раза

UPDATE Оплата
SET Сумма = Сумма / 2
WHERE КодТуриста IN
(SELECT КодТуриста
FROM Туристы
WHERE Фамилия = ‘Иванов’);