Базы данных. Краморенко Н.В. - 74 стр.

UptoLike

Составители: 

75
2. Подзапрос с несколькими уровнями вложенности
Пусть требуется узнать не поставщиков продукта 9, как это делалось в предыдущем запросе, а
поставщиков моркови
SELECT Поставщик, Телефон
FROM Поставщики
WHERE КодПост IN
(SELECT КодПост
FROM Поставки
WHERE КодПрод IN
(SELECT КодПрод
FROM Продукты
WHERE Продукт = 'Морковь'));
В данном случае результатом самого внутреннего подзапроса является только одно значение
(9). Как уже было показано выше, подзапрос следующего уровня в свою очередь дает в результате
множество (1, 2, 3). Последний, самый внешний SELECT, вычисляет приведенный выше
окончательный результат. Вообще допускается любая глубина вложенности подзапросов.
SQL позволяет одни и те же запросы формулировать несколькими способами.
Тот же результат можно получить с помощью следующего запроса:
SELECT Поставщик, Телефон
FROM Поставщики, Поставки, Продукты
WHERE Поставщики.КодПост = Поставки.КодПост
AND Поставки.КодПрод = Продукты.КодПрод
AND Продукт = 'Морковь';
При выполнении этого компактного запроса система должна одновременно обрабатывать
данные из трех таблиц, тогда как в предыдущем примере эти таблицы обрабатываются поочередно.
Естественно, что для их реализации требуются различные ресурсы памяти и времени, однако этого
невозможно ощутить при работе с ограниченным объемом данных в иллюстративной БД «Магазин».
3. Пересечение двух таблиц
Найти продукты, которые есть и в таблице Продукты, и в таблице НовыеПродукты
SELECT Продукт
FROM Продукты
WHERE Продукт IN
(SELECT Продукт
FROM НовыеПродукты);
Или
SELECT Продукты.Продукт
FROM Продукты, НовыеПродукты
WHERE Продукты.Продукт = НовыеПродукты.Продукт;
4. Разность двух таблиц
Найти продукты, которые есть в таблице Продукты, но отсутствуют в таблице НовыеПродукты
SELECT Продукт
FROM Продукты
WHERE Продукт NOT IN
(SELECT Продукт
FROM НовыеПродукты);
Вложенный подзапрос с оператором сравнения, отличным от IN
Выдать продукты, имеющие ту же единицу измерения, что и молоко.
SELECT Продукт
FROM Продукты
WHERE ЕдИзм =
(SELECT ЕдИзм
FROM Продукты
WHERE Продукт = 'Молоко');
2. Подзапрос с несколькими уровнями вложенности
       Пусть требуется узнать не поставщиков продукта 9, как это делалось в предыдущем запросе, а
поставщиков моркови

       SELECT Поставщик, Телефон
       FROM Поставщики
       WHERE КодПост IN
       (SELECT КодПост
       FROM Поставки
       WHERE КодПрод IN
       (SELECT КодПрод
       FROM Продукты
       WHERE Продукт = 'Морковь'));

        В данном случае результатом самого внутреннего подзапроса является только одно значение
(9). Как уже было показано выше, подзапрос следующего уровня в свою очередь дает в результате
множество (1, 2, 3). Последний, самый внешний SELECT, вычисляет приведенный выше
окончательный результат. Вообще допускается любая глубина вложенности подзапросов.

       SQL позволяет одни и те же запросы формулировать несколькими способами.
       Тот же результат можно получить с помощью следующего запроса:
       SELECT Поставщик, Телефон
       FROM Поставщики, Поставки, Продукты
       WHERE Поставщики.КодПост = Поставки.КодПост
              AND Поставки.КодПрод = Продукты.КодПрод
              AND Продукт = 'Морковь';
       При выполнении этого компактного запроса система должна одновременно обрабатывать
данные из трех таблиц, тогда как в предыдущем примере эти таблицы обрабатываются поочередно.
Естественно, что для их реализации требуются различные ресурсы памяти и времени, однако этого
невозможно ощутить при работе с ограниченным объемом данных в иллюстративной БД «Магазин».

3. Пересечение двух таблиц
Найти продукты, которые есть и в таблице Продукты, и в таблице НовыеПродукты
      SELECT Продукт
      FROM Продукты
      WHERE Продукт IN
      (SELECT Продукт
       FROM НовыеПродукты);
      Или
      SELECT Продукты.Продукт
      FROM Продукты, НовыеПродукты
      WHERE Продукты.Продукт = НовыеПродукты.Продукт;
4. Разность двух таблиц
Найти продукты, которые есть в таблице Продукты, но отсутствуют в таблице НовыеПродукты
SELECT Продукт
FROM Продукты
WHERE Продукт NOT IN
      (SELECT Продукт
       FROM НовыеПродукты);
       Вложенный подзапрос с оператором сравнения, отличным от IN
       Выдать продукты, имеющие ту же единицу измерения, что и молоко.
       SELECT Продукт
       FROM Продукты
       WHERE ЕдИзм =
       (SELECT ЕдИзм
        FROM Продукты
        WHERE Продукт = 'Молоко');

                                                  75