PostgresSQL/PostgresSQL 수강일지

[수강일지 25] select 4 (join)

jamk-diary 2026. 6. 15. 16:28

 

 

ERD for DataBase 만들기 

 

ERD(Entity Relationship Diagram)란?

한 줄로 요약하면 "데이터베이스의 건물 설계도(또는 지도)

우리가 마인크래프트로 건물을 짓거나 레고를 조립할 때 설계도를 먼저 보잖아? 그것처럼 데이터베이스를 만들기 전에 "어떤 테이블들이 필요하고, 그 테이블들이 서로 어떻게 연결되어 있는지" 한눈에 볼 수 있게 그린 그림이란다.

 

ERD 글자 속에 숨은 뜻 (영어 울렁증 퇴치!)

  • E (Entity / 개체): 데이터베이스에 저장하고 싶은 '진짜 세상의 주인공들'
    • 예시:  employees(사원), departments(부서), jobs(업무) 같은 네모 상자들이 각각의 Entity
  • R (Relationship / 관계): 이 주인공들이 '서로 어떻게 얽혀있는지' 나타내는 .
    • 예시: 사원은 반드시 특정 부서에 속해 있겠지? 그래서 employees 상자와 departments 상자가 으로 이어져 있는 거야.
  • D (Diagram / 도표): 이걸 보기 좋게 그린 그림!

 

 

[MYSQL] 📚 테이블 조인(JOIN) - 그림으로 알기 쉽게 정리

SQL JOIN JOIN은 데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현해 주는, Relation Database 에서 가장 많이 쓰이는 녀석이다. (INNER) JOIN 조인하는

inpa.tistory.com

 

ERD를 왜 배울까? (조인의 핵심 키!)

-JOIN을 잘하려면 ERD를 볼 줄 알아야 한다

 

예를 들어, "사원 이름이랑 그 사원이 일하는 부서 이름을 같이 보고 싶다!" 할 때

  1. ERD 화면에서 employees 테이블과 departments 테이블을 잇고 있는 선을 따라가 본다.
  2. 선 끝을 보니 두 테이블이 똑같이 department_id라는 연결고리(외래키)를 가지고 있네?
  3. "오케이! 이 두 테이블은 department_id로 JOIN하면 되겠구나!" 하고 힌트를 얻을 수 있다 

postgres -> 마우스 우클릭 -> erd

employees 랑 department는 manager_id 로도 연결 되어 있을까?

정답 !

연결 목적 ->  부서를 대표하고 책임지는 부서장(매니저) 가 누구인지 나타내는 연결고리 

ex) "각 부서의 '부서 이름'과 그 부서를 이끄는 '부서장의 이름'을  같이 보고 싶을 때 manager_id로 두 테이블을 JOIN 한다 

JOIN

 

join 

  • 두 개 이상의 테이블을 연결 (join) 해서 데이터를 취득하는 방법이다
  •  현재 테이블에서 취득할 수 없는 컬럼의 데이터를 상대 테이블에서 취득하기 위한 처리이다 
<핵심>
테이블 사이에 연결선이 2개나 있을 때는, 내가 '소속 사원'을 뽑고 싶은 건지, '부서장'을 뽑고 싶은 건지에 따라 ON 절 뒤에 쓰는 컬럼을 골라야 한다!

 

inner join (교집합) 

 

ANSI 표준 INNER JOIN과 결과가 완전히 똑같은 옛날 스타일 교집합 쿼리 알아보기 

  • ansi sql
  • posrgre sql 
  • ---- ansi sql, -- postgreSQl의 결과는 같다 
 ANSI 표준 문법
SELECT e.employee_id, e.first_name,
	e.department_id, d.department_id,
	d.department_name
from employees e INNER join departments d  
     on e.department_id = d.department_id;

 

테이블 이름 뒤에 e나 d를 붙이고, on 을 붙이는 이유 

  • employees에서 사원 한 명을 뽑는다. (예: 100번 사원 King, 부서번호 90)
  • ON 조건에 맞춰서 departments 테이블로 쏜살같이 달려간다.
  • 부서번호가 90번인 부서 이름(Executive)을 찾아서 King 사원 옆에 가로로 착! 이어 붙인다.
  • SELECT에 적힌 컬럼들만 화면에 이쁘게 출력한다!

 

