데이터 베이스/코멘토 SQL로 배우는 데이터 추출

직무부트캠프 3주차 - 현업 요구에 맞게 데이터 추출하기

whyHbr 2023. 11. 25. 13:47
728x90
반응형

--1. select 데이터를 가져온다.
SELECT -- 가져와라 
 * -- 모두 (모든컬럼)
 FROM EMP_C; -- 컨트롤 키 + 엔터

SELECT -- 가져와라 
 EMP_NM -- 한개만 컬럼명을 적어준다.
 FROM EMP_C; -- 컨트롤 키 + 엔터
 
 SELECT -- 가져와라 
  EMP_NM
 ,EMP_NO
 FROM EMP_C; -- 컨트롤 키 + 엔터
 
SELECT -- 가져와라 
  TMP.EMP_NM -- 테이블명.컬럼명
 ,TMP.EMP_NO 
 FROM EMP_C TMP ; -- 테이블에 이름을 붙여준다.

 

--2. WHERE 조건
SELECT

FROM EMP_C EMP
WHERE BIRTH_YMD >= '19500101'; -- = , <> , > , < , >= , <=

SELECT

FROM EMP_C EMP
WHERE GENDER_CD = '1'; --남자

SELECT

FROM EMP_C EMP
WHERE GENDER_CD <> '1'; --여자

SELECT

FROM EMP_C EMP
WHERE GENDER_CD <> '1'
AND BIRTH_YMD >= '19500101';  -- 여러조건을 만족하는 데이틑 찾을 때 AND를 사용

-----------------

SELECT

FROM EMP_C EMP
WHERE GENDER_CD <> '1'
AND BIRTH_YMD >= '19500101'
ORDER BY  EMP_NM ASC ; --오름정렬

SELECT

FROM EMP_C EMP
WHERE GENDER_CD <> '1'
AND BIRTH_YMD >= '19500101'
ORDER BY  EMP_NM DESC ; --내림정렬

SELECT

FROM EMP_C EMP
WHERE GENDER_CD <> '1'
AND BIRTH_YMD >= '19500101'
ORDER BY  EMP_NM, BIRTH_YMD DESC ; --내림정렬

 

--3. 정렬
SELECT

FROM EMP_C EMP
WHERE GENDER_CD <> '1'
AND BIRTH_YMD >= '19500101'
ORDER BY  EMP_NM ASC ; --오름정렬

SELECT

FROM EMP_C EMP
WHERE GENDER_CD <> '1'
AND BIRTH_YMD >= '19500101'
ORDER BY  EMP_NM DESC ; --내림정렬

SELECT

FROM EMP_C EMP
WHERE GENDER_CD <> '1'
AND BIRTH_YMD >= '19500101'
ORDER BY  EMP_NM, BIRTH_YMD DESC ; --내림정렬

 

--4. LIKE
SELECT 
*
FROM EMP_C
WHERE EMP_NM LIKE '이%';

SELECT 
*
FROM EMP_C
WHERE EMP_NM NOT LIKE '이%';

SELECT 
*
FROM EMP_C
WHERE EMP_NM LIKE '%이';

SELECT 
*
FROM EMP_C
WHERE EMP_NM LIKE '%이%';

 

--5. IN , NOT IN
SELECT 
 * FROM
 EMP_C
 WHERE EMP_NO  IN ('11507952','11510199','10004553');
 
 SELECT 
 * FROM
 EMP_C
 WHERE EMP_NO = '11507952';
 
 SELECT 
 * FROM
 EMP_C
 WHERE EMP_NO  NOT IN ('11507952','11510199');
 
 SELECT 
 * FROM
 EMP_C
 WHERE EMP_NO  IN ('11507952','11510199','10004553')
 AND EMP_NM LIKE '김%';

 

-- 6. GROUP BY ~별, 직원별 자녀수를 구하는 sql을 작성해보세요.

SELECT
 EMP_NO
,COUNT(*)
 FROM FAM_C
 WHERE REL_TYPE_CD = 'A27' -- 자녀는 A27
 AND EMP_NO = '10007088'
 GROUP BY EMP_NO ; -- GROUP BY 뒤에 있는 컬럼명을 그대로 SELECT 쪽에 넣어준다.
 
-- 그룹바이 , COUNT(*) , MAX,MIN,AVG,SUM 같이 함께 쓰인다.

-- 임직원중에서 남자와 여자 중에서 가장 생일이 빠른 사람은?
SELECT
 GENDER_CD
