Вход/Регистрация
Понимание SQL
вернуться

Грубер Мартин

Шрифт:

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

  • Читать дальше
  • 1
  • ...
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: