- •Часть 2. Реляционная модель.
- •Глава 4. Реляционные объекты данных: домены и отношения.
- •4.1. Вводный пример
- •4.2. Домены
- •4.3. Отношения
- •4.4. Виды отношений
- •4.5. Отношения и предикаты
- •4.6. Реляционные базы данных
- •4.7. Резюме
- •Глава 8.
- •8.1. Введение
- •8.2. Определение данных
- •8.3. Обработка данных: операции выборки
- •8.3.1. Получить цвета и города для деталей "не из Парижа" с весом, большим десяти
- •8.3.2. Для всех деталей получить номер детали и ее вес в граммах
- •8.3.3. Получить полную информацию обо всех поставщиках
- •8.3.4. Получить информацию обо всех парах поставщиков и деталей, совмещенных в одном городе
- •8.3.5. Получить все пары имен городов, таких что поставщик, находящийся в первом городе, поставляет деталь, хранящуюся во втором городе
- •8.3.6. Получить все пары номеров поставщиков, таких что оба поставщика в каждой паре размещаются в одном и том же городе
- •8.3.7. Получить общее число поставщиков
- •8.3.8. Получить максимальное и минимальное количество для детали р
- •8.3.9. Для каждой поставляемой детали получить номер детали и общее количество поставки
- •8.3.10. Получить номера для всех деталей, поставляемых более чем одним поставщиком
- •8.3.11. Получить имена поставщиков, поставляющих деталь р2
- •8.3.12. Получить имена поставщиков, поставляющих по крайней мере одну красную деталь
- •8.3.13. Получить номера поставщиков, статус которых меньше текущего максимального статуса в таблице s
- •8.3.14. Получить имена поставщиков, поставляющих деталь р2
- •8.3.15. Получить имена поставщиков, которые не поставляют деталь р2
- •8.3.16. Получить имена поставщиков, поставляющих все детали
- •8.3.17. Получить номера деталей, которые или весят более 16 фунтов, или поставляются поставщиком s2, или и то и другое
- •8.4. Обработка данных: операции обновления
- •Table-term
- •I join-table-expression
- •8.6. Условные выражения
- •8.7. Скалярные выражения
- •8.8. Встроенный sql
- •8.8.1. Единичный select. Получить статус и город для поставщика, чей номер поставки задан базовой переменной givens#
- •8.8.2. Insert. Вставить новую деталь в таблицу р (номер детали, ее назв. И вес определены базовыми переменными р#, pname, pwt соответственно, цвет и город неизвестны)
- •8.8.3, Update. Увеличить статус всех поставщиков из Лондона на значение, определенное базовой переменной raise
- •8.8.4. Delete. Удалить все поставки для поставщиков из города,
- •8.9. Резюме
8.3. Обработка данных: операции выборки
Теперь перейдем к операторам SQL языка обработки данных (data manipulation language— DML). Основные операторы DML— это select, insert, update и delete. Вначале рассматриваются операции выборки (select), а далее — операции обновления (insert, update, delete). Для простоты будем предполагать, что все операторы вводятся интерактивно; отдельные соображения, касающиеся встроенных в прикладные программы выражений SQL, приведены ниже в этой главе.
Операция выборки в SQL — это, по существу, табличное выражение, которое может быть сколь угодно сложным. Не углубляясь в детали, просто приведем несколько примеров в надежде, что они послужат иллюстрацией наиболее важных моментов.
(Чтобы облегчить сравнение с реляционной алгеброй и реляционным исчислением, мы также дадим ссылки на аналогичные примеры в главах 6 и 7.) Более полная и более формальная трактовка табличных выражений приведена ниже в этой главе.
8.3.1. Получить цвета и города для деталей "не из Парижа" с весом, большим десяти
SELECT P.COLOR, P.CITY
FROM P
WHERE P.CITY <> 'Paris'
AND P.WEIGHT>10;
Прежде всего, обратите внимание на использование в этом примере символа <> (не равно). Обычные скалярные операторы сравнения записываются в SQL так: =, <>, <, >, <= и >=.
Затем (что еще важнее) обратите внимание, что для используемых нами примерных данных (эти значения приводились ранее в книге) этот запрос будет возвращать четыре строки, а не две, несмотря на то, что три из этих четырех строк идентичны и имеют вид (Red, London). Язык SQL не удаляет лишних дублирующих строк из результата оператора select, пока пользователь явно не потребует этого с помощью ключевого слова DISTINCT, как показано ниже:
SELECT DISTINCT P.COLOR, P.CITY
FROM Р
WHERE P.CITY <> "Paris'
AND P.WEIGHT > 10 ;
Этот запрос будет возвращать только две строки.
Между прочим, в этом примере можно было прекрасно обойтись и без уточнителей "р.". Согласно общему правилу относительно уточнения имени в SQL неуточненные имена допускаются, если они не вызывают неоднозначности. Однако в наших примерах будут использоваться все уточнители, даже если они формально излишни. (К сожалению, в определенных контекстах явно требуется, чтобы имена столбцов были неуточнены! Например, это требуется в инструкции order by— см. ниже.)
И, наконец, заметьте, что последовательность строк в данной результирующей таблице в общем непредсказуема, пока пользователь не задаст некоторую определенную последовательность, как в этом примере:
SELECT DISTINCT P.COLOR, P.CITY
FROM Р
WHERE P.CITY <> 'Paris'
AND P.WEIGHT > 10
ORDER BY CITY DESC ;
В общем виде инструкция order by записывается так:
ORDER BY order-item-comma list
Здесь список commalist не должен быть пустым и каждый элемент order-item должен содержать неуточненное имя столбца, за которым (не обязательно) следуют ключевые слова asc или desc (которые означают возрастающий или убывающий порядок соответственно); по умолчанию принимается asc.
8.3.2. Для всех деталей получить номер детали и ее вес в граммах
SELECT P.P#, P.WEIGHT * 454 AS gmwt
FROM Р ;
Спецификация as gmwt вводит соответствующее имя результирующего столбца. Таким образом, два столбца результирующей таблицы будут называться Р# и GMWT соответственно. Если бы спецификация as gmwt была опущена, то соответствующий столбец был бы фактически безымянным. Обратите внимание, что хотя SQL на самом деле не требует от пользователя задавать имя результирующего столбца в таких случаях, но мы будем так делать в наших примерах всегда.