Перейти к содержимому

Как создать связи между таблицами

  • автор:

Создание, изменение и удаление отношения

Отношение в Access позволяет объединить данные из двух разных таблиц. Каждое отношение состоит из двух полей (по одному в каждой таблице) со связанными данными. Например, таблицы «Товары» и «Сведения о заказах» могут содержать поле «КодТовара». Каждая запись в таблице «Сведения о заказах» содержит значение поля «КодТовара», которому соответствует запись в таблице «Товары» с тем же значением в данном поле.

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

Перед началом работы с отношениями изучите основные понятия. Дополнительные сведения о см. в статьях Руководство по связям между таблицами и Начало работы со связями между таблицами.

В этой статье

  • Обзор
  • Создание отношения между таблицами с помощью окна отношений
  • Создание отношения между таблицами с помощью панели списка полей
  • Изменение отношения
  • Обеспечение целостности данных
  • Удаление отношения между таблицами

Обзор

Чтобы создать отношение в базе данных Access, можно воспользоваться одним из указанных ниже методов.

  • В окне «Схема данных» добавьте таблицы, которые требуется связать, а затем перетащите нужное поле из одной таблицы в другую.
  • Перетащите поле в таблицу из области Список полей.

При создании отношения между таблицами общие поля могут называться по-разному, однако часто требуется, чтобы эти имена совпадали. Очевидно, что общие поля должны иметь одинаковый тип данных. Однако если поле первичного ключа имеет тип «Счетчик», поле внешнего ключа также может быть числовым, если свойство Размер поля (FieldSize) обоих полей совпадает. Например, можно сопоставить поля с типами «Счетчик» и «Числовой», если свойство Размер поля обоих полей имеет значение «Длинное целое». Если оба общих поля являются числовыми, у них должно совпадать значение свойства Размер поля.

Создание отношения между таблицами с помощью окна отношений

  1. На вкладке Работа с базами данных в группе Отношения выберите элемент Схема данных.
  2. На вкладке Конструктор связей в группе Связи щелкните Добавить таблицы.
  3. Выберите одну или несколько таблиц или запросов и нажмите кнопку Добавить. После добавления таблиц и запросов на вкладку «Схема данных» нажмите кнопку Закрыть.
  4. Перетащите поле (как правило, поле первичного ключа) из одной таблицы на общее поле (поле внешнего ключа) в другой таблице. Чтобы перетащить сразу несколько полей, нажмите и удерживайте клавишу CTRL, нажмите каждое поле и перетащите выделенные поля.

Диалоговое окно

Откроется диалоговое окно Изменение связей.

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

  • Создание связи «один-к-одному» Оба общих поля (как правило, поля первичного ключа и внешнего ключа) должны иметь уникальный индекс. Это означает, что свойство Индексированное этих полей должно иметь значение Да(Совпадения не допускаются). Если оба поля имеют уникальный индекс, в Access будет создано отношение «один-к-одному».
  • Создание отношения «один-ко-многим». Поле на стороне «один» (как правило, первичный ключ) отношения должно иметь уникальный индекс. Это значит, что свойство Индексированное поле должно иметь значение Да(Совпадения не допускаются). Поле на стороне «многие» не должно иметь уникального индекса. Это поле может быть индексированным, но для него должны допускаться повторы. Это означает, что свойство Индексированное поле должно иметь значение Нет или Да (Допускаются совпадения). Когда у одного поля однозначный индекс, а у другого — нет, в приложении Access создается отношение «один-ко-многим».

Создание отношения между таблицами с помощью панели списка полей

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

При перетаскивании поля из «другой» (несвязанной) таблицы и выполнении инструкций мастера подстановок между таблицей из области Список полей и таблицей, в которую перетаскивается поле, автоматически создается новое отношение «один-ко-многим». Это отношение, созданное Access, не обеспечивает целостность данных по умолчанию. Чтобы обеспечить целостность данных, нужно изменить отношение. Дополнительные сведения см. в разделе Изменение отношения.

Открытие таблицы в режиме таблицы

  • Дважды щелкните таблицу в области навигации.

Открытие области «Список полей»

  • Нажмите клавиши ALT+F8. Будет отображена область Список полей.

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

