Шаг 8 - Выбор данных из нескольких таблиц -------------------------------------- Полное имя ячейки(поле таблицы) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ До сих пор все наши запросы обращались к одной таблице. Однако SQL позволяет в одном запросе обращаться к нескольким таблицам. Именно это свойство и сделал язык SQL столь популярным. Полное имя столбца в таблице фактически состоит из имени таблицы, за которым идет точка и имя столбца. (По правде говоря, вначале еще указывается и имя пользователя(имя схемы), но это скорее относится к правам доступа и мы вернемся к этому позднее). .. note:: | Примеры имен: | **Customers**.contactFirstName | **Customers**.city | **Employees**.firstName До этого в запросах мы опускали имена таблиц, потому что мы запрашивали только одну таблицу. Если мы хотим связать столбцы разных таблиц, то их надо указать с именами **Payments**.customerNumber или **Customers**.customerNumber, чтобы сервер мог их различать. Связать две таблицы ~~~~~~~~~~~~~~~~~~~ Предположим вы хотите увидеть список закзчиков и список соответствующих им агентов, с информацией о городах где они находятся. Это делается так: .. code-block:: sql 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``. Если эта комбинация удовлетворяет ему, то она выводится. Пример странных условий ~~~~~~~~~~~~~~~~~~~~~~~ Для объединения таблиц можно использовать любые условия, а не только равенство. Например: .. code-block:: sql SELECT customers.contactLastName,employees.lastName FROM customers,employees WHERE customers.contactLastName20000 limit 20; +-----------------+-----------+ | contactLastName | lastName | +=================+===========+ | Schmitt | Thompson | +-----------------+-----------+ | Schmitt | Tseng | +-----------------+-----------+ | Schmitt | Vanauf | +-----------------+-----------+ | King | Murphy | +-----------------+-----------+ | King | Patterson | +-----------------+-----------+ | King | Patterson | | King | 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. Свазать три таблицы ~~~~~~~~~~~~~~~~~~~~ Предположим, что мы хотим найти заказчиков, не находящихся в одном городе с агентом. Для этого требуется связать три таблицы: .. code-block:: sql 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. Далее мы обсудим использование комбинаций запросов, где один запрос будет производить вывод, который будет управлять работой другого запроса.