정규식을 이용한 패턴 연산
정규식(Regular Expression))이란?
-
특정한 규칙을 가진 문자열ㅇ늬 집합을 표현하는데 사용하는 형식의 언어
-
문자열을 처리하는 방법 중의 하나로, 특정한 조건의 문자를 검색하거나 치환하는 과정을 매우 간편하게 처리할 수 있도록 해주는 수단이다.
-
RegExLib.com => 정규표현식 참고 사이트
-
오라클에서는 단순히 LIKE를 사용해서는 안된다.
-
REGEXP_LIKE()
ex) SELECT * FROM NOTICE WHERE REGEXP_LIKE(TITIE, <정규식>);
<종류>
- 패턴
- . : 문자 하나
- | : 또는(OR), |로 구분된 문자에 해당하는 문자열을 찾음.
- [] : []안에 나열된 패턴에 해당하는 문자열을 찾음.
- ^ : 시작하는 문자열을 찾음.
- $ : 끝나는 문자열을 찾음.
- 수의 제한
- {m, n} : m회 이상 n회 이하 나타나는 문자
- ? : 0~1회 나타나는 문자
- 문자 그룹
- [A-z] 또는 [:alpha:] 또는 \a : 알파벳 대문자 또는 소문자인 문자열을 찾음
- [0-9] 또는 [:digit:] 또는 \d : 숫자인 문자열을 찾음
- 부정
- [^문자] : 괄호 안의 문자를 포함하지 않은 문자열을 찾음
문자열 비교를 위한 정규식
링크텍스트
ROWNUM 그리고 행 제한하기

- 옆에 비어있는 열이 ROWNUM에 해당된다.
- 조회된 순서대로 순번을 매긴다.
-- 5번째까지 추출
SELECT * FROM NOTICE WHERE ROWNUM BETWEEN 1 AND 5;
- 하지만 위의 코드는 틀렸다.
- 만약 아래와 같이 쿼리를 작성한다면 아무것도 추출되지 않을 것이다.
SELECT * FROM NOTICE WHERE ROWNUM BETWEEN 2 AND 8;
- 왜냐하면 ROWNUM은 테이블에서 하나의 ROW를 추출하면서 생성이되는 위의 코드에서는 2부터 8이기에 처음 ROWNUM이 1이여서 해당 ROW는 빼버린다. 그래서 애초에 아무것도 들어가지 못하면서 검색이 안되는 것이다.
- 아래와 같이 해야한다.
SELECT * FROM (SELECT ROWNUM NUM, NOTICE.* FROM NOTICE) WHERE NUM BETWEEN 2 AND 5;
- ROWNUM을 NUM으로 별칭을 붙여 NOTICE 테이블에 삽입하여 새로운 테이블을 형성한다.
- 그 다음 새로 생성된 테이블에서 NUM에 대하여 BETWEEN으로 ROW를 찾아주면 검색이 된다.
중복 값 제거 DISTINCT
- DISTINCT : 중복된 값은 하나의 ROW만을 보여준다.
오라클 함수
SELECT문의 구절
<작성 순서>
SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY
<동작 순서>
FROM -> CONNECT BY -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
- FROM
- WHERE
- GROUP BY(COUNT, AVG)
- 집계함수(SUM, MIN, MAX, COUNT, AVG)
SELECT WRITER_ID, COUNT(ID) FROM NOTICE GROUP BY WRITER_ID;
SELECT WRITER_ID, COUNT(ID) FROM NOTICE
GROUP BY WRITER_ID
HAVING COUNT(ID) <= 2;
- ORDER BY
- 정렬 : ASC(오름차순), DESC(내림차순)
- 아래와 같이 2차 정렬도 가능하다.
SELECT * FROM NOTICE ORDER BY HIT DESC, REGDATE DESC;
ROW_NUMBER(), RANK(), DENSE_RANK()
- ROW_NUMBER()
- 정렬을 하고 ROWNUM을 붙이고 싶은 경우가 있다.
- 일반적으로 ROWNUM을 붙인다면 막 섞인다.
- 정렬을 하고 ROWNUM을 붙이고 싶다면 ROW_NUMBER()함수를 사용하라.
SELECT ROW_NUMBER() OVER (ORDER BY HIT), ID, TITLE, WRITER_ID, REGDATE, HIT
FROM NOTICE
ORDER BY HIT;
- RANK()
- RANK 함수는 중복 값들에 대해서는 동일 순위로 표시하고, 중복 순위 다음 값에 대해서는 중복 개수만큼 떨어진 순위로 출력하도록 하는 함수이다.
SELECT RANK() OVER (ORDER BY HIT), ID, TITLE, WRITER_ID, REGDATE, HIT
FROM NOTICE
ORDER BY HIT;
- DENSE_RANK()
- DENSE_RANK() 함수는 중복 값들에 대해서는 동일 순위로 표시하고, 중복 순위 다음 값에 대해서는 중복 값 개수와 상관없이 순차적인 순위 값을 출력하도록 하는 함수이다.
SELECT DENSE_RANK() OVER (ORDER BY HIT), ID, TITLE, WRITER_ID, REGDATE, HIT
FROM NOTICE
ORDER BY HIT;
부조회(서브쿼리)
서브 쿼리를 사용하는 경우
--> 구절의 순서를 바꿔야 하는 경우
?. 만약 정렬한 결과에서 1에서 5까지의 ROWNUM을 가진 행을 뽑으려면?
- 서브쿼리를 사용하여 정렬을 한 결과에서 ROWNUM을 뽑는다.
SELECT *
FROM (SELECT * FROM NOTICE ORDER BY REGDATE DESC) -- 서브쿼리
WHERE ROWNUM BETWEEN 1 AND 5;
?. 나이가 평균 나이 이상인 회원의 ID와 나이 조회
SELECT ID, AGE
FROM MEMBER
WHERE AGE >= (SELECT AVG(AGE) FROM MEMBER);
조인(join)
- 관계형 DB에서는 중복 데이터를 피하기 위해서 데이터를 쪼개서 여러 테이블로 나눠서 저장한다.
- 이렇게 분리되어 저장된 데이터에서 원하는 결과를 다시 도출하기 위해서는 여러 테이블을 조합할 필요가 있다.
- 이때 조합하는 연산을 JOIN이라고 한다.

JOIN 연산 후

- INNER JOIN(내부 조인)
- 관계가 있는 레코드들만 합치는 조인을 INNER JOIN이라고 한다.
- 교집합이다.
- 둘 이상의 테이블에 존재하는 공통 속성의 값이 같은 것을 결과로 추출한다.
- 관계가 없는 것(OUTER)들은 빼고 관계가 있는(INNER)만 남아서 합쳐진다.
SELECT *
FROM MEMBER
INNER JOIN NOTICE ON MEMBER.ID = notice.writer_id;
- OUTER JOIN(외부 조인)
-
조인하는 여러테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽 테이블의 내용을 모두 철력하는 것이다.
-
종류로는 LEFT/RIGHT/FULL OUTER JOIN이 있다.
- LEFT OUTER JOIN : 해당 JOIN 식기준 왼쪽 테이블의 OUTER값을 포함
- RIGHT OUTER JOIN : 해당 JOIN 식기준 오른쪽 테이블의 OUTER값을 포함
- FULL OUTER JOIN : 두 테이블의 모든 OUTER를 포함
-
여기서 빈 값들은 NULL값으로 채워진다.
~36강까지