Все бесплатно
    Все ссылки на файлы, расположенные на страницах сайта, добавлены пользователями и доступны для бесплатного скачивания. За содержание этих файлов администрация сайта ответственности не несет.



Вопросы
  Прочитать содержимое папки
   Категория: Файловая система
  Округление в меньшую сторону
   Категория: Математика
  Сохраняем Bitmap в поле dbase
   Категория: Базы данных
  Listbox - элементы вверх-вниз
   Категория: Компоненты
  Переключение раскладки клавиатуры
   Категория: Приложение
  Компонент StatusBar
   Категория: Компоненты
  Поставить пароль на Paradox
   Категория: Базы данных
  Удалить пробелы в начале и конце
   Категория: Текст и строки
  Вывод текста на канву Canvas
   Категория: Компоненты

М.Грубер Понимание SQL - Глава 8
Скачать софт бесплатно. скачать шаблоны dle бесплатно.

8. ЗАПРАШИВАНИЕ МНОГОЧИСЛЕНЫХ ТАБЛИЦ ТАКЖЕ КАК ОДНОЙ



ДО ЭТОГО, КАЖДЫЙ ЗАПРОС КОТОРЫЙ МЫ ИССЛЕДОВАЛИ основывался на одиночной таблице. В этой главе, вы узнаете как сделать запрос любого числа таблиц с помощью одной команды. Это - чрезвычайно мощное средство потому что оно не только объединяет вывод из многочисленых таблиц, но и определяет связи между ними. Вы обучитесь различным формам которые могут использовать эти связи, а также устанавливать и использовать их чтобы удовлетворять возможным специальным требованиям.


=============ОБЪЕДИНЕНИЕ ТАБЛИЦ ============


Одна из наиболее важных особенностей запросов SQL - это их способность определять связи между многочислеными таблицами и выводить информацию из них в терминах этих связей, всю внутри одной команды. Этот вид операции называется - объединением, которое является одним из видов операций в реляционных базах данных. Как установлено в Главе 1, главное в реляционном подходе это связи которые можно создавать между позициями данных в таблицах. Используя обьединения, мы непосредственно связываем информацию с любым номером таблицы, и таким образом способныоздавать связи между сравнимыми фрагментами данных. При обьединении, таблицы представленые списком в предложении FROM запроса, отделяются запятыми. Предикат запроса может ссылаться к любому столбцу любой связанной таблицы и, следовательно, может использоваться для связи между ими. Обычно, предикат сравнивает значения в столбцах различных таблиц чтобы определить, удовлетворяет ли WHERE установленному условию.


ИМЕНА ТАБЛИЦ И СТОЛБЦОВ


Полное имя столбца таблицы фактически состоит из имени таблицы, сопровождаемого точкой и затем именем столбца. Имеются несколько примеров имен:


Salespeople.snum
Salespeople.city
Orders.odate


До этого, вы могли опускать имена таблиц потому что вы запрашивали только одну таблицу одновременно, а SQL достаточно интелектуален чтобы присвоить соответствующий префикс, имени таблицы. Даже когда вы делаете запрос многочисленых таблиц, вы еще можете опускать имена таблиц, если все ее столбцы имеют различные имена. Но это не всегда так бывает. Например, мы имеем две типовые таблицы со столбцами называемыми city.


Если мы должны связать эти столбцы( кратковременно ), мы будем должны указать их с именами Salespeople.city или Customers.city, чтобы SQL мог их различать.


СОЗДАНИЕ ОБЬЕДИНЕНИЯ


Предположим что вы хотите поставить в соответствии вашему продавцу ваших заказчиков в городе в котором они живут, поэтому вы увидите все комбинации продавцов и заказчиков для этого города. Вы будете должны брать каждого продавца и искать в таблице Заказчиков всех заказчиков того же самого города. Вы могли бы сделать это, введя следующую команду ( вывод показывается в Таблице 8.1 ):



SELECT Customers.cname, Salespeople.sname,
Salespeople.city
FROM Salespeople, Customers
WHERE Salespeople.city=Customers.city;

SQL Execution Log
SELECT Customers.cname, Salespeople.sname, Salespeople.city
FROM Salespeople, Customers WHERE Salespeople.city=Customers.city
cname
cname
city
Hoffman
Peel
London
Hoffman
Peel
London
Liu
Serres
San Jose
Cisneros
Serres
San Jose
Hoffman
Motika
London
Clemens
Motika
London

Таблица 8.1: Объединение двух таблиц


Так как это поле city имеется и в таблице Продавцов и таблице Заказчиков, имена таблиц должны использоваться как префиксы. Хотя это необходимо только когда два или более полей имеют одно и то же имя, в любом случае это хорошая идея включать имя таблицы в обьединение для лучшего понимания и непротиворечивости. Несмотря на это, мы будем, в наших примерах далее, использовать имена таблицы только когда необходимо, так что будет ясно, когда они необходимы а когда нет.


Что SQL в основном делает в обьединении - так это исследует каждую комбинацию строк двух или более возможных таблиц, и проверяет эти комбинации по их предикатам. В предыдущем примере, требовалась строка продавца Peel из таблицы Продавцов и объединение ее с каждой строкой таблицы Пользователей, по одной в каждый момент времени. Если комбинация производит значение которое делает предикат верным, и если поле city из строк таблиц Заказчика равно London, то Peel - это то запрашиваемое значение которое комбинация выберет для вывода. То же самое будет затем выполнено для каждого продавца в таблице Продавцов ( у некоторых из которых небыло никаких заказчиков в этих городах).


ОБЪЕДИНЕНИЕ ТАБЛИЦ ЧЕРЕЗ СПРАВОЧНУЮ ЦЕЛОСТНОСТЬ


