W Cat - Справка по SQL
- Название:Справка по SQL
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
W Cat - Справка по SQL краткое содержание
Справка по SQL - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
В результате выполнения запроса получим:
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;
Теперь результатом выполнения этого запроса будет следующая таблица:
a |
b |
c |
d |
---|---|---|---|
2 |
1 |
2 |
4 |
т.е. соединяются только те строки таблиц, у которых в указанных полях находятся равные значения (эквисоединение). Естественно, могут быть использованы любые условия, хотя эквисоединение используется чаще всего, поскольку эта операция воссоздает некую сущность, декомпозированную на две других в результате процедуры нормализации.
Если разные таблицы имеют столбцы с одинаковыми именами, то для однозначности требуется использовать точечную нотацию:
.
В тех случаях, когда это не вызывает неоднозначности, использование данной нотации не является обязательным.
Пример. Найти номер модели и производителя ПК, имеющих цену менее $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
WHERE PC.model = prod.model AND price < 600;
Обратите внимание, что в этом случае в других предложениях оператора SELECTуже нельзя использовать квалификатор Product , поскольку таблица Product уже не используется. Вместо него используется псевдоним prod . Кроме того, ссылаться теперь можно только на те поля таблицы Product , которые перечислены в подзапросе.
Операции соединения. Предложения JOIN
В предложении FROMможет быть указана явная операция соединениядвух и более таблиц. Среди ряда операций соединения, описанных в стандарте языка SQL, многими серверами баз данных поддерживается лишь операция соединения по предикату. Синтаксис соединения по предикату имеет вид:
FROM[ INNER]
| {{ LEFT| RIGHT| FULL} [ OUTER]} JOIN
[ ON]
Соединение может быть либо внутренним( INNER), либо одним из внешних( OUTER). Служебные слова INNERи OUTERможно опускать, поскольку внешнее соединение однозначно определяется его типом - LEFT(левое), RIGHT(правое) или FULL(полное), а просто JOINбудет означать внутреннее соединение.
Предикат определяет условие соединения строк из разных таблиц. При этом INNER JOINозначает, что в результирующий набор попадут только те соединения строк двух таблиц, для которых значение предиката равно TRUE. Как правило, предикат определяет эквисоединение по внешнему и первичному ключам соединяемых таблиц, хотя это не обязательно.
Пример. Найти производителя, номер модели и цену каждого компьютера, имеющегося в базе данных:
SELECT maker, Product.model AS model_1, PC.model AS model_2, price
FROM Product INNER JOIN PC ON PC.model = Product.model
ORDER BY maker, PC.model;
В данном примере в результирующем наборе будут соединяться только те строки из таблиц PC и Product , у которых совпадают номера моделей.
Для контроля в результат включен как номер модели из таблицы PC , так и из таблицы Product :
maker |
model_1 |
model_2 |
price |
---|---|---|---|
A |
1232 |
1232 |
600.0 |
A |
1232 |
Интервал:
Закладка: