SELECT * FROM employees e INNER JOIN departments d ON e.department_id = d.department_id
employees와 departments 테이블에서 department_id가 같은 데이터만 조회한다
INNER JOIN은 양쪽 테이블에 공통으로 존재하는 데이터만 조회한다.
Card
emy
← 탐색으로 돌아가기
SQLD에서 가장 많은 수험생이 막히는 구간이다. INNER JOIN, OUTER JOIN, SELF JOIN 등 테이블 연결 개념을 실제 데이터 흐름 기준으로 이해한다. 또한 서브쿼리의 실행 순서와 단일행/다중행 서브쿼리 차이를 학습하며, EXISTS, IN, ANY, ALL 같은 시험 핵심 포인트를 익힌다. 이 단계를 끝내면 복잡한 SQL 문제를 구조적으로 읽는 힘이 생긴다.
무료 체험 퀴즈
SELECT * FROM employees e INNER JOIN departments d ON e.department_id = d.department_id
employees와 departments 테이블에서 department_id가 같은 데이터만 조회한다
INNER JOIN은 양쪽 테이블에 공통으로 존재하는 데이터만 조회한다.
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id
employees와 departments를 department_id 기준으로 연결해서 조회한다
JOIN은 INNER JOIN과 동일하게 동작하며 INNER는 생략 가능하다.
SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id
직원 이름과 소속 부서명을 함께 조회한다
JOIN을 사용하면 여러 테이블의 컬럼을 동시에 조회할 수 있다.
SELECT * FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_id
employees 기준으로 모든 데이터를 조회하고 연결되는 departments 데이터가 있으면 함께 조회한다
LEFT OUTER JOIN은 왼쪽 테이블 데이터를 모두 유지한다.
SELECT * FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id
departments 기준으로 모든 데이터를 조회하고 연결되는 employees 데이터가 있으면 함께 조회한다
RIGHT OUTER JOIN은 오른쪽 테이블 데이터를 모두 유지한다.
아래 문항들은 이 학습지에 수록된 카드입니다. 로그인하면 이 학습지를 내 계정으로 복사해 카드를 한 장씩 넘기며 반복 학습할 수 있고, 숙달한 카드는 완료 표시하여 다음 세션에서 제외할 수 있습니다.
SELECT * FROM employees e INNER JOIN departments d ON e.department_id = d.department_id
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id
SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id
SELECT * FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_id
SELECT * FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id
SELECT * FROM employees e FULL OUTER JOIN departments d ON e.department_id = d.department_id
SELECT * FROM employees e, departments d WHERE e.department_id = d.department_id
SELECT * FROM employees e CROSS JOIN departments d
SELECT * FROM employees e NATURAL JOIN departments d
SELECT * FROM employees e JOIN departments d USING(department_id)
SELECT e.name, d.department_name FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id
SELECT e.name, d.department_name FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id
SELECT * FROM orders o JOIN customers c ON o.customer_id = c.customer_id
SELECT * FROM order_items oi JOIN products p ON oi.product_id = p.product_id
SELECT * FROM employees e JOIN jobs j ON e.job_id = j.job_id
SELECT * FROM employees e SELF JOIN employees m ON e.manager_id = m.employee_id
SELECT e.name, m.name FROM employees e JOIN employees m ON e.manager_id = m.employee_id
SELECT * FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id WHERE d.department_id IS NULL
SELECT * FROM users u JOIN orders o ON u.user_id = o.user_id
SELECT * FROM users u JOIN orders o ON u.user_id = o.user_id WHERE o.price > 10000
SELECT * FROM users u JOIN orders o ON u.user_id = o.user_id AND o.status = 'DONE'
SELECT * FROM users u LEFT JOIN orders o ON u.user_id = o.user_id WHERE o.order_id IS NULL
SELECT COUNT(*) FROM employees e JOIN departments d ON e.department_id = d.department_id
SELECT d.department_name, COUNT(*) FROM employees e JOIN departments d ON e.department_id = d.department_id GROUP BY d.department_name
SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id ORDER BY e.name
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees)
SELECT * FROM employees WHERE salary = (SELECT MAX(salary) FROM employees)
SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 100)
SELECT * FROM users WHERE user_id IN (SELECT user_id FROM orders)
SELECT * FROM users WHERE user_id NOT IN (SELECT user_id FROM orders)
SELECT * FROM employees WHERE salary > ANY (SELECT salary FROM employees WHERE department_id = 10)
SELECT * FROM employees WHERE salary > ALL (SELECT salary FROM employees WHERE department_id = 10)
SELECT * FROM departments d WHERE EXISTS (SELECT 1 FROM employees e WHERE e.department_id = d.department_id)
SELECT * FROM departments d WHERE NOT EXISTS (SELECT 1 FROM employees e WHERE e.department_id = d.department_id)
SELECT * FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'SALES')
SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products)
SELECT name, (SELECT department_name FROM departments d WHERE e.department_id = d.department_id) FROM employees e
SELECT * FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id)
SELECT * FROM employees e WHERE EXISTS (SELECT 1 FROM employees m WHERE e.manager_id = m.employee_id)
SELECT * FROM orders o WHERE EXISTS (SELECT 1 FROM users u WHERE o.user_id = u.user_id)
SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE u.user_id = o.user_id AND o.price > 10000)
SELECT * FROM employees WHERE department_id IN (10,20,30)
SELECT * FROM employees WHERE department_id NOT IN (10,20,30)
SELECT * FROM employees WHERE salary > SOME (SELECT salary FROM employees WHERE department_id = 10)
SELECT * FROM employees WHERE salary < ALL (SELECT salary FROM employees WHERE department_id = 20)
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > (SELECT AVG(salary) FROM employees)
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.location_id = 100
SELECT * FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id WHERE e.salary > 3000
SELECT * FROM users u JOIN orders o ON u.user_id = o.user_id JOIN payments p ON o.order_id = p.order_id
SELECT * FROM products p JOIN categories c ON p.category_id = c.category_id
SELECT * FROM sales s JOIN customers c ON s.customer_id = c.customer_id WHERE s.sale_date > TO_DATE('20250101','YYYYMMDD')
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
SELECT * FROM employees e WHERE e.salary = (SELECT MAX(salary) FROM employees WHERE department_id = e.department_id)
SELECT * FROM employees e WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id)
SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE u.user_id = o.user_id)
SELECT * FROM users u WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE u.user_id = o.user_id)
SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE department_name LIKE 'M%')
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id AND d.location_id = 100
SELECT * FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id AND d.location_id = 100
SELECT * FROM employees e WHERE department_id = ANY (SELECT department_id FROM departments WHERE location_id = 100)
SELECT * FROM employees WHERE salary > (SELECT MIN(salary) FROM employees WHERE department_id = 30)
SELECT * FROM orders o JOIN customers c ON o.customer_id = c.customer_id WHERE c.city = 'SEOUL'
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
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE e.salary > 5000 AND d.department_name = 'SALES'
SELECT * FROM employees e WHERE EXISTS (SELECT 1 FROM departments d WHERE e.department_id = d.department_id AND d.location_id = 100)
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')
SELECT department_id, COUNT(*) FROM employees GROUP BY department_id HAVING COUNT(*) > 5
SELECT * FROM employees e JOIN jobs j ON e.job_id = j.job_id WHERE j.job_title LIKE '%MANAGER%'
SELECT * FROM employees e WHERE EXISTS (SELECT 1 FROM employees m WHERE e.manager_id = m.employee_id AND m.salary > 5000)
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.department_name IN ('SALES','HR')
SELECT * FROM employees e WHERE department_id NOT IN (SELECT department_id FROM departments WHERE location_id = 200)