Эта особенность часто используется просто для эксплуатации связей встроенных в базу данных. В предыдущем примере, мы установили связь между двумя таблицами в обьединении. Это прекрасно. Но эти таблицы, уже были соединены через snum поле. Эта связь называется состоянием справочной целостности, как мы уже говорили в Главе 1. Используя обьединение можно извлекать данные в терминах этой связи. Например, чтобы показать имена всех заказчиков соответствующих продавцам которые их обслуживают, мы будем использовать такой запрос:


SELECT Customers.cname, Salespeople.sname
FROM Customers, Salespeople
WHERE Salespeople.snum=Customers.snum;


Вывод этого запроса показывается в Таблица 8.2.


Это - пример обьединения, в котором столбцы используются для определения предиката запроса, и в этом случае, snum столбцы из обеих таблиц, удалены из вывода. И это прекрасно. Вывод показывает какие заказчики каким продавцом обслуживаются; значения поля snum которые устанавливают связь - отсутствуют. Однако если вы введете их в вывод, то вы должны или удостовериться что вывод понятен сам по себе или обеспечить коментарий к данным при выводе.

SQL Execution Log
SELECT Customers.cname, Salespeople.sname,
FROM Salespeople, Customers
WHERE Salespeople.snum=Customers.snum
cname
sname
Hoffman
Peel
Giovanni
Axelrod
Liu
Serres
Grass
Serres
Clemens
Peel
Cisneros
Rifkin
Pereira
Motika

Таблица 8.2: Объединение продавцов с их заказчикам


ОБЪЕДИНЕНИЯ ТАБЛИЦ ПО РАВЕНСТВУ ЗНАЧЕНИЙ В СТОЛБЦАХ И ДРУГИЕ ВИДЫ ОБЪЕДИНЕНИЙ


Обьединения которые используют предикаты основанные на равенствах называются - объединениями по равенству. Все наши примеры в этой главе до настоящего времени, относились именно к этой категории, потому что все условия в предложениях WHERE базировались на математических выражениях использующих знак равно (=). Строки 'city='London' и 'Salespeople.snum=Orders.snum ' - примеры таких типов равенств найденных в предикатах. Объединения по равенству - это вероятно наиболее общий вид объединения, но имеются и другие. Вы можете, фактически, использовать любой из реляционных операторов в обьединении. Здесь показан пример другого вида объединения (вывод показывается в Таблице 8.3):



SELECT sname, cname
FROM Salespeople, Customers
WHERE sname < cname
AND rating < 200;

SQL Execution Log
SELECT sname, cname FROM Salespeople, Customers
WHERE sname < cname AND rating < 200;
sname
cname
Peel
Pereira
Motika
Pereira
Axelrod
Hoffman
Axelrod
Clemens
Axelrod
Pereira

Таблица 8.3: Обьединение основанное на неравенстве


Эта команда не часто бывает полезна. Она воспроизводит все комбинации имени продавца и имени заказчика так, что первый предшествует последнему в алфавитном порядке, а последний имеет оценку меньше чем 200.


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


ОБЪЕДИНЕНИЕ БОЛЕЕ ДВУХ ТАБЛИЦ


Вы можете также создавать запросы объединяющие более двух таблиц.


Предположим что мы хотим найти все порядки заказчиков не находящихся в тех городах где находятся их продавцы.Для этого необходимо связать все три наши типовые таблицы ( вывод показывается в Таблице 8.4 ):



SELECT onum, cname, Orders.cnum, Orders.snum
FROM Salespeople, Customers,Orders
WHERE Customers.city < > Salespeople.city
AND Orders.cnum=Customers.cnum
AND Orders.snum=Salespeople.snum;

SQL Execution Log
SELECT onum, cname, Orders.cnum, Orders.snum
FROM Salespeople, Customers, Orders
WHERE Customers.city < > Salespeople.city
AND Orders.cnum=Customers.cnum
AND Orders.snum=Salespeople.snum;
onum
cname
cnum
snum
3001
Cisneros
2008
1007
3002
Pereira
2007
1004
3006
Cisneros
2008
1007
3009
Giovanni
2002
1003
3007
Grass
2004
1002
3010
Grass
2004
1002

Таблица 8. 4: Объединение трех таблиц


Хотя эта команда выглядит скорее как комплексная, вы можете следовать за логикой, просто проверяя - что заказчики не размещены в тех городах где размещены их продавцы ( совпадение двух snum полей ), и что перечисленные порядки - выполнены с помощью этих заказчиков( совпадение порядков с полями cnum и snum в таблице Порядков ).


===============РЕЗЮМЕ===============


Теперь вы больше не ограничиваетесь просмотром одной таблицы в каждый момент времени. Кроме того, вы можете делать сложные сравнения между любыми полями любого числа таблиц и использовать полученные результаты чтобы решать какую информацию вы бы хотели видеть. Фактически, эта методика настолько полезна для построения связей, что она часто используется для создания их внутри одиночной таблицы. Это будет правильным: вы сможете объединить таблицу с собой, а это очень удобная вещь.
Это будет темой Главы 9.


************** РАБОТА С SQL **************

    1. Напишите запрос который бы вывел список номеров порядков сопровождающихся именем заказчика который создавал эти порядки.
    2. Напишите запрос который бы выдавал имена продавца и заказчика для каждого порядка после номера порядков.
    3. Напишите запрос который бы выводил всех заказчиков обслуживаемых продавцом с комиссионными выше 12% . Выведите имя заказчика, имя продавца, и ставку комиссионных продавца.
    4. Напишите запрос который вычислил бы сумму комиссионных продавца для каждого порядка заказчика с оценкой выше 100.