Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Плещёв БД 2013-03-15.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
12.65 Mб
Скачать

В опросы для самопроверки и контроля

Вопросы для самопроверки

  1. Укажите область допустимых значений для полей типа Varchar.

  2. Каким образом представляются поля типа Int?

  3. Укажите область допустимых значений для переменных типа Binary_Integer.

  4. Укажите область допустимых значений для полей типа Numeric.

  5. Для чего используется тип переменной Varray?

  6. Что означает параметр %Type в операторе объявления переменной?

  7. Для чего используется тип переменной Ref Cursor?

  8. Что представляет собой коллекция?

  9. Что представляет собой пакет в PL/SQL?

  10. Какая форма записи параметров допускается в подпрограммах?

  11. Что означает атрибут курсора %Isopen?

  12. Что означает атрибут курсора %Rowcount?

  13. Для чего предназначен оператор Fetch?

  14. Что такое динамический SQL‑оператор?

  15. Каково назначение оператора Savepoint?

  16. Каково назначение оператора Rollback?

  17. Каково назначение оператора Raise?

  18. Каково назначение SQL‑команды Create View?

  19. Каково назначение метода таблицы Limit?

  20. Каково назначение метода таблицы Trim([n])?

Контрольные вопросы

  1. Укажите область допустимых значений для полей типа Nvarchar2.

  2. Укажите область допустимых значений для полей типа Char.

  3. В чем заключается отличие типа Pls_Integer от типа Binary_Integer?

  4. Укажите область допустимых значений для переменных типа Pls_Integer.

  5. Укажите область допустимых значений для переменных типа Boolean.

  6. Для чего используется тип переменной Record?

  7. Для чего используется тип переменной Table?

  8. Что означает параметр %Rowtype в операторе объявления переменной?

  9. Что представляют собой перезагружаемые подпрограммы?

  10. Что понимается под курсором?

  11. Могут ли использоваться переменные курсоры в динамических SQL‑опе­ра­торах?

  12. Что означает атрибут курсора %Found?

  13. Каково назначение SQL‑оператора Execute?

  14. Каково назначение контрольной точки?

  15. Каким оператором вызывается обработчик исключений?

  16. Каково назначение SQL‑оператора Grant?

  17. Каково назначение метода таблицы Exists?

  18. Каково назначение метода таблицы Count?

  19. Каково назначение хост‑переменных?

  20. Каково назначение предкомпиляторов Oracle?

Глава 7. Практикум

7.1. Язык запросов sql

7.1.1. Запросы на чтение данных

В следующих упражнения из [18] используется базы данных «Поставки» с таблицами (ключевые поля подчеркнуты):

S – поставщики (Номер_поставщика, Фамилия, состояние, Город);

Р – детали (Номер_детали, Название, цвет, Вес, Город);

SPпоставки деталей (Номер_поставщика, Номер_детали, Количество);

J – изделия (Номер_изделия, Название, Город);

SPJ поставка деталей для изделий – (Номер_поставщика, Номер_детали, Номер_изделия, Количество).

Подзапросы

7.1.1.1 Выдать названия изделий, для которых поставляются детали поставщиком S1.

7.1.1.2. Выдать цвета деталей, поставляемых поставщиком S1.

7.1.1.3. Выдать номера деталей, поставляемых для какого-либо изделия в Лондоне.

7.1.1.4. Выдать номера изделий, использующих по крайней мере одну деталь, поставляемую поставщиком S1.

7.1.1.5. Выдать номера поставщиков, поставляющих по крайней мере одну деталь, поставляемую по крайней мере одним поставщиком, который поставляет по крайней мере одну красную деталь.

7.1.1.6. Выдать номера поставщиков, имеющих состояние меньшее, чем у поставщика S1.

7.1.1.7. Выдать номера поставщиков, поставляющих детали для какого-либо изделия с деталью Р1 в количестве, большем, чем средний объем поставок детали Р1 для этого изделия.

Квантор EXISTS

7.1.1.8. Повторите упражнение 7.1.1.3 и используйте в Вашем решении EXISTS.

7.1.1.9. Повторите упражнение 7.1.1.4 и используйте в Вашем решении EXISTS.

7.1.1.10. Выдать номера изделий, для которых не поставляет какой-либо красной детали поставщик из Лондона.

7.1.1.11. Выдать номера изделий, для которых детали полностью поставляет поставщик S1.

