- •Часть 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.3. Получить полную информацию обо всех поставщиках
SELECT * — или "SELECT S.*" (т.е. "*" можно уточнить)
FROM S ;
Результатом будет копия всей таблицы S; звездочка— это сокращение для списка всех имен столбцов в таблице (или таблицах), на которую делается ссылка в инструкции from, в порядке слева направо, как эти столбцы определены в таблице (таблицах). Обратите внимание на комментарий в этом примере (комментарии в SQL начинаются с двойного дефиса и заканчиваются символом новой строки).
Отметим, что звездочку очень удобно использовать в интерактивных запросах, так как вводится меньше символов. Однако использование звездочки во встроенном SQL (т.е. SQL в прикладных программах) потенциально опасно, так как смысл звездочки (*) может измениться (например, в случае, если из таблицы был убран или в таблицу был добавлен столбец с помощью оператора alter table).
Замечание. Согласно стандарту SQL/92 выражение select * from T (где Т— название таблицы) можно упростить до table T.
8.3.4. Получить информацию обо всех парах поставщиков и деталей, совмещенных в одном городе
В SQL существует несколько способов выразить этот запрос. Приведем три самых простых:
1. SELECT S.S#, S.SNAME, S.STATUS, S.CITY,
P.P#, P.PNAME, P.COLOR, P.WEIGHT
FROM S, P
WHERE S.CITY = P.CITY ;
2. S JOIN P USING CITY ;
3. S NATURAL JOIN P ;
Результатом в каждом случае будет естественное соединение таблиц S и Р (по городам). Первая формулировка заслуживает более подробного обсуждения; она единственная из трех допустима в SQL, который был первоначально определен (явная операция JOIN была добавлена в SQL/92). Концептуально можно рассматривать реализацию этой версии запроса следующим образом:
• Во-первых, после выполнения инструкции from мы получаем декартово произведение S TIMES P.
• Далее, после выполнения where мы получаем выборку из этого произведения, в которой два значения CITY в каждой строке равны (иначе говоря, построено соединение поставщиков и деталей по эквивалентности городов).
• И, наконец, после выполнения оператора select мы получаем проекцию выборки по столбцам, указанным в инструкции select. Конечным результатом будет естественное соединение.
Следовательно, нестрого говоря, инструкция from в SQL соответствует декартову произведению, инструкция where— выборке, а совместная инструкция select -from-where представляет проекцию выборки произведения.
8.3.5. Получить все пары имен городов, таких что поставщик, находящийся в первом городе, поставляет деталь, хранящуюся во втором городе
SELECT DISTINCT S.CITY AS SCITY, P.CITY AS PCITY FROM S JOIN SP USING S# JOIN P USING P# ;
Обратите внимание, что приведенная ниже инструкция уже будет некорректной, поскольку она включает столбец CITY как присоединяемый столбец во втором соединении:
SELECT DISTINCT S.CITY AS SCITY, P.CITY AS PCITY FROM S NATURAL JOIN SP NATURAL JOIN P ;
8.3.6. Получить все пары номеров поставщиков, таких что оба поставщика в каждой паре размещаются в одном и том же городе
Сравните с аналогичными примерами в главах 6 и 7.
SELECT FIRST.S# AS SA, SECOND.S# AS SB
FROM S AS FIRST, S AS SECOND
WHERE FIRST.CITY = SECOND.CITY
AND FIRST.S# < SECOND.S# ;
Обратите внимание в этом примере на явные переменные области значений FIRST и SECOND. В наших предыдущих примерах все переменные области значений были неявными. Также следует отметить, что вводимые имена столбцов SA и SB относятся к столбцам результирующей таблицы и потому не могут быть использованы в инструкции WHERE.