사용예)2005년 4-6월 남여회원별 평균 구매금액을 조회하시오.
--구분 : 성별 / 평균 구매금액, 필요테이블 : 3개
SELECT CASE WHEN SUBSTR(B.MEM_REGNO2,1,1) IN(1,3) THEN '남성회원' ELSE '여성회원' END AS 구분,
ROUND(AVG(A.CART_QTY*C.PROD_PRICE)) AS 평균구매금액
FROM CART A, MEMBER B, PROD C
WHERE SUBSTR(A.CART_NO,1,6) BETWEEN '200504' AND '200506'
AND A.CART_MEMBER=B.MEM_ID
AND A.CART_PROD=PROD_ID
GROUP BY CASE WHEN SUBSTR(B.MEM_REGNO2,1,1) IN(1,3) THEN '남성회원' ELSE '여성회원' END;
사용예)2005년 4-6 월별, 평균 구매금액을 조회하시오.
--구분 : 성별 / 평균 구매금액, 필요테이블 : 3개
SELECT SUBSTR(A.CART_NO,5,2) AS 월,
CASE WHEN SUBSTR(B.MEM_REGNO2,1,1) IN(1,3) THEN '남성회원' ELSE '여성회원' END AS 구분,
ROUND(AVG(A.CART_QTY*C.PROD_PRICE)) AS 평균구매금액
FROM CART A, MEMBER B, PROD C
WHERE SUBSTR(A.CART_NO,1,6) BETWEEN '200504' AND '200506'
AND A.CART_MEMBER=B.MEM_ID
AND A.CART_PROD=PROD_ID
GROUP BY SUBSTR(A.CART_NO,5,2),
CASE WHEN SUBSTR(B.MEM_REGNO2,1,1) IN(1,3) THEN '남성회원' ELSE '여성회원' END
ORDER BY 1;
숙제01)미국에 위치한 각 부서별 평균임금을 계산하고 자신이 속한 부서의 평균급여보다 급여를 더 받는 사원을 조회하시오.
Alias는 사원번호,사원명,부서명,급여,부서평균급여
제출기한 : 10월 15일
제출방법 : SEM-PC
파일명 : 자신의 이름_제출일자.txt(메모장 등을 이용한 문서)
3)COUNT(*|컬럼명) --숫자로 반환됨
사용예)각 부서별 사원수를 조회하시오
SELECT DEPARTMENT_ID AS 부서코드,
COUNT(*) AS 사원수1,
COUNT(PHONE_NUMBER) AS 사원수2
FROM EMP
GROUP BY DEPARTMENT_ID
ORDER BY 1;
---사원 수 1,2 모두 같은 값 도출
사용예)모든 부서별 사원수를 조회하시오 -- 모든이라는 말이 들어가면 : 외부조인(OUTER JOIN)
=> 외부조인에서 COUNT(*)를 사용하면 안됨!!
SELECT B.DEPARTMENT_ID AS 부서코드,
B.DEPARTMENT_NAME AS 부서명,
COUNT(A.JOB_ID) AS 사원수
-- COUNT 안에 A테이블의 컬럼을 쓰면 됨 '*'사용불가 ##이것만 주의하기
FROM EMP A ,DEPT B
WHERE A.DEPARTMENT_ID(+)=B.DEPARTMENT_ID
--EMP의 부서코드 : 12개(NULL 포함) DEPT의 부서코드 : 27개(작은 쪽에 + : 아우터조인)
GROUP BY B.DEPARTMENT_ID,B.DEPARTMENT_NAME
ORDER BY 1;
SELECT DISTINCT DEPARTMENT_ID
FROM DEPT;
사용예)2005년 1-6월 제품별 매입건수를 조회하시오
SELECT BUY_PROD AS 제품코드,
COUNT(*) AS 매입건수
FROM BUYPROD
WHERE BUY_DATE BETWEEN TO_DATE('20050101') AND TO_DATE('20050630')
GROUP BY BUY_PROD
ORDER BY 1;
사용예)사원테이블에서 년도별 입사인원을 조회하시오
SELECT EXTRACT(YEAR FROM HIRE_DATE) AS 연도,
COUNT(*) AS 입사인원 -- 조인이 없을 때는 * 사용가능
FROM EMP
GROUP BY EXTRACT(YEAR FROM HIRE_DATE)
ORDER BY 1;
GROUP BY 절 다음에는 집계함수를 쓰지 않은 일반컬럼 사용
집계함수를 쓰면 SELECT절에서 쓴 일반컬럼(집계함수를 쓰지 않은)들은 100% GROUP BY절에 와야한다.
COUNT(*) : * 를 쓰면 열(컬럼명)의 도메인(자료 수)이 몇 개 인지 세준다.
서브쿼리가 들어가는 SQL의 특징
1. 지문(요구사항)이 짧다.
2. 쿼리가 길다.
SELECT, FROM, WHERE절에서 서브쿼리가 쓰일 수 있다.
VIEW 창에서 왼쪽에 나타나는 숫자열은 : ROWNUM
사용예)2005년도 제품별 매출건수,매출수량합계 및 매출금액합계를 조회하되 매출건수가 5회 이상인 제품만 조회하시오.
Alias는 제품코드,제품명,매출건수,매출수량합계,매출금액합계
SELECT A.CART_PROD AS 제품코드,
B.PROD_NAME AS 제품명,
COUNT(*) AS 매출건수,
SUM(A.CART_QTY) AS 매출수량합계,
TO_CHAR(SUM(A.CART_QTY*B.PROD_PRICE),'9,999,999') AS 매출금액합계
FROM CART A,PROD B
WHERE A.CART_NO LIKE '2005%'
AND A.CART_PROD=B.PROD_ID
GROUP BY A.CART_PROD,B.PROD_NAME
HAVING COUNT(*)>=5
ORDER BY 1;
4)MAX(col), MIN(col)
사용예)각 부서별 최대급여와 최소급여를 조회하시오 --최대값을 가지는 사원을 구하는 게 아님, 최대값을 구하는 것
SELECT DEPARTMENT_ID AS 부서코드,
MAX(SALARY) AS 최대급여,
MIN(SALARY) AS 최소급여
FROM HR.EMP
GROUP BY DEPARTMENT_ID
ORDER BY 1;
사용예)각 부서별 최대급여와 최소급여를 받는 사람을 조회하시오
(최대급여)
SELECT DEPARTMENT_ID AS DID,
MAX(SALARY) AS MSAL
FROM EMP
GROUP BY DEPARTMENT_ID
ORDER BY 2 DESC;
(최소급여)
SELECT DEPARTMENT_ID AS DID,
MIN(SALARY) AS NSAL
FROM EMP
GROUP BY DEPARTMENT_ID
ORDER BY 2;
(최대급여 사원정보)
SELECT B.EMPLOYEE_ID AS 사원번호,
B.EMP_NAME AS 사원명,
A.DID AS 부서코드,
A.MSAL AS 최대급여
FROM (SELECT DEPARTMENT_ID AS DID, --인라인 서브쿼리
MAX(SALARY) AS MSAL
FROM HR.EMP
GROUP BY DEPARTMENT_ID)A,
HR.EMP B
WHERE A.DID=B.DEPARTMENT_ID
AND A.MSAL=B.SALARY
ORDER BY 3;
(최소급여 사원정보)
SELECT B.EMPLOYEE_ID AS 사원번호,
B.EMP_NAME AS 사원명,
A.DID AS 부서코드,
A.NSAL AS 최대급여
FROM(SELECT DEPARTMENT_ID AS DID,
MIN(SALARY) AS NSAL
FROM EMP
GROUP BY DEPARTMENT_ID)A,
HR.EMP B
WHERE A.DID=B.DEPARTMENT_ID
AND A.NSAL=B.SALARY
ORDER BY 3;
--집계함수는 중첩될 수 없다.
사용예)각 부서별 급여가 많은 5명의 사원정보 조회
--실행순서 : FROM -> WHERE -> SELECT절 순(원하는 형태대로 하려면 서브쿼리필요)
SELECT A.EMP_NAME,
A.SALARY
FROM (SELECT EMP_NAME,
SALARY
FROM HR.EMP
ORDER BY 2 DESC)A
WHERE ROWNUM<=5;
5) ROLLUP(col[,col,...])