2020년 11월 02일
업데이트:
ORDER BY
SELECT한 컬럼을 정렬하기 위해 작성하는 구문으로, SELECT 구문의 가장 마지막에 작성하며 실행 순서 역시 가장 마지막에 수행된다.
SELECT 컬럼명 [, 컬럼명, ...]
FROM 테이블명
WHERE 조건식
ORDER BY 컬럼명 | 별칭 | 컬럼순번 정렬방식 [NULLS FIRST | LAST];
-- 정렬 방식
-- ASC : 오름차순
-- DESC : 내림차순
GROUP BY
여러 개의 결과 값을 산출하기 위해 그룹 함수가 적용될 그룹의 기준을 GROUP BY 절에 기술하여 사용한다.
GROUP BY 컬럼명 | 함수식 [, 컬럼명 | 함수식, ...]
-- SELECT 절에는 GROUP BY에 작성된 컬럼명 또는 그룹함수만 작성이 가능하다.
-- 부서별 급여 합 조회
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
-- EMPLOYEE 테이블에서 부서 코드, 부서별 급여 합, 부서별 급여 평균, 부서별 인원 수를 부서 코드 순으로 조회
SELECT DEPT_CODE, SUM(SALARY) "급여 합",
FLOOR(AVG(SALARY)) "급여 평균", COUNT(*) "인원 수"
FROM EMPLOYEE
GROUP BY DEPT_CODE
ORDER BY DEPT_CODE;
-- EMPLOYEE 테이블에서 부서별로 보너스를 받는 사원의 수를 부서 역순으로 조회
SELECT DEPT_CODE, COUNT(BONUS) "보너스 받는 인원 수"
FROM EMPLOYEE
GROUP BY DEPT_CODE
ORDER BY DEPT_CODE DESC NULLS LAST;
-- EMPLOYEE 테이블에서 각 성별의 급여 평균, 급여 합, 인원 수를
-- 인원 수 오름차순으로 조회
SELECT DECODE(SUBSTR(EMP_NO, 8, 1), '1', '남', '2', '여') 성별,
FLOOR(AVG(SALARY)) "급여 평균",
SUM(SALARY) "급여 합",
COUNT(*) "인원 수"
FROM EMPLOYEE
GROUP BY DECODE(SUBSTR(EMP_NO, 8, 1), '1', '남', '2', '여') ;
-- EMPLOYEE 테이블에서 각 성별의 급여 평균, 급여 합, 인원 수를
-- 인원 수 내림차순으로 조회
SELECT DECODE(SUBSTR(EMP_NO, 8, 1), '1', '남', '2', '여') 성별,
FLOOR(AVG(SALARY)) "급여 평균",
SUM(SALARY) "급여 합",
COUNT(*) "인원 수"
FROM EMPLOYEE
GROUP BY DECODE(SUBSTR(EMP_NO, 8, 1), '1', '남', '2', '여')
ORDER BY "인원 수" ASC;
--- EMPLOYEE 테이블에서 부서 코드가 'D5', 'D6'인 부서의 급여 평균 조회
SELECT DEPT_CODE, FLOOR(AVG(SALARY)) "급여 평균" -- 4순위
FROM EMPLOYEE -- 1 순위
WHERE DEPT_CODE IN ('D5', 'D6') -- 2 순위
GROUP BY DEPT_CODE; -- 3순위
-- EMPLOYEE 테이블에서 직급 코드별 2000년도 이후 입사자들의 급여 합 조회
SELECT JOB_CODE, SUM(SALARY) "급여 합"
FROM EMPLOYEE
WHERE EXTRACT(YEAR FROM HIRE_DATE) >= 2000
-- WHERE HIRE_DATE >= '00/01/01' 이런 식으로 작성 가능
-- WHERE HIRE_DATE >= TO_DATE('200000101', 'YYYYMMDD') 도 가 능
GROUP BY JOB_CODE
ORDER BY JOB_CODE;
-- 여러 컬럼을 묶어서 그룹으로 지정하는 경우
-- EMPLOYEE 테이블에서
-- 부서별로 특정 직급코드의 인원 수와 급여 합을
-- 부서코드 오름차순, 직급코드 내림차순
SELECT DEPT_CODE, JOB_CODE, COUNT(*) "인원 수", SUM(SALARY) "급여 합"
FROM EMPLOYEE
GROUP BY DEPT_CODE, JOB_CODE
ORDER BY DEPT_CODE, JOB_CODE DESC;
-- ** GROUP BY 절에 작성되지 않은 컬럼은 SELECT 절에 작성할 수 없다
-- EMPLOYEE 테이블에서
-- 부서 별로 급여 등급이 같은 직원의 수를 부서코드별 급여 등급 오름차순으로 정렬
SELECT DEPT_CODE, SAL_LEVEL, COUNT(*) "인원 수"
FROM EMPLOYEE
GROUP BY DEPT_CODE, SAL_LEVEL
ORDER BY DEPT_CODE, SAL_LEVEL;
HAVING
그룹 함수로 값을 구해올 그룹에 대해 조건을 설정할 때 HAVING 절에 기술한다. 참고로 WHERE 절은 각 컬럼 값에 대한 조건이므로 헷갈리지 않도록 주의.
-- EMPLOYEE 테이블에서 부서별 급여 평균이 3백만 이상인 부서를
-- 부서 코드 오름차순으로 조회
SELECT DEPT_CODE, FLOOR(AVG(SALARY)) "급여 평균"
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING FLOOR(AVG(SALARY)) >= 3000000
ORDER BY DEPT_CODE;
-- EMPLOYEE 테이블에서 부서별 급여 합이 9백만 초과인 부서를
-- 부서 코드 오름차순으로 조회
SELECT DEPT_CODE, SUM(SALARY) "급여 합"
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING SUM(SALARY) > 9000000
ORDER BY DEPT_CODE;
SELECT 해석 순서
/* SELECT 해석 순서
5 : SELECT 컬럼명 AS 별칭, 계산식, 함수식
1 : FROM 참조할 테이블명
+ JOIN
2 : WHERE 컬럼명 | 함수식 | 결과가 TRUE / FALSE
3 : GROUP BY 그룹을 묶을 컬럼명
4 : HAVING 그룹함수식 비교연산자 비교값
6 : ORDER BY 컬럼명 | 컬럼순서 | 별칭 정렬방식 [NULLS FIRST | LAST];
*/
집계 함수
그룹 별 산출한 결과 값의 집계를 계산하는 함수이다.
ROLLUP
인자로 전달받은 그룹 중 가장 먼저 지정한 그룹별로 추가적인 집계 결과를 반환한다.
-- ROLLUP 집계 함수 :
-- 그룹별 '중간 집계'와 '전체 집계'를 계산하여 결과를 행에 자동 추가해주는 함수
SELECT JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY ROLLUP(JOB_CODE)
ORDER BY 1;
-- EMPLOYEE 테이블에서 각 부서에 소속된 직급별 급여 합을
-- 단, 부서별 급여 합, 직급별 급여 합, 전체 급여 합 결과 추가
SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY ROLLUP(DEPT_CODE, JOB_CODE)
ORDER BY 1;
CUBE
인자로 지정된 그룹들로 가능한 모든 조합 별로 집계한 결과를 반환한다.
-- CUBE 집계 함수 : ROLLUP + 그룹으로 지정된 모든 그룹에 대한 집계 결과 추가
SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY CUBE(DEPT_CODE, JOB_CODE)
ORDER BY 1;
GROUPING
ROLLUP, CUBE에 의한 산출물이 인자로 전달받은 컬럼 집합의 산출물이면 0, 아니면 1을 반환하는 함수이다.
SELECT DEPT_CODE, JOB_CODE, SUM(SALARY),
GROUPING(DEPT_CODE) "부서별 그룹",
GROUPING(JOB_CODE) "직급별 그룹"
FROM EMPLOYEE
GROUP BY ROLLUP(DEPT_CODE, JOB_CODE)
ORDER BY 1;
SELECT DEPT_CODE, JOB_CODE, SUM(SALARY),
CASE WHEN GROUPING(DEPT_CODE) = 0 AND GROUPING(JOB_CODE) = 1 THEN '부서'
WHEN GROUPING(DEPT_CODE) =1 AND GROUPING(JOB_CODE) = 0 THEN '직급'
WHEN GROUPING(DEPT_CODE) =1 AND GROUPING(JOB_CODE) = 1 THEN '총합'
ELSE '부서별 직급'
END 구분
FROM EMPLOYEE
GROUP BY CUBE(DEPT_CODE, JOB_CODE)
ORDER BY 1;
집합 연산자(SET OPERATION)
여러 개의 SELECT 결과물을 하나의 쿼리로 만드는 연산자이다. 서로 다른 조건에 의해 결과가 다른 SELECT문을 하나로 결합하고 싶을 때 사용한다.
UNION(합집합)
여러 개의 쿼리 결과를 합치는 연산자로 중복된 영역은 제외하고 합친다.
-- EMPLOYEE 테이블에서
-- 부서 코드가 'D5'인 직원이거나 급여가 300만 초과인 직원의
-- 사번, 이름, 부서 코드, 급여 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
--> UNION은 OR 연산과 같은 결과를 반환한다.
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' OR SALARY > 3000000;
INTERSECT(교집합)
여러 개의 SELECT 결과에서 공통된 부분만 결과로 추출한다.
-- INTERSECT(교집합)
-- RESULT SET 중 공통되는 행만 조회한다.
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
INTERSECT
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
--> INTERSECT는 AND 연산과 같은 결과를 반환한다.
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
AND SALARY > 3000000;
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;
MINUS(차집합)
선행 SELECT 결과에서 다음 SELECT 결과와 겹치는 부분을 제외한 나머지 부분을 추출한다.
-- 부서코드가 'D5'인 직원 중 월급이 300만 초과한 사람을 제외한 결과를 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
MINUS
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
JOIN
하나 이상의 테이블에서 데이터를 조회하기 위해 사용하고 수행 결과는 하나의 Result Set으로 나온다.
INNER JOIN / OUTER JOIN
기본적으로 JOIN은 INNER JOIN이며, 두 개 이상의 테이블을 조인할 때 일치하는 값이 없는 행은 조인에서 제외된다. OUTER JOIN은 일치하지 않은 값도 포함이 되며 반드시 OUTER JOIN을 명시해야 한다.
-- 1.내부 조인(INNER JOIN) ( == 등가 조인(EQAUL JOIN) )
--> 연결된 컬럼의 값이 일치하는 행들만 조인이 이루어짐
-- (== 컬럼 값이 일치하지 않는 행은 조인에서 제외됨)
-- *ANSI 표준 구문
-- ANSI는 미국 국립 표준 협회를 뜻함, 미국의 산업표준을 제정하는 민간단체로
-- 국제표준화기구 ISO에 가입되어있다.
-- ANSI에서 제정된 표준을 ANSI라고 하고
-- 여기서 제정한 표준 중 가장 유명한 것이 ASCII코드이다.
-- *오라클 전용 구문
-- FROM절에 ','로 구분하여 합치게 될 테이블명을 기술하고
-- WHERE절에 합치기에 사용할 컬럼명을 명시한다
-- 1) 연결에 사용할 두 컬럼명이 다른 경우
-- EMPLOYEE, DEPARTMENT 테이블을 참조하여
-- 사번, 이름, 부서 코드, 부서명 조회
-- EMPLOYEE 테이블에서 부서 코드 : DEPT_CODE
-- ERPARTMENT : 테이블에서 부서 코드 : DEPT_ID
----> 동일한 컬럼의 의미, 동일한 ㅇ데이터의 형태를 띔 == 조인 가능
-- ANSI 방식
-- 연결에 사용할 컬럼명이 다른 경우
-- JOIN 테이블명 ON(컬럼명1 = 컬럼명 2)
SELECT EMP_ID, EMP_NAME, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 오라클 방식
SELECT EMP_ID, EMP_NAME, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
-- DEPARTMENT, LOCATION 테이블을 참조하여
-- 부서명, 지역명 조회
-- ANSI
SELECT DEPT_TITLE, LOCAL_NAME
FROM DEPARTMENT
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);
-- 오라클
SELECT DEPT_TITLE, LOCAL_NAME
FROM DEPARTMENT, LOCATION
WHERE LOCATION_ID = LOCAL_CODE;
-- 2) 연결에 사용할 두 컬럼명이 같을 경우
-- EMPLOYEE, JOB 테이블을 참조하여
-- 사번, 이름, 직급 코드, 직급명 조회
-- ANSI
-- 연결에 사용할 컬럼명이 같은 경우 JOIN 테이블명 USING(같은 컬럼명)
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
-- 오라클
-- 방법 1) 같은 컬럼명을 구분하기 위해 테이블명으로 구분
SELECT EMP_ID, EMP_NAME, EMPLOYEE.JOB_CODE, JOB_NAME
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;
-- 방법 2) 테이블명에 별칭을 지정하여 구분하는데 사용
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
/* 2. 외부 조인(OUTER JOIN) ( == 포괄 조인 )
-- 두 테이블의 지정한 컬럼값이 일치하지 않는 행도 조인에 포함 시킴
* OUTER JOIN은 반드시 명시해야 함
*/
-- INNER JOIN과 OUTER JOIN을 비교하기 위한 SQL 구문
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID); -- 21명 조회
-- 1) LEFT [OUTER] JOIN
-- 합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 모든 컬럼을 기준으로 조인
-- (NULL 제외하지 않음)
-- ANSI
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
LEFT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 오라클 (+)
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
-- 왼쪽(DEPT_CODE)를 기준으로 하여 오른쪽(DEPT_ID)를 맞춰서 추가
-- 2) RIGHT [OUTER] JOIN
-- 합치기에 사용한 두 테이블 중 오른편에 기술된 테이블의 모든 컬럼을 기준으로 조인
-- (NULL 제외하지 않음)
-- ANSI
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
RIGHT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID); --24 행
-- 오른쪽에 조인이 되지 않았던 해외영업 3부, 마케팅부, 국내영업부가 추가됨
-- 오라클 (+)
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
-- 3) FULL [OUTER] JOIN
-- 합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함
--> LEFT 합집합 RIGHT
-- ANSI
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID); --24 행
-- 오라클은 FULL OUTER 불가
--SELECT EMP_NAME, DEPT_TITLE
--FROM EMPLOYEE, DEPARTMENT
--WHERE DEPT_CODE(+) = DEPT_ID;
CROSS JOIN(교차 조인)
카테시안 곱(CARTESIAN PRODUCT)라고도 하며 조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 조인 방법이다. 검색되는 데이터 수는 ‘행의 컬럼의 수 * 또 다른 행의 컬럼 수’로 나온다.
-- 3.교차 조인(CROSS JOIN) (== CARTESIAN PRODUCT, 곱집합)
-- 조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법
SELECT EMP_NAME
FROM EMPLOYEE; -- 23행
SELECT DEPT_TITLE FROM DEPARTMENT; -- 9행
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT; -- 207행 = 23 * 9
비등가 조인(NON_EQAUL JOIN)
’=’를 사용하지 않으며, 지정한 컬럼 값이 일치하는 경우가 아닌 값의 범위에 포함되는 행들을 연결하는 방식이다.
-- 4. 비등가 조인(NON EQAUL JOIN)
-- '='(등호)를 사용하지 않는 조인문
-- 지정한 컬럼 값이 일치하는 경우(등가)가 아닌
-- 지정한 컬럼 값이 일정 범위 내에 포함되는 값일 경우 조인 수행
--EMPLOYEE, SAL_GRADE를 참조하여
-- 자신의 급여등급에 맞는 급여를 받고 있는 사람들의
-- 이름, 급여, 급여 등급 조회
SELECT EMP_NAME, SALARY, EMPLOYEE.SAL_LEVEL
FROM EMPLOYEE
JOIN SAL_GRADE ON (SALARY BETWEEN MIN_SAL AND MAX_SAL);
-- S1 600백만 600만 ~ 1000만 사이니?
SELF JOIN(자체 조인)
두 개 이상의 서로 다른 테이블을 연결하는 것이 아닌 같은 테이블을 조인한다.
-- 5. 자체 조인(SELF JOIN)
-- 같은 테이블을 조인한다.
--> 동일한 테이블 두 개를 조인하는 모양
-- EMPLOYEE 테이블에서
-- 사번, 이름, 관리자 사번, 관리자 이름 조회
-- ANSI
SELECT E.EMP_ID, E.EMP_NAME, E.MANAGER_ID "관리자 사번", M.EMP_NAME "관리자 이름"
FROM EMPLOYEE E
--JOIN EMPLOYEE M ON(E.MANAGER_ID = M.EMP_ID); -- 15행(INNER JOIN)
LEFT JOIN EMPLOYEE M ON (E.MANAGER_ID = M.EMP_ID); -- 23행*(LEFT OUTER JOIN)
-- 오라클
SELECT E.EMP_ID, E.EMP_NAME, E.MANAGER_ID "관리자 사번", M.EMP_NAME "관리자 이름"
FROM EMPLOYEE E, EMPLOYEE M
--WHERE E.MANAGER_ID = M.EMP_ID; --15행(등가조인)
WHERE E.MANAGER_ID = M.EMP_ID(+); --23행 왼쪽 포괄 조인)
NATURAL JOIN(자연 조인)
조인하려는 두 테이블이 동일한 타입과 이름을 가진 컬럼이 있다면 자동적으로 조인이 이루어지도록 하는 구문이다. 반드시 동일한 타입과 이름의 컬럼이 존재해야 하며, 해당 조건이 만족되지 않으면 CROSS JOIN이 일어난다.
-- EMPLOYEE, JOB 테이블을 참조하여
-- 사번, 이름, 직급코드, 직급명 조회
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE);
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
NATURAL JOIN JOB;
-- 컬럼명 또는 데이터 타입이 다른 경우 크로스 조인이 나타남
SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
NATURAL JOIN DEPARTMENT;
다중 조인
하나 이상의 테이블에서 데이터를 조회하기 위해 사용하고 수행 결과는 하나의 RESULT SET으로 나온다.
-- N개의 테이블을 조인할 때 사용함
-- 조인 순서 중요(★★★★★★★)
-- EMPLOYEE, DEPARTMENT, LOCATION 테이블을 참조하여
-- 사번, 사원명, 부서명, 지역명 조회
--ANSI
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);
-- 조인 순서를 지키지 않은 경우
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE)
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- EMPLOYEE 테이블에는 LOCATION_ID라는 컬럼이 없기 때문에
-- EMPLOYEE, LOCATION 테이블의 등가 조인이 성립하지 않음
-- 오라클
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID
AND LOCATION_ID = LOCAL_CODE;
--------------23명 모든 사원 조회
-- ANSI
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
LEFT JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);
-- 직급이 대리이면서 아시아 지역에 근무하는 직원 조회
-- 사번, 이름, 직급명, 부서명, 근무지역명, 급여를 조회하세요
--ANSI
SELECT EMP_ID, EMP_NAME,JOB_NAME, DEPT_TITLE, LOCAL_NAME, SALARY
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE)
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE)
WHERE JOB_NAME = '대리' AND LOCAL_NAME LIKE 'ASIA%';
-- 오라클
SELECT EMP_ID, EMP_NAME,JOB_NAME, DEPT_TITLE, LOCAL_NAME, SALARY
FROM EMPLOYEE E, JOB J, DEPARTMENT, LOCATION
WHERE E.JOB_CODE = J.JOB_CODE AND
DEPT_CODE = DEPT_ID AND LOCATION_ID = LOCAL_CODE
AND JOB_NAME = '대리' AND LOCAL_NAME LIKE 'ASIA%';
댓글남기기