SQLite INNER JOIN
Как внутренние объединения работают в SQLite?
В SQLite INNER JOIN выбирает все строки из обеих участвующих таблиц для отображения в результате, если и только если обе таблицы удовлетворяют условиям, указанным в предложении ON. JOIN, CROSS JOIN и INNER JOIN являются синтаксическими эквивалентами. В стандартном SQL они не эквивалентны. INNER JOIN используется с предложением ON, CROSS JOIN используется в противном случае.
У нас есть три типа INNER JOIN: INNER JOIN, NATURAL INNER JOIN и CROSS INNER JOIN. Ключевое слово INNER может быть опущено.
Иллюстрированная презентация
Предположим, что у нас есть две таблицы таблица-A и таблица-B. Уникальными столбцами для двух таблиц являются ID. Значения в столбце ID для таблицы-A составляют 210 211 212 и 213, а значения для таблицы B - 210 214 212 212 и 212. Вот графическое представление.
Пример: SQLite INNER JOIN
При объединении записей из более чем одной таблицы пользователь должен указать, как записи в таблице можно сопоставить с записями в другой. Поскольку обе таблицы имеют столбец ID (doctor_id), мы можем сопоставить их, используя этот столбец. Предложение ON используется для сопоставления записей в двух таблицах на основе значения столбца doctor_id. Использование INNER JOIN объединяет таблицы. INNER JOIN позволяет строкам из любой таблицы появляться в результате тогда и только тогда, когда обе таблицы удовлетворяют условиям, указанным в предложении ON.
Вот примеры таблиц.
стол - врачи доктор_ид степень доктора_имя ---------- -------------- ---------- 210 Доктор Джон Линга, доктор медицины 211 Доктор Питер Холл MBBS 212 Доктор Ке Джи Доктор медицины 213 д-р Пат Фэй, доктор медицины стол - посещения doctor_id имя_пользователя vdate ---------- ------------ ---------- 210 Джулия Найер 2013-10-15 214 ТиДжей Олсон 2013-10-14 215 Джон Сео 2013-10-15 212 Джеймс Марлоу 2013-10-16 212 Джейсон Маллин 2013-10-12
В этом примере предложение ON указывает, что столбец doctor_id таблицы врачей и посещений должен совпадать. Если идентификатор (doctor_id) не отображается в обеих таблицах, строка не будет отображаться в результате, поскольку условие в предложении ON не выполняется. Только те врачи будут участвовать в JOIN, чья степень ID MD.
SELECT doctors.doctor_id,doctors.doctor_name,visits.patient_name
FROM doctors
INNER JOIN visits
ON doctors.doctor_id=visits.doctor_id
WHERE doctors.degree='MD';
Выход:
doctor_id doctor_name имя пациента ---------- -------------- ------------ 210 Доктор Джон Линга Джулия Найер 212 Доктор Ке Джи Джеймс Марлоу 212 Доктор Ке Джи Джейсон Маллин
Пример: внутреннее соединение SQLite с псевдонимом
Следующее утверждение SQLite объединяет идентификатор доктора, имя доктора, степень доктора и имя пациента для этого доктора, который имеет степень MD и не имеет зарегистрированного идентификатора 210. Обратите внимание, что псевдонимы использовались для ссылки на имена столбцов. ВНУТРЕННЕЕ СОЕДИНЕНИЕ выполняется на основе условия, что doctor_id в таблице докторов также должен присутствовать в таблице посещений.
SELECT doc.doctor_id,doc.doctor_name,doc.degree,vis.patient_name
FROM doctors AS doc
INNER JOIN visits AS vis ON doc.doctor_id=vis.doctor_id AND
doc.degree="MD" AND doc.doctor_id<>210;
Вот результат.
doctor_id доктор_имя степень имя_файла ---------- ----------- ---------- ------------ 212 Доктор Ке Джи Доктор медицины Джеймс Марлоу 212 Доктор Ке Джи Доктор медицины Джейсон Маллин
SQLite INNER JOIN с использованием трех таблиц
Вот примеры таблиц:
стол - врачи доктор_ид степень доктора_имя ---------- -------------- ---------- 210 Доктор Джон Линга, доктор медицины 211 Доктор Питер Холл MBBS 212 Доктор Ке Джи Доктор медицины 213 д-р Пат Фэй, доктор медицины стол - специальность spl_id spl_descrip doctor_id ---------- ----------- ---------- 1 КАРДИО 211 2 NEURO 213 3 ARTHO 212 4 GYNO 210 s стол - посещения doctor_id имя_пользователя vdate ---------- ------------ ---------- 210 Джулия Найер 2013-10-15 214 ТиДжей Олсон 2013-10-14 215 Джон Сео 2013-10-15 212 Джеймс Марлоу 2013-10-16 212 Джейсон Маллин 2013-10-12
Приведенные выше таблицы связаны друг с другом. В врачах таблицы специальностей и визитов doctor_id и spl_id являются первичными ключами для врачей и таблицы специальностей последовательно. Doctor_id в таблице специализаций и таблицах посещений - это внешний ключ, который является ссылкой на первичный ключ doctor_id таблицы докторов .
Если мы хотим, чтобы все записи для врача, который специализировался на special1 и сидел в его палате в среду (WED) во время его графика, можно использовать следующий SQL:
SELECT a.doctor_id,a.doctor_name,
b.spl_descrip,c.patient_name,c.vdate
FROM doctors a
INNER JOIN speciality b
ON a.doctor_id=b.doctor_id
INNER JOIN visits c
ON a.doctor_id=c.doctor_id
WHERE a.doctor_id=212 AND c.vdate='2013-10-16';
Выход:
doctor_id doctor_name spl_descrip имя_пользователя vdate ---------- ----------- ----------- ------------ ------ ---- 212 Доктор Ке Джи АРТХО Джеймс Марлоу 2013-10-16
Объяснение:
шаг 1
SELECT a.doctor_id,a.doctor_name,b.spl_descrip
FROM doctors a
INNER JOIN speciality b
ON a.doctor_id=b.doctor_id;
шаг 2
ВЫБЕРИТЕ a.doctor_id, a.doctor_name, b.spl_descrip, c.patient_name, c.vdate ОТ врачей INNER JOIN специальность ON a.doctor_id = b.doctor_id INNER JOIN посещает c ON a.doctor_id = c.doctor_id;
шаг 3
SELECT a.doctor_id,a.doctor_name,
b.spl_descrip,c.patient_name,c.vdate
FROM doctors a
INNER JOIN speciality b
ON a.doctor_id=b.doctor_id
INNER JOIN visits c
ON a.doctor_id=c.doctor_id
WHERE a.doctor_id=212 AND c.vdate='2013-10-16';
ВНУТРЕННИЕ СОЕДИНЕНИЯ: SQL и другие реляционные базы данных
Предыдущий: Создать, Отбросить представления
Следующая: ЛЕВАЯ НАРУЖНАЯ СОЕДИНЕНИЕ
Новый контент: Composer: менеджер зависимостей для PHP , R программирования