2022-02-02 SQL 개요 / 연산자 / 함수 / GROUP BY HAVING / JOIN / SET_OPERATOR / SUBQUERY

GGAE99·2022년 2월 3일
0

진도

목록 보기
15/43

설을 아주 잘 보내고 안그래도 살찐몸이 더 살쪄서 돌아왔다. 망해따. 공부나 하자.
일단 SQL이 뭔지 살펴보자.

SQL

  • 관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준검색언어
  • 원하는 데이터를 찾는 방법이나 절차를 기술하는 것이 아닌 조건을 기술하여 작성
  • 문법의 종류 로는 DDL(데이터 정의), DML(데이터 조회, 데이터 조작), DCL(권한 설정),
    TCL(트랜잭션 제어) 가 있다.

솔직히 이 위에건 무슨 말인지 필자는 잘 모른다. 그냥 정의되어있길래 정리나 해보자 하고 정말 간단하게 이름만 써놓은거다. 그리고 이 이후에 정의할 것 들은 내가 알고있는 것들 위주다.

첫번째로 TABLE이다.

TABLE

TABLE
1. TABLE 정의

  • 데이터를 담고 있는 객체
  • 테이블은 기본적으로 행과 열을 이용하여 데이터를 표현
  1. TABLE 용어
  • Relation : 테이블의 이름을 Realation이라고 부름
  • Column(Attribute, Domain) : 특정한 단순 자료형과 데이터의 열(세로)
  • Row(Tuple) : 테이블에서 한 객체의 대한 전체 정보를 표현한 행(가로)
  • Field : 어떠한 단일 값 자체를 의미

다음은 오라클의 데이터 타입들이다. 이건 간단하게만 보고 넘어가자.

오라클의 데이터 타입

오라클의 데이터 타입

  • NUMBER([P,S])
    P : 표현할 수 있는 전체 자리 수 (1~38)
    S : 소수점 이하 자리 수 (-84~127)
  • CHAR(SIZE)
    영어는 1byte씩 한글은 3byte씩 차지( 유료버전은 하나에 2byte... 이해가긴함)
  • VARCHAR2(SIZE)
    CHAR랑 같은데 byte값을 설정하고 공간이 남으면 얘는 지워주고 char는 공백을 채움
  • DATE
    날짜 데이터

요정도만 알아보자. 이번에 알아볼 것은 DML(SELECT)와 연산자이다.

DML(DQL)

옆에 써져있는 DQL은 DML중에 SELECT만을 따로 의미한다. SELECT는 데이터를 조회하기 위한 수단이라고 볼 수 있다. 조회한 결과를 RESULT SET이라고 하고, 이 RESULT SET은 0개 이상의 행을 포함하며 특정한 기준에 의해 정렬이 가능하다.

SELECT의 기본 작성법이다.

SELECT 컬럼명,컬렴명.... FROM 테이블명 WHERE 조건식;
1. SELECT

  • 조회하고자 하는 컬럼명을 기술
  • 여러 컬럼을 조회하는 경우 컬럼은 쉼표로 구분
  • 모든 컬럼을 조회하는 경우 컬럼은 쉼표로 구분
  • 조회 결과는 기술한 컬럼명 순으로 표시
  1. FROM
  • 조회 대상 컬럼이 포함된 테이블명을 기술
  1. WHERE
  • 행을 선택하는 조건을 기술
  • 여러 개의 제한 조건을 포함 할 수 있으며, 논리연산자로 연결
  • 조건을 만족시키는 행들만 RESULT SET에 포함
  • 조건없이 모든 행을 검색하려는 경우 WHERE절은 생략이 가능

EX) SELECT SUM(SALARY) , SUM(BONUS) FROM EMPLOYEE WHERE DEPT_CODE='D9';

요런식으로 조회할 컬럼명, 조회 대상 테이블, 조건을 설정해주면 된다. 요게 기본이다.

다음은 연산자이다.

연산자

SELECT의 연산자를 살펴볼 것 이다. SELECT의 연산자는 연결 연산자, 논리 연산자, 비교 연산자가 존재한다. 근데 그 중에서 비교연산자가 꽤 많다. 일단 살펴보자.