Чтобы просмотреть список всех полей таблицы, щелкните знак плюс (+) рядом с именем таблицы в области Список полей. Чтобы добавить поле в таблицу, перетащите его из области Список полей в таблицу в режиме таблицы.

Добавление поля и создание связи из области «Список полей»

  1. Открыв таблицу в режиме таблицы, нажмите клавиши ALT+F8. Будет отображена область Список полей.
  2. Чтобы отобразить список полей в таблице, в группе Доступные поля в другой таблице щелкните знак плюс (+) рядом с именем таблицы.
  3. Перетащите нужное поле из области Список полей в таблицу, открытую в режиме таблицы.
  4. Когда появится линия вставки, поместите поле в выбранное место. Появится окно мастера подстановок.
  5. Следуйте инструкциям мастера подстановок. Поле будет отображено в таблице в режиме таблицы.

При перетаскивании поля из «другой» (несвязанной) таблицы и выполнении инструкций мастера подстановок между таблицей из области Список полей и таблицей, в которую было перетаскивается поле, автоматически создается новое отношение «один-ко-многим». Это отношение, созданное Access, не обеспечивает целостность данных по умолчанию. Чтобы обеспечить целостность данных, нужно изменить отношение. Дополнительные сведения см. в разделе Изменение отношения.

Изменение отношения

Чтобы изменить отношение, выберите его в окне «Схема данных» и внесите нужные изменения.

  1. Установите указатель на линию связи и щелкните линию, чтобы выделить ее. При выделении линия связи становится толще.
  2. Дважды щелкните выделенную линию связи ИЛИ На вкладке Конструктор связей в группе Сервис щелкните Изменить связи.

Откроется диалоговое окно Изменение связей.

Открытие диалогового окна «Изменение связей»

Диалоговое окно

  1. На вкладке Работа с базами данных в группе Отношения выберите элемент Схема данных.
  2. На вкладке Конструктор связей в группе Связи щелкните Все связи. Будут отображены все таблицы с отношениями, а также соответствующие линии связи. Обратите внимание на то, что скрытые таблицы (таблицы, для которых установлен флажок скрытый в диалоговом окне Свойства) и их отношения не отображаются, если в диалоговом окне Параметры переходов не выбран параметр «Показывать скрытые объекты».
  3. Щелкните линию отношения, которое вы хотите изменить. При выделении линия связи становится толще.
  4. Дважды щелкните линию связи. ИЛИ На вкладке Конструктор связей в группе Сервис щелкните Изменить связи. Откроется диалоговое окно Изменение связей.
  5. Внесите изменения и нажмите кнопку ОК. В диалоговом окне Изменение связей можно изменить связи между таблицами (например, таблицы, запросы или поля на любой стороне связи). Можно также задать тип соединения или включить обеспечение целостности данных и выбрать каскадный параметр. Дополнительные сведения о типе соединения и его просмотре см. в разделе Указание типа соединения. Дополнительные сведения об обеспечении целостности данных и выборе каскадного параметра см. в разделе Обеспечение целостности данных.

Указание типа соединения

При определении отношения между таблицами сведения о нем влияют на структуру запросов. Например, при определении отношения между двумя таблицами и создании запроса, работающего с этими двумя таблицами, в Access автоматически выбираются сопоставляемые поля по умолчанию на основе полей, указанных в отношении. Эти исходные значения в запросе можно переопределить, но часто значения, определенные отношением между таблицами, являются верными. Поскольку сопоставление и объединение данных из двух таблиц являются часто воспроизводимыми действиями во всех базах данных, кроме самых простых, параметры по умолчанию, определенные отношениями между таблицами, могут быть полезны и экономить время.

С помощью запроса к нескольким таблицам можно комбинировать данные из них путем сопоставления значений в общих полях. Операция сопоставления и комбинирования называется объединением. Например, требуется отобразить заказы клиентов. Для этого создается запрос, объединяющий таблицы «Клиенты» и «Заказы» по полю «Код клиента». Результаты запроса содержат сведения о клиенте, а также другие сведения только для строк с найденным соответствующим значением.

Одно из значений, которое можно задать для каждого отношения, — это тип объединения. Тип объединения определяет, какие записи будут включены в результаты запроса. Обратимся к описанному примеру с объединением таблиц «Клиенты» и «Заказы» по общим полям, представляющим код клиента. При использовании типа объединения по умолчанию (внутреннего соединения) запрос возвращает только строки таблиц «Клиенты» и «Заказы», для которых общие поля (также называемые связанными полями) совпадают.

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

