[SQLD합격] JOIN과 서브쿼리 완전 이해
SQLD에서 가장 많은 수험생이 막히는 구간이다. INNER JOIN, OUTER JOIN, SELF JOIN 등 테이블 연결 개념을 실제 데이터 흐름 기준으로 이해한다. 또한 서브쿼리의 실행 순서와 단일행/다중행 서브쿼리 차이를 학습하며, EXISTS, IN, ANY, ALL 같은 시험 핵심 포인트를 익힌다. 이 단계를 끝내면 복잡한 SQL 문제를 구조적으로 읽는 힘이 생긴다.
수록 문항
총 71개아래 문항들은 이 학습지에 수록된 카드입니다. 각 카드는 문제(Q)와 답(A)으로 구성되어 있으며, 일부 카드에는 추가 해설이 포함되어 있습니다. 로그인하면 이 학습지를 내 계정으로 복사해 카드를 한 장씩 넘기며 반복 학습할 수 있고, 숙달한 카드는 완료 표시하여 다음 세션에서 제외할 수 있습니다.
-
#1Q.
SELECT * FROM employees e INNER JOIN departments d ON e.department_id = d.department_id
A.employees와 departments 테이블에서 department_id가 같은 데이터만 조회한다
INNER JOIN은 양쪽 테이블에 공통으로 존재하는 데이터만 조회한다. -
#2Q.
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id
A.employees와 departments를 department_id 기준으로 연결해서 조회한다
JOIN은 INNER JOIN과 동일하게 동작하며 INNER는 생략 가능하다. -
#3Q.
SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id
A.직원 이름과 소속 부서명을 함께 조회한다
JOIN을 사용하면 여러 테이블의 컬럼을 동시에 조회할 수 있다. -
#4Q.
SELECT * FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_id
A.employees 기준으로 모든 데이터를 조회하고 연결되는 departments 데이터가 있으면 함께 조회한다
LEFT OUTER JOIN은 왼쪽 테이블 데이터를 모두 유지한다. -
#5Q.
SELECT * FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id
A.departments 기준으로 모든 데이터를 조회하고 연결되는 employees 데이터가 있으면 함께 조회한다
RIGHT OUTER JOIN은 오른쪽 테이블 데이터를 모두 유지한다. -
#6Q.
SELECT * FROM employees e FULL OUTER JOIN departments d ON e.department_id = d.department_id
답은 로그인 후 확인 -
#7Q.
SELECT * FROM employees e, departments d WHERE e.department_id = d.department_id
답은 로그인 후 확인 -
#8Q.
SELECT * FROM employees e CROSS JOIN departments d
답은 로그인 후 확인 -
#9Q.
SELECT * FROM employees e NATURAL JOIN departments d
답은 로그인 후 확인 -
#10Q.
SELECT * FROM employees e JOIN departments d USING(department_id)
답은 로그인 후 확인 -
#11Q.
SELECT e.name, d.department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id
답은 로그인 후 확인 -
#12Q.
SELECT e.name, d.department_name FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id
답은 로그인 후 확인 -
#13Q.
SELECT * FROM orders o JOIN customers c ON o.customer_id = c.customer_id
답은 로그인 후 확인 -
#14Q.
SELECT * FROM order_items oi JOIN products p ON oi.product_id = p.product_id
답은 로그인 후 확인 -
#15Q.
SELECT * FROM employees e JOIN jobs j ON e.job_id = j.job_id
답은 로그인 후 확인 -
#16Q.
SELECT * FROM employees e SELF JOIN employees m ON e.manager_id = m.employee_id
답은 로그인 후 확인 -
#17Q.
SELECT e.name, m.name FROM employees e JOIN employees m ON e.manager_id = m.employee_id
답은 로그인 후 확인 -
#18Q.
SELECT * FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id WHERE d.department_id IS NULL
답은 로그인 후 확인 -
#19Q.
SELECT * FROM users u JOIN orders o ON u.user_id = o.user_id
답은 로그인 후 확인 -
#20Q.
SELECT * FROM users u JOIN orders o ON u.user_id = o.user_id WHERE o.price > 10000
답은 로그인 후 확인 -
#21Q.
SELECT * FROM users u JOIN orders o ON u.user_id = o.user_id AND o.status = 'DONE'
답은 로그인 후 확인 -
#22Q.
SELECT * FROM users u LEFT JOIN orders o ON u.user_id = o.user_id WHERE o.order_id IS NULL
답은 로그인 후 확인 -
#23Q.
SELECT COUNT(*) FROM employees e JOIN departments d ON e.department_id = d.department_id
답은 로그인 후 확인 -
#24Q.
SELECT d.department_name, COUNT(*) FROM employees e JOIN departments d ON e.department_id = d.department_id GROUP BY d.department_name
답은 로그인 후 확인 -
#25Q.
SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id ORDER BY e.name
답은 로그인 후 확인 -
#26Q.
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees)
답은 로그인 후 확인 -
#27Q.
SELECT * FROM employees WHERE salary = (SELECT MAX(salary) FROM employees)
답은 로그인 후 확인 -
#28Q.
SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 100)
답은 로그인 후 확인 -
#29Q.
SELECT * FROM users WHERE user_id IN (SELECT user_id FROM orders)
답은 로그인 후 확인 -
#30Q.
SELECT * FROM users WHERE user_id NOT IN (SELECT user_id FROM orders)
답은 로그인 후 확인 -
#31Q.
SELECT * FROM employees WHERE salary > ANY (SELECT salary FROM employees WHERE department_id = 10)
답은 로그인 후 확인 -
#32Q.
SELECT * FROM employees WHERE salary > ALL (SELECT salary FROM employees WHERE department_id = 10)
답은 로그인 후 확인 -
#33Q.
SELECT * FROM departments d WHERE EXISTS (SELECT 1 FROM employees e WHERE e.department_id = d.department_id)
답은 로그인 후 확인 -
#34Q.
SELECT * FROM departments d WHERE NOT EXISTS (SELECT 1 FROM employees e WHERE e.department_id = d.department_id)
답은 로그인 후 확인 -
#35Q.
SELECT * FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'SALES')
답은 로그인 후 확인 -
#36Q.
SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products)
답은 로그인 후 확인 -
#37Q.
SELECT name, (SELECT department_name FROM departments d WHERE e.department_id = d.department_id) FROM employees e
답은 로그인 후 확인 -
#38Q.
SELECT * FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id)
답은 로그인 후 확인 -
#39Q.
SELECT * FROM employees e WHERE EXISTS (SELECT 1 FROM employees m WHERE e.manager_id = m.employee_id)
답은 로그인 후 확인 -
#40Q.
SELECT * FROM orders o WHERE EXISTS (SELECT 1 FROM users u WHERE o.user_id = u.user_id)
답은 로그인 후 확인 -
#41Q.
SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE u.user_id = o.user_id AND o.price > 10000)
답은 로그인 후 확인 -
#42Q.
SELECT * FROM employees WHERE department_id IN (10,20,30)
답은 로그인 후 확인 -
#43Q.
SELECT * FROM employees WHERE department_id NOT IN (10,20,30)
답은 로그인 후 확인 -
#44Q.
SELECT * FROM employees WHERE salary > SOME (SELECT salary FROM employees WHERE department_id = 10)
답은 로그인 후 확인 -
#45Q.
SELECT * FROM employees WHERE salary < ALL (SELECT salary FROM employees WHERE department_id = 20)
답은 로그인 후 확인 -
#46Q.
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > (SELECT AVG(salary) FROM employees)
답은 로그인 후 확인 -
#47Q.
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.location_id = 100
답은 로그인 후 확인 -
#48Q.
SELECT * FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id WHERE e.salary > 3000
답은 로그인 후 확인 -
#49Q.
SELECT * FROM users u JOIN orders o ON u.user_id = o.user_id JOIN payments p ON o.order_id = p.order_id
답은 로그인 후 확인 -
#50Q.
SELECT * FROM products p JOIN categories c ON p.category_id = c.category_id
답은 로그인 후 확인 -
#51Q.
SELECT * FROM sales s JOIN customers c ON s.customer_id = c.customer_id WHERE s.sale_date > TO_DATE('20250101','YYYYMMDD')
답은 로그인 후 확인 -
#52Q.
SELECT e.name, d.department_name, l.location_name FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN locations l ON d.location_id = l.location_id
답은 로그인 후 확인 -
#53Q.
SELECT * FROM employees e WHERE e.salary = (SELECT MAX(salary) FROM employees WHERE department_id = e.department_id)
답은 로그인 후 확인 -
#54Q.
SELECT * FROM employees e WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id)
답은 로그인 후 확인 -
#55Q.
SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE u.user_id = o.user_id)
답은 로그인 후 확인 -
#56Q.
SELECT * FROM users u WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE u.user_id = o.user_id)
답은 로그인 후 확인 -
#57Q.
SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE department_name LIKE 'M%')
답은 로그인 후 확인 -
#58Q.
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id AND d.location_id = 100
답은 로그인 후 확인 -
#59Q.
SELECT * FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id AND d.location_id = 100
답은 로그인 후 확인 -
#60Q.
SELECT * FROM employees e WHERE department_id = ANY (SELECT department_id FROM departments WHERE location_id = 100)
답은 로그인 후 확인 -
#61Q.
SELECT * FROM employees WHERE salary > (SELECT MIN(salary) FROM employees WHERE department_id = 30)
답은 로그인 후 확인 -
#62Q.
SELECT * FROM orders o JOIN customers c ON o.customer_id = c.customer_id WHERE c.city = 'SEOUL'
답은 로그인 후 확인 -
#63Q.
SELECT c.customer_name, SUM(o.price) FROM customers c JOIN orders o ON c.customer_id = o.customer_id GROUP BY c.customer_name
답은 로그인 후 확인 -
#64Q.
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE e.salary > 5000 AND d.department_name = 'SALES'
답은 로그인 후 확인 -
#65Q.
SELECT * FROM employees e WHERE EXISTS (SELECT 1 FROM departments d WHERE e.department_id = d.department_id AND d.location_id = 100)
답은 로그인 후 확인 -
#66Q.
SELECT * FROM users u JOIN orders o ON u.user_id = o.user_id WHERE o.order_date BETWEEN TO_DATE('20250101','YYYYMMDD') AND TO_DATE('20251231','YYYYMMDD')
답은 로그인 후 확인 -
#67Q.
SELECT department_id, COUNT(*) FROM employees GROUP BY department_id HAVING COUNT(*) > 5
답은 로그인 후 확인 -
#68Q.
SELECT * FROM employees e JOIN jobs j ON e.job_id = j.job_id WHERE j.job_title LIKE '%MANAGER%'
답은 로그인 후 확인 -
#69Q.
SELECT * FROM employees e WHERE EXISTS (SELECT 1 FROM employees m WHERE e.manager_id = m.employee_id AND m.salary > 5000)
답은 로그인 후 확인 -
#70Q.
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.department_name IN ('SALES','HR')
답은 로그인 후 확인 -
#71Q.
SELECT * FROM employees e WHERE department_id NOT IN (SELECT department_id FROM departments WHERE location_id = 200)
답은 로그인 후 확인
처음 5개의 답만 미리 보여드려요. 전체 71개 항목은 로그인 후 학습할 수 있습니다.
이 학습지를 효과적으로 활용하는 방법
- ① 처음에는 전체 문항을 한 번씩 훑어보며 익숙한 항목과 낯선 항목을 분류하세요.
- ② 학습 세션에서 "안 외운 문항만" 옵션으로 아직 숙달하지 못한 카드에 집중합니다.
- ③ 랜덤 순서 학습을 활용해 카드 순서에 의존한 암기를 방지하세요.
- ④ 키보드 단축키(1·2·A·D·Space)를 쓰면 한 손으로도 빠르게 복습할 수 있습니다.
- ⑤ 복사(Fork)한 학습지에는 자유롭게 나만의 해설이나 예문을 덧붙여 내 스타일로 다듬어 보세요.