7. 1.1.12. Выдать номера деталей, поставляемых для всех изделий в Лондон.

7.1.1.13. Выдать номера поставщиков, поставляющих одну и ту же деталь для всех изделий.

7.1.1.14. Выдать номера изделий, для которых поставляются по крайней мере все детали, имеющиеся у поставщика S1.

Для следующих четырех упражнений преобразуйте приведенное предложение SELECT языка SQL обратно в его эквивалент на естественном языке.

7.1.1.15.

SELECT DISTINCT НОМЕР_ИЗДЕЛИЯ FROM SPJ SPJX WHERE NOT EXISTS (SELECT * FROM SPJ SPJY

WHERE SPJY.НОМЕР_ИЗДЕЛИЯ=SPJX. НОМЕР_ИЗДЕЛИЯ AND NOT EXISTS (SELECT * FROM SPJ SPJZ WHERE SPJZ. НОМЕР_ДЕТАЛИ = SPJY.НОМЕР–ДЕТАЛИ AND SPJZ.НОМЕР_ПОСТАВЩИКА='S1'));

7.1.1.16.

DISTINCT НОМЕР_ИЗДЕЛИЯ FROM SPJ SPJX WHERE NOT EXISTS (SELECT * FROM SPJ SPJY WHERE EXISTS (SELECT * FROM SPJ SPJX WHERE SPJ А. НОМЕР_ПОСТАВЩИКА = 'S1' AND SPJ А. НОМЕР_ДЕТАЛИ = SPJY.НОМЕР_ДЕТАЛИ) AND NOT EXISTS (SELECT * FROM SPJ SPJB WHERE SPJB. НОМЕР_ПОСТАВЩИКА='S1' AND SPJB. НОМЕР_ДETAЛИ=SPJY.НОМЕР_ДЕТАЛИ AND SPJB.НОМЕР_ИЗДEЛИЯ=SPJX..НОМЕР_ИЗДЕЛИЯ));

7.1.1.17.

SELECT DISTINCT НОМЕР_ИЗДЕЛИЯ FROM SPJ SPJX WHERE NOT EXISTS (SELECT * FROM SPJ SPJY WHERE EXISTS (SELECT * FROM SPJ SPJA WHERE SPJA. НОМЕР_ДЕТАЛИ = SPJY.НОМЕР_ДЕТАЛИ AND SPJA. НОМЕР_ИЗДЕЛИЯ = SPJX.НОМЕР_ИЗДЕЛИЯ) AND NOT EXISTS (SELECT * FROM SPJ SPJB WHERE SPJB. НОМЕР_ПОСТАВЩИКА= 'S1' AND SPJB. НОМЕР_ДЕТАЛИ = SPJY.НОМЕР_ДЕТАЛИ AND SPJB.НОМЕР_ИЗДЕЛИЯ=SPJX.НОМЕР_ИЗДЕЛИЯ));

7.1.1.18.

SELECT DISTINCT НОМЕР_ИЗДЕЛИЯ FROM SPJ SPJX WHERE NOT EXISTS (SELECT * FROM SPJ SPJY WHERE EXISTS (SELECT * FROM SPJ SPJA WHERE SPJA. НОМЕР_ПОСТАВЩИКА =PJY. НОМЕР_ПОСТАВЩИКА AND SPJA. НОМЕР_ДЕТАЛИ IN (SELECT НОМЕР_ДЕТАЛИ ROM P WHERE ЦВЕТ = 'Красный') AND NOT EXISTS (SELECT * FROM SPJ SPJB WHERE SPJB. НОМЕР_ПОСТАВЩИКА = SPJY. НОМЕР_ПОСТАВЩИКА AND SPJB. НОМЕР_ИЗДЕЛИЯ = SPJX. НОМЕР_ИЗДЕЛИЯ)));

Стандартные функции

7.1.1.19. Выдать общее число изделий, для которых поставляет детали поставщик S1.

7.1.1.20. Выдать общее количество деталей Р1, поставляемых поставщиком S1.

7.1.1.21. Для каждой поставляемой для некоторого изделия детали выдать ее номер, номер изделия и соответствующее общее количество деталей.

7.1.1.22. Выдать номера изделий, для которых город является первым в алфавитном списке таких городов.

7.1.1.23. Выдать номера изделий, для которых средний объем поставки деталей Р1 больше наибольшего объема поставки любой детали для изделия J 1.