연산자의 종류
1. 연결 연산자

  • || : 이거 그냥 컬럼을 하나로 만들어주는다.
    SELECT SUM(SALARY) , SUM(BONUS) 요렇게 쓴거하고 SELECT SUM(SALARY) || SUM(BONUS)
    이렇게 쓴게 뭐가 다르냐면 결과값을 전자는 따로 출력하고 오른쪽은 붙여서 하나의 값에 같이 출력해준다. 이게 차이점이다.
  1. 논리 연산자
  • 여러개의 제한 조건 결과를 하나의 논리 결과로 만들어 준다.
  • AND : 여러 조건이 동시에 TRUE일 경우 TRUE
  • OR : 여러 조건들 중 하나라도 TRUE일 경우 TRUE
  • NOT : 조건에 대한 반대로 반환(NULL)은 예외
  • WHERE문에 조건을 넣을때 주로 사용한다. 사실 비교연산자도 그러하다.
  1. 비교 연산자
  • 아 근데 얘가 진짜 좀 많다 하나하나 보자.
  • 표현식 사이의 관계를 비교하기 위해 사용하고, 비교 결과는 논리 결과(TRUE, FALSE, NULL)중 하나가 된다. 단, 비교하는 두 컬럼 값/표현식은 동일한 데이터 타입이어야 한다.
  • = : 같다
  • <, > : 작다/크다
  • <=, => : 작거나 같다/ 크거나 같다
  • <>, !=, ^= : 같지않다.
  • BETWEEN AND : 특정 범위에 포함되는지 비교
    EX) -- 급여가 300만원이상이고 600만원 이하인 직원의 이름, 급여
    SELECT EMP_NAME, SALARY
    FROM EMPLOYEE
    WHERE SALARY BETWEEN 3000000 AND 6000000;
  • LIKE/NOT LIKE : 문자 패턴 비교
    EX) -- 이름에 '형'이 들어가는 사람의 직원 아이디와 이름.
    SELECT EMP_ID, EMP_NAME
    FROM EMPLOYEE
    WHERE EMP_NAME LIKE '%형%';
  • IS NULL/IS NOT NULL : NULL 여부 비교
  • IN/NOT IN : 비교 값 목록에 포함/미포함 여부 비교
  1. 연산자의 우선순위
  • 산술 연산자 -> 연결 연산자 -> 비교 연산자 -> IS NULL/NOT NULL, LIKE/NOT LIKE, IN/NOT IN -> BETWEEN AND -> 논리 연산자 - NOT -> 논리 연산자 - AND -> 논리 연산자 -OR

연산자 참 오래도 했다. 이번에는 SQL에서 사용하는 함수에 대해 알아보자.

함수

함수란 하나의 큰 프로그램에서 반복적으로 사용되는 부분들을 분리하여 작성해 놓은 서브 프로그램이다. 호출하며 값을 전달하면 수행 결과를 리턴하는 방식으로 사용한다.
여러 개의 값을 전달했을 때 결과 값이 여러개 나오는게 단일행 함수,
여러 개의 값을 전달했을 때 결과 값이 하나만 나오는게 그룹 함수이다.
ORDER BY 절부터 알아보자.

ORDER BY

ORDER BY는 선택한 어떤 한 컬럼을 기준으로 오름차순 또는 내림차순으로 정리해준다.

-- EMPLOYEE테이블 전체 조회후 이름으로 오름차순 정렬 ASC; DEFAULT값임 (문자열)
SELECT FROM EMPLOYEE ORDER BY EMP_NAME ASC;
-- EMPLOYEE테이블 전체 조회후 이름으로 내림차순 정렬 DESC; (문자열)
SELECT
FROM EMPLOYEE ORDER BY EMP_NAME DESC;

와 같은 방식이다.

문자 정리 함수 (문자 처리 함수)

