Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
М. ГРУБЕР_SQL.doc
Скачиваний:
22
Добавлен:
18.04.2019
Размер:
1.4 Mб
Скачать

Работа с sql

Обратите внимание: Ответы для этих упражнений написаны в псевдокодах, являющихся английским языком описания логики, которой должна следовать программа. Это сделано для того, чтобы помочь читателям, которые могут быть незнакомы с Паскалем (или любым другим языком). Кроме того, это лучше сфокусирует ваше внимание на включаемых понятиях, опуская частности того или другого языка. Чтобы не противоречить нашим примерам, стиль псевдокода будет напоминать Паскаль.

Мы опустим из программ все, что не относится напрямую к рассматриваемым вопросам, например, определение устройств ввода-вывода, подключение к базе данных, и так далее. Конечно, имеется много способов, чтобы выполнять такие упражнения; и совсем не обязательно, что представленные варианты решений являются самыми удачными.

  1. Разработайте простую программу, которая выберет все комбинации полей snum и cnum из таблиц Заказов и Заказчиков и выясните, всегда ли предыдущая комбинация такая же, как последующая. Если комбинация из таблицы Заказов не найдена в таблице Заказчиков, значение поля snum для этой строки будет изменено на удовлетворяющее условию совпадения. Вы должны помнить, что курсор с подзапросом — модифицируем (ANSI ограничение, также применимо к просмотрам, и что базисная целостность базы данных это не тоже самое, что проверка на ошибку (т.е. первичные ключи уникальны, все поля cnums в таблице Заказов правильны, и так далее). Проверьте раздел объявлений, и убедитесь, что там объявлены все используемые курсоры.

  2. Предположим, что ваша программа предписывает ANSI запрещение курсоры или просмотры, использующие модифицируемые подзапросы. Как вы должны изменить вышеупомянутую программу?

  3. Разработайте программу, которая подсказывает пользователям изменить значения поля city продавца, автоматически увеличивает комиссионные на .01 для продавца, переводимого в Барселону и уменьшает их на .01 для продавца, переводимого в Сан-Хосе. Кроме того, продавец, находящийся в Лондоне, должен потерять .02 из своих комиссионных, независимо от того, меняет он город или нет, в то время как продавец, не находящийся в Лондоне, должен иметь увеличение комиссионных на .02. Изменение в комиссионных, основывающееся на нахождении продавца в Лондоне, может применяться независимо от того, куда тот переводится. Выясните, могут ли поле city или поле comm содержать NULL значения, и обработайте их, как это делается в SQL. Предупреждение: эта программа имеет некоторые сокращения.

(См. Приложение A для ответов.)

Приложение A

Ответы для упражнений

Глава 1

cnum

rating

Другим словом для строки является запись. Другим словом для столбца является поле.

Потому что строки, по определению, находятся без какого либо определенного упорядочения.

Глава 2

Символ (или текст) и номер

Нет

Язык Манипулирования Данными (ЯЗЫК DML)

Это слово в SQL имеет специальное учебное значение

Глава 3

SELECT onum, amt, odate FROM Orders;

SELECT * FROM Customers WHERE snum = 1001;

SELECT city, sname, snum, comm FROM Salespeople;

SELECT rating, cname FROM Customers WHERE city = 'SanJose';

SELECT DISTINCT snum FROM Orders;

Глава 4

SELECT * FROM Orders WHERE amt > 1000;

SELECT sname, city FROM Salespeople WHERE city = 'London' AND comm > .10;

SELECT * FROM Customers WHERE rating > 100 OR city = 'Rome';

или

SELECT * FROM Customers WHERE NOT rating < = 100 OR city = 'Rome';

или

SELECT * FROM Customers WHERE NOT (rating < = 100 AND city < > 'Rome');

Могут быть еще другие решения.

onum amt odate cnum snum 3001 18.69 10/03/1990 2008 1007 3003 767.19 10/03/1990 2001 1001 3005 5160.45 10/03/1990 2003 1002 3009 1713.23 10/04/1990 2002 1003 3007 75.75 10/04/1990 2004 1002 3008 4723.00 10/05/1990 2006 1001 3010 1309.95 10/06/1990 2004 1002 3011 9891.88 10/06/1990 2006 1001

onum amt odate cnum snum 3001 18.69 10/03/1990 2008 1007 3003 767.19 10/03/1990 2001 1001 3006 1098.16 10/03/1990 2008 1007 3009 1713.23 10/04/1990 2002 1003 3007 75.75 10/04/1990 2004 1002 3008 4723.00 10/05/1990 2006 1001 3010 1309.95 10/06/1990 2004 1002 3011 9891.88 10/06/1990 2006 1001

SELECT * FROM Salespeople;