以下の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で補われる側に(+)を付けて記述します。