7.1.1.24. Выдать номера поставщиков, поставляющих деталь Р1 для какого-либо изделия в количестве, большем среднего объема поставок детали Р1 для этого изделия.

Объединение

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

7.1.1.26. Приведите результат следующего предложения SELECT:

SELECT P.ЦВЕТ FROM P UNION SELECT P. ЦВЕТ FROM P;

Ответы к некоторым упражнениям

Следующие ответы не обязательно являются единственно возможными.

7.1.1.1.

SELECT НАЗВАНИЕ FROM J WHERE НОМЕР_ИЗДЕЛИЯ IN (SELECT НОМЕР_ИЗДЕЛИЯ FROM SPJ WHERE НОМЕР_ПОСТАВЩИКА =’S1’);

7.1.1.2.

SELECT DISTINCT ЦВЕТ FROM P WHERE НОМЕР_ДЕТАЛИ IN (SELECT НОМЕР_ДЕТАЛИ FROM SPJ WHERE НОМЕР_ПОСТАВЩИКА='Sl');

7.3.

SELECT DISTINCT Н ОМЕР_ДЕТАЛИ FROM SPJ WHERE НОМЕР_ИЗДЕЛИЯ IN (SELECT НОМЕР_ИЗДЕЛИЯ FROM J WHERE ГОРОД = 'Лондон');

7.1.1.4.

SELECT DISTINCT НОМЕР_ИЗДЕЛИЯ FROM SPJ WHERE НОМЕР_ДЕТАЛИ IN (SELECT НОМЕР_ДЕТАЛИ FROM SPJ WHERE НОМЕР_ПОСТАВЩИКА='Sl');

7.1.1.5.

SELECT DISTINCT НОМЕР_ПОСТАВЩИКА FROM SPJ WHERE НОМЕР–ДЕТАЛИ IN (SELECT НОМЕР_ДЕТАЛИ FROM SPJ WHERE НОМЕР_ПОСТАВЩИКА IN (SELECT НОМЕР_ПОСТАВЩИКА FROM SPJ WHERE НОМЕР_ДЕТАЛИ IN (SELECT НОМЕР–ДЕТАЛИ FROM Р WHERE ЦВЕТ = 'Красный')));

7.1.1.6.

SELECT НОМЕР–ПОСТАВЩИКА FROM S WHERE СОСТОЯНИЕ <

(SELECT СОСТОЯНИЕ FROM S WHERE НОМЕР_ПОСТАВЩИКА = 'Sl');

7.1.1.7.

SELECT DISTINCT НОМЕР_ПОСТАВЩИКА FROM SPJ SPJX WHERE НОМЕР_ДЕТАЛИ = 'Р1’ КОЛИЧЕСТВО > (SELECT AVG (КОЛИЧЕСТВО) FROM SPJ SPJY WHERE НОМЕР_ДЕТАЛИ = 'Р1'

AND SPJY.НОМЕР_ИЗДЕЛИЯ=SPJX.НОМЕР_ИЗДЕЛИЯ);

7.8

SELECT DISTINCT НОМЕР_ДЕТАЛИ FROM SPJ WHERE EXISTS (SELECT * FROM J WHERE НОМЕР_ИЗДЕЛИЯ = SPJ. НОМЕР–ИЗДЕЛИЯ AND ГОРОД = 'ЛОНДОН');

7.9.

SELECT DISTINCT SPJX. HOMEP_ИЗДЕЛИЯ FROM SPJ SPJX WHERE EXISTS (SELECT * FROM SPJ SPJY WHERE SPJY. HOMEP_ДЕТАЛИ=SPJX. HOMEP_ДЕТАЛИ AND SPJY. НОМЕР_ПОСТАВЩИКА = 'Sl');

7.1.1.10.

SELECT НОМЕР_ИЗДЕЛИЯ FROM J WHERE NOT EXISTS (SELECT * FROM SPJ WHERE НОМЕР_ИЗДЕЛИЯ = J. НОМЕР_ИЗДЕЛИЯ AND НОМЕР_ДЕТАЛИ IN (SELECT НОМЕР_ДЕТАЛИ FROM P WHERE ЦВЕТ = 'Красный') AND НОМЕР_ПОСТАВЩИКА IN (SELECT НОМЕР_ПОСТАВЩИКА FROM S WHERE ГОРОД = 'Лондон'));

7.1.1.11.

SELECT НОМЕР_ИЗДЕЛИЯ J FROM SPJ SPJX WHERE NOT EXISTS (SELECT * FROM SPJ SPJY WHERE SPJY. НОМЕР_ИЗДЕЛИЯ =SPJX. НОМЕР_ИЗДЕЛИЯ AND SPJY. НОМЕР_ПОСТАВЩИКА<> ‘S1’);

7.1.1.12.

SELECT DISTINCT НОМЕР_ДЕТАЛИ FROM SPJ SPJX WHERE NOT EXISTS (SELECT * FROM J WHERE ГОРОД == 'Лондон');

7.1.1.13.

SELECT DISTINCT НОМЕР_ПОСТАВЩИКА FROM SPJ SPJX WHERE EXISTS

(SELECT НОМЕР_ДЕТАЛИ FROM P WHERE NOT EXISTS (SELECT НОМЕР_ИЗДЕЛИЯ FROM J WHERE NOT EXISTS (SELECT * FROM SPJ SPJZ WHERE SPJZ. НОМЕР_ПОСТАВЩИКА =

SPJX. HOMEP_ ПОСТАВЩИКА AND SPJZ. НОМЕР_ДЕТАЛИ = P. НОМЕР_ДЕТАЛИ AND SPJZ. НОМЕР_ИЗДЕЛИЯ= J. НОМЕР_ИЗДЕЛИЯ)));

7.1.1.14

SELECT DISTINCT НОМЕР_ИЗДЕЛИЯ FROM SPJ SPJX WHERE NOT EXISTS (SELECT НОМЕР_ДЕТАЛИ FROM SPJ SPJY WHERE SPJY. НОМЕР–ПОСТАВЩИКА = 'Sl' AND NOT EXISTS (SELECT * FROM SPJ SPJZ WHERE SPJZ. НОМЕР_ДЕТАЛИ = SPJY.НОМЕР_ДЕТАЛИ AND SPJZ. НОМЕР_ИЗДЕЛИЯ = SPJX.НОМЕР_ИЗДЕЛИЯ));

7.1.1.15. Выдать номера изделий, использующих только детали, поставляемые поставщиком S1.

7.1.1.16. Выдать номера изделий, для которых поставщик S1 поставляет несколько деталей каждого из поставляемых им типов.

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

7.1.1.18. Выдать номера изделий, детали для которых поставляет каждый поставщик, поставляющий какую-либо красную деталь.

7.1.1.19.

SELECT COUNT (DISTINCT НОМЕР–ИЗДЕЛИЯ) FROM SPJ WHERE НОМЕР_ПОСТАВЩИКА == 'S1';

7.1.1.20.

SELECT SUM (КОЛИЧЕСТВО) FROM SPJ WHERE НОМЕР_ДЕТАЛИ = 'P1’AND НОМЕР_ПОСТАВ ЩИКА = 'S1';

7.1.1.21.

SELECT НОМЕР_ДЕТАЛИ, НОМЕР_ИЗДЕЛИЯ, SUM (КОЛИЧЕСТВО) FROM SPJ GROUP BY НОМЕР_ДЕТАЛИ, НОМЕР_ИЗДЕЛИЯ;

7.1.1.22.

SELECT НОМЕР_ИЗДЕЛИЯ FROM J

WHERE ГОРОД =(SELECT MIN (ГОРОД) FROM J);

7.1.1.23.

SELECT НОМЕР_ИЗДЕЛИЯ FROM SPJ WHERE НОМЕР_ДЕТАЛИ = 'PI' GROUP BY НОМЕР_ИЗДЕЛИЯ HAVING AVG (КОЛИЧЕСТВО) > (SELECT MAX (КОЛИЧЕСТВО) FROM SPJ WHERE НОМЕР_ ИЗДЕЛИЯ = 'J1');

7.1.1.24.

SELECT DISTINCT НОМЕР_ПОСТАВЩИКА FROM SPJ SPJX WHERE НОМЕР_ДЕТАЛИ = 'PI' AND КОЛИЧЕСТВО > (SELECT AVG (КОЛИЧЕСТВО) FROM SPJ SPJY WHERE НОМЕР_ДЕТАЛИ ='Р1’

AND SPJY.НОМЕР_ИЗДЕЛИЯ=SPJX.НОМЕР_ИЗДЕЛИЯ);

7.1.1.25.

SELECT ГОРОД FROM S UNION

SELECT ГОРОД FROM P UNION SELECT ГОРОД FROM J ORDER BY 1;

7.1.1.26. Список наименований цветов деталей без повторения.