Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Использование нескольких таблиц




Предположим, нужно узнать, в какие числа врач принимал пациентов. В таблице Diagnosis указаны даты приёма, но для того, чтобы выбрать нужные, необходимо знать имя врача. Так как имена хранятся в таблице doctor, в этом запросе нужно использовать обе таблицы:

 

SELECT Doctor.name, diag_date FROM Doctor, Diagnosis WHERE

Doctor.doctor_id = Diagnosis.doctor_id AND Doctor.name = ‘doctor 1’;

 

 

На некоторые аспекты этого запроса следует обратить особое внимание:

● в выражении FROM указаны две таблицы, так как запрос будет получать информацию из обеих.

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

● так как столбец name может присутствовать в обеих таблицах, нужно явно указать, какую именно таблицу вы имеете в виду, ссылаясь на данный столбец. Это можно сделать, связав имя таблицы с именем столбца.

Для объединения не обязательно иметь две отдельные таблицы: иногда можно объединить таблицу с самой собой - если нужно сравнить одни записи таблицы с другими записями той же таблицы.

В языке SQL поддерживаемом в MySQL предусмотрены также специальные конструкции для объединения таблиц в запросе. Основные из них:

1) FULL JOIN – полное объединение

2) INNER JOIN – внутренне объединение (пересечение)

3) LEFT JOIN – объединение слева

4) RIGHT JOIN - объединение справа

При операции FULL JOIN в результирующем наборе записей будут присутствовать все возможные комбинации из записей в таблицах объединения (декартово произведение). Например, при выполнении запроса:

 

SELECT * FROM Doctor FULL JOIN diagnosis;

 

мы получим набор из 2*6 = 12 записей, где 2 записи из таблицы докторов будут перебраны с 6 записями из таблицы диагнозов.

 

При операции INNER JOIN результирующий набор записей будет представлять собой пересечение двух таблиц по значению заданного в команде поля – столбца для объединения. Например, запрос:

 

SELECT Doctor.name, diag_date FROM Doctor INNER JOIN Diagnosis ON

Doctor.doctor_id = Diagnosis.doctor_id WHERE Doctor.name = ‘doctor 1’;

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

 

 

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

Конструкция LEFT JOIN позволяет при объединении таблиц выбрать все записи из левой таблицы и соответствующие им (по полю объединения) записи правой таблицы. Если для записи левой таблицы нет соответствующей записи в другой таблице, то поля правой таблицы заполняются значениями NULL. Например, запрос:

 

SELECT Doctor.name, diag_date FROM Doctor LEFT JOIN Diagnosis ON

Doctor.doctor_id = Diagnosis.doctor_id WHERE Doctor.name = ‘doctor 1’;

 

вернёт информацию о соответствующем враче (в любом случае) и всех его диагнозах, если они есть.

 

 

Если записей о диагнозах нет, будет выдано следующее:

 

 

Инструкция RIGHT JOIN аналогична предыдущей с той лишь разницей, что берутся все записи из правой таблицы и дополняются информацией из левой, если такая имеется. Например запрос:

 

SELECT Doctor.name, diag_date FROM Diagnosis RIGHT JOIN Doctor ON

Doctor.doctor_id = Diagnosis.doctor_id WHERE Doctor.name = ‘doctor 1’;

 

полностью аналогичен предыдущему.

 

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

 

SELECT * FROM (Doctor INNER JOIN Diagnosis

ON Doctor.doctor_id = Diagnosis.doctor_id)

INNER JOIN Patient ON Patient.patient_id = Diagnosis.patient_id;

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 328.

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