Примечание: В этом случае термины «слева» и «справа» относятся к положению таблиц в диалоговом окне Изменение связей, а не в окне «Схема данных».

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

Указание типа соединения

Диалоговое окно Свойства соединения в Access отображается с тремя вариантами соединений. Первый параметр выбирается, в котором состояния включают только строки, в которых объединенные поля из обеих таблиц равны.

  1. В диалоговом окне Изменение связей нажмите кнопку Тип соединения. Откроется диалоговое окно Параметры соединения.
  2. Выберите нужный вариант и нажмите кнопку ОК.

В таблице ниже, составленной на основании таблиц «Клиенты» и «Заказы», приведены три варианта, отображаемые в окне Параметры объединения, указан используемый в них тип объединения, а также то, какие именно строки (все или только сопоставленные) возвращаются для каждой из таблиц.

1. Объединение только тех записей, в которых связанные поля обеих таблиц совпадают.

Как создать связь между таблицами в sql

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

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

CREATE TABLE customers ( customer_id INT PRIMARY KEY, customer_name VARCHAR(50) ); CREATE TABLE orders ( order_id INT PRIMARY KEY, order_date DATE, customer_id INT, FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); 

В этом примере мы создаем таблицы customers и orders. Затем мы определяем столбец customer_id как внешний ключ в таблице orders с помощью ключевого слова FOREIGN KEY. Мы указываем, что этот внешний ключ связывает столбец customer_id в таблице orders со столбцом customer_id в таблице customers.

После создания связи между таблицами вы можете использовать операторы JOIN для объединения этих таблиц и выполнения запросов, используя данные из обеих таблиц.

Как создать связи между таблицами

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

Access 2010 даёт возможность организовывать и отображать межтабличные связи двумя способами: непосредственно связей между таблицами и создание вложенных таблиц данных. В Access 2010 система самостоятельно устанавливает связи между таблицами, если в таблицах уже установлены ключевые поля.

Для создания связей необходимо установить соответствие величин одной таблицы величинам из другой таблицы. Связи устанавливаются через определяемые пользователем поля. Для этого связывают ключевое поле родительской таблицы (внешний ключ) с соответствующим ему полем дочерней таблицы. Эти поля в таблицах часто имеют одинаковые имена, но в общем случае это не обязательно. Строго обязательными являются следующие условия.

Ø В одной или в обеих таблицах должно быть поле, содержащее уникальные (не имеющие повторений) значения во всех записях, это и есть первичный ключ.

Ø Связываемые поля должны иметь одинаковые типы данных, кроме исключений из этого правила:

· Поле Счётчика (Код) разрешается связывать с Числовым полем, если в числовом поле в свойствах Размер поля задано значение Длинное целое ( Long Integer );

· Поле Счётчика (Код) разрешается связывать с Числовым полем, если для обоих полей в свойстве Размер поля задано значение Код репликации ( Replication ID – идентификатор связи).

Ø Связываемые поля Числового типа должны иметь одинаковые значения свойства Размер поля.

Ø Для полей, содержащие данные типа OLE и MEMO , первичный ключ назначить невозможно.

В сбалансированной структуре реляционной базы данных каждая запись в любой таблице должна уникально идентифицироваться, т.е. значения некоторых полей в таблице не должны повторяться во всём множестве записей. Этот уникальный идентификатор называется первичным ключом . Как вы заметили, после создания таблиц в Access 2010 в режиме Конструктор, при выполнении операций «Закрыть» или «Сохранить», система делает напоминание: . В том случае, если нажать на кнопку «Нет», то ключевого поля система создавать не будет (в рассмотренных примерах дано объяснение, почему удобнее ключ устанавливать позже). При создании таблицы в режиме Таблица, система автоматически создаёт первое поле, которое называется «Код» с типом данных «Счётчик». Это поле является ключевым, например, на рисунке 60 показан вариант создаваемой таблицы вручную, при вводе данных в поле «Стаж…» система автоматически в поле «Код» устанавливает порядковые номера записей, а после закрытия таблицы поле «Код» становится ключевым.

Рис. 60. Пример созданной таблицы в режиме Таблица

