Шаг 8 - Выбор данных из нескольких таблиц
Полное имя ячейки(поле таблицы)
До сих пор все наши запросы обращались к одной таблице. Однако SQL позволяет в одном запросе обращаться к нескольким таблицам. Именно это свойство и сделал язык SQL столь популярным.
Полное имя столбца в таблице фактически состоит из имени таблицы, за которым идет точка и имя столбца. (По правде говоря, вначале еще указывается и имя пользователя(имя схемы), но это скорее относится к правам доступа и мы вернемся к этому позднее).
Примечание
До этого в запросах мы опускали имена таблиц, потому что мы запрашивали только одну таблицу. Если мы хотим связать столбцы разных таблиц, то их надо указать с именами 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. Далее мы обсудим использование комбинаций запросов, где один запрос будет производить вывод, который будет управлять работой другого запроса.