- •Часть 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.
8.1. Введение
Как уже отмечалось ранее, язык SQL весьма далек от полноценной реализации реляционной модели. И тем не менее, он является стандартным реляционным языком и в настоящее время поддерживается практически всеми продуктами, представленными на рынке, поэтому каждый специалист по базам данных должен быть знаком с ним. По крайней мере, в пределах этой главы.
Необходимо подчеркнуть, что SQL — очень объемный язык. Документ по его стандарту [8.1] содержит более 600 страниц. Поэтому в книге, такой как наша, невозможно дать исчерпывающее описание этого языка; достаточно полно можно описать лишь самые главные его аспекты. Хотелось бы предупредить читателя, что приведенное здесь описание языка во многих случаях беглое и поверхностное. В частности, мы не колеблясь опускали материал, не относящийся непосредственно к обсуждаемой теме и для краткости делали существенные упрощения. Более полное (но также учебное) описание можно найти в [8.5-8.7].
В этой главе затронуты следующие вопросы. Сначала обсуждаются средства определения данных; затем рассматриваются средства обработки данных (операции выборки и операции обновления). После этого описываются три ключевых конструкции SQL: табличные выражения (включая, в частности, выражения выборки), условные выражения и скалярные выражения. Далее приводятся некоторые соображения по применению "встроенного" языка SQL (т.е. средств для встраивания операторов SQL в программу на базовом языке). И наконец, вкратце подводятся итоги главы.
Замечание. Дополнительные аспекты SQL, касающиеся таких тем, как восстановление, параллельная обработка и т.д., кратко обсуждаются в последующих главах, посвященных этим темам.
Сделаем еще несколько предварительных замечаний. Прежде всего, приведенное обсуждение касается текущего стандарта [8.1], неформально известного как "SQL/92" ("SQL-92" или просто "SQL2"); официальное название стандарта— Международный стандарт языка баз данных SQL (1992) (International Standard Database Language SQL). Наше изложение основано на материалах [8.5], в значительной степени пересмотренных в соответствии с требованиями данной книги. Обратите внимание на следующие отличия:
• Символ "#", который мы часто используем в именах доменов и столбцов, на самом деле в стандарте SQL/92 не допустим.
• Мы используем символ ";" как признак конца оператора, хотя согласно стандарту SQL/92 этот символ предусмотрен только для встроенного SQL и только для определенных базовых языков.
• Мы часто используем названия для синтаксических категорий, которые отличаются от стандартных названий, потому что терминология стандарта не всегда подходит для наших целей.
Хотя здесь речь идет только об уровне SQL/92, следует отметить, что ни один из коммерческих продуктов к моменту написания книги не поддерживал в полной мере стандарта SQL/92. Те языки, которые обычно поддерживаются продуктами, можно назвать "надмножествами подмножества" языка SQL/92. Другими словами, любой' данный продукт, не поддерживая некоторых аспектов стандарта, в других отношениях, возможно, превосходит его. Например, продукт IBM DB2, безусловно, не поддерживает всех средств SQL/92, касающихся целостности, но он превосходит стандарт в отношении правил, связанных с обновлением представлений.
И последнее замечание: в SQL используются такие термины, как таблицы, строки и столбцы вместо реляционных терминов отношение, кортеж и атрибут. Поэтому для согласованности со стандартом SQL и продуктами, поддерживающими SQL, мы также будем использовать эти термины в данной главе (и везде, где речь идет о SQL).