복수행 함수(그룹함수) = 행이 여러개일때 행이 하나 나온다.
COUNT
(컬럼명) = 행의 갯수
SELECT COUNT(ENAME) FROM EMP;
SELECT COUNT(*) FROM EMP;
SUM
(컬럼명) = 해당 컬럼의 합
SELECT SUM(SAL) 급여합 FROM EMP;
AVG
(컬럼명) = 해당 컬럼의 평균
SELECT AVG(SAL) 급여평균 FROM EMP;
MIN
(컬럼명),MAX
(컬럼명) = 해당 컬럼의 최소,최대값
SELECT MIN(SAL) 최소급여, MAX(SAL) 최대급여 FROM EMP;
GROUP BY
= 컬럼을 기준으로 그룹으로 묶음
- 형식
< 실행순서 >
SELECT 컬럼명,.. -------- 5
FROM 테이블명 -------- 1
WHERE 조건절 -------- 2
GROUP BY 컬럼명 -------- 3
HAVING 조건절 -------- 4
ORDER BY 기준컬럼 -------- 6
하나의 SQL문장절에 포함된 또 다른 SELECT문장. 두번 질의를 해야 얻을 수 있는 결과를 한번의 질의로 해결이 가능한 쿼리
1.단일행 서브쿼리
서브쿼리의 실행결과가 하나의 행만을 리턴해 주는 쿼리. 즉 하나의 데이터만을 리턴
연산자 : =
,<>
,>
,>=
,<
,<=
예)
사원번호가 7369인 사원과 같은 직업을 갖는 사원들의 사원번호,이름,직업을 출력
SELECT EMPNO,ENAME,JOB FROM EMP
WHERE JOB = (SELECT JOB FROM EMP WHERE EMPNO=7369);
예2)
사원급여가 평균급여보다 많은 사원들의 사원번호와 급여를 조회
SELECT EMPNO,SAL FROM EMP
WHERE SAL>(SELECT AVG(SAL) FROM EMP);
예3)
'ALLEN'과 같은 부서에 근무하는 사원들의 모든 정보를 조회
SELECT * FROM EMP
WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME='ALLEN');
서브쿼리의 실행결과가 여러개의 행을 리턴
연산자 : IN
,ANY
,ALL
사용가능하고 =
,<>
,>
,>=
,<
,<=
는 사용할 수 없다.
예1)
부서번호가 10번인 사원들의 급여와 같은 급여를 받는 사원들의 이름과 급여를 출력하시오.
SELECT ENAME,SAL FROM EMP
WHERE SAL IN(SELECT SAL FROM EMP WHERE DEPTNO=10);
예2)
부서번호가 10번인 사원의 급여와 같거나 많은 급여를 받는 사원의 이름과 급여를 출력하시오.
SELECT ENAME,SAL FROM EMP
WHERE SAL >= ANY(SELECT SAL FROM EMP WHERE DEPTNO=10);
예3) 30번 부서의 가장 많은 급여보다 더 많은 급여를 받는 사원번호,급여를 조회하시오.
SELECT EMPNO,SAL FROM EMP
WHERE SAL > ALL(SELECT SAL FROM EMP WHERE DEPTNO=30);
예4) 10번 부서사원들중에 20번 부서의 사원과 같은 직업을 갖는 / 사원의 사원번호,직업,입사일을 조회하시오.
SELECT EMPNO,JOB,HIREDATE FROM EMP
WHERE DEPTNO=10 AND JOB IN (SELECT JOB FROM EMP WHERE DEPTNO=20);
예5) 급여가 30번 부서의 최저급여보다 낮은 사원의 사원번호,이름,급여를 조회하시오.(ALL연산자사용)
--MIN함수쓰는게 더 좋다
SELECT EMPNO,ENAME,SAL FROM EMP
WHERE SAL < ALL(SELECT SAL FROM EMP WHERE DEPTNO=30);