Когда использовать левое внешнее соединение?
Я не понимаю понятия левого внешнего соединения, правого внешнего соединения или, действительно, почему нам нужно использовать соединение вообще! Вопрос, с которым я борюсь, и таблица, над которой я работаю, здесь: Ссылка
Вопрос 3 (b)
Создайте команду в SQL, чтобы решить следующий запрос, объяснив, почему он должен был использовать
(внешний) метод соединения. [5 знаков]
"Найдите имя каждого сотрудника и его/ее зависимого супруга, если таковые имеются"
Вопрос 3 (c) -
Создайте команду в SQL для решения следующего запроса, используя (i) метод объединения, и (ii)
метод подзапроса. [10 знаков]
"Найдите идентификационное имя каждого сотрудника, который работал более 20 часов на
Проект компьютеризации "
Может кто-нибудь объяснить это мне просто?
Ответы
Ответ 1
Соединения используются для объединения двух связанных таблиц.
В вашем примере вы можете комбинировать таблицу Employee и таблицу отдела так:
SELECT FNAME, LNAME, DNAME
FROM
EMPLOYEE INNER JOIN DEPARTMENT ON EMPLOYEE.DNO=DEPARTMENT.DNUMBER
Это приведет к набору записей, например:
FNAME LNAME DNAME
----- ----- -----
John Smith Research
John Doe Administration
Я использовал INNER JOIN
выше. INNER JOIN
объединить две таблицы, чтобы отображались только записи с совпадениями в обеих таблицах, и в этом случае они соединяются по номеру отдела (поле DNO в Employee, DNUMBER в таблице Department).
LEFT JOIN
позволяют объединять две таблицы, когда у вас есть записи в первой таблице, но может не иметь записи во второй таблице. Например, скажем, вы хотите получить список всех сотрудников, а также всех иждивенцев:
SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_last, DEPENDENT.LNAME as dependent_last
FROM
EMPLOYEE INNER JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN
Проблема заключается в том, что если у сотрудника нет зависимости, то их запись вообще не будет отображаться - поскольку в таблице DEPENDENT нет соответствующей записи.
Итак, вы используете левое соединение, которое сохраняет все данные в "левом" (т.е. в первой таблице) и вытягивает любые соответствующие данные по "правой" (вторая таблица):
SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_first, DEPENDENT.LNAME as dependent_last
FROM
EMPLOYEE LEFT JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN
Теперь мы получаем все записей сотрудников. Если для данного сотрудника нет соответствующих зависимостей (-ов), поля dependent_first
и dependent_last
будут иметь значение null.
Ответ 2
пример (не используя ваши таблицы примеров: -)
У меня есть компания по прокату автомобилей.
Table car
id: integer primary key autoincrement
licence_plate: varchar
purchase_date: date
Table customer
id: integer primary key autoincrement
name: varchar
Table rental
id: integer primary key autoincrement
car_id: integer
bike_id: integer
customer_id: integer
rental_date: date
Простенько? У меня 10 записей для автомобилей, потому что у меня 10 автомобилей.
Я занимаюсь этим бизнесом уже 10 лет, поэтому у меня 1000 клиентов.
И я арендую автомобили около 20 раз в год на автомобили = 10 лет x 10 автомобилей x 20 = 2000 аренды.
Если я храню все в одной большой таблице, у меня есть 10x1000x2000 = 20 миллионов записей.
Если я сохраню его в 3 таблицах, у меня есть 10 + 1000 + 2000 = 3010 записей.
Это 3 порядка, поэтому я использую 3 таблицы.
Но поскольку я использую 3 таблицы (чтобы сэкономить место и время), я должен использовать объединения, чтобы снова получить данные
(по крайней мере, если мне нужны имена и номерные знаки вместо цифр).
Использование внутренних соединений
Вся аренда для покупателя 345?
SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id)
INNER JOIN car on (car.id = rental.car_id)
WHERE customer.id = 345.
То, что a INNER JOIN
, потому что мы только хотим знать о том, какие автомобили linked to
аренда linked to
клиенты, которые действительно произошли.
Обратите внимание, что у нас также есть bike_id, связанный с велосипедным столом, который очень похож на автомобильный стол, но отличается.
Как мы получим все байки + прокат автомобилей для клиентов 345.
Мы можем попробовать и сделать это
SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id)
INNER JOIN car on (car.id = rental.car_id)
INNER JOIN bike on (bike.id = rental.bike_id)
WHERE customer.id = 345.
Но это даст пустое множество!
Это потому, что аренда может быть либо bike_rental ИЛИ car_rental, но не одновременно.
И нерабочий INNER JOIN
запрос даст только результаты для всех арендных плат, где мы арендуем как велосипед, так и автомобиль в той же транзакции.
Мы пытаемся получить и boolean OR
отношения, используя логическое объединение AND
.
Использование внешних соединений
Для этого нам понадобится outer join
.
Разрешите его с помощью left join
SELECT * FROM customer
INNER JOIN rental on (rental.customer_id = customer.id) <<-- link always
LEFT JOIN car on (car.id = rental.car_id) <<-- link half of the time
LEFT JOIN bike on (bike.id = rental.bike_id) <<-- link (other) 0.5 of the time.
WHERE customer.id = 345.
Посмотрите на это так. INNER JOIN
является AND
, a left join
является OR
, как в следующем псевдокоде:
if a=1 AND a=2 then {this is always false, no result}
if a=1 OR a=2 then {this might be true or not}
Если вы создаете таблицы и запускаете запрос, вы можете увидеть результат.
по терминологии
A left join
совпадает с a left outer join
.
A join
без дополнительных префиксов - это INNER JOIN
Там также есть full outer join
. За 25 лет программирования я никогда не использовал это.
Почему Left join
Ну, там задействованы две таблицы. В примере мы связали
клиент в аренду с INNER JOIN
во внутреннем соединении обеих таблиц должен, поэтому нет никакой разницы между таблицей left:customer
и таблицей right:rental
.
Следующая ссылка была left join
между left:rental
и right:car
. С левой стороны все строки должны быть связаны, а на правой стороне они не должны. Вот почему он left join
Ответ 3
Вы используете внешние соединения, когда вам нужны все результаты из одной из таблиц соединений, есть ли соответствующая строка в другой таблице или нет.
Ответ 4
Я думаю, что вопрос 3 (b) запутан, потому что вся его предпосылка неверна: вам не нужно использовать внешнее соединение для "решения запроса", например. рассмотрим это (следуя стилю синтаксиса в экзаменационной статье, вероятно, мудрый):
SELECT FNAME, LNAME, DEPENDENT_NAME
FROM EMPLOYEE, DEPENDENT
WHERE SSN = ESSN
AND RELATIONSHIP = 'SPOUSE'
UNION
SELECT FNAME, LNAME, NULL
FROM EMPLOYEE
EXCEPT
SELECT FNAME, LNAME, DEPENDENT_NAME
FROM EMPLOYEE, DEPENDENT
WHERE SSN = ESSN
AND RELATIONSHIP = 'SPOUSE'
Ответ 5
В целом:
СОЕДИНЯЙТЕ СОЕДИНЕНИЯ две таблицы вместе.
Используйте INNER JOIN, когда вы хотите "искать", например, искать подробную информацию о любом конкретном столбце.
Используйте OUTER JOIN, когда хотите "продемонстрировать", например, перечислите всю информацию из двух таблиц.