이번에는 문자 처리 함수를 간단하게 정리해 볼 것이다.

  1. LENGTH : 문자열의 길이를 반환
    SELECT EMP_NAME,LENGTH(EMP_NAME),EMAIL,LENGTH(EMAIL) FROM EMPLOYEE;
  2. LENGTHB : 문자열의 바이트를 반환
    SELECT EMP_NAME,LENGTH(EMP_NAME),LENGTHB(EMP_NAME),
    EMAIL,LENGTH(EMAIL),LENGTHB(EMAIL)
    FROM EMPLOYEE;
  3. INSTR : 문자열중 특정 문자가 어느위치에 존재하는지 반환 // 매개변수 : (대상문자열,잗을문자,검색시작위치,몇번재존재하는지)
    SELECT INSTR('Hello World Hi High','H',1,1) FROM DUAL;
    SELECT INSTR('Hello World Hi High','H',-1,1) FROM DUAL;
    -- 검색시작위치 : -1 = 뒤에서부터 찾으라는 뜻
  4. LPAD/RPAD : 주어진 컬럼문자열에 임의의 문자를 왼쪽/오른쪽에 덧붙여 길이를 일정하게 만들어서 반환 매개변수 : (문자열,범위,채워줄문자)
    -- 공간이 부족하면 지정해준 범위에서 문자열을 자름
    SELECT EMAIL, LENGTH(EMAIL), LPAD(EMAIL,20,'#'), RPAD(EMAIL,20,'#'), LPAD(EMAIL,10,'#')
    FROM EMPLOYEE;
  5. LTRIM/RTRIM : 주어진 문자열의 왼쪽 또는 오른쪽에서
    지정한 문자열에 포함된 모든문자를 제거한 나머지 반환
    SELECT LENGTH(' AB') FROM DUAL;
    -- 길이 3
    SELECT LENGTH(LTRIM(' AB',' ')) FROM DUAL;
    -- 길이 2 // 공백을 지워주었기때문
    SELECT LENGTH(' AB'),LENGTH(LTRIM(' AB',' ')), LENGTH(LTRIM(' AB')) FROM DUAL; -- TRIM함수를 사용했을때, 지워질 문자를 입력하지 않았다면 알아서 ' '공백 문자를 지움
    SELECT LTRIM('0000123','0'), RTRIM('0000012300000','0') FROM DUAL;
    -- 지워줄 문자를 지우다가, 지워줄 문자와 일치하지않는 문자를 만났을때 종료
    SELECT LTRIM('ACABAACBCABCABEG','ABC') FROM DUAL;
    -- 지워줄 문자를 굳이 문자 하나로 지정하지 않고, 여러개로 설정해주면 순서에 상관없이 속해있는 모든 문자를 다 지움
    SELECT RTRIM(LTRIM('235023350AB350350305','0123456789'),'0123456789')
    FROM DUAL; -- L,R 2개 같이 사용도 가능
  6. TRIM : 주어진 문자열의 앞/뒤/양쪽에있는 지정한 문자를 제거한 나머지
    // 근데 얘는 문자 하나밖에 문자 여러개를 입력을 못함 못지움
    SELECT 'ZZZZABZZZZ' FROM DUAL;
    SELECT TRIM('Z' FROM 'ZZZZABZZZZ') FROM DUAL; -- 양쪽 다 지움
    SELECT TRIM(LEADING 'Z' FROM 'ZZZZABZZZZ') FROM DUAL; -- 앞쪽부터 지움
    SELECT TRIM(TRAILING 'Z' FROM 'ZZZZABZZZZ') FROM DUAL; -- 뒤쪽부터 지움
    SELECT TRIM(BOTH 'Z' FROM 'ZZZZABZZZZ') FROM DUAL; -- 양쪽 다 지움
  7. SUBSTR : 컬럼이나 문자열에서 지정한 위치부터 지정한 개수의 문자열을 잘라서 리턴
    SELECT SUBSTR('Hello World Hi High',7,2) from dual;
    --7번째 문자부터 2개 출력
    select substr('Hello World Hi High',9,5) from dual;
    --9번째 문자부터 5개 출력
    select substr('Hello World Hi High',-10,5) from dual;
    --뒤에서부터 10번째 문자부터 정방향으로 5개 출력
    select substr('Hello World Hi High',9) from dual;
    --9번째 문자부터 전부 출력

이정도가 문자열 정리 함수이다.
다음은 내가 생각하기에 성질이 좀 다른 친구들을 정리해 놓은 것 이다.

  1. LOWER / UPPER / INITCAP : 문자열을 소문자/대문자/첫글자만 대문자러 변환하여 리턴
    select lower('Hello Hi') from dual; --소문자로
    select upper('Hello Hi') from dual; --대문자로
    select initcap('hello hi') from dual; --첫글자만 대문자로
  2. CONCAT : 문자열 두개를 전달받아 하나로 합쳐서 리턴
    select concat(concat('ABCD','가나다라'),'1234') from dual;
    select 'ABCD'||'가나다라'||'1234' from dual; -- 사실 이렇게 해주면되서 잘 안씀
  3. REPALCE : 문자열을 변경하여 리턴
    select replace(email, 'AB', 'iei') from employee; --> AB를 iei로 바꿔서 리턴

이제 숫자 처리 함수를 살펴보자. 이거 하나하나 예시를 들려니까 너무 길다. 정의만 써야겠다.
미래의 내가 다시 볼걸 대비해 조언을 한다. 그냥 직접 다시 써봐라 그게 빠를거다.

숫자 처리 함수

  1. ABS : 절댓값
  2. MOD : 나머지값
  3. round, floor, ceil : 반올림/버림/올림
    -- 소수 첫째자리에서 반올림 다만 round(xxx.xxx , y) y 다음 자리숫자를 반올림헤서 표시
    y가 음수일 경우에는 정수 첫째부터 y번째 자리에서 반올림

이제 날짜 처리 함수를 알아본다

날짜 처리 함수

  1. SYSDAYE : 시스템에 저장되어있는 현재 날짜를 반환
  2. MONTHS_BETWEEN : 날짜 두개의 개월수차이를 반환
  3. ADD_MONTHS : 날짜와 숫자를 받아서 숫자만큼 개월수를 더해서 리턴
  4. NEXT_DAY : 인자로받은 날짜에 인자로받은 요일 중 가장 가까운 다음요일
    ( 1 =일요일 ~ 7 = 토요일)
  5. LAST_DAY : 인자로받은 날짜가 속한 달의 마지막날짜를 구하여 리턴
  6. EXTRACT : 날짜에서 연,월,일 정보를 따로 추출하는 기능

다음은 형 변환 함수이다.

형 변환 함수

  1. TO_CHAR : 날짜형데이터 또는 숫자형데이터를 문자형으로 변환
    -- TO_CHAR(날짜or숫자,([FORMAT])
  2. TO_DATE : 숫자 또는 문자형 데이터를 날짜형 데이터로 리턴
    -- TO_DATE(숫자OR문자, [FORMAT])
  3. TO_NUMBER : 문자형 데이터를 숫자로 변경

다른 기능을 가진 기타 함수들이다.

기타 함수

  1. NVL : NULL을 처리하는 함수
  2. DECODE : 선택함수
    -- 조건이 얼마 없을때 사용하기 좋다
  3. CASE : 선택함수
    -- IF ~ ELSE IF
    -- 자바 SWITCH문이랑 진짜 비슷하다.
    -- 조건을 여러개 걸기에는 CASE가 편하다

그룹 함수이다.

그룹 함수

하나 이상의 행을 그룹으로 묶어 연산하여 총합, 평균 등을 하나의 컬럼으로 리턴하는 함수이다.
요건 식도 같이 쓰겠다.

  1. SUM : 조회 결과의 합계
    SELECT SUM(SALARY) , SUM(BONUS) FROM EMPLOYEE;
    -- 그룹함수는 아예 NULL값을 취급을 안해서 NULL값을 더해주지도않는다. 데이터로 안본다.
    SELECT SUM(SALARY) , SUM(BONUS) FROM EMPLOYEE WHERE DEPT_CODE='D9';
  2. AVG : 조회 결과의 평균
    SELECT AVG(SALARY) FROM EMPLOYEE WHERE DEPT_CODE='D9';
  3. COUNT : 조회 결과의 수
    SELECT COUNT(SALARY) FROM EMPLOYEE;
    SELECT COUNT() FROM EMPLOYEE;
    -- 어차피 몇줄인지만 알면 되는 것 이기 때문에, COUNT는 보통
    을쓴다.
    SELECT COUNT(SALARY) FROM EMPLOYEE WHERE DEPT_CODE='D9';
    SELECT COUNT(DEPT_CODE) FROM EMPLOYEE;
    -- 21 // NULL값은 COUNT할때 값에서 포함하지 않으므로 NULL값을 가지고있는 두 정보가 포함안됐다.
  4. MAX, MIN : 조회결과중 최대값/최소값
    SELECT SALARY FROM EMPLOYEE ORDER BY 1 DESC;
    SELECT MAX(SALARY), MIN(SALARY) FROM EMPLOYEE ;
    -- 최대값과 최소값을 출력해준다.

함수는 이제 다 봤다.
이번에 볼 것은 GROUP BY & HAVING이다.

GROUP BY # HAVING

GROUP BY

  • 그룹함수는 단 한 개의 결과값만 산출하기 때문에, 그룹함수를 이용하여 여러개의 결과값을 산출하기 위해서는 그룹함수가 적용될 그룹의 기준을 지정하여야 하는데 이를 GROUP BY절에 기술한다.
  • SELECT SUM(SALARY) FROM EMPLOYEE;
    --WHERE가 없으므로 EMPLOYEE테이블 전체의 급여 총합
    SELECT DEPT_CODE, SUM(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE;
    -- 그룹의 단위가 DEPT_CODE로 동일하게 그룹단위

HAVING

  • 그룹함수로 값을 구해올 그룹에 대해 조건을 설정할 때는 HAVING절에 기술
    (WHERE은 SELECT에 대한 조건)
  • -- 급여의 평균이 300만원 이상인 부서의 부서코드와 급여평균을 조회
    SELECT
    DEPT_CODE,
    FLOOR(AVG(SALARY)) 급여평균
    FROM EMPLOYEE
    GROUP BY DEPT_CODE
    HAVING FLOOR(AVG(SALARY)) >= 3000000;

다음은 개인적으로 중요하다고 생각되는 JOIN이다.

JOIN

한 개 이상의 테이블에서 데이터를 조회하기 위해 사용하는 것으로, 수행결과는 하나의 RESULT SET으로 나오게 된다.

JOIN 기본
1. 두 테이블 조인 시 연결하는 컬럼의 이름이 다른경우 ON을 사용
SELECT EMP_NAME,DEPT_CODE,DEPT_TITLE
FROM EMPLOYEE E
JOIN DEPARTMENT D ON (DEPT_CODE=DEPT_ID);
2. 두 테이블 조인 시 컬럼의 이름이 같은게 존재하는 경우 테이블명.컬럼명 형식을 사용해서 구분
SELECT EMP_NAME,E.JOB_CODE,J.JOB_CODE
FROM EMPLOYEE E
JOIN JOB J ON(E.JOB_CODE=J.JOB_CODE);
3. 두 테이블 조인 시 연결하는 컬럼의 이름이 같은경우 USING 키워드 사용
SELECT EMP_NAME,JOB_CODE,JOB_CODE
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);

이게 JOIN의 기본 사용 형태이다. JOIN의 다양한 활용을 알아보자.

JOIN 형태
1. INNER JOIN -> JOIN -> 조인 비교구문에 일치하는 데이터만 나옴
-> INNER JOIN이 JOIN의 기본값
2. LEFT JOIN -> 조인 비교구문에 일치하지 않더라고 왼쪽 테이블의 정보는 모두표현.
없는 데이터는 NULL로 표시
3. RIGHT JOIN -> 조인 비교구문에 일치하지 않더라도 오른쪽 테이블의 정보는 모두 표현.
없는데이터는 NULL로 표시
4. FULL JOIN -> LEFT JOIN에 포함되는 결과 + RIGHT JOIN에 포함되는 결과를 모두 포함한 외부조인 -> 완전 외부조인
5. CROSS JOIN -> 모든 경우와 한번씩 엮어줌
6. SELF JOIN -> 같은 테이블을 조인할때 사용
7. 다중 JOIN -> JOIN은 여러번 사용도 가능하다.

여기까지가 JOIN의 다양한 형태이다.
거의 다 왔다. 이제 SET OPERATER다. 개념이 집합과 같다.

SET OPERATER

그냥 바로 정리 들어가자.

SET OPERATER
1. UNION
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE WHERE DEPT_CODE = 'D5' -- 총 6명이 조회되는 SELECT문
-- 위의 두 조회구문 2개 ROW 일치 209,215
UNION
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE WHERE SALARY >= 3000000; -- 총 8명이 조회되는 SELECT문
-- UNION -> 겹치는 2개의 ROW를 제외하고 남은 12개의 ROW를 정렬시켜서 출력
2. UNION ALL
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE WHERE DEPT_CODE = 'D5'
UNION ALL
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE WHERE SALARY >= 3000000;
-- UNION ALL -> 14개의 ROW를 모두 출력하고 정렬도 안시켜서 그냥 출력
3. MINUS
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE WHERE SALARY >= 3000000
MINUS
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE WHERE DEPT_CODE = 'D5';
-- MINUS -> 겹치는 2개의 ROW를 제외하고 첫번째 셀렉트를 출력

SET OPERATER는 그냥 집합이라고 보면 편할 것 같다. 집합빼는것도 있고, 합집합도 있고, 여기서만 쓰는 특이한 합집합도 있다. 같은 원소를 다 표현한다.

이제 SUBQUREY이다.

SUBQUREY
1. SUBQUERY란

  • 하나의 SELECT 문장 안에 포함된 또 하나의 SELECT 문장
  • SUBQUERY는 MAINQUERY 실행 전에 한번만 실행
  1. SUBQUERRY 조건
  • SUBQUERY는 반드시 소괄호로 묶어야한다. EX) (SELECT FLOOR(AVG(SALARY)) FROM EMPLOYEE);
  • SUBQUERY와 비교할 항목은 SUBQUERY의 SELECT한 항목의 개수와 자료형이 일치해야한다.

