행 하나당 하나의 값을 반환
함수를 호출한 위치는 하나의 값으로 대체
LOWER('A') -> a
LENGTH('ABCD') -> 4
=> 내장함수
NVL( ) : NULL값을 다른 값으로 대체
NVL2( ) : 값이 NULL인지 여부에 따라 다른 값으로 반환
여러 개의 행에 하나의 값을 반환
NULL 값은 계산에 제외, NULL인 행은 반환X
COUNT( ) : 데이터 행의 개수를 반환
MAX( ) : 지정된 칼럼에서 가장 큰 값을 반환
MIN( ) : 지정된 칼럼에서 가장 작은 값을 반환
SUM( ) : 지정된 칼럼의 데이터 총 합계
AVG( ) : 지정된 칼럼의 데이터 평균값
NULL값 처리
SELECT AVG(NVL('칼럼1', 0)) FROM 테이블명;
~별 -> GROUP BY
SELECT 칼럼1, 칼럼2 FROM 테이블명 GROUP BY 칼럼1, 칼럼2;
5 SELECT
1 FROM
2 WHERE
3 GROUP BY 그룹화
4 HAVING 특정 그룹 조건 추가
6 ORDER BY
GROUP으로 묶은 칼럼만 SELECT 가능
SELECT 칼럼1, AVG(칼럼2) FROM 테이블명 GROUP BY 칼럼1; -> 출력O
SELECT 칼럼1, 칼럼2, AVG(칼럼3) FROM 테이블명 GROUP BY 칼럼1; -> ERROR
여러 테이블을 결합해 데이터 사용
JOIN 조건을 주지 않는다면 모든 데이터의 가능한 조합을 다 하기에 조건을 주어 추린다
SELECT 칼럼1, 칼럼2, 칼럼3
FROM 테이블명1, 테이블명2
WHERE 테이블명1.칼럼 = 테이블명2.칼럼
WHERE절에 조건이 많이 들어가면 가독성이 떨어지기에 ANSI JOIN을 사용
테이블명에 별칭 지정 시 AS 사용하지 않고 한 칸 띄고 지정
SELECT 칼럼1 FROM 테이블명1 a, 테이블명2 b WHERE a.칼럼2 = b.칼럼2;
-> INNER 생략 가능 DEFAULT JOIN
SELECT 칼럼1, 칼럼2, 칼럼3
FROM 테이블명1
(INNER) JOIN 테이블명2
ON 테이블명1.칼럼 = 테이블2.칼럼
테이블1에 있는 데이터, 테이블2에 없는 데이터를 추가할 경우
테이블1 쪽이 튀어나온다 => 왼쪽이 튀어나옴
OUTER 생략 가능
SELECT 칼럼1, 칼럼2
FROM 테이블명1
LEFT (OUTER) JOIN 테이블명2
ON 테이블명1.칼럼3 = 테이블명2.칼럼3
SELECT 칼럼1, 칼럼2
FROM 테이블명1, 테이블명2
WHERE 테이블명1. 칼럼3 = 테이블명2.칼럼3(+);

테이블1에 없는 데이터, 테이블2에 있는 데이터를 추가할 경우
테이블2 쪽이 튀어나온다 => 오른쪽이 튀어나옴
OUTER 생략 가능
SELECT 칼럼1, 칼럼2
FROM 테이블명1
RIGHT (OUTER) JOIN 테이블명2
ON 테이블명1.칼럼3 = 테이블명2.칼럼3
SELECT 칼럼1, 칼럼2
FROM 테이블명1, 테이블명2
WHERE 테이블명1. 칼럼3(+) = 테이블명2.칼럼3;
SELECT 칼럼1, 칼럼2
FROM 테이블명1
FULL OUTER JOIN 테이블명2
ON 테이블명1.칼럼3 = 테이블명2.칼럼3
동일한 테이블을 JOIN하는 경우, 테이블 별칭을 무조건 지정해야 한다
SELECT a.칼럼1, b.칼럼2
FROM 테이블명1 a
INNER JOIN 테이블명1 b
ON a.칼럼3 = b.칼럼3;
SELECT a.칼럼1, b.칼럼2
FROM 테이블명1 a, 테이블명1 b
WHERE a.칼럼3 = b.칼럼3;
두 테이블의 모든 행을 조합, 교차곱을 생성
SELECT 칼럼1, 칼럼2
FROM 테이블명1
CROSS JOIN 테이블명2
SELECT 칼럼1, 칼럼2
FROM 테이블명1, 테이블명2
USING()
두 테이블의 칼럼명이 같은 경우, USING절을 이용하면 열의 정의가 명확해지며 쉽게 JOIN 가능
SELECT 컬럼1, 컬럼2, 컬럼3
FROM 테이블명1
INNER JOIN 테이블명2 USING(칼럼1);
SQL문 안에서 또 다른 쿼리가 존재
SELECT 칼럼1, 칼럼2, 칼럼3
FROM (SELECT 칼럼1, 칼럼2 FROM 테이블명 [ORDER BY 컬럼1 ASC:DESC]);
sql문 안에 또 다른 SELECT문을 서브쿼리라고 한다
ROWNUM() : SELECT하는 시점에 행 번호를 자동으로 부여하는 가상의 칼럼
<예시>
정렬된 결과에 대해서 ROWNUM을 부여
SELECT name, job, ROWNUM
FROM (SELECT name, job FROM company ORDER BY name ASC)
RNUM의 순서를 따로 지정
별칭을 SELECT할 때 사용 가능
SELECT result1.*, ROWNUM AS rnum
FROM(SELECT name, job FROM company ORDER BY name ASC) result1;
서브 쿼리에 result1이라는 별칭 지정
위의 결과값 중에 RNUM의 값이 1~5 까지인 결과 출력
SELECT *
FROM (SELECT result1.*, ROWNUM rnum
FROM (SELECT eame, job
FROM company ORDER BY name ASC) result1)
WHERE rnum BETWEEN 1 AND 5;
정렬 작업 : SELECT eame, job FROM company ORDER BY name ASC) result1
행번호 부여 : SELECT result1.*, ROWNUM rnum
FROM (SELECT eame, job
FROM company ORDER BY name ASC) result1
원하는 ROW만 SELECT : SELECT *
FROM (SELECT result1.*, ROWNUM rnum
FROM (SELECT eame, job
FROM company ORDER BY name ASC) result1)
WHERE rnum BETWEEN 1 AND 5;
단일 값을 반환하는 서브쿼리
주로 = 이나 비교 연산자와 함께 사용
SELECT 칼럼1, 칼럼2
FROM 테이블명
WHERE 칼럼3 = (
SELECT 칼럼3
FROM 테이블명2
WHERE 칼럼4 = "XXXX"
);
=> 값이 하나로 반환
여러 행을 반환하는 서브쿼리
주로 IN, ANY, ALL 연산자와 함께 사용
SELECT 칼럼1, 칼럼2
FROM 테이블명
WHERE 칼럼3 IN (
SELECT 칼럼3
FROM 테이블명2
WHERE 칼럼4 = "XXXX"
);
=> 값이 여러 개로 반환
SELECT 칼럼1, 칼럼2
FROM 테이블명
WHERE 칼럼3 IN (XXX, XXX, XXX);
서브 쿼리가 메인 쿼리의 각 행에 의존적으로 실행
메인 쿼리와 서브 쿼리 사이 간에 참조 관계