- •Iso (международной организацией по
- •2 Понимание sql
- •Что такое - реляционная база данных?
- •Порядок строк произволен
- •4 Понимание sql ___________________________________________________________________
- •Идентификация строк ( первичные ключи )
- •Столбцы именуются и нумеруются
- •8 Понимание sql
- •************** Работа с sql **************
- •Sql : обзор
- •Что делает ansi ?
- •Интерактивный и вложенный sql
- •14 Понимание sql
- •Субподразделения sql
- •16 Понимание sql
- •Sql несогласованности
- •Что такое - пользователь?
- •18 Понимание sql
- •Условия и терминология
- •************** Работа с sql **************
- •24 Понимание sql
- •26 Понимание sql
- •Переупорядочение столбца
- •28 Понимание sql
- •Параметры distinct
- •30 Понимание sql
- •32 Понимание sql
- •************* Работа с sql ***************
- •38 Понимание sql
- •40 Понимание sql
- •42 Понимание sql
- •44 Понимание sql
- •Использование специальных операторов в условиях
- •50 Понимание sql
- •52 Понимание sql
- •54 Понимание sql
- •56 Понимание sql
- •************** Работа с sql **************
- •Обобщение данных с помощью агрегатных функций
- •64 Понимание sql
- •66 Понимание sql
- •Включение дубликатов в агрегатные функции
- •Предложение group by
- •68 Понимание sql
- •Предложение having
- •70 Понимание sql
- •72 Понимание sql
- •************** Работа с sql **************
- •Формирование выводов запросов
- •Помещение текста в вашем выводе запроса
- •78 Понимание sql
- •80 Понимание sql
- •82 Понимание sql
- •Упорядочение вывода по номеру столбца
- •84 Понимание sql
- •************** Работа с sql **************
- •Запрашивание многочисленых таблиц также как одной
- •90 Понимание sql
- •92 Понимание sql
- •94 Понимание sql
- •************** Работа с sql **************
- •Объединение таблицы с собой
- •Псевдонимы
- •100 Понимание sql
- •Устранение избыточности
- •102 Понимание sql
- •Больше псевдонимов
- •104 Понимание sql
- •106 Понимание sql
- •************** Работа с sql **************
- •Вставка одного запроса внутрь другого
- •112 Понимание sql
- •114 Понимание sql
- •116 Понимание sql
- •In определяет набор значений, одно из которых должно совпадать с другим
- •118 Понимание sql
- •In является подходящим, если запрос может ограниченно производить одно
- •120 Понимание sql
- •122 Понимание sql
- •*************** Работа с sql *************
- •Соотнесенные подзапросы
- •130 Понимание sql
- •132 Понимание sql
- •Соотнесенные подзапросы в предложении having
- •134 Понимание sql
- •*************** Работа с sql *************
- •Использование оператора exists
- •140 Понимание sql
- •142 Понимание sql
- •144 Понимание sql
- •146 Понимание sql
- •************** Работа с sql **************
- •Использование оператора exists
- •152 Понимание sql
- •154 Понимание sql _____________________________________________________________________
- •156 Понимание sql
- •158 Понимание sql
- •160 Понимание sql
- •162 Понимание sql
- •Использование count вместо exists
- •166 Понимание sql
- •************** Работа с sql **************
100 Понимание sql
______________________________________________________________________
ГЛ. 9
Когда запрос заканчивается, псевдонимы используемые в нем больше не
имеют никакого значения.
Теперь, когда имеются две копии таблицы Заказчиков, чтобы работать с
ними, SQL может обрабатывать эту операцию точно также как и любое
другое обьединение - берет каждую строку из одного псевдонима и срав-
нивает ее с каждой строкой из другого псевдонима.
Устранение избыточности
Обратите внимание что наш вывод имеет два значение для каждой комби-
нации, причем второй раз в обратном порядке. Это потому, что каждое
значение показано первый раз в каждом псевдониме, и второй раз( сим-
метрично) в предикате.
Следовательно, значение A в псевдониме сначала выбирается в комбина-
ции со значением B во втором псевдониме, а затем значение A во втором
псевдониме выбирается в комбинации со значением B в первом псевдониме.
В нашем примере, Hoffman выбрался вместе с Clemens, а затем Clemens
выбрался вместе с Hoffman. Тот же самый случай с Cisneros и Grass,
Liu и Giovanni, и так далее. Кроме того каждая строка была сравнена
сама с собой, чтобы вывести строки такие как - Liu и Liu.
Простой способ избежать этого состoит в том, чтобы налагать порядок
на два значения, так чтобы один мог быть меньше чем другой или
предшествовал ему в алфавитном порядке. Это делает предикат
ассиметричным, поэтому те же самые значения в обратном порядке не
будут выбраны снова, например:
SELECT tirst.cname, second.cname, first.rating
FROM Customers first, Customers second
WHERE first.rating = second.rating
AND first.cname < second.cname;
Вывод этого запроса показывается в Рисунке 9.2.
Hoffman предшествует Periera в алфавитном порядке, поэтому комбинация
удовлетворяет обеим условиям предиката и появляется в выводе. Когда
та же самая комбинация появляется в обратном порядке - когда Periera
в псевдониме первой таблицы сравнтвается с Hoffman во второй таблице
псевдонима - второе условие не встречается.
Аналогично Hoffman не выбирается при наличии того же рейтинга что и
он сам потому что его имя не предшествует ему самому в алфавитном
порядке. Если бы вы захотели включить сравнение строк с ними же
ОБЪЕДИНЕНИЕ ТАБЛИЦ С СОБОЙ 101
______________________________________________________________________
=============== SQL Execution Log ==============
| |
| SELECT first.cname, second.cname, first.rating |
| FROM Customers first, Customers second |
| WHERE first.rating = second.rating |
| AND first.cname < second.cname |
| =============================================== |
| cname cname rating |
| ------- --------- ------- |
| Hoffman Pereira 100 |
| Giovanni Liu 200 |
| Clemens Hoffman 100 |
| Pereira Pereira 100 |
| Gisneros Grass 300 |
=================================================
Рисунок 9.2: Устранение избыточности вывода в обьединении с собой.
в запросах подобно этому, вы могли бы просто использовать
< = вместо <.
ПРОВЕРКА ОШИБОК
Таким образом мы можем использовать эту особенность SQL для проверки
определенных видов ошибок. При просмотре таблицы Порядков, вы можете
видеть что поля cnum и snum должны иметь постоянную связь.
Так как каждый заказчик должен быть назначен к одному и только одному
продавцу, каждый раз когда определенный номер заказчика появляется в
таблице Порядков, он должен совпадать с таким же номером продавца.
Следующая команда будет определять любые несогласованности в этой
области:
SELECT first.onum, tirst.cnum, first.snum,
second.onum, second.cnum,second.snum
FROM Orders first, Orders second
WHERE first.cnum = second.cnum
AND first.snum < > second.snum;
Хотя это выглядит сложно, логика этой команды достаточно проста.
Она будет брать первую строку таблицы Порядков, запоминать ее под