Справка по SQL | страница 10



, представленному ниже:

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 имеются одинаковые модели по одной и той же цене. В результате получим следующую таблицу: