Промежуточный экзамен Правила Это экзамен «с открытыми книгами», любые печатные материалы могут быть использованы. Для каждого из 10- вопросов (в экзамене будет 15 вопросов) обведите кружком один из ответов: (a), (b), (c) или (d) – тот, который вы считаете верным. Не обводите более одного варианта в каждом вопросе. Если вы изменили свой ответ, четко отметьте, какой вариант ответа является окончательным. Оценка за экзамен считается по схеме: (количество правильных ответов *3) – (количество неправильных ответов), так что случайное угадывание в среднем не даст результата. Один балл добавляется за указание фамилии на листе, следовательно, максимальная оценка равна 100. Если вы хотите пояснить или проиллюстрировать ваш ответ, для того, чтобы он считался хотя бы «частично правильным», вы можете использовать нижнее поле или оборотную сторону страницы (но не лицевую сторону). Пожалуйста, используйте эту возможность как можно реже, только в том случае, если вы считаете, что вопрос сформулирован неясно или допускает разные толкования – мы засчитываем лишь частичный балл, и только в редких случаях. У вас есть примерно 5.4 минуты на каждый вопрос. Разумно используйте это время, не тратьте слишком много времени на какой-то отдельный вопрос. Не забудьте подписать лист на следующей строке: Я признаю и принимаю указанные требования ___________________ Ваша фамилия (1 балл) ___________________________________________ В каждом из следующих 2-х вопросов от вас требуется сравнить два запроса: Q1 и Q2. Вы должны решить, являются ли эти запросы: 1. Совершенно одинаковыми [ответ (a)]; это означает, что для любой базы данных ответы на оба запросы будут одинаковыми. Иначе говоря, одни и те же записи будут выбраны каждым из запросов, и каждая запись будет выбрана одинаковое число раз в каждом запросе. Порядок записей несуществен. 2. Полностью различными [ответ (d)]; это означает, что существуют базы данных, в которых Q1 сформирует больше записей, а в других базах Q2 сформирует больше записей. Заметьте, что запрос, производящий меньшее число копий одной записи, может произвести ноль копий этой записи. 3. Один из них содержится в другом, но они не совпадают [ответы (b) и (с)]. Например, Q1 содержится в Q2, если для любой базы Q2 сформирует, по крайней мере, столько же копий каждой записи, что и Q1. Заметьте, что возможна ситуация, когда Q2 сформирует одну или более копий записи, а Q1 – ни одной такой записи. Общие советы: Не считайте, что запрос содержит тривиальную синтаксическую ошибку и выдает пустой результат. Отношения, упомянутые в запросе, могут иметь дополнительные атрибуты, но они не влияют на результат. Отношения могут содержать NULL в некоторых полях. SQL запросы считаются запросами стандарта SQL2, если специально не оговорено иное. Результаты SQL и OQL-запросов в общем случае являются наборами, а результаты запросов реляционной алгебры и Даталога являются множествами. Рассмотрим два отношения со схемами R(A,B) и S(B,C): Вопрос 1: Q1: SELECT R.A FROM R, S WHERE R.B=S.B; Q2: SELECT R.A FROM R WHERE R.B IN (SELECT B FROM S); (a) (b) (c) (d) Q1 и Q2 дают один и тот же результат. Результат Q1 всегда содержится в результате Q2. Результат Q2 всегда содержится в результате Q1. Q1 и Q2 могут давать разные результаты, не содержащиеся друг в друге. В вопросе 2 схема отношения R(A,B,C). Вопрос 2: Q1: SELECT DISTINCT * FROM R; Q2: SELECT * FROM R GROUP BY A, B, C; (a) (b) (c) (d) Q1 и Q2 дают один и тот же результат. Результат Q1 всегда содержится в результате Q2. Результат Q2 всегда содержится в результате Q1. Q1 и Q2 могут давать разные результаты, не содержащиеся друг в друге. Вопрос 3: Отношение R(A, B, C) удовлетворяет многозначной зависимости A->>B и содержит (возможно, среди прочих) следующие записи в текущем состоянии: (0,1,2), (0,3,4) и (1,5,6). Какая из записей не обязательно принадлежит текущему состоянию таблицы? (0,1,4) (b) (0,3,4) (c) (0,5,2) (d) ни одна из них (т.е., все принадлежат). Вопрос 4: Следующий кусок программы – это PSM-код (не PL/SQL). Предполагается вставить в отношение S (которое имеет единственный атрибут) все эти целые числа в пределах от 1 до n, которых еще нет в S. Однако некоторые операторы имеют синтаксические ошибки. (1) CREATE PROCEDURE Foo(OUT n INTEGER) (2) DECLARE x INTEGER; (3) BEGIN (4) x : = n; (5) WHILE x >= 1 DO (6) IF x NOT IN (SELECT * FROM S) THEN (7) INSERT INTO S VALUES(x); (8) END IF; (9) x : = x - 1; (10) END LOOP; (11) END; Какая из следующих строк не содержит существенной ошибки: (a) Заголовок процедуры в строке (1) (b) While-цикл в строке (5) (c) Оператор присвоения в строке (9) (d) Оператор закрытия цикла в строке (10) Вопрос 5: В следующем вопросе будем рассматривать отношения R(a,b) и S(a,b). Q1: π a (R) π a (S) Q2: π a (R S) (a) (b) (c) (d) Q1 и Q2 дают один и тот же результат. Результат Q1 всегда содержится в результате Q2. Результат Q2 всегда содержится в результате Q1. Q1 и Q2 могут давать разные результаты, не содержащиеся друг в друге. В следующих двух вопросах рассматриваются отношения: Emps (id, name, dept, salary) Managers (dept, mgr) Первое содержит ID служащего, его имя, отдел и зарплату; второе дает для каждого отдела его управляющего, то есть ID служащего, который управляет этим отделом. Вопрос 6: Мы хотим добавить ограничение к этому отношению, так, чтобы в поле mgr таблицы Managers могли появляться только ID сотрудников, которые есть в таблице Emps. Какое из следующих изменений обеспечивает это ограничение? (a) В объявлении Managers добавить для поля mgr ограничение CHECK ( EXISTS (SELECT * FROM Emps WHERE id=mgr ) ). (b) В объявлении Emps добавить ограничение FOREIGN KEY id REFERENCES Managers (mgr). (c) В объявлении Managers добавить ограничение FOREIGN KEY id REFERENCES Emps (id) (d) Более одного из вышеприведенных ответов. Вопрос 7: Предположим, мы хотим задать ограничение, что ни в каком отделе суммарная зарплата сотрудников не должна превышать $1,000,000. Для этого мы создаем следующее утверждение: CREATE ASSERTION cheap CHECK( NOT EXIST (Q) ); Какой запрос Q лучше всего описывает это ограничение? (a) SELECT * FROM Emps WHERE SUM(salary) > 1000000; (b) SELECT dept, SUM(salary) FROM Emps GROUP BY dept; (c) SELECT SUM(salary) FROM Emps, Managers WHERE id = mgr GROUP BY Emps.dept HAVING SUM(salary) > 1000000; (d) SELECT dept FROM Emps GROUP BY dept HAVING SUM(salary) > 1000000; В следующих двух вопросах рассматриваются три таблицы: 1. R(a,b) = {(0,1), (4,5), (8,9)}. 2. S(b,c) = {(1,2), (5,2), (5,6), (5,10), (13,10)}. 3. T(c,d) = {(2,3), (6,7), (10,11), (10,3) }. Вопрос 8: Количество записей в результате R ⊲⊳ S ⊲⊳ T, где ⊲⊳ представляет собой натуральное соединение, равно: (a) 5 (b) 8 (c) 10 (d) 13 Вопрос 9: Количество записей в результате запроса (R ⊲⊳ S) ⊲⊳ T, где ⊲⊳ представляет собой полное натуральное внешнее соединение, равно: (a) 5 (b) 8 (c) 13 (d) 60 Вопрос 10: Какое из утверждений будет истинно, если R и S – множества, но не обязательно истинно, если R и S – наборы? (a) (R – S) (S – R) = R S (b) R (S – R) = (R S) R (c) R S = R – (R – S) (d) R (S R) = (R S) R