이게 SUBQUERY의 개념이다. 이제 이 SUBQUERY가 어떤 유형을 가지고 있는지 알아보자.

SUBQUERY 유형
1. 단일행 SUBQUERY
SUBQUERY의 조회 결과 값의 개수가 1개인 경우 (1행,1열)
2. 다중행 SUBQUERY
SUBQUERY의 조회 결과 값의 행이 여러개인 경우 (N행, 1열)
3. 다중열 SUBQUERY
SUBQUERY의 조회 결과 컬럼 개수가 여러개인 경우 (1행, N열)
4. 다중행 SUBQUERY
SUBQUERY의 조회 결과 컬럼 개수와 행의 개수가 여러개인 경우 (N행, N열)
5. 상관 SUBQUERY (상호연관 SUBQUERY)
SUBQUERY가 만든 결과 값을 MAINQUERY가 비교 연산할 때, MAINQUERY 테이블 값이 변경되면서
SUBQUERY의 결과값도 변경되는 경우
6. 스칼라 SUBQUERY
상관쿼리 이면서 결과값이 1개인 경우 (얘는 결국 상관SUBQUERY에 속해있단 뜻)

유형을 이렇게 정리할 수 있겠다. 필자가 공부한 다중행 SUBQUERY내의 연산자 까지만 알아보자.

다중행 SUBQUERY 연산자
1. ANY : 서브쿼리 결과중 하나라도 참이면 참
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY > ANY(2000000,5000000);
그리고
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY < ANY(2000000,5000000);
2. ALL : 서브쿼리 결과가 모두 참이라면 참
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY > ALL(2000000,5000000);
그리고
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY < ALL(2000000,5000000);
3. EXISTS : 서브쿼리 결과 중 만족하는 값이 하나라도 존재하면 참
SELECT EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE E1
WHERE
EXISTS
(
SELECT EMP_NAME FROM EMPLOYEE E2 WHERE NVL(BONUS,0)>=0.3
);
그리고
SELECT EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE E1
WHERE
EXISTS
(
SELECT EMP_NAME FROM EMPLOYEE E2 WHERE NVL(E1.BONUS,0)>=0.3
);

진짜 긴 포스팅이었던 것 같다. 너무 길어서 중간에 좀 생략된 부분들도 있는 것 같다.
귀찮기도 하고 너무 TMI인가 싶기도했다. 오늘은 여기까지!

0개의 댓글