Содержание:
Выборка из нескольких таблиц (неявная операция соединения)
В sql выборка из нескольких таблиц или неявная операция соединения допускается в предложении FROM, но при этом перечисление таблиц, как правило, сопровождается условием соединения записей из разных таблиц.
Рассмотрим пример неявной операции соединения:
Необходимо выбрать имена преподавателей, учебную группу и курс, на котором они преподают. Условием отбора должно являться одинаковое значение полей
Учебная группа
в таблицах Список
и Группы
.
✍ Решение:
1 2 3 4 5 | SELECT DISTINCT группы.`Преподаватель` , список.`Учебная группа` , список.`курс` FROM группы, список WHERE группы.`Учебная группа` = список.`Учебная группа` AND курс <3 |
✍ Решение:
1 2 3 4 | SELECT DISTINCT pc.Номер, Производитель FROM pc, product WHERE pc.Номер = product.Номер AND Цена <30000 |
Иногда в предложении FROM требуется указать одну и ту же таблицу несколько раз. В таком случае для таблицы потребуется псевдоним. Рассмотрим пример:
✍ Решение:
1 2 3 4 5 | SELECT DISTINCT A.`Курс` AS номер_курса1, B.`Курс` AS номер_курса2 FROM список AS A, список AS B WHERE A.`Год рождения` = B.`Год рождения` AND A.Курс < B.Курс LIMIT 0 , 30 |
Результат:
Здесь условие A.Курс < B.Курс
используется для того, чтобы не выводились одинаковые пары, отличающиеся только перестановкой курса.
В общем случае можно использовать условие A.Курс <> B.Курс
!
✍ Решение:
1 2 3 4 | SELECT DISTINCT A.Номер AS модель1, B.Номер AS модель2 FROM pc AS A, pc AS B WHERE A.Цена = B.Цена AND A.Номер < B.Номер |
Здесь условие A.Номер < B.Номер
используется для того, чтобы не выводились одинаковые пары, отличающиеся только перестановкой номера:
tid
), которые ведут уроки по одинаковым курсам (таблица lessons
)1. Вывести все сведения из таблиц
Личные данные
и Список
, совпадающие по полям Код
и Код студента
2. Вывести фамилии, адреса и оценки по word из таблиц
Личные данные
и Список
, совпадающие по полям Код
и Код студента
Вывести курс и год рождения студентов, учащихся на одном курсе, но имеющих разный год рождения. При этом рассмотреть все курсы, кроме первого.
Результат:
Запросы sql INNER JOIN
В предложении FROM может использоваться явная операция соединения двух и более таблиц.
Разберем пример. Имеем две таблицы: teachers
(учителя) и lessons
(уроки):
teachers | lessons |
✍ Решение:
SELECT t.name,t.code,l.course FROM teachers t INNER JOIN lessons l ON t.id=l.tid |
В запросе буквы l
и t
являются псевдонимами таблиц lessons
(l) и teachers
(t).
Inner Join - это внутреннее объединение (
JOIN
- с англ. "объединение", ключевое словоINNER
можно опустить).При внутреннем объединении выбираются только совпадающие данные из объединяемых таблиц.
Word
INNER
), либо одним из внешних (OUTER
). Служебное слово INNER
можно опускать, тогда при использовании просто слова JOIN
имеется в виду внутреннее соединение (INNER
)name
, title
, length
) из таблиц teachers
и courses
. Использовать внутреннее объединениеЗапросы sql OUTER JOIN
При использовании внутреннего объединения inner join выбираются только совпадающие данные из объединяемых таблиц. Для того чтобы получить данные, которые подходят по условию частично, необходимо использовать внешнее объединение.
OUTER JOIN - внешнее объединение, которое возвращает данные из обеих таблиц (совпадающие по условию объединения), ПЛЮС выборка дополнится оставшимися данными из внешней таблицы, которые по условию не подходят, заполнив недостающие данные значением
NULL
.Существует два типа внешнего объединения - LEFT OUTER JOIN ("внешней" таблицей будет находящаяся слева) и RIGHT OUTER JOIN ("внешней" таблицей будет находящаяся справа).
OUTER
можно опустить. Запись LEFT JOIN
эквивалентна записи LEFT OUTER JOIN
.✍ Решение:
SELECT t.name, t.code, l.course FROM teachers t LEFT OUTER JOIN lessons l ON t.id = l.tid |
LEFT JOIN
означает, что помимо строк, для которых выполняется условие, в результирующий набор попадут все остальные строки из левой таблицы. При этом отсутствующие значения из правой таблицы будут заполнены NULL-значениями.
С тем же примером (выбрать имена учителей и курсы, которые они ведут) фильтрация по RIGHT OUTER JOIN
вернет полный список уроков по курсам (правая таблица) и сопоставленных учителей. Но так как нет таких уроков, которые бы не соответствовали определенным учителям, то выборка будет состоять только из двух строк:
SELECT t.name, t.code, l.course FROM teachers t RIGHT OUTER JOIN lessons l ON t.id = l.tid |
Личные данные
сведения для нового студента, у которого пока отсутствуют оценки (остальные данные заполнить). Этого же студента добавить в таблицу список
(с тем же кодом).
Выбрать фамилии студентов и их оценки по Word. В случае отсутствия оценки, все равно выводить фамилию.
name
, title
, length
) из таблиц teachers
и courses
. Использовать внешнее объединениеВ приведенных примерах можно вводить фильтры для более точной фильтрации:
✍ Решение:
SELECT t.name, t.code, l.course FROM teachers t LEFT OUTER JOIN lessons l ON t.id = l.tid WHERE l.tid IS NULL |
Объединение с подзапросом
При использовании объединения часто бывает необходимо, чтобы результирующая выборка содержала данные только по одной конкретной строке
Синтаксис:
SELECT t1.*, t2.* FROM left_table t1 LEFT JOIN (SELECT * FROM right_table WHERE some_column = 1 LIMIT 1) t2 ON t1.id = t2.join_idили
SELECT t1.*, t2.* FROM left_table t1 INNER JOIN (SELECT * FROM right_table WHERE some_column = 1 LIMIT 1) t2 ON t1.id = t2.join_id
✍ Решение:
SELECT t1.*, t2.* FROM teachers t1 INNER JOIN (SELECT * FROM lessons WHERE course = "php" LIMIT 1) t2 ON t1.id = t2.tid |
Разберем еще один пример:
✍ Решение:
1 2 3 4 5 6 7 | SELECT t1.производитель, t1.Тип, t2 . * FROM pc t2 INNER JOIN ( SELECT * FROM product WHERE Тип = "Компьютер" ) t1 ON t2.Номер = t1.Номер |
Так как в таблице product
находятся данные не только по компьютерам, то мы использовали подзапрос, при этом сохранив внутреннее соединение таблиц.
Результат:
Word
оценка "отлично".
Благодарю! Интересно как !
Вопрос по outer join.
На вашем примере про курсы. А если есть еще курс SQL, который никто не ведет. Как вывести в одном запросе всех преподавателей, независимо от того ,ведут ли они курсы а так же и курсы, которые никто не ведет?
то есть:
Иванов — PHP
Петров — null
Сидоров — null
null — SQL