Программирование >>  Руководство по sql 

1 ... 49 50 51 [ 52 ] 53 54 55 ... 105


Без оператора 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

Добавив заголовки столбцов, вы получите следующий результат: Результат:

discount

title

10 %

Cooking with Computers: Surreptitious Balance Sheets

11.95

IQ.lsS

Emotional Security: A New Algorithm

7.99

7.191

Fifty Years in Buckingham Palace Kitchens

11.95

10.755

Is Anger the Enemy?

10.95

9.855

Life Without Fear

Sushi, Anyone?

14.99

13.491

The Gourmet Microwave

2.99

2.392

You Can Combat Computer Stress!

2.99

2.392

But Is It User Friendly?

22.95

16.065

Computer Phobic and Non-Phobic Individuals: Behavior Variations

21.59

15.113

Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean

20.95

14.665

Prolonged Data Deprivation: Four Case Studies

19.99

13.993

Secrets of Silicon Valley

Silicon Valley Gastronomic Treats

19.99

13.993

Straight Talk About Computers

19.99

13.993

The Busy Executives Database Guide

19.99

13.993

Чтобы отсортировать результаты по цене, можно воспользоваться предложением 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



1 ... 49 50 51 [ 52 ] 53 54 55 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика