Join ms sql примеры: Joins (SQL Server) — SQL Server
Содержание
работа с таблицами и их соединением OTUS
Базы данных – то, что помогает бизнесу, а также государственным органам и предприятиям. Это – хранилища информации. Работать с ними должен уметь каждый, особенно когда речь заходит о программировании.
В основном БД представлены таблицами. С ними совершают разнообразные действия:
- объединяют тем или иным способом;
- удаляют;
- корректируют;
- сохраняют;
- выводят на экран.
Делается это или посредством пользовательского интерфейса и специализированных утилит, или через специальные языки «программирования». С ними должен быть знаком каждый программер.
Определение SQL
Чтобы задействовать таблицы в приложениях, играх и прочем контенте, можно использовать SQL. Это – самый распространенный вариант развития событий.
Так называют язык структурированных запросов. Он дает возможность сохранять, управлять и извлекать информацию из реляционных баз данных.
Особенности – что умеет язык
При помощи SQL пользователь/разработчик сможет:
- заполучать доступ к информации в системах управления БД;
- производить описание данных, их структур;
- определять электронные материалы в «табличном хранилище», управляя оными;
- проводить взаимодействие с иными языками при помощи модулей, библиотек и компиляторов SQL;
- создавать новые таблички, удалять старые;
- заниматься созданием представлений, хранимых процедур и функций.
Также при работе с таблицами БД за счет SQL можно настраивать доступ к представлениям, таблицам и процедурам. Главное знать, каким именно образом действовать.
В SQL существуют всевозможные команды, использованием которых удается производить те или иные манипуляции. Далее будет рассказано всего об одном достаточно важном моменте. А именно – как использовать оператор Join. Он пригодится и новичкам, и тем, кто долгое время работает с таблицами и БД.
Что представляет собой JOIN
JOIN – команда/оператор, который используется, когда нужно произвести объединение нескольких таблиц в базах данных. Вследствие нее происходит преобразование двух строк в одну. И не обязательно оные окажутся в разных табличках. JOIN может работать в пределах одного «хранилища» информации.
Команда выполняется при перечислении двух и более таблиц в операторе SQL. Определение JOIN – соединение. Синтаксис здесь довольно простой. Но стоит обратить внимание на то, что вариантов объединения несколько. У каждого – своя запись.
Типы
Возможные слияния зависят от того, что именно хочет получить пользователь в конечном итоге. Существуют следующие типы соединений таблиц и иных материалов в рассматриваемом языке запросов:
- простое;
- left outer join;
- right outer join;
- full outer join.
Каждый join запрос в SQL имеет собственные нюансы. О них будет рассказано далее. Разобраться, какой вариант подойдет в том или ином случае поможет простая математика. Там тоже есть объединение. Если разобрать соответствующий вопрос там, в программировании добиться успеха удастся в считанные минуты.
Важно: есть еще один вариант – cross join. Встречается на практике не слишком часто, но помнить о подобном раскладе тоже нужно.
Проще простого – Inner
Первый вариант – это использование простого объединения. Встречается на практике чаще всего. Возвращает пересечение нескольких (обычно двух) множеств. В табличной терминологии — происходит возврат записи, которая имеется в обоих таблицах. Оная должна соответствовать выставленному заранее критерию.
Для реализации поставленной задачи применяется INNER JOIN. Чтобы лучше понимать данный процесс, стоит составить диаграмму Венна:
- нарисовать круг – пусть это будет «таблица 1»;
- рядом, задевая область первой фигуры, изобразить второй круг – это «таблица 2»;
- закрасить область пересечения – это и есть результат операции inner join.
Рисунок выше – наглядный пример диаграммы Венна. С его помощью удастся разобраться в принципах «простого» объединения нескольких табличек.
Запись
Для того, чтобы выполнять те или иные операции в запросовом языке, стоит уточнить синтаксис желаемой команды. В случае с обычным (простым) объединением необходимо использовать следующий шаблон:
Здесь никаких проблем возникнуть не должно. Код легко читается:
- выбрать колонки;
- from table1 – из первой таблицы;
- объединить с таблицей 2.
Для наглядного примера стоит рассмотреть несколько таблиц с информацией, а также принцип joins типа inner.
Наглядный пример
Пусть будет дана таблица под названием customer. В ней такая информация:
Далее – создается таблица orders:
Теперь нужно joining поля в этих хранилищах информации простым объединением. Для реализации поставленной задачи составляется команда типа:
SELECT customers.customer_id, orders.order_id, orders.order_date FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id ORDER BY customers.customer_id; |
В конечном итоге при обработке запроса на экран будет выведен следующий результат:
Здесь выбираются поля в таблице, которые имеют одинаковые значения customer_id в обоих хранилищах. Поэтому другие поля будут пропущены. А строчка, где order_id = 5 в orders опускается, так как customer_id идут со значениями null. То есть, их нет в customers.
Left Join
В отличие от предыдущего объединения, left join – это возврат всех строк из левой таблицы по установленным принципам. Это – левостороннее соединение, осуществляемое через условие ON. Вследствие обработки операции:
- проводится проверка на соответствие условия соединения;
- если оно выполняется – строчка из второй прибавляется к первой таблице.
Именно такое описание можно дать команде left join. Представив его в виде диаграмм, необходимо запомнить следующее представление:
Вся закрашенная область – это результат обработки команды left join в языке SQL.
Запись и пример
Указанным ранее вариантом соединения пользуются чаще всего. Но иногда, особенно при работе с большим количеством информации, может потребоваться левостороннее «слияние». Оно обладает такой формой записи:
Ключевое слово OUTER может быть пропущено. Это нормальное явление, допускаемое некоторыми языками запросов. Помогает значительно сократить исходный код при его написании.
Для примера необходимо взять таблицу с информацией:
Вторая база данных:
Названия тут будут такими же, как и в прошлом случае. Теперь составляется запрос выполнения левостороннего слияния:
После обработки оного на экране появятся всего 6 записей:
Так произошло, потому что left join произвел внутреннее объединение только строки customers и те строчки из orders, где объединенные поля обладают равными значениями. Также стоит запомнить следующие важные сведения:
- когда значение в customer_id из customers отсутствует в orders, поля «ордерс» отображаются в виде null;
- если выставленный параметр слияния не выполняется, поля/строчки «отбрасываются».
Ничего трудного. Такой тип объединения табличек в программировании и базах данных тоже встречается не слишком редко.
Right Join
Описание right join предельно простое – правостороннее соединение. Результатом будут служить строчки из второй таблицы, соответствующие выставленному условию слияния. Наглядно это выглядит так:
Результат запроса исключает поля левой таблицы, не соответствующие выставленным при составлении команды критериям.
О синтаксической записи и примерах
Синтаксис в команды будет иметь вид:
Чтобы понять, как работает right join в языке SQL, рекомендуется обратить внимание на наглядный пример. Он опять осуществляется с табличками customer и orders. Пример будет прописан в операторе SELECT.
Даны две таблицы с информацией:
Далее, чтобы joined две таблички по правостороннему принципу, требуется отправить соответствующий запрос. Он обладает такой формой записи:
Как только операция пройдет обработку, на экране устройства появится результат. Он будет состоять из пяти элементов:
Здесь:
- возвращаются строки из orders – все;
- на экран дополнительно выводятся строчки из customers, которые имеют с «ордерс» одинаковые значения;
- если customers_id в orders отсутствует в «кастомерс», соответствующие поля имеют значение null.
Но и это еще не все. Для полного осознания запросов слияния электронных материалов, требуется в первую очередь изучить все доступные расклады. Их осталось еще 2. Встречаются на практике не слишком часто, из-за чего доставляют немалые хлопоты. Особенно тем, кто занимается запросовым языком относительно недавно.
По полной программе
Предпоследний вариант, который предусматривает join в языке SQL – это full. Можно назвать данный процесс созданием единой таблицы. Информациях из обеих БД будет выведена на экран. Здесь не важно, где именно осуществляется непосредственное пересечение полей.
При full join происходит:
- проверка на невыполнение условия;
- вывод на экран всех строчек из левой и правой таблиц со значениями null, когда условие не выполнено.
Выглядит это так:
Если говорить математическим языком, вследствие обработки запроса произойдет слияние двух множеств. На диаграмме виден результат – это закрашенная область.
Как записывать и применять
Форма записи окажется такого типа:
Full – это внутреннее соединение всех полей в табличках предоставленных баз данных. Для того, чтобы намного лучше разобраться в этом вопросе, составляются таблички:
Они называются так же, как и предлагал последний наглядный пример. Запрос обладает следующим видом:
Итог:
Перекрестным типом
Еще один довольно интересный подход, который относится к основным – это cross. Называется перекрестным. Ин6огда – декартово. При его использовании происходит генерация того же результата, что и при вызове двух таблиц без рассматриваемой команды. Это значит, что:
- на экране появится итог слияния первой таблицы и второй;
- каждая запись одной таблицы будет дублироваться для каждого поля из другой.
Так, если в таблице1 a записей, а в таблице2 b, результирующей окажется таблица a x b полей. В виде диаграммы представить подобный процесс проблематично. Она только запутает разработчиков.
Обладает запрос следующим синтаксисом:
Внимание: cross join – это декартово произведение. Так будет проще понять, о чем идет речь.
Комбинации
Для того, чтобы объединять пары табличек, можно воспользоваться self join. Чтобы разобраться в принципах работы запроса, необходимо рассмотреть пример. Сам запрос выглядит так:
А итог:
Представить такое произведение множеств наглядно тоже проблематично. Зато на примере – нет. Тут показано, что у Гарри нет начальника.
Исключение
После рассмотрения внешнего соединения и другого объединения в языке SQL, важно не забывать об исключении. Результатом будут данные из первой таблицы, но исключая поля, совпадающие со второй табличкой. Наглядно это выглядит так:
Чтобы воспользоваться подобным приемом, не нужно знать ни декартово произведение, ни какие-то другие сложные понятия. В запрос добавляется оператор Where.
А вот пример записи команды:
Планы исполнения
Для того, чтобы грамотно использовать join в SQL, нужно учитывать планы исполнения запросов. То, как именно (в какой последовательности) будет происходить обработка операторов и необходимые вычисления.
Очередность такая:
- from;
- join;
- where.
Данный принцип актуален для всех СУБД. Если не принимать его во внимание, можно в конечном итоге получить таблички с неверной информацией.
Важно: для того, чтобы ускорить обработку команд, важно использовать кластерные индексы. Они применяются Server Query Optimizer для обеих таблиц. Автоматическое создание кластерных индексов производится для первичных ключей. С остальными придется производить соответствующую настройку.
Описание join в языке SQL не должно вызывать вопросов. А если хочется лучше понять, что это такое, а также разобраться в принципах работы queries, стоит посетить дистанционные специализированные курсы. По окончанию обучения выдается сертификат, подтверждающий знания и навыки в выбранном направлении.
SQL: несколько Join к одной таблице / связи
Бывают случаи, когда нужно создать несколько Join запросов к одной таблице, то есть когда у нас есть много элементов в таблице ссылающихся на тот же внешний ключ. Это не сложная задача, если вы имели дело с этим раньше, но может немного сбить с толку новых пользователей БД. Вот почему я создал эту статью — чтобы объяснить, как правильно проектировать и связывать таблицы в SQL.
Пример двойного ключа — команды и игры
Как простой пример возьмем две команды играющие в игру, например футбол. Каждая команда будет иметь уникальный столбец в таблице. Давайте рассмотрим следующую простую таблицу в качестве примера того, как может выглядеть команда (примеры в этой статье написаны для MySQL, но по аналогии можно делать для любых ANSI-92 совместимых БД):
CREATE TABLE team ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, PRIMARY KEY (id) ) TYPE=InnoDB;
Пока все просто… Это основа базы данных. Что ж, давайте перейдем к играм.
Две ссылки
Каждая игра состоит из двух команд и места встречи. Самый простой способ установить место встречи это сослаться на команду хозяев с таблицы игр. Затем просто сделать вторую ссылку на команду гостей, чтобы сослаться на второго участника игры.
CREATE TABLE game ( id INT NOT NULL AUTO_INCREMENT, home_team_id INT NOT NULL REFERENCES team(id), guest_team_id INT NOT NULL REFERENCES team(id), home_score INT NULL, guest_score INT NULL, game_date DATE NOT NULL, PRIMARY KEY (id) ) TYPE=InnoDB;
Дважды соединенные
Работа с данными будет повеселее. При соединении двух таблиц, вам придется сделать join дважды, и подойти творчески к вопросу о том, как манипулировать join-ами, для того, чтобы получить данные надлежащим образом. Вот простая выборка всех игр и результатов.
SELECT g.*, t1.name AS home_team_name, t2.name AS guest_team_name FROM game AS g INNER JOIN team AS t1 ON g.home_team_id = t1.id INNER JOIN team AS t2 ON g.guest_team_id = t2.id; ORDER by game_date DESC
Обратная ссылка
Поиск расписания одной команды включает в себя объединение домашних и выездных игр, с созданием идентификатора метаданных места встречи.
SELECT * FROM ( SELECT t1.*, g.id AS game_id, g.game_date, t2.id AS opponent_id, t2.name AS opponent_name, 'home' AS venue FROM game AS g INNER JOIN team AS t1 ON g.home_team_id = t1.id INNER JOIN team AS t2 ON g. guest_team_id = t2.id UNION ALL SELECT t1.*, g.id AS game_id, g.game_date, t2.id AS opponent_id, t2.name AS opponent_name, 'away' AS venue FROM game AS g INNER JOIN team AS t1 ON g.guest_team_id = t1.id INNER JOIN team AS t2 ON g.home_team_id = t2.id ) AS schedule WHERE schedule.id = 1 ORDER BY schedule.game_date ASC
Вот и все! Углубляйтесь, и получайте удовольствие!
Источник: http://www.transio.com/content/sql-multiple-joins-single-table-relationship
LEFT JOIN с использованием SQL (примеры включены) — Data to Fish
12 февраля 2022 г.
Вы можете использовать LEFT JOIN, чтобы получить все записи из левой таблицы и записи из правой таблицы, где есть совпадение с (если совпадения нет, вы получите NULL под выбранными полями справа таблица):
ВЫБЕРИТЕ ТБ1.*, ТБ2. * ОТ left_table_name tb1 LEFT JOIN right_table_name tb2 ON tb1.id = tb2.id
Давайте посмотрим, как применить левое соединение, рассмотрев несколько примеров.
Применение левого соединения между двумя таблицами с помощью SQL
В следующем примере вы увидите, как применить левое соединение между:
- Левая таблица с именем products ; и
- Правая таблица называется цены
Вы можете создать таблицу « products » с помощью следующего запроса:
CREATE TABLE products ( product_id int первичный ключ, product_name nvarchar(50) )
И затем вставляем в таблицу 5 записей:
ВСТАВИТЬ В продукты (product_id, product_name) ЦЕННОСТИ (1, «Ноутбук»), (2, «Планшет»), (3, «Монитор»), (4, «Принтер»), (5, «Клавиатура»)
Затем вы можете создать таблицу « цены », используя следующий синтаксис:
CREATE TABLE цены ( product_id int первичный ключ, product_price целое )
Затем вставьте в таблицу 5 записей:
ВСТАВИТЬ В цены (product_id, product_price) ЦЕННОСТИ (1, 1200), (2, 300), (3, 500), (4, 150), (5, 80)
Наконец, вы можете применить ЛЕВОЕ СОЕДИНЕНИЕ, используя приведенный ниже запрос. Обратите внимание, что поле product_id (которое существует в обеих таблицах) будет использоваться для связи таблиц вместе:
SELECT tb_1.*, tb_2.* ИЗ продуктов tb_1 LEFT JOIN цены tb_2 ON tb_1.product_id = tb_2.product_id
Зеленым цветом показаны все записи и поля из таблицы products («левая» таблица), а желтым — все записи и поля из таблица цен («правильная» таблица):
product_id | имя_продукта | product_id | цена_продукта |
1 | Ноутбук | 1 | 1200 |
2 | Планшет | 2 | 300 |
3 | Монитор | 3 | 500 |
4 | Принтер | 4 | 150 |
5 | Клавиатура | 5 | 80 |
Выбор подмножества полей
Иногда может потребоваться выбрать подмножество полей из объединенных таблиц.
Например, выберем:
- Поля product_id и product_name из таблицы «products»; и
- Поле product_price из таблицы «цены»
Вот запрос:
ВЫБЕРИТЕ tb_1.product_id, tb_1.имя_продукта, tb_2.product_price ИЗ продуктов tb_1 LEFT JOIN цены tb_2 ON tb_1.product_id = tb_2.product_id
Теперь вы увидите только выбранные поля из таблиц:
product_id | имя_продукта | цена_продукта |
1 | Ноутбук | 1200 |
2 | Планшет | 300 |
3 | Монитор | 500 |
4 | Принтер | 150 |
5 | Клавиатура | 80 |
Применение левого соединения к нескольким таблицам с использованием SQL
Теперь создадим третью таблицу с именем « brand »:
CREATE TABLE brand ( product_id int первичный ключ, product_brand nvarchar(50) )
А затем вставить 5 записей:
ВСТАВИТЬ В бренды (product_id, product_brand) ЦЕННОСТИ (1, 'ДД'), (2, 'ЧЧ'), (3, 'ММ'), (4, «ПП»), (5, 'RR')
Предположим, вы хотите выполнить левое соединение нескольких таблиц (в нашем примере это 3 таблицы: продукты, цены и бренды).
В этом случае вы можете выполнить следующий запрос:
SELECT tb_1.product_id, tb_1.имя_продукта, tb_2.product_price, tb_3.product_brand ИЗ продуктов tb_1 LEFT JOIN цены tb_2 ON tb_1.product_id = tb_2.product_id ЛЕВОЕ СОЕДИНЕНИЕ брендов tb_3 ON tb_1.product_id = tb_3.product_id
Как видите, первое и второе поля были выбраны из таблицы products (зеленым цветом), третье поле было выбрано из таблицы цены (желтым цветом), а четвертое поле было выбрано из брендов таблица (оранжевая):
product_id | имя_продукта | цена_продукта | product_brand |
1 | Ноутбук | 1200 | ДД |
2 | Планшет | 300 | ЧЧ |
3 | Монитор | 500 | ММ |
4 | Принтер | 150 | ПП |
5 | Клавиатура | 80 | руб. |
Другой способ написать приведенный выше запрос:
SELECT tb_1.product_id, tb_1.имя_продукта, tb_2.product_price, tb_3.product_brand ОТ ( ВЫБРАТЬ * ИЗ продуктов ) тб_1 ЛЕВОЕ СОЕДИНЕНИЕ (( ВЫБРАТЬ * ОТ цены )) tb_2 ON tb_1.product_id = tb_2.product_id ЛЕВОЕ СОЕДИНЕНИЕ ((( ВЫБРАТЬ * ОТ брендов ))) tb_3 ПО tb_1.product_id = tb_3.product_id
Вы получите те же результаты, что и раньше:
product_id | имя_продукта | цена_продукта | product_brand |
1 | Ноутбук | 1200 | ДД |
2 | Планшет | 300 | ЧЧ |
3 | Монитор | 500 | ММ |
4 | Принтер | 150 | ПП |
5 | Клавиатура | 80 | руб. |
И еще один способ написать вышеуказанный запрос:
SELECT микс.product_id, микс.название_продукта, смесь.продукт_цена, tb_3.product_brand ОТ ( ВЫБРАТЬ tb_1.product_id, tb_1.имя_продукта, tb_2.product_price ИЗ продуктов tb_1 LEFT JOIN цены tb_2 ON tb_1.product_id = tb_2.product_id ) смесь ЛЕВОЕ СОЕДИНЕНИЕ ((( ВЫБРАТЬ * ОТ брендов ))) tb_3 ПО mix.product_id = tb_3.product_id
Вы снова увидите те же результаты:
product_id | имя_продукта | цена_продукта | product_brand |
1 | Ноутбук | 1200 | ДД |
2 | Планшет | 300 | ЧЧ |
3 | Монитор | 500 | ММ |
4 | Принтер | 150 | ПП |
5 | Клавиатура | 80 | руб. |
JOIN и VIEW
Предыдущая страница | Следующая страница | На один уровень выше |
Доступны слайды лекций: PDF PowerPoint
Содержимое
- Несколько исходных таблиц
- Условие ПРИСОЕДИНЕНИЯ
- Традиционное СОЕДИНЕНИЕ
- Современное ПРИСОЕДИНЕНИЕ
- ВНЕШНЕЕ СОЕДИНЕНИЕ
- ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
- Именование
- Псевдонимы
- Самостоятельные соединения
- просмотров
- ПАДЕНИЕ Вид
Иногда вам нужно будет написать запрос, который использует более одного
Таблица. Это вполне приемлемо в SQL, но требует небольшой осторожности…
Очень легко создавать многотабличные запросы, которые производят в основном
вздор.
Основная концепция создания многотабличных запросов заключается в том, что все таблицы
нужное должно быть указано в предложении FROM запроса. Например, позволяет
попробуйте написать запрос, в котором перечислены имя владельца, дата рождения и
регистрационный номер для каждого автомобиля в базе данных. REGNO в CAR, но
ДОБ находится в ВОДИТЕЛЕ. Поэтому нужны обе таблицы. Основной запрос выглядит
нравиться:
ВЫБЕРИТЕ имя, доб, имя С автомобиля, водитель ;
Порядок, в котором таблицы появляются в строке FROM, не имеет значения.
Однако этот запрос не дает правильного ответа. Причина этому
заключается в том, что СУБД не понимает, как связать одну таблицу с другой.
Условие ПРИСОЕДИНЕНИЯ
Чтобы с пользой объединить несколько таблиц вместе, нам нужно объяснить
базы данных, как они присоединяются. Предложение FROM принимает все строки во всех
перечисленных таблиц и формирует новую таблицу, содержащую все комбинации
исходных строк. В большинстве случаев это приводит к мусору. смотреть на
этот пример.
ВЫБРАТЬ * ИЗ автомобиля ;
REGNO | МАРКА | ЦВЕТ | ЦЕНА | ВЛАДЕЛЕЦ |
---|---|---|---|---|
F611 AAA | FORD | RED | 12000 | Jim Smith |
J111 BBB | SKODA | BLUE | 11000 | Jim Smith |
A155 BDE | MERCEDES | BLUE | 22000 | Боб Смит |
K555 GHT | FIAT | GREEN | 6000 | Боб Джонс |
SC04 BFE | 4 | |||
SC04 BFE | 9 | |||
SC04 | 9 | |||
SC04 | 9 | |||
SC04 | 9 | |||
SC04 | 9 | |||
. 0064 | СИНИЙ | 13000 |
ВЫБРАТЬ * ОТ водителя ;
NAME | DOB |
---|---|
Jim Smith | 11 Jan 1980 |
Bob Smith | 23 Mar 1981 |
Bob Jones | 3 Dec 1986 |
ВЫБРАТЬ * С автомобиля, водитель ;
REGNO | МАРКА | ЦВЕТ | ЦЕНА | ВЛАДЕЛЕЦ | ИМЯ | ДОБ |
---|---|---|---|---|---|---|
F611 AAA | FORD | КРАСНЫЙ | 12000 | Джим Смит | Джим Смит | 11 января 1980 |
J111 BBB | SKODA | СИНИЙ | 11000 | Джим Смит | Джим Смит | 11 января 1980 |
A155 BDE | MERCEDES | СИНИЙ | 22000 | Боб Смит | Джим Смит | 11 января 1980 |
K555 GHT | FIAT | ЗЕЛЕНЫЙ | 6000 | Боб Джонс | Джим Смит | 11 января 1980 г. |
SC04 BFE | SMART | СИНИЙ | 13000 | Джим Смит | 11 января 1980 | |
F611 AAA | FORD | КРАСНЫЙ | 12000 | Джим Смит | Боб Смит | 23 марта 1981 |
J111 BBB | SKODA | СИНИЙ | 11000 | Джим Смит | Боб Смит | 23 марта 1981 |
A155 BDE | MERCEDES | СИНИЙ | 22000 | Боб Смит | Боб Смит | 23 марта 1981 |
K555 GHT | FIAT | ЗЕЛЕНЫЙ | 6000 | Боб Джонс | Боб Смит | 23 марта 1981 г. |
SC04 BFE | SMART | СИНИЙ | 13000 | Боб Смит | 23 марта 1981 | |
F611 AAA | FORD | КРАСНЫЙ | 12000 | Джим Смит | Боб Джонс | 3 декабря 1986 |
J111 BBB | SKODA | СИНИЙ | 11000 | Джим Смит | Боб Джонс | 3 декабря 1986 г. |
A155 BDE | МЕРСЕДЕС | СИНИЙ | 22000 | Боб Смит | Боб Джонс | 3 декабря 1986 |
K555 GHT | FIAT | ЗЕЛЕНЫЙ | 6000 | Боб Джонс | Боб Джонс | 3 декабря 1986 |
SC04 BFE | SMART | СИНИЙ | 13000 | Боб Джонс | 3 декабря 1986 г. |
В нашем запросе нас интересуют только те комбинации таблиц, которые подчиняются
правила отношения FOREIGN KEY, которое объединяет эти две таблицы. если ты
помните, ПЕРВИЧНЫЙ КЛЮЧ ВОДИТЕЛЯ (ИМЯ) был скопирован в АВТОМОБИЛЬ как ИНОСТРАННЫЙ
КЛЮЧ (имя ВЛАДЕЛЬЦА). Таким образом, эта сгенерированная таблица FROM должна быть отфильтрована.
так что только строки, где ИМЯ = ВЛАДЕЛЕЦ . Обратите внимание, что это ОТ
сгенерированная таблица, содержащая все комбинации перечисленных таблиц
известен как декартово перекрестное произведение . Мы вернемся к
предмет перекрестного произведения в главе реляционной алгебры.
Теперь, чтобы наш запрос работал правильно, мы вставляем JOIN
условие ИМЯ = ВЛАДЕЛЕЦ . Есть два основных способа сделать это,
которые мы будем называть традиционными и современными . В обе стороны
обычно называются INNER JOIN.
Традиционное СОЕДИНЕНИЕ
Чтобы поместить условие соединения ИМЯ = ВЛАДЕЛЕЦ в запрос, используя традиционный
Подход заключается в том, чтобы, как правило, просто перечислить его в предложении WHERE. Так…
ВЫБРАТЬ * С автомобиля, водитель ГДЕ владелец = имя ;
REGNO | МАРКА | ЦВЕТ | ЦЕНА | ВЛАДЕЛЕЦ | НАЗВАНИЕ | ДОБ |
---|---|---|---|---|---|---|
F611 AAA | FORD | КРАСНЫЙ | 12000 | Джим Смит | Джим Смит | 11 января 1980 |
J111 BBB | SKODA | СИНИЙ | 11000 | Джим Смит | Джим Смит | 11 января 1980 |
A155 BDE | MERCEDES | СИНИЙ | 22000 | Боб Смит | Боб Смит | 23 марта 1981 г. |
K555 GHT | FIAT | ЗЕЛЕНЫЙ | 6000 | Боб Джонс | Боб Джонс | 3 декабря 1986 г. |
Современное ПРИСОЕДИНЕНИЕ
Чтобы поместить условие соединения ИМЯ = ВЛАДЕЛЕЦ в запрос, используя
современный подход, вы переписываете строку FROM, чтобы сказать:
FROM table1 JOIN table2 ON (правила)
Итак, в нашем примере:
ВЫБРАТЬ * ОТ АВТОМОБИЛЯ ПРИСОЕДИНЯЙТЕСЬ к водителю НА (владелец = имя) ;
REGNO | МАРКА | ЦВЕТ | ЦЕНА | ВЛАДЕЛЕЦ | НАЗВАНИЕ | ДОБ |
---|---|---|---|---|---|---|
F611 AAA | FORD | КРАСНЫЙ | 12000 | Джим Смит | Джим Смит | 11 января 1980 |
J111 BBB | SKODA | СИНИЙ | 11000 | Джим Смит | Джим Смит | 11 января 1980 |
A155 BDE | MERCEDES | СИНИЙ | 22000 | Боб Смит | Боб Смит | 23 марта 1981 |
K555 GHT | FIAT | ЗЕЛЕНЫЙ | 6000 | Боб Джонс | Боб Джонс | 3 декабря 1986 г. |
НАРУЖНОЕ СОЕДИНЕНИЕ
Вы могли заметить результат в предыдущем запросе
(когда там
не было условий соединения), где в поле OWNER было NULL.
Это для машины без хозяина. Как только условие соединения было
вставленные в запрос строки с владельцами NULL были отфильтрованы.
Обычно это именно то, что нужно, но иногда мы хотим, чтобы
условие соединения, которому нужно следовать, если поля не равны NULL, и правила
быть сломанным, когда есть NULL. Такие СОЕДИНЕНИЯ называются ВНЕШНИМИ СОЕДИНЕНИЯМИ.
В современном синтаксисе JOIN вы просто вставляете слово LEFT
или слово ПРАВО перед словом ПРИСОЕДИНЯЙСЯ.
9| | |
| | +——— Справа от JOIN
| +————— Оператор JOIN
+————————- Слева от JOIN
Поскольку таблица CAR имеет значения NULL, а CAR отображается слева от
слово JOIN в запросе, правильное ключевое слово для использования — LEFT JOIN. Запрос
становится:
ВЫБРАТЬ * ИЗ АВТОМОБИЛЯ ЛЕВЫЙ ПРИСОЕДИНЯЙТЕСЬ к водителю (владелец = имя) ;
REGNO | МАРКА | ЦВЕТ | ЦЕНА | ВЛАДЕЛЕЦ | ИМЯ | ДОБ |
---|---|---|---|---|---|---|
F611 AAA | FORD | КРАСНЫЙ | 12000 | Джим Смит | Джим Смит | 11 января 1980 |
J111 BBB | SKODA | СИНИЙ | 11000 | Джим Смит | Джим Смит | 11 января 1980 |
A155 BDE | MERCEDES | СИНИЙ | 22000 | Боб Смит | Боб Смит | 23 марта 1981 |
K555 GHT | FIAT | ЗЕЛЕНЫЙ | 6000 | Боб Джонс | Боб Джонс | 3 декабря 1986 г. |
SC04 BFE | SMART | BLUE | 13000 |
ИМЯ | Дата рождения | |
---|---|---|
Джим Смит | 11 янв.0061 Боб Джонс | 3 декабря 1986 года |
Дэвид Дэвис | 1 октября 1975 года |
Так вот, у Дэвида Дэвиса нет машины, и поэтому он никогда не появляется в обычном внутреннем мире.
ПРИСОЕДИНИТЬСЯ. Во внешнем соединении мы можем иметь:
ВЫБРАТЬ * ИЗ АВТОМОБИЛЯ ЛЕВЫЙ ПРИСОЕДИНЯЙТЕСЬ к водителю (владелец = имя) ;
REGNO | МАРКА | ЦВЕТ | ЦЕНА | ВЛАДЕЛЕЦ | ИМЯ | Дата рождения |
---|---|---|---|---|---|---|
F611 AAA | FORD | КРАСНЫЙ | 12000 | Джим Смит | Джим Смит | 11 января 1980 |
J111 BBB | SKODA | СИНИЙ | 11000 | Джим Смит | Джим Смит | 11 января 1980 |
A155 BDE | MERCEDES | СИНИЙ | 22000 | Боб Смит | Боб Смит | 23 марта 1981 г. |
K555 GHT | FIAT | ЗЕЛЕНЫЙ | 6000 | Боб Джонс | Боб Джонс | 3 декабря 1986 г. |
SC04 BFE | SMART | BLUE | 13000 |
REGNO | МАРКА | ЦВЕТ | ЦЕНА | ВЛАДЕЛЕЦ | ИМЯ | Дата рождения |
---|---|---|---|---|---|---|
F611 AAA | FORD | КРАСНЫЙ | 12000 | Джим Смит | Джим Смит | 11 января 1980 |
J111 BBB | SKODA | СИНИЙ | 11000 | Джим Смит | Джим Смит | 11 января 1980 |
A155 BDE | MERCEDES | СИНИЙ | 22000 | Боб Смит | Боб Смит | 23 марта 1981 г. |
K555 GHT | FIAT | ЗЕЛЕНЫЙ | 6000 | Боб Джонс | Боб Джонс | 3 декабря 1986 |
Дэвид Дэвис | 1 октября 1975 г. |
В некоторых относительно необычных запросах было бы полезно увидеть все
строки, которые подчиняются условию соединения, за которыми следуют строки, оставленные
из каждой из таблиц, участвующих в объединении. Это называется ПОЛНЫЙ ВНЕШНИЙ
JOIN и записывается в SQL как ПОЛНОЕ СОЕДИНЕНИЕ .
ВЫБРАТЬ * FROM car FULL JOIN водитель ON (владелец = имя) ;
REGNO | МАРКА | ЦВЕТ | ЦЕНА | ВЛАДЕЛЕЦ | ИМЯ | ДОБ |
---|---|---|---|---|---|---|
F611 AAA | FORD | КРАСНЫЙ | 12000 | Джим Смит | Джим Смит | 11 января 1980 г. |
J111 BBB | SKODA | СИНИЙ | 11000 | Джим Смит | Джим Смит | 11 января 1980 |
A155 BDE | MERCEDES | СИНИЙ | 22000 | Боб Смит | Боб Смит | 23 марта 1981 |
K555 GHT | FIAT | ЗЕЛЕНЫЙ | 6000 | Боб Джонс | Боб Джонс | 3 Декабрь 1986 |
SC04 BFE | SMART | СИНИЙ | 13000 | |||
Дэвид Дэвис | 1 октября 1975 г. |
В некоторых сложных запросах СУБД может быть не в состоянии определить, какая таблица
принадлежит атрибут. Например, объединение двух таблиц ALPHA и
БРАВО, где оба
таблицы имеют столбец с именем NAME. Выполнение следующего:
ВЫБЕРИТЕ имя из АЛЬФА,БРАВО
выдаст ошибку. Проблема в том, что когда вы говорите «имя», это то, что в
АЛЬФА
или тот что в БРАВО? Вместо этого вы должны сделать запрос более явным.
Что вам разрешено делать, так это перед именем столбца, которое вы можете сказать с таблицей
этот столбец принадлежит. Если вы хотите сказать «имя» в АЛЬФА, вы можете
скажем alpha.name . Теперь понятно, к какой таблице относится столбец,
и запрос будет работать:
ВЫБЕРИТЕ alpha.name из АЛЬФА, БРАВО
Иногда вы можете иметь дело с большими именами таблиц и обнаружить, что у вас есть
чтобы поместить имя таблицы перед многими именами атрибутов. Это может быть
много печатать. SQL позволяет вам сделать вид, что таблица называется как-то
еще на время вашего запроса. Это называется псевдонимом. Итак, вместо
ВЫБЕРИТЕ автовладельца из автомобиля
ты можешь написать
ВЫБЕРИТЕ владельца ИЗ автомобиля c
Таким образом, псевдонимы обеспечивают сокращенный способ обращения к таблицам. В более сложном
пример:
ВЫБЕРИТЕ c.regno,c.owner,d.dob ИЗ автомобиля c ПРИСОЕДИНЯЙТЕСЬ к водителю d ON (c.owner = d.name) ;
Помните, что вам нужно использовать псевдонимы, только если вы хотите, и украшать атрибуты
с именами таблиц, когда компьютер не может определить, какой атрибут таблицы
вы говорите о.
Самосоединения или Equijoins — это то, где вы хотите, чтобы запрос использовал один и тот же
table несколько раз, но каждый раз вы используете его для разных целей.
Рассмотрим вопрос «Кто водит машину того же цвета, что и Боб Смит»?
ВЫБЕРИТЕ цвет ОТ автомобиля, ГДЕ владелец = «Боб Смит»;
цвет |
---|
СИНИЙ |
ВЫБЕРИТЕ владельца ИЗ автомобиля ГДЕ цвет = 'СИНИЙ' И владелец != 'Боб Смит' И владелец НЕ NULL
владелец |
---|
Джим Смит |
Чтобы выполнить этот запрос, нам нужно дважды использовать CAR. Сначала найти цвет, а потом
найти других владельцев. Таким образом, CAR используется для двух разных целей.
Чтобы объединить эти запросы вместе, нам нужно дважды использовать CAR. Чтобы это сработало,
нам нужно использовать псевдонимы таблиц, чтобы CAR выглядел как две разные таблицы.
После этого легко!
ВЫБЕРИТЕ др.владельца С автомобиля бобсмит, автомобиль другой ГДЕ bobsmith.colour = other.colour -- присоединиться к цвету И bobsmith.owner = 'Боб Смит' -- В бобсмите ищите только Боба Смита. AND bobsmith.owner != other.owner -- ДРУГОЕ не может быть Бобом Смитом AND other.owner NOT NULL -- Исключить автомобили без владельцев
владелец |
---|
Джим Смит |
При написании запросов запрос может становиться все длиннее и длиннее. Кроме того,
иногда вы обнаружите, что один и тот же запрос использует одни и те же правила в двух разных
части запроса. В языках программирования вы бы переместили дубликат
код в своего рода библиотеку подпрограмм. В SQL идея подпрограммы
называется ВИДОМ.
В СУБД может быть создано ВИД, и каждое представление представляет определенный
SQL-запрос. Как только представление создано, запрос, который оно представляет, скрывается от
пользователя, и вместо этого представление кажется просто другой таблицей. Содержимое
VIEW всегда остается идентичным результату выполнения запроса
который представляет представление.
Допустим, вы хотите, чтобы запрос сообщал вам, сколько водителей есть
и сколько машин
существуют в базе данных. Вы можете запустить два разных запроса:
ВЫБЕРИТЕ количество (*) из ДРАЙВЕРА; ВЫБЕРИТЕ количество (*) из CAR;
Вместо этого давайте поместим каждый из них в VIEW
CREATE VIEW count1 (всего) AS SELECT count(*) from DRIVER; CREATE VIEW count2 (всего) AS SELECT count(*) from CAR; ВЫБЕРИТЕ * из подсчета1;
всего |
---|
3 |
ВЫБЕРИТЕ * из счетчика2;
Всего |
---|
5 |
ВЫБЕРИТЕ count1.