複数の表からのデータの表示23 / 50 問

以下のSQL文で、何行のデータが返されますか。

SELECT department_id, department_name FROM departments;

DEPARTMENT_ID  DEPARTMENT_NAME
-------------- ----------------
10             総務
20             営業
30             開発
40             経理

SELECT employee_id, department_id FROM employees;

EMPLOYEE_ID  DEPARTMENT_ID
------------ --------------
101          10
102          10
103          10
104          20
105

SELECT d.department_name, e.employee_id
FROM departments d LEFT OUTER JOIN employees e
  ON d.department_id = e.department_id;
A4行
B5行
C6行✓
D7行
正解:C解説

LEFT OUTER JOINは、結合条件に一致する行に加えて、左側の表(departments)で一致しなかった行も返します。一致しなかった行の右側の列はNULLになります。

  • 総務(10):101、102、103の3行
  • 営業(20):104の1行
  • 開発(30)、経理(40):従業員がいないため、employee_idがNULLの行として各1行

合計6行が返されます。部署が未設定(NULL)の105は、右側の表にしか存在しないため返されません。

SELECT d.department_name, e.employee_id
FROM departments d LEFT OUTER JOIN employees e
  ON d.department_id = e.department_id;

DEPARTMENT_NAME  EMPLOYEE_ID
---------------- ------------
総務             101
総務             102
総務             103
営業             104
開発
経理

外部結合の種類と今回の行数

結合返される行行数
INNER JOIN一致する行のみ4行
LEFT OUTER JOIN一致する行+departmentsの不一致行(開発、経理)6行
RIGHT OUTER JOIN一致する行+employeesの不一致行(105)5行
FULL OUTER JOIN一致する行+両方の不一致行7行

Oracle独自の構文では、WHERE d.department_id = e.department_id(+)のように、NULLで補われる側に(+)を付けて記述します。

前後の問題