|
Программирование >> Руководство по sql
Без оператора UNION вам потребовалось бы выполнить три отдельных запроса и поместить результаты в новую таблицу. Оператор UNION выполняет все это за один проход: SQL: select 20% off, title, price, price * .80 from titles where price < $7.00 union select 10% off, title, price, price * .90 from titles where price between $7.00 and $15.00 union select 30% off, title, price, price * .70 from titles where price > $15.00 Добавив заголовки столбцов, вы получите следующий результат: Результат:
Чтобы отсортировать результаты по цене, можно воспользоваться предложением ORDER BY. ПОДЗАПРОСЫ в следующей главе мы обратимся к подзапросам. Подзапросы обеспечивают другой метод для выполнения запросов к нескольким таблицам. Хотя объединения и подзапросы часто могут заменять друг друга, в некоторых случаях желаемый результат можно получить только с помощью подзапроса. Глава 8 Структурированные запросы и подзапросы что ТАКОЕ ПОДЗАПРОС Подзапрос (subquery) - это дополнительный метод манипуляций с несколькими таблицами. Это - оператор SELECT, вложенный: в предложение WHERE, HAVING или SELECT другого оператора SELECT; . в оператор INSERT, UPDATE или DELETE; в другой подзапрос. Именно возможность вложения операторов SQL друг в друга является причиной, по которой SQL первоначально был назван Structured Query Language (язык структурированных запросов). Термин подзапрос часто используется для ссылки на всю совокупность операторов, которая включает один или несколько подзапросов, а также на отдельное вложение. Каждый включающий оператор - следующий по старщинству уровень в подзапросе - представляет собой внещний уровень для внутреннего подзапроса. Подзапросы - достаточно сложная тема, поскольку существует два типа их обработки - некоррелированная и коррелированная - й три возможности соединения подзапроса с внещним предложением. После ознакомления с общим синтаксисом подзапроса мы посмотрим, как работают некоррелированный и коррелированный подзапросы, и сравним их с объединениями. Затем мы углубимся в вопросы соединений и рассмотрим некоррелированный и коррелированный примеры каждого из них. Упрощенный синтаксис подзапроса Упрощенная форма синтаксиса подзапроса (рис. 8.1) иллюстрирует вложение подзапроса в операторе SELECT. (В больщинстве примеров, приведенных в этой главе, используется именно этот вид структуры подзапроса.) Условия поиска (в том числе объединения), относящиеся к другому запросу, также могут встречаться в предложении WHERE внещнего запроса - до или после внутреннего запроса. SELECT [DISTINCT] Начало внешнего FROM список таблиц -- оператора SELECT WHERE {выражение { [NOT] IN оператор сравнения [ANY ALL] } I [NOT] EXISTS) Подзапрос, (SELECT [DISTINCT] список вы6ора подзапроса FROM список таблиц заключенный в скобки WHERE условия) [GROUP BY список группировки [HAVING условия]] - , . гчто nv nnnrvvi --Необязательные части [ ORDER BY порядок ] внешнего оператора SELECT Рис. 8.1. Подзапрос в операторе SELECT Глава 8. Структурированные запросы и подзапросы 159 КАК РАБОТАЮТ ПОДЗАПРОСЫ Подзапросы возвращают результаты внутреннего запроса во внещнее предложение и имеют две основные формы: некоррелированную (noncorrelated) и коррелированную (correlated). Первая реализуется (концептуально) изнутри наружу , т.е. внещний запрос выполняет то или иное действие, основываясь на результатах выполнения внутреннего запроса. Вторую (коррелированную) форму подзапроса можно представлять себе как обратное действие: внешний оператор SQL предоставляет значения для внутреннего подзапроса, которые будут использоваться при его выполнении. Затем результаты выполнения подзапроса возвращаются на внешний запрос. Как коррелированные, так и некоррелированные подзапросы бывают трех типов (подробнее об этом несколько позже), в зависимости от элементов в предложении WHERE внешнего запроса. 1. Подзапросы, которые не возвращают ни одного или возвращают несколько элементов (начинаются с IN или с оператора сравнения, содержат ключевые слова ANY или ALL). 2. Подзапросы, которые возвращают единственное значение (начинаются с простого оператора сравнения). 3. Подзапросы, которые представляют собой тест на существование (начинаются с EXISTS). На рис. 8.2 сравниваются некоррелированный и коррелированный подзапросы с идентичными получаемыми результатами. Оба они начинаются с IN и отыскивают названия издательств, выпускающих книги по бизнесу. SQL (некоррелированный): SQL (коррелированный): select pub name select pub name from publishers from publishers p----- where pub id in ; where bisiness in (select pub id---(select type- ; from titles from titles у where type = business) where pub id = p.pub id) Внутренний запрос выполняется Внутренний запрос для своего независимо, передавая результаты выполнения должен получить данные во внешний запрос из внешнего запроса Результат: РиЬ пате New Age Books Algodata Infosystems Рис. 8.2. Некоррелированный и коррелированный подзапросы Как это обычно имеет место в подзапросах, этот запрос можно также сформулировать как запрос на объединение. Чтобы названия каждого издательства отображались только один раз, добавьте в список выбора ключевое слово DISTINCT. SQL: select distinct pub name from publishers p, titles t where p.pub id = t. pub id and type = business
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |