Шаг 8 - Выбор данных из нескольких таблиц

Полное имя ячейки(поле таблицы)

До сих пор все наши запросы обращались к одной таблице. Однако SQL позволяет в одном запросе обращаться к нескольким таблицам. Именно это свойство и сделал язык SQL столь популярным.

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

Примечание

Примеры имен:
Customers.contactFirstName
Customers.city
Employees.firstName

До этого в запросах мы опускали имена таблиц, потому что мы запрашивали только одну таблицу. Если мы хотим связать столбцы разных таблиц, то их надо указать с именами Payments.customerNumber или Customers.customerNumber, чтобы сервер мог их различать.

Связать две таблицы

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

Это делается так:

SELECT customers.customerName,customers.contactFirstName,customers.city,customers.contactLastName,employees.firstName,employees.lastName
FROM customers,employees
WHERE customers.salesRepEmployeeNumber=employees.employeeNumber
ORDER BY customers.city;

customerName

contactFirstName

city

contactLastName

firstName

lastName

Diecast Classics Inc.

Kelvin

Allentown

Leong

Steve

Patterson

GiftsForHim.com

Wales

Auckland

MacKinlay

Peter

Marsh

Down Under Souveniers, Inc

Mike

Auckland

Graham

Peter

Marsh

Kellys Gift Shop

Tony

Auckland

Snowden

Peter

Marsh

Enaco Distributors

Eduardo

Barcelona

Saavedra

Martin

Gerard

Rovelli Gifts

Giovanni

Bergamo

Rovelli

Pamela

Castillo

Herkku Gifts

Veysel

Bergen

Oeztan

Barry

Jones

Precious Collectables

Braun

Bern

Urs

Martin

Gerard

Gifts4AllAges.com

Juri

Boston

Yoshido

Steve

Patterson

Diecast Collectables

Valarie

Boston

Franco

Julie

Firrelli

Auto-Moto Classics Inc.

Leslie

Brickhaven

Taylor

Steve

Patterson

Online Mini Collectables

Miguel

Brickhaven

Barajas

Julie

Firrelli

Collectables For Less Inc.

Allen

Brickhaven

Nelson

Julie

Firrelli

т.к. поле customerNumber имеется в таблицах Торговые агенты(employees) и Заказчики(customers), имена таблиц должны использоваться как префиксы. Как работает этот запрос? SQL Server проверяет каждую комбинацию строк двух таблиц и проверяет их на условие указанное в предложении WHERE. Если эта комбинация удовлетворяет ему, то она выводится.

Пример странных условий

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

Например:

SELECT customers.contactLastName,employees.lastName
FROM customers,employees
WHERE customers.contactLastName<employees.lastName and customers.creditLimit>20000 limit 20;

contactLastName

lastName

Schmitt

Thompson

Schmitt

Tseng

Schmitt

Vanauf

King

Murphy

King

Patterson

King King

Patterson Thompson

King

Patterson

King

Tseng

King

Vanauf

King

Marsh

King

Nishi

Ferguson

Murphy

Ferguson

Patterson

Ferguson

Firrelli

Ferguson

Patterson

Ferguson

Jennings

Ferguson

Thompson

Ferguson

Firrelli

Ferguson

Patterson

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

Свазать три таблицы

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

SELECT customers.customerName,offices.city,customers.city
FROM customers,employees,offices
WHERE   customers.city<>offices.city and
customers.salesRepEmployeeNumber=employees.employeeNumber
and employees.officeCode=offices.officeCode;

Результат:

customerName

city

city

Atelier graphique

Paris

Nantes

Signal Gift Stores

San Francisco

Las Vegas

Australian Collectors, Co.

Sydney

Melbourne

La Rochelle Gifts

Paris

Nantes

Baane Mini Imports

London

Stavern

Mini Gifts Distributors Ltd.

San Francisco

San Rafael

Blauer See Auto, Co.

London

Frankfurt

Euro+ Shopping Channel

Paris

Madrid

Volvo Model Replicas, Co

London

Luleå

Danish Wholesale Imports

Paris

Kobenhavn

Saveley & Henriot, Co.

Paris

Lyon

Dragon Souveniers, Ltd.

Tokyo

Singapore

Diecast Classics Inc.

Boston

Allentown

Technics Stores Inc.

San Francisco

Burlingame

Handji Gifts& Co

Sydney

Singapore

Herkku Gifts

London

Bergen

American Souvenirs Inc

NYC

New Haven

Daedalus Designs Imports

Paris

Lille

Cambridge Collectables Co.

Boston

Cambridge

Gift Depot Inc.

NYC

Bridgewater

Osaka Souveniers Co.

Tokyo

Kita-ku

Toys of Finland, Co.

London

Helsinki

AV Stores, Co.

London

Manchester

Clover Collections, Co.

London

Dublin

Auto-Moto Classics Inc.

Boston

Brickhaven

UK Collectables, Ltd.

London

Liverpool

Canadian Gift Exchange Network

NYC

Vancouver

Online Mini Collectables

Boston

Brickhaven

Toys4GrownUps.com

San Francisco

Pasadena

Mini Caravy

Paris

Strasbourg

King Kong Collectables, Co.

Tokyo

Central Hong Kong

Enaco Distributors

Paris

Barcelona

Boards & Toys Co.

San Francisco

Glendale

Heintze Collectables

Paris

Århus

Québec Home Shopping Network

NYC

Montréal

Collectable Mini Designs Co.

San Francisco

San Diego

giftsbymail.co.uk

London

Cowes

Alpha Cognac

Paris

Toulouse

Amica Models & Co.

Paris

Torino

Auto Associés & Cie.

Paris

Versailles

Toms Spezialitäten, Ltd

London

Köln

Royal Canadian Collectables, Ltd.

NYC

Tsawassen

Annas Decorations, Ltd

Sydney

North Sydney

Rovelli Gifts

Paris

Bergamo

Теперь вы можете строить запросы к нескольким таблицам одновременно. Вы можете устанавливать любые критерии отбора записей и условия связывания таблиц - собственно то ради чего и создавался SQL. Далее мы обсудим использование комбинаций запросов, где один запрос будет производить вывод, который будет управлять работой другого запроса.