В том случае, если ключевое поле не было установлено в таблице, то понадобится установить ключ самостоятельно (в рассматриваемых примерах, для таблиц «Личные сведения» и «Доплаты» ключи не устанавливались). Для добавления первичного ключа к таблице или для его удаления, необходимо таблицу открыть в режиме Конструктор. Рассмотрим на примере правила создания первичного ключа.

1. Откройте в режиме Конструктор таблицу «Личные сведения».

2. Выделите строку с наименованием поля «Фамилия».

3. На вкладке «Работа с таблицами» щёлкните по надписи .

4. Сохраните таблицу.

Понятно, что убрать ключ из таблицы можно выполнив те же действия. Проверьте, существуют ли ключи в других таблицах, которые были созданы на предыдущих этапах («Надбавка за стаж», «Номенклатура должностей» и «Доплаты»). Если в режиме Конструктор попытаться открыть таблицу, , которая является связанной с внешним файлом, то система выдаст сообщение, текст которого представлен на рисунке 61.

Рис. 61. Сообщение системы о том, что даненая таблица является связанной

1. Может ли Access 2010 самостоятельно устанавливать связи между таблицами, при каких условиях это происходит?

2. Для чего необходимо устанавливать первичный ключ в таблице?

3. Каким типам полей не удаётся установить первичный ключ?

4. Можно ли полю с типом данных Текстовый назначать первичный ключ?

5. Как понимать термин «Уникальное значение записей»?

6. В каких случаях Access 2010 самостоятельно создаёт ключевое поле?

7. Что необходимо сделать, чтобы переназначить ключевое поле в таблице?

Для отображения, корректировки и удаления связей между таблицами в Access предложено прекрасное визуальное средство – Схема данных. Для того, чтобы увидеть, какие связи между таблицами существуют, достаточно закрыть все таблицы, активизировать вкладку «Работа с базами данных», а затем нажать на пиктограмму «Схема данных», которая показана в начале раздела слева. Часто разработчик базы данных изменяет наименования ключевых полей, что потребует от него проведения операции создания связи вручную или её удаление. В некоторых версиях Access 2010 система не создаёт связей. Поэтому, полезно ознакомиться с последовательностью установления связей вручную.

1. Закройте все таблицы в базе данных.

2. Выделите одну из таблиц, например, «Доплаты», при этом появится вкладка «Работа со связями».

3. Щёлкните по пиктограмме , будет открыто окно для добавления таблиц при создании схемы данных. Нажмите на кнопку . Обратите внимание, что ещё имеются способы добавления таблицы на поле «Схема данных». Например, можно в области переходов ухватить левой клавишей мыши нужную таблицу, а затем перетащить её в поле «Схема данных», либо на поле «Схема данных» щёлкнуть правой кнопкой мыши, а затем выбрать из списка . На рисунке 62 представлен пример добавления таблицы «Личные сведения» на поле «Схема данных» методом выбора из списка. Как видите, связи можно устанавливать не только с таблицами, а и с запросами, которые на выходе формируют новые таблицы (о создании запросов будет сказано ниже). Добавьте на поле «Схема данных» таблицы, которые были созданы ранее.

Рис. 62. Пример добавления таблиц на поле «Схема данных»

4. Добавьте все таблицы, созданные ранее, на поле «Схема связей». Проведите операцию установление связей между таблицами «Доплаты» (родительская таблица) и «Личные сведения» (Дочерняя таблица). Для выполнения установления связей левой кнопкой мыши выделите в таблице «Доплаты» поле , а затем переместите указатель мыши на поле таблицы «Личные сведения», когда освободите указатель мыши, появится окно «Изменение связей» (Рис. 63).

Рис. 63. Окно для установления параметров связей между таблицами

5. В окне «Изменение связей» указано откуда и куда проложена связь, если типы данных соединяемых полей совпадают (выполняются правила создания связей), то в поле «Тип отношения» появится сообщение: Один-ко-многим. Обязательно установите отметку в поле , тогда в окне «Схема данных» появится связь. На одном конце будет стоять единица (эти данные являются уникальными, а на другом конце связи будет стоять знак — много). Желательно сделать пометки и в остальных полях, тогда при внесении коррекций в исходную таблицу в записи или их удаление, в запросах произойдёт автоматическое изменение результатов. Нажмите на кнопку .

Почему при устанвлении связей между таблицами не обязательно ставить пометки в полях «Каскадное обновление связанных полей» и «Каскадное удаление связанных полей»? Это естественный вопрос, тем не менее, обратите внимание, если использовать в качестве связываемых полей поле «Счётчик», то это поле невозможно видоизменить пользователем, следовательно, нет смысла ставить в этом случае пометку (напомним, что при установлении ключевого поля «Текстовое», пользователь имеет возможность видоизменять данные в этом поле, например заменить фамилию.). «Каскадное удаление связанных записей» используется для того, чтобы при удалении записи из одной таблицы, в запросах или других связанных таблицах, данные помеченного поля так же будут удаляться.

1. Что следует сделать, чтобы создать схему связей между таблицами?

2. Какими способами можно добавить таблицу на поле схемы данных?

3. Для чего используется окно «Изменение связей»?

4. Для чего ставится пометка в окне «Щбеспечение целостности данных»?

При попытке создать связь между таблицами «Надбавки за стаж» и «Личные сведения» ничего не получится. Ответ ясен, в таблице «Личные сведения» отсутствует поле, которое можно связать с таблицей «Надбавки за стаж». Выходов из положения два. Первый способ – создать поле в таблице «Личные сведения», например, используя приём связанных таблиц, а затем из списка выбрать необходимые данные для заполнения вновь созданного поля. Второй способ – воспользоваться промежуточной таблицей, например, которая будет создана в запросе, этот приём довольно трудоёмкий, но позволяет наращивать базу данных новыми таблицами, а затем использовать их для выполнения вычислений в запросах (этот способ будет рассмотрен ниже). Создадим в таблице «Личные сведения» новое поле, например, «Стаж». Создание вложенных таблиц уже обсуждалось. Напомним, что сначала необходимо определить место нового поля в таблице, затем выбрать режим , далее — , а затем выполнить шаги по подстановки необходимого поля в виде списка из другой таблицы. В результате выполняемых действий будет получена связь между таблицами «Надбавка за стаж» (Родительская) и «Личные сведения» (Дочерняя). На рисунке 64 показан пример автоматического установления связей между таблицами, когда используется метод вложения таблиц. Когда будет раскрыта таблица «Надбавки за стаж», то в ней появляется символ . Если щёлкнуть по символу , то будут отображены строки (записи) из дочерней таблицы (в данном примере показаны записи со сведениями о сотрудниках, которые имеют стаж работы от 1 года до 3-х лет).

Рис. 64. Пример установления связей между таблицами методом вложенния таблиц

Автоматически созданная связь отображает отношение «Один ко многим», действительно, в таблице «Надбавки за стаж» каждая строка является уникальной, в то время как в таблице «Личные сведения» данные о стаже работы сотрудника могут относиться к нескольким строкам.

Для того, чтобы увидеть, какие связи между таблицами существуют, достаточно закрыть все таблицы, активизировать вкладку «Работа с базами данных», а затем нажать на пиктограмму «Схема данных». Часто разработчик базы данных изменяет наименования ключевых полей, что потребует от него проведения операции создания связи вручную или её удаление. На рисунке 65 показана схема связей для рассматриваемого примера.

Рис. 65. Вариант сформированных связей между таблицами в базе данных

1. Каки образом можно удалить имеющуюся связь между таблицами?

2. Что обозначает символ в таблице, которая открыта в режиме Таблица?

3. Что обозначает символ на линии связи между таблицами в окне «Схема связей»?

4. Можно ли в таблице изменять значение в поле «Счётчик»?

Связи между таблицами MS SQL: обзор основных отношений и типов соединения

Как связать таблицы в SQL

Связи между таблицами в базе данных — основа хранения данных в СУБД.

Связи в базе данных MS SQL позволяют нормализировать БД, настроить отношение между данными таблиц и сделать эффективные выборки данных. Главное — понять, как настраивать и использовать связи между таблицами MS SQL. Это необходимое условие для работы с любой БД.

Ниже рассмотрим основные концепции связей: Foreign Key и JOINs.

Foreign Key

Создание связей MS SQL между таблицами происходит через внешний ключ (foreign key). Данный ключ связывает поле (значение) исходной таблицы с Primary Key внешней таблицы. Через внешний ключ можно не только производить выборку данных, но и контролировать удаление данных в главной таблице:

  • NO ACTION — не производит никаких действий;
  • SET NULL — зависимые данные установятся в NULL при удалении записи из главной таблицы (primary table);
  • CASCADE — удаляются зависимые данные. Опасная операция. В реальной жизни используется редко.

Подробнее об этом — на курсе «Аналитик данных». За 12 месяцев разберетесь в основных данных, научитесь делать таблицы, соединять и обрабатывать несколько сразу, использовать оконные функции. Станете настоящим экспертом в аналитике!

ALTER TABLE ADD CONSTRAINT FK__ FOREIGN KEY () REFERENCES () ON UPDATE ON UPDATE

Типы соединения JOINs

Когда отношения между таблицами установлены, можно делать выборки данных из этих связанных таблиц.

Существует несколько механизмов соединения двух таблиц в запросе: это основные типы JOINs для MS SQL SERVER. И они практически всегда совпадают для всех реляционных СУБД.

Рассмотрим основные типы JOINs. Будем считать, что у нас есть левая и правая таблицы, которые соединяем через JOIN. *Левая и правая относительно слова JOIN.

Есть несколько механизмов соединения двух таблиц в запросе. Например, Oracle содержит Natural Join, который соединяет колонки с одинаковыми именами в таблицах. Используется крайне редко.

Обо всех способах соединения — на курсе «Аналитик данных». Уделяйте учебе всего два часа в день — и научитесь обновлять, удалять и добавлять записи, использовать разные соединения, чтобы решать реальные задачи.

LEFT (OUTER) JOIN

Типы соединения JOINs

Всегда выводите данные по левой таблице. Если правая таблица не содержит связанных данных, то выводите NULL для этих значений.

select * from A left join B on A.ID = B.A_ID
A1 B1
A2 B2
A3 NULL

RIGHT (OUTER) JOIN

Типы соединения JOINs

Обратное от Left Join. Используют редко. Всегда можно переписать на Left Join — тогда запрос легче читать. В частных случаях бывает, что Right Join дает лучшую статистику выполнения и оптимизирует запрос.
A left join B = B right join A:

select * from B right join A on A.ID = B.A_ID
A1 B1
A2 B2
A3 NULL

Аналитик данных: новая работа через 5 месяцев
Получится, даже если у вас нет опыта в IT

INNER JOIN

Типы соединения JOINs

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

На курсе «Аналитик данных» вы не только изучите теорию, но и выполните практические задания. Если возникнут сложности — помогут кураторы с реальным опытом в аналитике. Благодаря их помощи подготовите интересные проекты для портфолио.

select * from A inner join B on A.ID = B.A_ID -- аналог запроса на left join select * from A left join B on A.ID = B.A_ID where B.ID is not null
A1 B1
A2 B2

CROSS JOIN

Это пересечение всех строк из левой таблицы со всеми строками правой таблицы.

select * from A cross join B
A1 B1
A1 B2
A2 B1
A2 B2

FULL JOIN

Типы соединения JOINs

Представьте, что это смешанное сочетание Left Join и Right Join. Вначале выводятся значения левой таблицы, а правой заполняются NULL, затем — наоборот.

Запрос выводит пересечение значений. Если нет пересечений, то выводит значения по A и B c NULL:

select * from A full join B on A.ID = B.A_ID
A1 B1
A2 B2
A3 NULL
NULL B4

Типы отношений между таблицами

Используем Foreign Key и JOINs и создадим реальный пример бизнес-задачи. А еще рассмотрим настройку связей между таблицами.

Введем сущности Clinics, Doctors, Patients и Appointments.

  • Доктор работает или не работает только в одной клинике.
  • У доктора может быть вышестоящий менеджер.
  • Пациент может обращаться в разные клиники к разным докторам.

Создадим таблицы БД, пока без связей с сурогатными Primary Keys:

