Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практические SQL запросы на выборку.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
9.64 Mб
Скачать

Подзапросы выбирают одиночные столбцы

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

Использование выражений в подзапросах

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

SELECT * FROM Customers WHERE cnum = ( SELECT snum + 1000 FROM Salespeople WHERE sname = Serres );

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

Номер заказчика

Имя заказчика

Расположение заказчика

Рэйтинг

Номер продавца

2002

Giovanni

Rom

200

1003

Рисунок 11 Использование подзапроса с выражением

Подзапросы в предложении having

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

SELECT rating FROM Customers GROUP BY rating HAVING rating > ( SELECT AVG (rating) FROM Customers WHERE city = ‘San Jose');

Рэйтинг

300

Рисунок 12 Нахождение заказчиков с оценкой выше среднего в San Jose

Практическая часть

  1. Напишите запрос который бы вывел все пары продавцов живущих в одном и том же городе. Исключите комбинации продавцов с ними же, а также дубликаты строк выводимых в обратным порядке.

  2. Напишите запрос который вывел бы все пары Продажи по данным заказчикам, именам этих заказчиков, и исключал дубликаты из вывода, как в предыдущем вопросе.

  3. Напишите запрос который вывел бы имена(cname) и города(city) всех заказчиков с такой же оценкой(rating) как у Hoffmanа.

  4. Напишите запрос использующий поле cnum Hoffmanа а не его оценку, так чтобы оно могло быть использовано если его оценка вдруг изменится.

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

  6. Напишите запрос который вывел бы имена и оценки всех заказчиков которые имеют усредненые Продаж.

  7. Напишите запрос который бы выбрал общую сумму всех приобретений в порядках для каждого продавца, у которого эта общая сумма больше чем сумма наибольшего порядка в таблице.