
GROUP BY : 데이터 값이 같은 행끼리 묶어서 그룹화 (~~별 데이터 출력)
/* 전공별 학생수 출력 */
SELECT major1, COUNT(*) FROM student
GROUP BY major1;
ROULL UP : 하위 합계 생성
/* 부서별 전체 합계 */
SELECT deptno, SUM(salary)
FROM emp GROUP BY ROLLUP(deptno); -- DEPTNO 오름차순으로 정렬 후 해당 항목의 합계를 구함

GROUPING SET : 컬럼별 별도 처리
/* 부서별, 직업별 별도 합계 */
SELECT deptno, job, SUM(salary)
FROM emp GROUP BY GROUPING SETS(deptno, job);

CUBE : 결합 가능한 모든 그룹핑(모든 조합의 수)
/* 부서와 직급 조합별 합계 */
SELECT deptno, job, SUM(salary)
FROM emp GROUP BY CUBE(deptno, job);

HAVING : GROUP BY의 조건을 지정할 때 사용
/* 교수 직급별 평균급여가 300이상인 부서코드와 평균 급여 출력 */
SELECT deptno, AVG(salary) FROM professor
GROUP BY deptno
HAVING AVG(salary) >= 300;
SELECT 실행순서

실행순서에 유의하여 쿼리문을 작성할 것
JOIN : 한 개 이상의 테이블과 테이블을 연결할여 데이터를 조회하는 기법


SELECT
테이블명1.컬럼명, 테이블명2.컬러명, ...
FROM 테이블명1, 테이블명2
WHERE
테이블명1.컬럼명 = 테이블명2.컬럼명
( ORACLE과 MYSQL에서는 사용가능 )
SELECT
테이블명1.컬럼명, 테이블명2.컬러명, ...
FROM 테이블명1 JOIN 테이블명2
ON 테이블명1.컬럼명 = 테이블명2.컬럼명
( 국제표준 기법 )
OUTER JOIN : 양쪽 테이블 모두 조건이 만족하지 않아도, 한쪽 테이블의 데이터를 모두 출력 해야 하는 경우 사용

/* 학생명, 지도교수명 출력 (지도교수가 없는 학생도 출력)
*/
SELECT s.name, p.name
FROM student s,professor p
WHERE s.profno = p.no(+);
SELECT s.name, p.name
FROM student s LEFT JOIN professor p
ON s.profno = p.no;
SELECT level, empno, mgr, ename
FROM emp
START WITH MGR IS NULL -- 시작조건
CONNECT BY PRIOR empno = mgr; -- 조인조건

SELECT level, LPAD(' ', 4*(level-1)) || empno AS empno, mgr, ename
FROM emp
START WITH MGR IS NULL
CONNECT BY PRIOR empno = mgr;

sub-query : select안에 select구문이 포함된 구문

/* 양준혁 직원보다 급여가 많은 직원을 출력 */
SELECT ename, salary FROM emp
WHERE salary > (SELECT salary FROM emp WHERE ename = ‘양준혁’);
/* 1학년 학생들의 키와 같은 키를 가지고 있는 2학년 학생명과 학년, 키 출력 */
SELECT name, grade, height FROM student
WHERE height IN (SELECT height FROM student WHERE grade=1) AND grade=2;
/* 2학년 학생들의 가장 작은 키보다 큰 2학년 학생명과 학년, 키 출력 */
SELECT name, grade, height FROM student
WHERE height >= ANY (SELECT height FROM student WHERE grade=2) AND grade=2;
스칼라 서브쿼리 : 컬럼자리에 들어가는 서브쿼리
SELECT ename, d.deptno, dname
FROM emp e JOIN dept d
ON e.deptno = d.deptno; -- JOIN을 사용한 직원명, 부서코드, 부서명 출력
SELECT ename, deptno,
(SELECT dname FROM dept WHERE deptno=emp.deptno) dname
FROM emp; -- 스칼라 서브쿼리를 사용한 직원명, 부서코드, 부서명 출력
inline view 서브쿼리 : FROM절 뒤에 들어감
/* 직원명, 급여, 직급별 평균 급여 출력 */
SELECT ename, e.deptno, e.salary, v.salary
FROM emp e JOIN
(SELECT deptno, AVG(salary) salary FROM emp GROUP BY deptno) v
ON e.deptno = v.deptno;
ROWNUM 키워드를 통해 서브쿼리 사용
/* 페이지당 10개씩 출력되는 학생목록 첫 페이지 조회 */
SELECT * FROM (
SELECT ROWNUM as rnum, a.* FROM (
SELECT *
FROM student ORDER BY grade DESC
) a
) b
WHERE b.rnum BETWEEN 1 and 10;
/* 시작값 : (페이지-1) * 페이지당개수 + 1
끝값 : 페이지 * 페이지당개수 */
TCL(Transaction Control Language)