CREATE TABLE dbo.Clinics ( ID int, Name varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, CONSTRAINT Clinics_PK PRIMARY KEY (ID) ); CREATE TABLE dbo.Patients ( ID int, Name varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, CONSTRAINT Patients_PK PRIMARY KEY (ID) ); CREATE TABLE dbo.Doctors ( ID int, Name varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, Clinic_ID int NULL, Manager_ID int NULL, CONSTRAINT Doctors_PK PRIMARY KEY (ID) ); CREATE TABLE dbo.Appointments ( ID int, [Date] datetime2(0) NOT NULL, Patient_ID int NOT NULL, Doctor_ID int NOT NULL, CONSTRAINT Appointments_PK PRIMARY KEY (ID) );
insert into dbo.Clinics values (1, 'First Clinic'), (2, 'Second Clinic') insert into dbo.Doctors values (10, 'Doctor', 1, NULL), (11, 'Assistent Doctor', 1, 10), (12, 'Another Doctor', 2, NULL), (13, 'Retired Doctor', NULL, NULL), (15, 'Assist 2 Doctor', 1, 11) insert into dbo.Patients values (100, 'First Patient'), (101, 'Second Patient') insert into dbo.Appointments values (1000, GETDATE(), 100, 10), (1001, GETDATE(), 101, 10), (1002, GETDATE(), 100, 12)

Отношения «один к одному»

Используйте данную связь, когда значению из таблицы соответствует только одна запись из внешней таблицы. «Доктор может работать только в одной клинике». Можем предположить, что связь между Clinics и Doctors будет «один к одному»:

ALTER TABLE dbo.Doctors ADD CONSTRAINT FK_Doctors_ClinicID FOREIGN KEY (Clinic_ID) REFERENCES dbo.Clinics(ID);
select d.Name, c.Name from dbo.Doctors d left join dbo.Clinics c on c.ID = d.Clinic_ID;

Отношение «один ко многим»

Одной записи из таблицы соответствуют несколько записей из внешней. Данный тип связи очень распространен при построении схемы БД.

«Хотя доктор может принадлежать только одной клинике, клиники, в свою очередь, содержат штат докторов». Это отношение «один ко многим»:

select c.Name, d.Name from dbo.Clinics c inner join dbo.Doctors d on d.Clinic_ID = c.ID;
CLINIC DOCTOR
First Clinic Doctor
First Clinic Assistent Doctor
First Clinic Assist 2 Doctor
Second Clinic Another Doctor

Отношение «многие ко многим»

Организуется через промежуточную таблицу, в которой есть внешние ключи на разные таблицы.

О временных таблицах вы подробнее узнаете на курсе «Аналитик данных». Научитесь работать с временными таблицами, использовать оконные функции и соединять таблицы в SQL, применять их для сложных запросов.

В таблице Appointments есть связь на таблицы Doctors и Patients. Таким образом, организована связь между пациентами и докторами: пациент может посещать нескольких докторов, а доктора — принимать нескольких пациентов.

ALTER TABLE dbo.Appointments ADD CONSTRAINT FK_Appointments_DoctorID FOREIGN KEY (Doctor_ID) REFERENCES dbo.Doctors(ID); ALTER TABLE dbo.Appointments ADD CONSTRAINT FK_Appointments_PatientID FOREIGN KEY (Patient_ID) REFERENCES dbo.Patients(ID);

Это довольно распространенный вопрос на собеседовании для SQL-разработчика. Если программист может на примере объяснить, как строится связь «многие ко многим», — это уже хороший показатель для интервьюера.

Как получить список посещений пользователя с указанием клиники и докторов:

select p.Name, a.[Date], d.Name, c.Name from dbo.Patients p inner join dbo.Appointments a on a.Patient_ID = p.ID inner join dbo.Doctors d on d.ID = a.Doctor_ID inner join dbo.Clinics c on c.ID = d.Clinic_ID where p.ID = 100;
PATIENT DATE DOCTOR CLINIC
First Patient 2022-08-06 07:41:45.000 Doctor First Clinic
First Patient 2022-08-06 07:41:45.000 Another Doctor Second Clinic

Связь с самим собой

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

Таблица Doctors содержит колонку Manager, в которой указано, кто из докторов является менеджером текущего доктора. Здесь связь на строку из той же таблицы докторов.

Как рекурсивно получить список докторов, у которых определенный доктор является вышестоящим менеджером:

with cte as ( select d.ID, d.Name from dbo.Doctors d where d.ID = 10 union all select d2.ID, d2.Name from dbo.Doctors d2 inner join cte on cte.ID = d2.Manager_ID ) select * from cte

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

https://kapelnicza.vyvod-iz-zapoya-na-domu-voronezh.ru/