Программирование >>  Руководство по sql 

1 ... 46 47 48 [ 49 ] 50 51 52 ... 105


from authors aul, authors au2

where aul.city

= Oakland

and aul.zip =

au2.zip

Результат:

au fname

au Iname

Marjorie

Green

~~9Гб18~

Dirk

Stringer

94609

Dirk

Stringer

94609

Dirk

Stringer

94609

Dick

Straight

94609

Dick

Straight

94609

Dick

Straight

94609

Livia

Karsen

94609

Livia

Karsen

94609

Livia

Karsen

94609

Stearns

MacFeather

94612

В этих результатах достаточно сложно разобраться и они не кажутся правильными. Чтобы прояснить ситуацию, давайте сначала устраним повторяющиеся строки для трех авторов (Straight, Stringer и Karsen). Для этого используем в списке выбора ключевое слово DISTINCT.

SQL:

select distinct aul.au fname,aul.au lname, aul.zip from authors aul, authors au2 where aul.city = Oakland and aul.zip = au2.zip

Результат: au fname

Dick

Dirk

Livia

Marjorie

Stearns

au lname

Straight

Stringer

Karsen

Green

MacFeather

94609 94609 94609 94618 94612

Теперь в результате нет повторяющихся строк, но при этом в нем просто перечисляются все авторы, живущие в Окленде, а не только имеющие одинаковые почтовые коды. Что происходит?

При самоообъединении все значения почтовых кодов сравниваются сами с собой и поэтому в результат автоматически попадают все авторы из Окленда. Чтобы устранить из результата авторов, чьи почтовые коды совпадают только с их же собственными кодами, в предложение WHERE нужно добавить дополнительное условие:

SQL:

select distinct aul.au fname,aul.au Iname, aul.zip from authors aul, authors au2 where aul.city = Oakland

and aul.zip = au2.zip

and aul.au id != au2.au id



Результат: au fname

Dick Dirk Livia

au lname

Straight Stringer Karsen

94609 94609 94609

Если не использовать в запросе ключевое слово DISTINCT, в результате снова появятся повторяющиеся строки:

SQL:

select aul.au fname,aul.au lname, aul.zip from authors aul, authors au2 where aul.city = Oakland

and aul.zip = au2.zip

and aul.au id != au2.au id

Результат: au fname

Dirk

Dirk

Dick

Dick

Livia

Livia

au lname

Stringer

Stringer

Straight

Straight

Karsen

Karsen

94609 94609 94609 94609 94609 94609

Устранение дублирующихся строк особенно важно, когда требуется узнать сколько? , а не кто именно?

Использование при самообъединении оператора неравенства

в предыдущем примере для устранения повторяющихся строк при самообъединении использовался оператор неравенства. Вместо него также может применяться ключевое слово NOT. Выражение NOT имя столбца = имястолбца эквивалентно выражению 1шя столбца != имястолбца. Таким образом предыдущий запрос можно записать в следующем виде:

SQL:

select distinct aul.au fname,aul.au lname, aul.zip from authors aul, authors au2 where aul.city = Oakland

and aul.zip = au2.zip

and not aul.au id = au2.au id

В качестве другого примера использования при самообъединении оператора неравенства рассмотрим запрос, с помощью которого находятся значения идентификаторов книг и авторов для всех книг, написанных в соавторстве. Другими словами, находятся все строки в таблице titleauthors с одинаковыми значениями titlejd, но разными значениями auid.

SQL:

select distinct tl.title id, tl.au id from titleauthors tl, titleauthors t2 where tl.title id = t2.title id and tl.au id != t2.au id order by tl.title id



Результат:

title id

au id

BU1032

213-46-8ll5

BU1032

409-56-7008

BUllll

267-41-2394

BUllll

724-80-9391

MC3021

722-51-5454

MC3021

899-46-2035

PC8888

427-17-2319

PC8888

846-92-7186

PS1372

724-80-9391

PS1372

756-30-7391

PS2091

899-46-2035

PS2091

998-72-3567

TC7777

267-41-2394

10.1111

472-27-2349

10.1111

672-71-3249

Объединение нескольких таблиц

Таблица titleauthors в нашей базе данных хорошо иллюстрирует ситуацию, когда может потребоваться объединение более двух таблиц. Для получения полной информации о книгах и их авторах в случае базы данных bookbiz необходимо объединить три таблицы.

Например, чтобы найти названия всех книг определенного типа (tradcook) и имена их авторов, нужно выполнить следующий запрос:

SQL:

select au lname, au fname, title

from authors a, titles t, titleauthors ta

where a.au id = ta.au id

and t.title id = ta.title id

and t.type= trad cook

Результат:

au lname au fname title

OLeary Michael Sushi, Anyone?

Gringlesby Burt Sushi, Anyone? Yokomoto Akiko Sushi, Anyone?

Blotchet-Halls Reginald Fifty Years in Buckingham Palace Kitchens Panteley Sylvia Onions, Leeks, and Garlic: Cooking Secrets of

the Mediterranean

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

Несколько условий объединения почти всегда соединяются с помошью оператора AND, как, например, в предыдущем примере. Оператор OR в этом случае используется крайне редко, поскольку получаемые с его помощью условия недостаточно офаничивают объединение.



1 ... 46 47 48 [ 49 ] 50 51 52 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика