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

1 ... 51 52 53 [ 54 ] 55 56 57 ... 105


Объединения!

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

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

SQL:

select pub name, au fname, au lname from publishers, authors where publishers.city = authors.city

Результат: pub name

Algodata Infosystems Algodata Infosystems

au fname

Cheryl Abraham

au lname

Carson Bennet

Подзапрос может отображать информацию только из внешней таблицы {publishers), поэтому он находит название издательства и останавливается на этом. Если же вы хотите, чтобы результаты включали информацию из обеих таблиц, пользуйтесь объединением.

Подзапросы или самообъединения?

Многие операторы, в которых подзапрос и внешний запрос ссылаются на одну и ту же таблицу, можно реализовать с помощью самообъединения. Используя подзапрос, можно было бы, например, отыскать авторов, проживающих в том же городе, что и Livia Karsen:

SQL:

select au lname, au fname, from authors where city in (select city from authors

where au fname = Livia and au Iname = Karsen)

city

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

Green Stringer Straight Karsen MacFeather

au fname

Marjorie

Dirk

Dick

Livia

Stearns

city

Oakland Oakland Oakland Oakland Oakland

A можно было бы воспользоваться и самообъединением:

SQL:

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

and au2.au lname = Karsen

and au2.au fname = Livia



Что лучше?

Окончательное решение о том, каким же именно средством воспользоваться, - подзапросом или объединением, - когда приходится работать с несколькими таблицами, обычно определяется стилем, в котором вы предпочитаете работать. Большинство людей находят одно из этих средств более интуитивным . (Профаммисты, например, часто предпочитают подзапросы, поскольку они напоминают им столь привычные подпрограммы.) Тем не менее бывают случаи, когда приходится выбирать.

Подзапросы - когда вам необходимо сравнивать значения афегирующих функций с другими значениями.

Объединения - когда вы отображаете информацию из нескольких таблиц.

ПРАВИЛА ПОДЗАПРОСОВ

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

Список выбора внутреннего подзапроса, начинающийся с оператора сравнения или IN, может включать только одно выражение или имя столбца. Столбец, имя которого вы указываете в предложении WHERE внешнего оператора, должен быть совместимым для объединения со столбцом, имя которого вы указываете в списке выбора подзапроса.

Список выбора подзапроса, начинающийся с EXISTS, почти всегда включает звездочку (*). В данном случае нет необходимости указывать имена столбцов, поскольку вы лишь выполняете проверку на существование (или несуществование ) любых строк, которые удовлетворяют указанным критериям. (Вы можете задать принадлежность сфок таблицам в предложении WHERE подзапроса.) В остальных отношениях правила списка выбора для подзапроса, начинающегося с EXISTS, идентичны правилам для стандартного списка выбора.

Подзапросы, начинаюшиеся с немодифицированного оператора сравнения (оператор сравнения, за которым не следует ключевое слово ANY или ALL), не могут включать предложения GROUP BY и HAVING, если только вы не определили заранее, что в результате фуппировки будет возвращаться единственное значение.

Подзапросы не могут манипулировать своими результатами внутри себя, т.е. подзапрос не может включать предложение ORDER BY или ключевое слово INTO.

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

1. Подзапросы, которые возвращают от нуля до нескольких элементов (начинаются с IN или с оператора сравнения, модифицируемого с помощью ANY или ALL).

2. Подзапросы, которые возвращают единственное значение (начинаются с немодифицированного оператора сравнения).

3. Подзапросы, которые реализуют тест на существование (начинаются с EXISTS).

Каждый тип описывается в одном из последующих разделов. (Эти запросы могут быть некоррелированными или коррелированными.)



ПОДЗАПРОСЫ, НЕ ВОЗВРАЩАЮЩИЕ ЗНАЧЕНИЙ ИЛИ ВОЗВРАЩАЮЩИЕ НЕСКОЛЬКО ЗНАЧЕНИЙ

Эта группа включает подзапросы, начинающиеся с IN, NOT IN или оператора сравнения с ключевыми словами ANY или ALL.

Подзапросы, начинающиеся с IN

Подзапросы, начинающиеся с ключевого слова IN, имеют следующую общую форму:

Начало операторов SELECT, INSERT, UPDATE, DELETE или подзапроса WHERE выражение [NOT] IN (подзапрос)

/Конец операторов SELECT, INSERT, UPDATE, DELETE или подзапроса/

Результатом внутреннего подзапроса является список, включающий от нуля до нескольких значений. После того как подзапрос возвратит результаты, к их обработке приступит внещний запрос.

Ниже приведен пример оператора, который можно сформулировать либо с помощью подзапроса, либо с помощью объединения. Если этот запрос изложить по-русски, он будет выглядеть так: Найти фамилии всех вторых авторов, проживающих в Калифорнии и получающих менее 30 процентов авторского гонорара за книги, соавторами которых они являются . Если воспользоваться подзапросом, эта фраза примет следующий вид:

SQL:

select au lname, au fname from authors where state = CA and au id in

(select au id

from titleauthors

where royaltyshare < .30

and au ord =2)

Результат:

au fname

MacFeather Stearns

Сначала выполняется внутренний запрос, генерирующий список идентификаторов, состоящий из двух вторых авторов, удовлетворяющих заданному нами критерию поиска (получение менее 30 процентов авторского гонорара). После этого система выполняет внещний запрос.

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

Если воспользоваться объединением, запрос можно выразить так:

SQL:

select au lname, au fname from authors, titleauthors where state = CA

and authors.au id = titleauthors.au id and royaltyshare < .30 and au ord = 2



1 ... 51 52 53 [ 54 ] 55 56 57 ... 105

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