В результате выполнения запроса получим:
model
|
Qty_model
|
Avg_price
|
1232
|
4
|
425.0
|
1260
|
1
|
350.0
|
Заметим, что в предложении HAVING нельзя использовать псевдоним(Avg_price), используемый для именования значений агрегатной функции. Дело в том, что предложение SELECT, формирующее выходной набор запроса, выполняется предпоследним перед предложением ORDER BY.
Ниже приведен порядок обработки предложенийв операторе SELECT:
* FROM
* WHERE
* GROUP BY
* HAVING
* SELECT
* ORDER BY
Этот порядок не соответствует синтаксическому порядку общего формата оператора SELECT, представленному ниже:
SELECT[ DISTINCT| ALL]{*
| [ [[ AS] ]] [,…]}
FROM[[ AS] ] [,…]
[ WHERE]
[[ GROUP BY]
[ HAVING] ]
[ ORDER BY]
Использование в запросе нескольких таблиц. Предложение FROM
Как видно из приведенного в конце предыдущего раздела синтаксиса оператора SELECT, в предложении FROMдопускается указание несколькихтаблиц. Простое перечисление таблиц практически не используется, поскольку оно соответствует реляционной операции декартова произведения. Т.е. в результирующем наборе каждая запись из одной таблицы будет сочетаться с каждой записью в другой. Например, для таблиц
A
|
|
B
|
a
|
b
|
|
c
|
d
|
1
|
2
|
|
2
|
4
|
2
|
1
|
|
3
|
3
|
Результат запроса
SELECT * FROM A, B;
будет выглядеть следующим образом:
a
|
b
|
c
|
d
|
1
|
2
|
2
|
4
|
1
|
2
|
3
|
3
|
2
|
1
|
2
|
4
|
2
|
1
|
3
|
3
|
Поэтому перечисление таблиц, как правило, используется совместно с условием соединения записей из разных таблиц, указываемым в предложении WHERE. Для приведенных выше таблиц таким условием может быть совпадение значений, скажем, в полях a и c :
SELECT * FROM A, B WHERE a=c;
Теперь результатом выполнения этого запроса будет следующая таблица:
т.е. соединяются только те строки таблиц, у которых в указанных полях находятся равные значения (эквисоединение). Естественно, могут быть использованы любые условия, хотя эквисоединение используется чаще всего, поскольку эта операция воссоздает некую сущность, декомпозированную на две других в результате процедуры нормализации.
Если разные таблицы имеют столбцы с одинаковыми именами, то для однозначности требуется использовать точечную нотацию:
.
В тех случаях, когда это не вызывает неоднозначности, использование данной нотации не является обязательным.
Пример. Найти номер модели и производителя ПК, имеющих цену менее $600:
SELECT DISTINCT PC.model, maker
FROM PC, Product
WHERE PC.model = Product.model AND price < 600;
В результате каждая модель одного и того же производителя выводится только один раз:
model
|
maker
|
1232
|
A
|
1260
|
E
|
Иногда в предложении FROMтребуется указать одну и ту же таблицу несколько раз. В этом случае обязательным является переименование.
Пример. Вывести пары моделей, имеющих одинаковые цены:
SELECT DISTINCT A.model AS model_1, B.model AS model_2
FROM PC AS A, PC B
WHERE A.price = B.price AND A.model < B.model;
Здесь условие A.model < B.model используется для того, чтобы не выводились одинаковые пары, отличающиеся только перестановкой, например: 1232, 1233 и 1233, 1232. DISTINCT применяется для того, чтобы исключить одинаковые строки, поскольку в таблице PC имеются одинаковые модели по одной и той же цене. В результате получим следующую таблицу:
model_1
|
model_2
|
1232
|
1233
|
1232
|
1260
|
Переименование также требуется, если в предложении FROMиспользуется подзапрос. Так, первый пример можно переписать следующим образом:
SELECT DISTINCT PC.model, maker
FROM PC,
(SELECT maker, model
FROM Product) AS prod
Читать дальше