Чтение онлайн

на главную - закладки

Жанры

Понимание SQL

Грубер Мартин

Шрифт:

SELECT comm

FROM Salespeople

WHERE snum IN

( SELECT snum

FROM Customers

WHERE city="London" );

Выводимыми для этого запроса, показанного в Таблице 10.5, являются значения комиссионных продавца Peel (snum =1001 ), который имеет обоих заказчиков в Лондоне. Это - только для данного случая. Нет никакой причины чтобы некоторые заказчики в Лондоне не могли быть назначеными к кому-то еще. Следовательно, IN - это наиболее логичная форма чтобы использовать ее в запросе.

SQL Execution Log

SELECT comm FROM Salespeople WHERE snum IN

(SELECT snum FROM Customers WHERE city='London');

comm

0.12

Таблица 10.5 Использование IN с подзапросом для вывода одного значения

Между прочим, префикс таблицы для поля city необязателен в предыдущем примере, несмотря на возможную неоднозначность между полями city таблицы Заказчика и таблицы Продавцов.

SQL всегда ищет первое поле в таблице обозначенной в предложении FROM текущего подзапроса. Если поле с данным именем там не найдено, проверяются внешние запросы. В вышеупомянутом примере, "city" в предложении WHERE означает что имеется ссылка к Customer.city( поле city таблицы Заказчиков). Так как таблица Заказчиков указана в предложении FROM текущего запроса, SQL предполагает что это - правильно. Это предположение может быть отменено полным именем таблицы или префиксом псевдонима, о которых мы поговорим позже когда будем говорить об соотнесенных подзапросах. Если возможен беспорядок, конечно же, лучше всего использовать префиксы.

ПОДЗАПРОСЫ ВЫБИРАЮТ ОДИНОЧНЫЕ СТОЛБЦЫ

Смысл всех подзапросов обсужденных в этой главе тот, что все они выбирают одиночный столбец. Это обязательно, поскольку выбранный вывод сравнивается с одиночным значением. Подтверждением этому то, что SELECT * не может использоваться в подзапросе. Имеется исключение из этого, когда подзапросы используются с оператором EXISTS, который мы будем представлять в Главе 12.

ИСПОЛЬЗОВАНИЕ ВЫРАЖЕНИЙ В ПОДЗАПРОСАХ

Вы можете использовать выражение основанное на столбце, а не просто сам столбец, в предложении SELECT подзапроса. Это может быть выполнено или с помощью реляционных операторов или с IN. Например, следующий запрос использует реляционный оператор =( вывод показывается в Таблице 10.6 ):

SELECT *

FROM Customers

WHERE cnum=

( SELECT snum + 1000

FROM Salespeople

WHERE sname=Serres );

Он находит всех заказчиков чье значение поля cnum равное 1000, выше поля snum Serres. Мы предполагаем что столбец sname не имеет никаких двойных значений (это может быть предписано или UNIQUE INDEX, обсуждаемым в Главе 17, или ограничением UNIQUE, обсуждаемым в Главе 18 );иначе

SQL Execution Log

SELECT * FROM Customers WHERE cnum=

(SELECT snum + 1000 WHERE Salespeople

WHERE sname='Serres'

cnum

cname

city

rating

snum

2002

Giovanni

Rome

200

1003

Таблица 10.6: Использование подзапроса с выражением

подзапрос может произвести многочисленые значения. Когда поля snum и сnum не имеют такого простого функционального значения как например первичный ключ, что не всегда хорошо, запрос типа вышеупомянутого невероятно полезен.

ПОДЗАПРОСЫ В ПРЕДЛОЖЕНИИ HAVING

Вы можете также использовать подзапросы внутри предложения HAVING.

Эти подзапросы могут использовать свои собственные агрегатные функции если они не производят многочисленых значений или использовать GROUP BY или HAVING. Следующий запрос является этому примером (вывод пока зывается в Таблице 10.7 ):

SELECT rating, COUNT (DISTINCT cnum )

FROM Customers

GROUP BY rating

HAVING rating >

( SELECT AVG (rating)

FROM Customers

WHERE city=" San Jose';

SQL Execution Log

SELECT rating,count (DISTINCT cnum) FROM Customers

GROUP BY rating HAVING rating >

(SELECT AVG (rating)snum + 1000 FROM Custimers

WHERE city='San Jose'

rating

200

2

Таблица 10.7: Нахождение заказчиков с оценкой выше среднего в San Jose

Эта команда подсчитывает заказчиков с оценками выше среднего в San Jose. Так как имеются другие оценки отличные от 300, они должны быть выведены с числом номеров заказчиков которые имели эту оценку.

РЕЗЮМЕ

Теперь вы используете запросы в иерархической манере. Вы видели, что использование результата одного запроса для управления другим, расширяет возможности позволяющие выполнить большее количество функций. Вы теперь понимаете как использовать подзапросы с реляционными операторами также как и со специальным оператором IN, или в предложении WHERE или в предложении HAVING внешнего запроса.

В следующих главах, мы будем разрабатывать подзапросы. Сначала в Главе 11, мы обсудим другой вид подзапроса, который выполняется отдельно для каждой строки таблицы вызываемой во внешнем запросе. Затем, в Главе 12 и 13, мы представим вас нескольким специальным операторам которые функционируют на всех подзапросах, как это делает IN, за исключением когда эти операторы могут использоваться только в подзапросах.

РАБОТА С SQL

* Напишите запрос, который бы использовал подзапрос для получениявсех порядков для заказчика с именем Cisneros. Предположим, что вы не знаете номера этого заказчика, указываемого в поле cnum.

Поделиться:
Популярные книги

Пришельцы с небес

Желязны Роджер Джозеф
Золотая библиотека фантастики
Фантастика:
научная фантастика
5.00
рейтинг книги
Пришельцы с небес

Бремя власти

Балашов Дмитрий Михайлович
3. Государи московские
Научно-образовательная:
история
7.25
рейтинг книги
Бремя власти

Контртеррор

Валериев Игорь
6. Ермак
Фантастика:
альтернативная история
5.00
рейтинг книги
Контртеррор

Ганнибал у ворот

Барка Ганнибал
Великие полководцы
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Ганнибал у ворот

Ведьмак (сборник)

Сапковский Анджей
Фантастика:
фэнтези
6.67
рейтинг книги
Ведьмак (сборник)

Лекарь Империи 5

Карелин Сергей Витальевич
5. Лекарь Империи
Фантастика:
городское фэнтези
аниме
героическая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 5

Марш через джунгли

Вебер Дэвид Марк
1. Империя человека
Фантастика:
космическая фантастика
6.86
рейтинг книги
Марш через джунгли

Путь

Рякин Евгений Владимирович
Проза:
современная проза
7.50
рейтинг книги
Путь

Гражданская кампания

Буджолд Лоис Макмастер
12. Сага о Форкосиганах
Фантастика:
космическая фантастика
9.14
рейтинг книги
Гражданская кампания

Человек случайностей (др. изд.)

Мердок Айрис
Проза:
современная проза
6.80
рейтинг книги
Человек случайностей (др. изд.)

Прайм. День Платы

Бор Жорж
7. Легенда
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Прайм. День Платы

Обрученная с розой

Вилар Симона
1. Анна Невиль
Любовные романы:
исторические любовные романы
9.33
рейтинг книги
Обрученная с розой

Боярин

Гончаров Олег
3. Ночь Сварога
Приключения:
исторические приключения
8.58
рейтинг книги
Боярин

Базис

Владимиров Денис
7. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Базис