from employees e INNER join departments d 👉 "별명을 지어줄게!"

 

  • 이렇게 별명을 주면 뒤에서 코드를 쓸 때 employees.department_id라고 길게 안 쓰고 e.department_id로 짧게 쓸 수 있어서 엄청 편해진다
  • 별명은 원하는 단어로 자유롭게 지을 수 있다 
  •  자바에서  '변수명'을 주는 것과 똑같다고 생각하시면 편하다 !

on e.department_id = d.department_id 👉 "이 열쇠로 두 테이블을 합쳐!

 

  • ON은 두 테이블을 합칠 때 어떤 컬럼을 기준으로 삼을지 결정하는 연결고리(기준선)

SELECT e.employee_id, e.first_name, ... 👉 "내 소속을 확실히 밝힌다!"

 

  • 데이터를 합치고 나면  department_id라는 컬럼은 양쪽 테이블에 둘 다 존재한다
  • 만약 그냥 SELECT department_id라고만 쓰면 컴퓨터는 어떤 테이블의 어떤 부서 번호인가요?  하고 에러(Ambiguous error)를 내뿜어.
  • e.department_id(사원 테이블 꺼), d.department_id(부서 테이블 꺼)라고 소속을 명확하게 밝혀서 적어줘야 한다 !

 

 

 

postgreSQl (교집합 전통 방식으로 적기)
SELECT e.employee_id, e.first_name,
	e.department_id, d.department_id,
	d.department_name
from employees e, departments d 
where e.department_id = d.department_id;
  • - JOIN과 ON이라는 표준 단어를 쓰지 않았을 뿐, 작동하는 원리는 INNER JOIN과 100% 똑같다
  • --한쪽 테이블에만 있고 양쪽테이블에 둘 다 있는 컬럼이 아니라면 생략을 해도 된다
  • 조인이 된 객체 수가 궁금하다면 ? total rows 를 살펴 보기 

 

  • from employees e, departments d
    • 컴퓨터한테 "야, 일단 사원 테이블이랑 부서 테이블 둘 다 가져와 봐" 하고 명령
  • where e.department_id = d.department_id;
    • 바로 뒤에 WHERE 절로 브레이크를 딱 걸어주지!
    • "아 참! 아무나 다 엮지 말고, 사원 쪽 부서 번호랑 부서 쪽 부서 번호가 '똑같은 정상 커플(교집합)'만 남기고 나머지는 다 버려!
Cross join 

 조건 없이 무차별로 모든 경우의 수를 다 곱한다

 

모든 경우의 수네 말 그대로! 서브웨이에서 내 맘대로 샌드위치 조합해 먹을 수 있는데 이탈리안 bmt 샌드위치면 소스를 조합할 수 있는 모든 소스 조합을 다 만들어서 표에 출력 해준다!

 

1. bmt 스위트 어니언 + 후추 조합

2. bmt 스위트 어니언 + 올리브 오일 조합 이런 식으로

메뉴 이름 (Menu) 소스 이름 (Sauce)
1. 이탈리안 BMT 스위트 어니언
2. 이탈리안 BMT 랜치
3. 이탈리안 BMT 후추
4. 이탈리안 BMT 올리브 오일
 ANSI 표준 문법
SELECT e.employee_id, e.first_name,
	e.department_id, d.department_id,
	d.department_name
from employees e cross join departments d;

 

CROSS JOIN(교차 조인)은 실무에서 매일 쓰이는 녀석은 아니지만, 특정 상황에서는 대체 불가능한 아주 강력한 치트키가 돼!
주로 "기준이 되는 모든 베이스 조합(마스터 데이터)을 세팅할 때"와 "테스트용 데이터가 대량으로 필요할 때" 사용

<CROSS JOIN의 실제 용도>

  • 쇼핑몰에서 상품의 [사이즈 × 색상] 같은 모든 옵션 조합을 뽑아낼 때
  • 통계 쿼리에서 데이터가 비어있는 달(Month)이나 항목을 0으로 채우기 위한 기본 뼈대 표를 만들 때
  • 시스템 성능 테스트를 위해 순식간에 수만 ~ 수백만 건의 대용량 가짜 데이터를 뻥튀기할 때

    즉, "모든 가능성의 판을 깔아놓고 시작해야 할 때"

셀렉트 : 출력하라 ! e 테이블에서 사원 번호를, e 테이블에서 c첫번째 이름을를, e 테이블에서 부서 번호를 , d 테이블에서 부서번호, d 테이블에서 부서 이름을

프롬: 가져와라  모든 경우의 수로 엮은 애들을! 직원 테이블 (이하 e로 부르겠음!)  부서 테이블(이하 d로 부를 거임) 로부터!

 

PostgreSQL 방식

 

SELECT e.employee_id, e.first_name,
	e.department_id, d.department_id,
	d.department_name
from employees e, departments d;

 

콤마(,)로 연결하고 WHERE 조건절을 쓰지 않으면 자동으로 CROSS JOIN이 된다 

 

**🤔 쉼표(,)가 더 짧고 빠른데 왜 ANSI 표준 문법을 쓸까?**

>1. **안전성:** `ON` 조건을 실수로 빼먹었을 때 컴퓨터가 에러를 잡아주어 대참사(서버 다운)를 막아줍니다.

> 2. **가독성:** 테이블이 많아져도 어떤 테이블끼리 어떤 조건으로 묶이는지 위에서부터 순서대로 명확하게 보입니다.

> 3. **호환성:** 전 세계 데이터베이스 공통 표준이라 이직을 하거나 시스템을 바꿔도 코드를 그대로 쓸 수 있습니다!

 

outer join
ANSI 표준 문법 ( left) 
SELECT  e.employee_id, e.first_name,
	e.department_id, d.department_id,
	d.department_name
FROM employees e LEFT OUTER JOIN departments d
	ON e.department_id = d.department_id;
FROM employees e -- 직원 테이블(이하 e)의 데이터는 짝꿍이 있든 없든 무조건 다 가져오고,
LEFT OUTER JOIN departments d -- 부서 테이블(이하 d)을 오른쪽에 가로로 이어붙여라!
ON e.department_id = d.department_id; -- [조립 공식] e의 부서번호와 d의 부서번호가 '똑같은 정상 커플'들끼리 매칭해서 한 줄로 붙여라!

ON의 진짜 역할: 화면 출력이 아니라, 두 테이블에서 "같은 애들을 뽑아서" 가로로 길게 이어붙이는 조립 본드 역할!

 

LEFT OUTER JOIN이라는 글자를 기준으로 왼쪽에 적었냐, 오른쪽에 적었냐가 기준

 

  • 왼쪽(LEFT) 테이블: LEFT OUTER JOIN 바로 앞에 적힌 employees e
  • 오른쪽(RIGHT) 테이블: LEFT OUTER JOIN 바로 뒤에 적힌 departments d

코드에는 NULL이라는 글자가 없는데 왜 NULL이 나올까? A. `ON` 조건으로 양쪽 테이블의 부서번호를 매칭할 때, 부서가 없는 사원은 짝꿍 찾기에 실패하므로 컴퓨터가 결과창에 자동으로 "비어있음(NULL)"을 채워넣기 때문

 

-- ⚠️ 착각하기 쉬운 포인트!

-- 이것은 '교집합'이 아니다!

--교집합을 포함하여,  부서가 없는 왼쪽의 '신입 사원'들까지 누락 없이 전부 다 출력하는 쿼리다.

-- 대신 부서가 없는 사원의 d.department_name 자리는 NULL로 출력됩니다!

 

ANSI 표준 문법 ( RIGHT) 
SELECT  e.employee_id, e.first_name,
	e.department_id, d.department_id,
	d.department_name
FROM employees e right  outer join departments d
	on e.department_id = d.department_id;
-- 2단계: 최종적으로 화면에 '출력하라!'
SELECT  
    e.employee_id,      -- e 테이블(직원)에서 사원 번호를 출력하고, (짝꿍 없으면 NULL)
    e.first_name,       -- e 테이블(직원)에서 첫 번째 이름을 출력하고, (짝꿍 없으면 NULL)
    e.department_id,    -- e 테이블(직원)에서 부서 번호를 출력하고, (짝꿍 없으면 NULL)
    d.department_id,    -- d 테이블(부서)에서 부서 번호를 출력하고, (여긴 무조건 다 나옴)
    d.department_name   -- d 테이블(부서)에서 부서 이름을 출력하라! (여긴 무조건 다 나옴)

-- 1단계-①: 기준판 짜기! 이번엔 RIGHT 글자 뒤(오른쪽)에 있는 테이블이 '주인공'이다!
FROM employees e        

-- 1단계-②: 주인공인 부서 테이블을 오른쪽에 두고 다 가져와라!
RIGHT OUTER JOIN departments d -- 부서 테이블(d)은 데이터가 있든 없든 무조건 싹 다 살린다!

-- 1단계-③: '같은 애들 뽑기!' 조립 기준선 세우기
    ON e.department_id = d.department_id; 

    -- [조립 공식] e의 부서번호와 d의 부서번호가 '똑같은 정상 커플'들끼리 매칭해서 한 줄로 붙여라!
    --  만약 신설 부서나 인턴 부서라서 소속된 사원(e)이 단 한 명도 없더라도,
   이번엔 주인공이 오른쪽(d) 테이블이니까 부서 정보를 버리지 말고 무조건 다 출력해라!
대신 짝꿍이 없으니 왼쪽 사원 정보(e) 칸들은 자동으로 'NULL(빈칸)'로 채워진다!

 

right/reft other  join  + where...is null

 

right other  join  + where...is null

 

1. 유령 부서를 찾을 때 

SELECT  e.employee_id, e.first_name,
	e.department_id, d.department_id,
	d.department_name
FROM employees e right  outer join departments d
	on e.department_id = d.department_id
where e.department_id is null;

 

WHERE ... IS NULL이 한 일 ➡️ 방금 뽑힌 애들 중 교집합을 지워버린다!

SELECT  
    e.employee_id, e.first_name,
    e.department_id, d.department_id,
    d.department_name
-- ① [네 해석] "교집합으로 왼쪽 오른쪽을 엮은 후 오른쪽에 해당하는 애들 다 가져와!"

FROM employees e RIGHT OUTER JOIN departments d
-- ② [네 해석] "그중에서 e테이블과 d테이블에서 부서 번호가 같은 애들만 짝을 맞춰라!"

ON e.department_id = d.department_id
-- ③ [네 해석] "해놓고 WHERE에서 번호가 채워진 교집합을 지워버린 거야!"

WHERE e.department_id IS NULL; 
-- 💡 결론: 1, 2단계에서 다 불러온 뒤, 3단계(WHERE)에서 사원이 있는 정상 부서(교집합)를 
--    지우개로 싹 지웠기 때문에, 최종 결과에는 사원이 없는 '유령 부서'만 남아서 출력됩니다!

"우리 회사 부서 중에서, 사원이 단 한 명도 배정되지 않은 '텅 빈 유령 부서'가 어디 어디 있나 찾아봐라!"

  • RIGHT JOIN을 한 이유: 사원이 없는 부서까지 일단 화면에 다 불러오려고 쓴 거야.
  • WHERE ... IS NULL을 붙인 이유: 다 불러온 부서들 중에서, 사원이 있는 정상 부서들은 화면에서 지우고 진짜 유령 부서만 남겨서 보려고 쓴 거야.

결국 네 말대로 유령 부서인 애들만 쏙쏙 골라서 뽑고 싶을 때 이 두 코드를 같이 쓰는 게 정확해!

 

2. 사원 번호가 없는 사원을 찾을 떄 

SELECT e.employee_id, e.first_name,
       e.department_id, d.department_id,
       d.department_name
FROM employees e RIGHT OUTER JOIN departments d
     ON e.department_id = d.department_id 
WHERE e.employee_id IS NULL;
SELECT e.employee_id, e.first_name,
       e.department_id, d.department_id,
       d.department_name
FROM employees e RIGHT OUTER JOIN departments d
     ON e.department_id = d.department_id 
-- 💡 [해석] 사원 번호(employee_id) 자리가 비어있는 줄만 남겨라!
WHERE e.employee_id IS NULL; 

-- 🗣️ 한 줄 요약:
-- RIGHT JOIN으로 부서들을 다 불러왔을 때, 사원이 없는 부서는 '사원 번호' 자리도 당연히 빈칸(NULL)이 됩니다.
-- 따라서 이 조건문도 결국 "사원이 단 한 명도 없는 유령 부서"만 똑같이 골라내서 출력해 주는 치트키입니다!

 

 