,MIN(BIRTH_YMD)
FROM 
EMP_C
GROUP BY GENDER_CD;

SELECT
 GENDER_CD
,MAX(BIRTH_YMD)
FROM 
EMP_C
GROUP BY GENDER_CD;

 

----

-- 7. DECODE, CASE WHEN

SELECT
 EMP_NO
 ,GENDER_CD  AS 성별코드
 ,DECODE(GENDER_CD,'1','남자','2','여자','모름') AS 성별
 FROM EMP_C;
 
 SELECT
 EMP_NO
 ,GENDER_CD  AS 성별코드
 , BIRTH_YMD
 ,DECODE(GENDER_CD,'1','남자','2','여자','모름') AS 성별
 ,CASE WHEN GENDER_CD = '1' AND BIRTH_YMD <= '19500101' THEN '늙은남자'
       WHEN GENDER_CD = '1' AND BIRTH_YMD > '19500101' THEN '젊은남자'
       WHEN GENDER_CD = '2' THEN '여자'
       ELSE '모름' END AS 성별2
 FROM EMP_C;
 
 SELECT 
  ROWNUM --순번
  ,EMP.*
  FROM EMP_C EMP;

--RANK 동순위는 동일하게 처리하고, 뛰어 넘는다.
 SELECT 
  RANK() OVER (ORDER BY EMP_NM ASC) AS RN -- RANK를 순위를 선정하는데, EMP_NM의 오름차순으로
  ,EMP.*
  FROM EMP_C EMP;

--DENSE_RANK --> 동순위를 뛰어 넘기지 않는다.
 SELECT 
  DENSE_RANK() OVER (ORDER BY EMP_NM ASC) AS RN -- RANK를 순위를 선정하는데, EMP_NM의 오름차순으로
  ,EMP.*
  FROM EMP_C EMP;

--

SELECT * FROM EMP_C WHERE EMP_NO = '11510796'
UNION ALL -- 합치는데, 중복이 제거 되지 않는다.
SELECT * FROM EMP_C WHERE EMP_NO = '11503691'
;

SELECT * FROM EMP_C WHERE EMP_NO = '11510796'
UNION  -- 합치는데, 중복이 제거된다.
SELECT * FROM EMP_C WHERE EMP_NO = '11503691'
;

SELECT * FROM EMP_C WHERE EMP_NO = '11503691'
UNION ALL -- 합치는데, 중복이 제거 되지 않는다.
SELECT * FROM EMP_C WHERE EMP_NO = '11503691'
;

SELECT * FROM EMP_C WHERE EMP_NO = '11503691'
UNION  -- 합치는데, 중복이 제거된다.
SELECT * FROM EMP_C WHERE EMP_NO = '11503691'
;

SELECT * FROM EMP_C WHERE EMP_NO IN ( '11503691' , '11510796');

 

 

 

 

SELECT 
EMP_NO
,COUNT(*)
 FROM FAM_C
WHERE REL_TYPE_CD = 'A27'
GROUP BY EMP_NO
HAVING COUNT(*) < 3;

 

 

 

-- JOIN
-- 테이블과 테이블을 합친다.
-- 1) 기준 테이블
-- 2) 대상 테이블
-- 3) 키를 합친다.

-- INNER JOIN / LEFT OUTER JOIN

-- 임직원번호 / 임직원성명 / 임직원가족이름
-- EMP_C (EMP_NO ) / EMP_C (EMP_NM ) / FAM_C (FAM_NM )
SELECT
EMP.EMP_NO AS 임직원번호
,EMP.EMP_NM  AS 직원성명
,FAM.FAM_NM AS 직원가족성명
FROM
EMP_C EMP
INNER JOIN -- 교집
FAM_C FAM
ON EMP.EMP_NO = FAM.EMP_NO --JOIN KEY
WHERE EMP.EMP_NO  IN ('10001452','11505155')
;

SELECT
EMP.EMP_NO AS 임직원번호
,EMP.EMP_NM  AS 직원성명
,FAM.FAM_NM AS 직원가족성명
FROM
EMP_C EMP
LEFT OUTER JOIN 
FAM_C FAM
ON EMP.EMP_NO = FAM.EMP_NO --JOIN KEY
WHERE EMP.EMP_NO  IN ('10001452','11505155')
;

 

 

 

참고

http://www.gurubee.net/oracle/sql

728x90