정규표현식 ( REGULAR EXPRESSION )
- REGEXP_LIKE( 비교대상, 비교조건 )
- 전화번호 체크
- 이메일 체크
1. 올바른 전화번호 체크
번호 확인 1번
- SELECT * FROM MEMBER
- WHERE PHONE LIKE '%-%-%';
- 이상하게 번호를 입력한 애들도 나온다.
- % 는 0개 이상 문자열을 대체하므로
번호 확인 2번
- 정규식 활용
- WHERE REGEXP_LIKE (PHONE, '^01[01679]-\d{4}-\d{4}$');
- 이상한 번호 애들 제외되고 나왔다.
정규식 체크
'^01[01679]-\d{4}-\d{4}$'
^ : 문자열의 시작
- ex) 내가 정한 형식에 맞는 부분이 이상한 문장 중간에 있기만 해도 통과됨.
- ex) 내가 정한 규칙으로 시작했으면 해서 지정
[ ] : 한 글자 :
- 01까지는 무조건 와야 하고 그 뒤에 조건[ 0이거나 1이거나 ]에 맞는 한 글자가 온다는 의미
- ex) [김이박최] ----->이 중 한 글자가 들어와야 한다는 의미
- ex) [0123456789] or [0-9] -----> 이 중 한 숫자가 들어와야한다는 의미
\d : 숫자(digit) 하나
- ex) \d\d\d\d -----> 숫자 4개
{ } : 반복되는 개수
- ex) \d{ 10 } -----> 숫자 10개 입력시까지 반복할 것이다.
- ex) \d{ 3, 4 } -----> 숫자 3개 또는 4개 올 것이다.
$ : 문자열의 끝
- ex) 내가 정한 형식 뒤에 있는 이상한 부분까지 딸려오는 것 방지
보통 내가 검사하려고 하는 유형에 맞춰 site에서 검색해서 사용한다.
이런 걸 하나하나 외우기는 힘들다.
검색창에 reg exp lib 검색
https://regexlib.com/?AspxAutoDetectCookieSupport=1
Regex Cheat Sheet 참조
2. 올바른 이메일 체크
1. 이메일 칼럼 추가
2. 이메일 가지고 있는 데이터 추가
3. 이메일 잘 작성했는지 검사 - 정규식
- REGEXP_LIKE( ... )
- 함수의 개념은 어렵지 않다.
- 앞에 있는 애(EMAIL)가
- 뒤의 조건(정규식)에 맞는지 확인하는 것
4. 정규식 체크
- \w : : 문자 하나 ( 어떤 알파벳, 숫자, 언더바 ) 하나
- * : : 0개 이상
- + : : 1개 이상
- | : 또는 ------> (abc|zzz|qqq) 셋 중에 하나 - () 없어도 되긴 하는데 가독성 고려-해줌
- \D : : nondigit 아무거나 - ( 대문자 D는 숫자 아닌 것 )
외울 필요는 없고 이런 게 있구나 이해
정규식 끝!
정렬하기
- ORDER BY SAL
- ORDER BY SAL asc -- 오름차순
- ORDER BY SAL desc — 내림차순
- ORDER BY SAL, ENAME; --- 여러 개의 칼럼으로도 정렬 가능
- 실행 순서
1. FROM 절 실행 – EMP 테이블에 접근, ROW 하나하나 꺼내오는 작업 수행
2. WHERE절 실행 – 꺼내온 ROW에 대해서 WHERE 조건에 맞는 ROW들만 남겨 놓는다.
3. SELECT 실행 - 꺼내온 ROW 중 SELECT 조건에 맞는 것들만 RESULT SET에 남겨 놓는다.
4. ORDER BY 실행 – RESULT SET에 있는 거 정렬 ( SAL 오름차순으로, 그다음 ENAME 내림차순으로 정렬 )
정렬 끝!
ROWNUM
- 우리가 만든 테이블에는 없지만 추가로 조회할 수 있는 칼럼이 있다
- ROWNUM
- RESULT SET에 있는 ROW의 숫자 알려준다.
- 사용 예시) 게시글 페이징 처리해줄 경우 사용 가능 – 1페이지에는 10개씩
###CHECK
- 다른 칼럼을 같이 조회할 경우에는 풀네임을 써주어야 한다.
- ROWNUM, * 하면 실행 안됨
- ROWNUM, E.*
ROWNUM 의 별칭과 인덱스 활용하는 방법
- 그냥 사용 시 2가지 문제점 발생
- ROWNUM 별칭 사용 못한다.
- ROWNUM 1 초과 인덱스 사용불가
1. ROWNUM - 별칭 부여는 되는 데 사용이 안되네?
- 실행 순서에 따라 안된다.
- 아직 별칭 부여가 되지 않은 상태여서 안된다.
- 실행 순서
- FROM절 - EMP테이블 가서 ROW들 하나하나 꺼내올 것이다.
- WHERE절 - 다 꺼내오는 것이 아니라 RNUM 이 10보다 작은애만 꺼내올 것이다.
- WHERE절 - ROWNUM에 아직 별칭 부여가 되지 않았다. RNUM 사용 불가
- WHERE ROWNUM < 10으로 수정
2. ROWNUM - 결과가 안 나오네?
- 지금 상황에서는 ROWNUM >= 1 조건을 제외하고는 RESULT SET에 ROW들은 다 비어있다.
- WHY??
- RESULT SET에 ROWNUM은 1번 받을 준비하고 있다.
- 첫 번째 오는 ROW 조건이 1보다 크다 ( > 1 ) -----> 거짓이다. 조건 안 맞네 ROW BYE
- RESULT SET에 ROWNUM 아직 비어있는 1번 받을 준비 중
- 두 번째 오는 ROW 조건이 1보다 크다( > 1 ) ----> 거짓이다. 조건 안 맞네 ROW BYE
- ....
- 아무것도 입력되지 못한다.
- 그러므로 우리가 해준 조건인 ROWNUM < 10의 값도 나오지 않는 것.
중요 개념 체크 - 문제 해결
### RESULT SET = TABLE
- 우리가 어떤 쿼리를 실행해서 나온 RESULT SET 은 테이블과 다를 것이 없다.
- 이 RESULT SET을 TABLE처럼 사용해보자.
- FROM절에 들어가야 할 것은 테이블명
- FROM절에 ( RESULT SET )을 넣어주어도 같다.
- RESULT SET = TABLE 이므로!
- FROM 절에 테이블 대신 RESULT SET 넣어주기.
- FROM 절에 우리가 실행한 쿼리의 결과 RESULT SET을 넣어주었다.
- 이미 별칭과 ROW의 번호까지 부여된 테이블을 넣어준 것이다.
이렇게 해주면 바깥쪽 WHERE절에서
- ROWNUM의 별칭 RNUM으로 사용 가능! - 1번 문제 해결
- ROWNUM의 번호도 모두 사용 가능! - 2번 문제 해결
ROWNUM 끝
DISTINCT
- 중복제거 ( DISTINCT )
- 칼럼 여러 개를 묶어서 중복 제거도 가능
- DISTINCT 키워드 여러 개 사용은 불가능
SELECT DISTINCT DEPTNO
- 사원번호 중복 제거해서 보여줘라
SELECT DISTINCT DEPTNO, MGR
- 사원 번호와 매니저(사원 관리자) 번호
- DEPTNO, MGR을 한 쌍으로 묶어서 중복되는 것들 1개만 남기고 없애준다.
##CHECK
- DISTINCT 뒤에 칼럼 하나면 그거 중복되는 애들 제거
- DISTINCT 뒤에 칼럼 여러 개 오면 그것들을 쌍으로 중복되는 애들 제거
- DISTINCT 키워드 여러개 사용은 불가능
- DISTINCT DEPTNO, DISTINCT MGR ----- X
- DEPTNO, DISTINCT MGR ----- X
중복 끝!
REVIEW
정규 표현식과 ROWNUM의 개념이 새로웠다.
정규 표현식
회원 가입할 때 자주 봤던
이메일 형식과 ID/PWD 설정이 올바르지 않다는 표시
그 내부에는 이런 정규표현식이 적용되어있었구나
기호들의 기본적인 개념만 숙지해놓고
필요한 상황에 맞춰 검색해서 사용하면 될 거 같긴 하다.
ROWNUM
내가 뽑아낸 RESULT SET의 ROW 표시
한 페이지의 게시글 수를 제한하는 상황에서 사용한다고 하니
바로 어떤 상황에서 사용하는 거구나 이해가 되었다!
대신 인덱스를 사용하려면 작업이 필요했다.
ROWNUM을 포함된 RESULT SET을 테이블로
다른 FROM 절에 넣어서 사용해야 한다는 점!
이제 점점 웹 페이지를 구성하는 여러 가지 기능들에 대해서
알아가고 있다는 느낌이고, 구현하는 능력도 배워가고 있다.
JDBC와 프런트 앤드 쪽도 배워서
어느 정도 형식이 갖춰진 웹 페이지도 빨리 만들어 보고 싶다 ㅎㅎ
'Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원 > 5월' 카테고리의 다른 글
22. 05. 19 - 함수 사용해보기, GROUP BY, 서브 쿼리 (0) | 2022.05.22 |
---|---|
22.05.18 - jdbc ( Connection, Statement, ResultSet ) (0) | 2022.05.19 |
22. 05. 17 - 트랜잭션(COMMIT, ROLLBACK), DDL, DCL, 연산자 (0) | 2022.05.18 |
22. 05. 16 - DBMS ( Oracle DB, sqldeveloper ), SQL ( 자료형, 유형 ) (0) | 2022.05.17 |
22. 05. 12 ~ 05. 13 - 휴 강 ( 복습, 예습, 충전 타임 ) (0) | 2022.05.16 |