Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Использование нескольких таблиц
Предположим, нужно узнать, в какие числа врач принимал пациентов. В таблице 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; просмотров: 376. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |