이것저것 해보기🌼

[SQL] postgreSQL 문법 정리(CASE,JOIN,GROUP BY등) 본문

코딩테스트

[SQL] postgreSQL 문법 정리(CASE,JOIN,GROUP BY등)

realtree 2021. 7. 2. 12:44

 

 

참고 포스팅 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=wiseyoun07&logNo=221135110180 

 

ORACLE쿼리에서 postgreSQL쿼리 변환

회사에서 SM 운영 업무를 줄곧 해오면서 DB 사용에 있어 오라클 DB를 벗어날 일이 크게 없었다. 안정...

blog.naver.com

http://www.gurubee.net/lecture/2953

 

JOIN

JOIN 문법 JOIN은 FROM에서 2개 이상의 테이블을 결합하여 다수의 행을 검색하는 것을 말합니다. JOIN의 일반적인 문법은 다음과 같습니다. ..

www.gurubee.net

 

 

기본 문법

 

1) 현재시간 출력 -> now()

select now();

 

-> CHAR() 형으로 바꾸기

select to_char(now(), 'yyyy-mm-dd');

 

※오라클의 FROM DUAL; 같은 것은 사용하지 않는다.

 

 

2) 오라클 NVL  -> coalesce()

select coalesce(user_id, 0) from user_t;

-> user_id 가 NULL 이면 0으로 출력하기

 

3) 오라클 ROWNUM=3 -> LIMIT 3

select name from exam_t

limit 5

-> exam_t 상위 5개 이름 출력

 

※만약 오름차순, 내림차순으로 상위 값들을 출력하고 싶으면

먼저 order by 로 정렬한 결과를 다시 감싸서 limit 지정해야함

 

 

 

4) CASE 문

(ORACLE의 DECODE는 제공안함)

CASE WHEN nation = 'KR' THEN type = 'DOMESTIC' ELSE type = 'INTERNATIONAL' END

 

예시)

SELECT ename
     , deptno
     , CASE WHEN deptno = '10' THEN 'New York'
            WHEN deptno = '20' THEN 'Dallas'
            ELSE 'Unknown'
       END AS loc_name
  FROM emp
 WHERE job = 'MANAGER'

 

 

5) JOIN

[INNER] JOIN
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
CROSS JOIN

그런데 나의 경우에는 구름 테스트환경에서 PostgreSQL 로 풀때 INNER 를 붙이니까 잘 안되었던 것 같다.

그냥 INNER, OUTER는 생략하고 시험을 봐야겠다.

 

 

- INNER JOIN

SELECT * 
  FROM T1 
 JOIN T2 
    ON T1.num = T2.num;

T1의 num 과 T2의 num 이 서로 매칭이 되는 경우만 출력

 

그런데 꼭 INNER JOIN 안쓰고 EQUI JOIN 도 가능한것 같다.

 

 

- LEFT JOIN

SELECT * 
  FROM T1 
  LEFT JOIN T2 
 ON T1.num = T2.num

T1, T2와 INNER JOIN 해서 T1의 모든 값을 출력하고, T2에 매칭되는 값이 없는 경우에는 null 값을 넣어 출력

 

 

- RIGHT JOIN

SELECT * 
  FROM T1 
 RIGHT JOIN T2 
    ON T1.num =T2.num;

 

T1과 T2를 INNER JOIN 해서 T2의 모든 값을 출력하고, T1에 매칭되는 값이 없는 경우에는 null 값을 넣어 출력

 

 

- FULL OUTER JOIN

SELECT * 
  FROM T1 
  FULL JOIN T2 
    ON T1.num = T2.num;

T1, T2의 모든 결과를 다 가져오고, 매칭되는 값이 없는 경우 null 을 넣어서 출력

 

 

- CROSS JOIN

SELECT * 
  FROM t1 
 CROSS JOIN t2;

어떤 값을 기준으로 매칭하는 것이 아닌, 모든 경우의 수를 전부 매칭

t1이 N행 있고, t2가 M행 있다면 결과는 N * M 행

 

 

 

6) GROUP BY

ORCLE과 사용법이 동일하다.

 

 

PAYMENT 테이블을 STAFF_ID 기준으로 PAYMENT_ID의 카운트를 조회하며 STAFF_ID 기준으로 GROUP BY

SELECT
	STAFF_ID,
	COUNT(PAYMENT_ID) AS COUNT
FROM
	PAYMENT
GROUP BY
	STAFF_ID;

GROUP BY를 사용하면 SELECT 절에는 GROUP BY에 쓰인 column만 사용가능하다.

 

 

만약 위에서 STAFF_NAME이 필요한 경우에는, 아래와 같이 사용해야한다.

SELECT
	A.STAFF_ID,
	COUNT(A.PAYMENT_ID) AS COUNT,
	B.STAFF_NAME
FROM
	PAYMENT A,
	STAFF B
WHERE
	A.STAFF_ID = B.STAFF_ID
GROUP BY
    A.STAFF_ID,
	B.STAFF_ID

GROUP BY로 PAYMENT의 STAFF_ID 를 사용하면, PAYMENT의 다른 칼럼에도 접근이 가능해진다.

 

참고자료 : https://nittaku.tistory.com/431

 

 

RANK() 나 PARTITION BY() 정도 수준은 안나올것 같으므로 우선 이정도만 정리!