언제 left 를 하고 right 를 하는지가 헷갈려 -

주인공은 무조건 앞(위)

"무조건 내가 데이터 다 살리고 싶은 테이블을 FROM 바로 뒤(왼쪽)에 적고 LEFT JOIN을 건다!"

 

FULL OUTER JOIN
FULL OUTER JOIN


--"우리가 가진 데이터 전부 다 싹 긁어모아! 누락은 절대 없어!"

모두 출력"이라는 말 때문에 아무 조건 없이 모든 걸 다 뿜어낼 것 같지만, 실제로는 "기준을 가지고 다 합친 뒤에, 내가 보고 싶은 것만 골라내기 위해서" 조건문이 꼭 필요

<사용>

실무에서 "우리 회사 데이터 중에 뭔가 삐걱거리거나 누락된 게 있나 양쪽 다 한눈에 점검해 봐!"라는 미션을 받았을 때

SELECT  e.employee_id, e.first_name,
e.department_id, d.department_id,
d.department_name
FROM employees e full  outer join departments d
on e.department_id = d.department_id;
-- 5. FULL OUTER JOIN (완전 외부 조인)
-- 💡 네 해석: "우리가 가진 데이터 전부 다 싹 긁어모아! 누락은 절대 없어!" (합집합)

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

-- 🗣️ 한 줄 요약:
-- LEFT JOIN과 RIGHT JOIN을 반반 섞은 짬짜면 같은 쿼리입니다.
-- 매칭되는 정상 데이터(교집합)는 물론이고, '부서 없는 사원'과 '사원 없는 유령 부서'까지 
-- 양쪽 테이블의 모든 데이터를 단 하나의 줄도 버리지 않고 싹 다 화면에 출력해 줍니다!
FULL OUTER JOIN + -WHERE ... IS NULL 조건


--"양쪽에 다 들어있는 완벽한 커플(정상 데이터)들은 다 저리 가! 짝 없는 애들만 남겨!"
대칭차집합

: 양쪽 테이블에서 서로 짝꿍을 찾지 못하고 낙오된 유령 데이터들만 싹 모아라!" 하는 명령

 

SELECT  e.employee_id, e.first_name,
e.department_id, d.department_id,
d.department_name
FROM employees e full  outer join departments d
on e.department_id = d.department_id
where e.department_id is null 
 or d.department_id is null;

FULL OUTER JOIN (일단 다 불러와!)

  • 교집합: 정상 커플 (사원과 부서 번호가 똑같이 일치하는 애들)
  • 왼쪽 유령: 부서가 없는 신입 사원 (우측 부서 번호가 NULL)
  • 오른쪽 유령: 사원이 없는 텅 빈 부서 (좌측 사원 번호가 NULL)

WHERE e.department_id IS NULL OR d.department_id IS NULL (교집합을 지워버려!)

WHERE 조건 지우개가 등장

사원 쪽 부서 번호가 비어있거나(IS NULL), 부서 쪽 부서 번호가 비어있는(IS NULL) 애들**'만'** 남겨라

정상 커플(교집합)들은 조건에 안 맞으니까 지우개로 싹 지워버려

 

 

--self join : 동일한 테이블 join 

-- 6. SELF JOIN (자체 조인 / 1인 2역 조인)

-- 셀프 조인은 하나의 테이블에서 여러개를 빼내야 할 때 사용!

 

-- 🗣️ 한 줄 요약:
-- 상사도 결국 회사 직원이라 같은 테이블에 살고 있습니다. 
-- 그래서 테이블을 복사하듯 e(사원)와 m(상사)으로 별명을 쪼갠 뒤, 
-- 사원 정보의 '상사id' 열쇠로 상사 정보의 '사원번호' 자물쇠를 열어서 가로로 이어붙이는 마법입니다!

--SELF JOIN (자체 조인) 방법 1/ ANSI 표준 문법

 

select emp.employee_id as "사원번호",emp.first_name as "사원이름",
emp.manager_id as "상사 id" , mgr.employee_id as "상사의 사원번호",
mgr.first_name as "상사 이름"
from employees emp join employees mgr --emp사원 mgr 상사 
on emp.manager_id = mgr.employee_id;

쿼리의 목적 : 사원들의 정보 옆에, 그 사원의 '직속 상사 이름'이 누구인지 가로로 착! 붙여서 출력하고 싶다!


-- [방법 ①] ANSI 표준 문법 (JOIN ~ ON)
SELECT 
    emp.employee_id as "사원번호",
    emp.first_name as "사원이름",
    emp.manager_id as "상사 id", 
    mgr.employee_id as "상사의 사원번호",
    mgr.first_name as "상사 이름"
FROM employees emp JOIN employees mgr -- 👈 똑같은 테이블에 '사원(emp)'과 '상사(mgr)'라는 배역을 줍니다!
  ON emp.manager_id = mgr.employee_id; -- 👈 [조립 공식] "사원의 상사id"와 "상사의 사원번호"가 같은 사람끼리 짝꿍 매칭!

--posetgreSQl 방법 2 / PostgreSQL 과거 문법 (콤마, ~ WHERE) -> 결과는 100% 똑같음!

 

SELECT emp.employee_id as "사원번호",emp.first_name as "사원이름",
emp.manager_id as "상사 id" , mgr.employee_id as "상사의 사원번호",
mgr.first_name as "상사 이름"
from employees emp, employees mgr
where emp.manager_id = mgr.employee_id;
-- [방법 ②] PostgreSQL 과거 문법 (콤마, ~ WHERE) -> 결과는 100% 똑같음!
SELECT 
    emp.employee_id as "사원번호",
    emp.first_name as "사원이름",
    emp.manager_id as "상사 id", 
    mgr.employee_id as "상사의 사원번호",
    mgr.first_name as "상사 이름"
FROM employees emp, employees mgr -- 👈 일단 무차별로 두 배역을 다 불러온 뒤,
WHERE emp.manager_id = mgr.employee_id; -- 👈 WHERE 절로 "상사id와 사원번호가 똑같은 정상 커플"만 남기고 다 버려!


강사님 과제 
-- 문제1) 사원들의 이름, 부서번호, 부서명을 출력하라


-- 문제2) 30번 부서의 사원들의 이름, 직업, 부서명을 출력하라


-- 문제3) 커미션을 받는 사원의 이름, 직업, 부서번호, 부서명을 출력하라


-- 문제4) 지역번호 2500 에서 근무하는 사원의 이름, 직업, 부서번호, 부서명을 출력하라


-- 문제5) 이름에 A가 들어가는 사원들의 이름과 부서이름을 출력하라


-- 문제6) 사원이름과 그 사원의 관리자 이름을 출력하라


-- 문제7) 사원이름과 부서명과 월급을 출력하는데 월급이 6000 이상인 사원을 출력하라


-- 문제8) first_name 이 TJ 이란 사원보다 늦게 입사한 사원의 이름과 입사일을 출력하라
     
 
-- 문제9) 급여가 3000에서 5000사이인 사원의 이름과 소속부서명 출력하라


-- 문제10) ACCOUNTING 부서 소속 사원의 이름과 입사일 출력하라


-- 문제11) 급여가 3000이하인 사원의 이름과 급여, 근무지를 출력하라


-- 문제12) 관리자보다 먼저 입사한 모든 사원의 이름 및 입사일을 관리자의 이름 및 입사일과 
-- 함께 표시하고 레이블명을 각각 emp name, emp hired, mgr name, mgr hired 로 지정하라.


-- 문제13) 지역별로 근무하는 사원의 수가 5명 이하인 경우, 사원이 적은 도시순으로 정렬하고 city와 사원수를 출력하시오.


-- 문제14) 지정한 부서번호, 사원이름 및 지정한 사원과 동일한 부서에서 근무하는 모든 사원을 표시하도록 하고 부서번호는 deptno, 사원이름은 사원, 동일한 부서에서 근무하는 사원은 동료로 표시하시오.
-- (부서번호, 사원이름, 동료 순으로 오름차순 정렬)

⭕❌

--문제1) 사원들의 이름, 부서번호, 부서명을 출력하라
SELECT e.employee_id, d.department_id, d.department_name
from employees e, departments d

