Oracle SQL(2)
WHERE
- SELECT와 FROM과 같이 쓰이며, 조건을 붙이고 싶을 때 쓴다.
SELECT empno, ename, sal
FROM emp
WHERE sal <= 1000;
SELECT empno, ename, sal, hiredate
FROM emp
WHERE hiredate > '81/01/01';
- WHERE절에서 조건식을 이용하여 데이터를 검색할 때는 반드시 문자 데이터와 날짜 데이터는 ' '을 감싸서 사용해야 한다.
SELECT empno, ename, sal
FROM emp
WHERE sal BETWEEN 1000 AND 2000;
-- 1000과 2000 사이의 연봉
-- BETWEEN a AND b : a와 b 사이에 포함되는
SELECT empno, ename, hiredate
FROM emp
WHERE hiredate BETWEEN '81/01/01' AND '81/12/31';
-- 날짜 연산도 가능하다.
- BETWEEN을 사용할 때 주의해야 할 점은 a < b여야 한다.
BETWEEN a AND b
<==>a <= x <= b
비교 할때 대소문자 주의점
- SQL문은 대소문자를 구별하지 않는다. 하지만 테이블에 저장된 데이터 값인 리터럴은 대소문자를 구별한다.
- 따라서 테이블에 저장된 데이터 값이 대문자인 경우에는 조건식에 사용하는 리터럴 값도 반드시 대문자로 지정해야 원하는 데이터를 얻을 수 있다.
IN 연산자
- 하나의 값이 아닌 목록에 지정된 여러 개의 값을 한꺼번에 비교할 때 사용하는 연산자로서 내부적으로 OR 연산자로 실행된다.
- 비교가능한 값은 수치 데이터뿐만 아니라 문자 및 날짜 데이터 비교에 모두 사용 가능하다.
SELECT ename
FROM emp
WHERE sal IN (1250, 5000);
-- 사원테이블에서 JOB이 MANAGER이면서 20번 부서에 속하거나
-- JOB이 CLERK이면서 30번 부서에 속하는 사원의 정보를 출력
SELECT ename, job, deptno
FROM emp
WHERE (JOB, DEPTNO) IN ( ('MANAGER', 20), ('CLERK', 30) );
SELECT empno, ename
FROM emp
WHERE hiredate IN ('81/04/02', '81/12/03', '81/09/08');
NULL 비교
SELECT comm
FROM emp
WHERE comm = null;
-- null 값 비교가 안됌
SELECT comm
FROM emp
WHERE comm is null;
-- null 비교는 이렇게 해야 함
SELECT comm
FROM emp
WHERE comm is not null;
-- null이 아닐 때는 이렇게 비교
LIKE 연산자
- 검색하고자 하는 문자열을 정확히 알 수 없는 경우에 사용한다.
- 전체가 아닌 임의의 문자만 일치하더라도 데이터 검색이 가능하다.
와일드 카드 문자 | 설명 |
---|---|
% | %위치에 0개 이상의 문자(열)과 대체 |
_ | _ 위치에반드시 1개 문자와 대체 |
- 검색하고자 하는 문자열에 패턴 매칭 연산자(와일드 카드)가 포함되어 있을 때에는 ESCAPE 옵션을 사용한다.
WHERE 컬럼명 LIKE '%$_%' ESCAPE '$';
위 코드에서는 ESCAPE 문자로 $문자를 설정했다. 따라서 ESCAPE 문자인 $뒤의 한 글자는 와일드카드로 인식하지 않고 글자 그대로 인식하라는 뜻이다.
따라서 위 코드 실행 시 _ 문자가 포함된 레코드가 검색된다.
- ESCAPE는 사용자가 임의의 문자로 지정할 수 있기 때문에 '@' 또는 'E'같은 사용자가 원하는 문자로 대체될 수 있다.
SELECT empno, ename, job
FROM emp
WHERE job LIKE '%E___' ESCAPE 'E';
위 코드를 보면 __문자가 3개가 있으나 ESCAPE 옵션을 사용했기 때문에 ESCAPE 문자 E 뒤에 오는 는 문자가 아닌 일반문자로 처리가 된다.
따라서 뒤에서 3번째 문자로 _를 가진 사원을 조회할 수 있다.
논리 연산자
- AND : 두 개의 조건이 TRUE이면 TRUE 리턴
- OR : 두 가지 조건 중 한 가지만 만족하더라도 TRUE
- NOT : 지정된 조건이 아닌 데이터를 검색
SELECT empno, ename, job, sal
FROM emp
WHERE job = 'SALESMAN'
AND sal >= 1500;
SELECT ename, sal
FROM emp
WHERE NOT sal <= 3000
SELECT DISTINCT job
FROM emp
WHERE NOT job = 'SALESMAN';
SELECT empno, ename
FROM emp
WHERE (job = 'CLERK' OR job = 'ANALYST')
AND (comm is null and sal > 1000 and sal < 3000);
SELECT ename, job, sal
FROM emp
WHERE sal NOT IN (800, 900);
SELECT ename
FROM emp
WHERE ename NOT LIKE 'J%';
SELECT empno
FROM emp
WHERE sal NOT BETWEEN 1000 AND 2000;
SELECT empno
FROM emp
WHERE hiredate NOT BETWEEN '81/01/01' AND '81/12/31';
연산자 우선순위
연산자 우선순위 | 연산자 |
---|---|
1 | 괄호() |
2 | NOT |
3 | 비교 연산자 |
4 | AND |
5 | OR |
AND연산자와 OR연산자를 같이 사용하는 경우에는 AND연산자가 OR연산자보다 먼저 실행되기 때문에 의도하지 않은 결과가 나올 수 있다.
따라서, 괄호를 적절하게 사용해서 가독성도 높이고 우선순위를 조절하는 것이 필요하다.
SELECT ename, job, sal, comm
FROM emp
WHERE job = 'CLERK' OR job = 'ANALYST'
AND comm IS NULL
AND sal >= 1000
AND sal <= 3000;
SELECT ename, job, sal, comm
FROM emp
WHERE (job = 'CLERK' OR job = 'ANALYST')
AND comm IS NULL
AND sal >= 1000
AND sal <= 3000;
위의 두 개의 코드는 서로 결과가 다르다.
ORDER BY 절
- 기본적으로 테이블에 저장된 데이터는 정렬되어 있지 않은 상태이다.
- 따라서 데이터를 조회할 때 명시적으로 특정 칼럼을 기준으로 정렬해서 검색해야 한다.
SELECT [DISTINCT] {*, column [Alias], ...}
FROM 테이블명
[WHERE 조건식]
ORDER BY { column, 표현식} [ASC|DESC];
-- 1 2 3 4
SELECT empno, ename, job, sal as "월급"
FROM emp
ORDER BY 4 DESC;
- ORDER BY 절 뒤에는 컬럼명 또는 표현식이 올 수 있는데, 지정 가능한 표현식으로는 컬럼의 alias와 SELECT 절에서 명시된 컬럼의 순서값을 지정할 수 있다.
- 위의 문장에서 empno 컬럼은 첫 번째 순서기 때문에 1로 지정이 되고, 그 이후부터는 순서대로 지정이 되기 때문에 ORDER BY 4는 sal 기준으로 정렬이 되는 것이다.
- 문자, 숫자, 날짜 모두 정렬이 가능하다.
SELECT empno
FROM emp
ORDER BY empno ASC; -- ASC 생략 가능
SELECT empno
FROM emp
ORDER BY empno DESC;
SELECT ename, sal
FROM emp
ORDER BY sal DESC;
SELECT empno, ename, hiredate
FROM emp
ORDER BY hiredate DESC;
SELECT ename, empno, sal as "월급"
FROM emp
ORDER BY 월급;
SELECT ename, sal as 월급, sal * 12 as 연봉
FROM emp
ORDER BY 연봉 DESC;
- 다중 데이터 정렬도 가능하다.
SELECT [DISTINCT] {*, column [Alias], ...}
FROM 테이블명
[WHERE 조건식]
ORDER BY {column, 표현식}[ASC|DESC], {column, 표현식}[ASC|DESC]
SELECT empno, ename, sal, hire_date
FROM emp
ORDER BY sal DESC, hire_date;
- 첫 번째로 정렬하고자 하는 컬럼을 ORDER BY 절 바로 뒤에 위치하게 하면 되고, 그 뒤로부터 정렬하고자 하는 컬럼들을 써 넣으면 된다.
만약 정렬하는 컬럼이 널 값이 존재하는 경우에 오라클DB는 가장 큰 값으로 인식한다.
SELECT comm FROM emp ORDER BY comm DESC;
단일 행 함수
- 모든 행에 대해서 각각 적용되어 행의 개수와 동일한 개수의 결과를 리턴
- SELECT, WHERE, ORDER BY 절에 사용 가능하다.
문자처리 함수
1. INITCAP
- 첫 글자만 대문자로 변환하여 반환한다.
SELECT INITCAP('ORACLE SQL')
FROM dual; -- 결과 -> Oracle Sql
SELECT deptno, INITCAP(dname), INITCAP(loc)
FROM dept;
2. LOWER
- 대소문자가 혼합되어 있거나 대문자를 소문자로 변경한다.
SELECT empno, dname, LOWER(job)
FROM emp, dept
WHERE ename = 'KING'
AND emp.deptno = dept.deptno;
3. UPPER
SELECT UPPER('abc')
FROM dual -- -> ABC
SELECT empno, ename, job, deptno
FROM emp
WHERE ename = UPPER('scott');
4. concat
- 두 개의 문자열을 연결하여 하나의 문자열로 반환하는 함수이다.
SELECT CONCAT('Oracle', 'Sql')
FROM dual; -- -> OracleSql
5. LENGTH
- 문자열의 길이를 반환하는 함수이다.
SELECT LENGTH('Oracle')
FROM dual -- -> 6
SELECT LENGTH('Ora cle')
FROM dual -- -> 7
6. INSTR
- 문자열에서 특정 문자가 나타나는 위치를 반환한다.
INSTR(컬럼명 | 표현식, 검색값, [m, n]
- m은 문자를 검색하기 위한 시작 위치값을 의미하고, n 값은 몇 번째로 나오는 문자를 검색할지를 결정한다.
SELECT INSTR('MILLER', 'L', 1, 2), INSTR('MILLER', 'X', 1, 2)
FROM dual;
-- 4 0
1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
M | I | L | L | E | R |
- 위와 같이 없는 문자를 찾으려고 하면 0을 반환한다.
7. SUBSTR
- 문자열에서 일부분의 문자열을 추출할 때 사용하는 함수이다.
SUBSTR(컬럼명|표현식, m [, n])
- m은 문자열을 검색하기 위한 시작 위치 값을 의미하고 n값은 반환받을 문자열의 개수를 의미한다.
SELECT SUBSTR('900303-1234567', 8, 1)
FROM dual;
-- 1이 출력
SELECT SUBSTR('900303-1234567', 8 )
FROM dual;
-- 1234567이 출력
SELECT SUBSTR('900303-1234567', -8)
FROM dual;
-- -1234567이 출력
- 시작 위치값이 음수일 때 뒤에서부터 세게 된다. 예를 들어 위의 음수 -8로 지정되어 있을 경우, 뒤에서 여덟 번째부터 시작된다.
8. LPAD
- 왼쪽에 문자열을 끼워 넣는 역할을 한다.
LPAD(컬럼 | 표현식, n, 'string')
- n은 전체 자릿수를 의미하고, string은 삽입할 문자열을 의미한다. 삽입할 문자가 없는 경우, 공백으로 채워진다.
SELECT LPAD('MILLER', 10, '*')
FROM dual;
9. RPAD
- 오른쪽에 문자열을 끼워 넣는 역할을 한다.
RPAD(컬럼 | 표현식, n, 'string')
- n은 전체 자릿수를 의미하고, string은 삽입할 문자열을 의미한다. 삽입할 문자가 없는 경우, 공백으로 채워진다.
SELECT RPAD('MILLER', 10, '*')
FROM dual;
10. REPLACE
- 특정 문자열을 치환할 때 사용하는 함수이다.
REPLACE( 컬럼명 | 표현식, 's1', 's2')
- s1은 이전 문자열을 의미하고 s2는 새로운 문자열을 의미한다.
SELECT REPLACE('JACK and JUE', 'J', 'BL')
FROM dual;
11. LTRIM
- 문자열에서 특정 문자를 삭제하기 위한 용도로 사용된다.
- `LTRIM(컬럼명 | 표현식, 'str')
- str는 문자열에서 삭제할 문자를 의미한다.
SELECT LTRIM('MILLER', 'M')
FROM dual;
다중 행 함수(그룹 함수)
- 검색되는 모든 행에 대해서 한번만 적용되고 한 건의 결과만을 리턴
Author And Source
이 문제에 관하여(Oracle SQL(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sparkbosing/Oracle-SQL2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)