SELECT empno, ename, sal
FROM emp
WHERE sal <= 1000;
SELECT empno, ename, sal, hiredate
FROM emp
WHERE hiredate > '81/01/01';
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 AND b
<==> a <= x <= b
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');
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이 아닐 때는 이렇게 비교
와일드 카드 문자 | 설명 |
---|---|
% | %위치에 0개 이상의 문자(열)과 대체 |
_ | _ 위치에반드시 1개 문자와 대체 |
WHERE 컬럼명 LIKE '%$_%' ESCAPE '$';
위 코드에서는 ESCAPE 문자로 $문자를 설정했다. 따라서 ESCAPE 문자인 $뒤의 한 글자는 와일드카드로 인식하지 않고 글자 그대로 인식하라는 뜻이다.
따라서 위 코드 실행 시 _ 문자가 포함된 레코드가 검색된다.
SELECT empno, ename, job
FROM emp
WHERE job LIKE '%E___' ESCAPE 'E';
위 코드를 보면 __문자가 3개가 있으나 ESCAPE 옵션을 사용했기 때문에 ESCAPE 문자 E 뒤에 오는 는 문자가 아닌 일반문자로 처리가 된다.
따라서 뒤에서 3번째 문자로 _를 가진 사원을 조회할 수 있다.
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;
위의 두 개의 코드는 서로 결과가 다르다.
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;
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;
만약 정렬하는 컬럼이 널 값이 존재하는 경우에 오라클DB는 가장 큰 값으로 인식한다.
SELECT comm FROM emp ORDER BY comm DESC;
SELECT INITCAP('ORACLE SQL')
FROM dual; -- 결과 -> Oracle Sql
SELECT deptno, INITCAP(dname), INITCAP(loc)
FROM dept;
SELECT empno, dname, LOWER(job)
FROM emp, dept
WHERE ename = 'KING'
AND emp.deptno = dept.deptno;
SELECT UPPER('abc')
FROM dual -- -> ABC
SELECT empno, ename, job, deptno
FROM emp
WHERE ename = UPPER('scott');
SELECT CONCAT('Oracle', 'Sql')
FROM dual; -- -> OracleSql
SELECT LENGTH('Oracle')
FROM dual -- -> 6
SELECT LENGTH('Ora cle')
FROM dual -- -> 7
INSTR(컬럼명 | 표현식, 검색값, [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 |
SUBSTR(컬럼명|표현식, 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이 출력
LPAD(컬럼 | 표현식, n, 'string')
SELECT LPAD('MILLER', 10, '*')
FROM dual;
RPAD(컬럼 | 표현식, n, 'string')
SELECT RPAD('MILLER', 10, '*')
FROM dual;
REPLACE( 컬럼명 | 표현식, 's1', 's2')
SELECT REPLACE('JACK and JUE', 'J', 'BL')
FROM dual;
SELECT LTRIM('MILLER', 'M')
FROM dual;