생각포인트 
키 열쇠를 안 적음, on 사용 안 함 

SELECT e.first_name, d.department_id, d.department_name
from employees e INNER join departments d  
     on e.department_id = d.department_id;



-- 문제2) 30번 부서의 사원들의 이름, 직업, 부서명을 출력하라
SELECT e.last_name, d.department_id, d.department_name
from employees e INNER join departments d  
     on e.department_id = d.department_id
where d.department_id = 30; 

-- 문제3) 커미션을 받는 사원의 이름, 직업, 부서번호, 부서명을 출력하라

SELECT  e.last_name, d.department_id, d.department_name --,e.commission_pct
from employees e INNER join departments d  
     on e.department_id = d.department_id
WHERE e.commission_pct is not null;

-- 문제4) 지역번호 2500 에서 근무하는 사원의 이름, 직업, 부서번호, 부서명을 출력하라

SELECT e.last_name , e.job_id , d.department_id , d.department_name --, d.location_id 
from  employees e INNER join departments d  
on e.department_id = d.department_id
where d.location_id = 2500;

-- 문제5) 이름에 A가 들어가는 사원들의 이름과 부서이름을 출력하라
SELECT e.employee_id, d.department_name --,e.first_name
from  employees e INNER join departments d  
on e.department_id = d.department_id
where e.first_name like 'A%';

 

문제 이해 오류 
-> 맨 앞글자가 아니라 이름에 A가 들어가는 이라고 했으니 이름 어디에 있는 A가 들어가게 where 을 수정해야 됨 

SELECT e.employee_id, d.department_name --,e.first_name
from  employees e INNER join departments d  
on e.department_id = d.department_id
where e.first_name like '%A%';


 




-- 문제6) 사원이름과 그 사원의 관리자 이름을 출력하라
SELECT  e.first_name as "사원이름",m.first_name as "상사 이름"
from employees e join employees m
      on e.manager_id = m.employee_id;

-- 문제7) 사원이름과 부서명과 월급을 출력하는데 월급이 6000 이상인 사원을 출력하라
SELECT e.last_name as "사원 이름" , d.department_name , e.salary as "월급"
FROM employees e left outer join departments d
       on e.department_id = d.department_id
WHERE e.salary >=6000;

-- 문제8) first_name 이 TJ 이란 사원보다 늦게 입사한 사원의 이름과 입사일을 출력하라
SELECT   e.first_name as "사원이름", e.hire_date as "입사일"
from employees e
where   (e.hire_date >= e.first_name and e.first_name= 'TJ');

 
-- 문제9) 급여가 3000에서 5000사이인 사원의 이름과 소속부서명 출력하라
SELECT e.last_name , d.department_name
from employees e left outer join departments d
       on e.department_id = d.department_id
where  3000<= e.salary and  5000 >= e.salary;

-- 문제10) ACCOUNTING 부서 소속 사원의 이름과 입사일 출력하라
SELECT e.last_name , e.hire_date , d.department_name
from employees e inner join departments d 
on e.department_id = d.department_id
where d.department_name like 'Accounting';

-- 문제11) 급여가 3000이하인 사원의 이름과 급여, 근무지를 출력하라
SELECT e.last_name, e.salary,   d.location_id
from employees e inner join departments d 
on e.department_id = d.department_id
where 3000>=e.salary;


-- 문제12) 관리자보다 먼저 입사한 모든 사원의 이름 및 입사일을 관리자의 이름 및 입사일과 
-- 함께 표시하고 레이블명을 각각 emp name, emp hired, mgr name, mgr hired 로 지정하라.
SELECT
from
where

-- 문제13) 지역별로 근무하는 사원의 수가 5명 이하인 경우, 사원이 적은 도시순으로 정렬하고 city와 사원수를 출력하시오.
select count(l.city) ,count(c.country_id)
 from countries c inner join locations l
on c.country_id = l.country_id
where 5>=c.country_id ;


-- 문제14) 지정한 부서번호, 사원이름 및 지정한 사원과 동일한 부서에서 근무하는 모든 사원을 표시하도록 하고 부서번호는 deptno, 사원이름은 사원, 동일한 부서에서 근무하는 사원은 동료로 표시하시오.
-- (부서번호, 사원이름, 동료 순으로 오름차순 정렬)