Подтвердить что ты не робот

Когда использовать левое внешнее соединение?

Я не понимаю понятия левого внешнего соединения, правого внешнего соединения или, действительно, почему нам нужно использовать соединение вообще! Вопрос, с которым я борюсь, и таблица, над которой я работаю, здесь: Ссылка

Вопрос 3 (b)

Создайте команду в SQL, чтобы решить следующий запрос, объяснив, почему он должен был использовать (внешний) метод соединения. [5 знаков] "Найдите имя каждого сотрудника и его/ее зависимого супруга, если таковые имеются"

Вопрос 3 (c) -

Создайте команду в SQL для решения следующего запроса, используя (i) метод объединения, и (ii) метод подзапроса. [10 знаков] "Найдите идентификационное имя каждого сотрудника, который работал более 20 часов на Проект компьютеризации "

Может кто-нибудь объяснить это мне просто?

4b9b3361

Ответ 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, когда хотите "продемонстрировать", например, перечислите всю информацию из двух таблиц.