SELECT문 (데이터 조회) (p51 참조)
테이블에 저장된 데이터를 조회하는 SQL 명령어.
SELECT * FROM DEPT;
SELECT로 특정 데이터 추출 (p96 참조)
1. WHERE 조건과 비교 연산자
[ 형식 ]
SELECT {*, column...}
FROM table_name
WHERE 조건절;
[ 조건절의 구성 ]
컬럼, 연산자, 비교대상 순
WHERE SAL >= 3000;
1) 비교 연산자
= 같다
> 보다 크다
< 보다 작다
>= 보다 크거나 같다
<= 보다 작거나 같다
<>, !=, ^= 다르다
(실습)
SELECT * FROM EMP
WHERE SAL >= 3000;
SELECT * FROM EMP
WHERE DEPTNO = 10;
2) 문자 데이터 조회
- 문자 데이터 조회 : 데이터에 작은따옴표 ' ' 사용
- 날짜 데이터 조회 : '년도/월/일' 형식으로 사용
[ 문자 조회 ]
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE ENAME ='FORD'; -- 문자열, 날짜는 작은따옴표 붙여야 함.
[ 날짜 조회 ]
SELECT *
FROM EMP
WHERE HIREDATE <= '1982/01/01';
문제) 이름이 SCOTT인 사원의 사원번호, 사원명, 급여를 출력하는 SQL문을 출력하라.
사원정보가 저장된 테이블 이름은 EMP, 사원번호 컬럼은 EMPNO, 사원명 컬럼은 ENAME, 급여컬럼은 SAL이다.
SELECT EMPNO, ENAME, SAL
FROM EMP
WHERE ENAME = 'SCOTT';
2. 논리 연산자
1) AND 연산자
두 가지 조건을 모두 만족할 경우에만 검색.
10번 부서 소속 사원 중 직급이 MANAGER인 사람을 검색하여 사원명, 부서번호, 직급을 출력하는 경우
[조건1] 10번 부서 소속인 사원 : DEPTNO = 10
[조건2] 직급이 MANAGER인 사원 : JOB = 'MANAGER'
SELECT *
FROM EMP
WHERE DEPTNO = 10 AND JOB = 'MANAGER';
-- EMP 테이블에서 부서번호(DEPTNO)가 10이고, 직급(JOB)이 'MANAGER'인 자료의 사원명, 부서번호, 직급컬럼 표시
2) OR 연산자
두 가지 조건 중 한 가지만 만족하더라도 검색.
10번 부서에 소속된 사원이거나 직급이 MANAGER인 사람을 검색하여 사원명, 부서번호, 직급을 출력하는 경우
[조건1] 10번 부서 소속인 사원 : DEPTNO = 10
[조건2] 직급이 MANAGER인 사원 : JOB = 'MANAGER'
SELECT *
FROM EMP
WHERE DEPTNO = 10 OR JOB = 'MANAGER';
3) NOT 연산자
조건에 만족하지 못하는 것만 검색
SELECT *
FROM EMP
WHERE NOT DEPTNO = 10;
※ NOT 연산자를 쓰지 않아도 같지 않다란 의미의 <> 연산자나 != 연산자를 쓸 수도 있다.
SELECT *
FROM EMP
WHERE DEPTNO <> 10;
문제) 사원번호가 7521이거나 7654이거나 7844인 사원의 급여를 검색하는 쿼리문을 비교연산자와 OR 연산자를 사용하여 작성하시오.
SELECT EMPNO, SAL
FROM EMP
WHERE EMPNO = 7521 OR EMPNO = 7654 OR EMPNO = 7844;
3. BETWEEN AND 연산자
하나의 컬럼 같이 특정 범위에 속하는지를 물어보기 위해서 사용. (숫자, 날짜, 문자형에 사용 가능)
[ 형식 ]
2000에서 3000 사이의 사원을 검색하기 위해서는 비교 연산자와 논리 연산자를 결합하여 표현할 수 있다.
SELECT * FROM EMP
WHERE SAL >= 2000 AND SAL <= 3000;
SELECT * FROM EMP
WHERE SAL < 2000 AND SAL > 3000;
이를 BETWEEN 연산자로 바꾸면
[ BETWEEN 연산자로 날짜 검색 ]
1) 예전 방식 : 슬래쉬(/)로 구분
SELECT * FROM EMP
WHERE HIREDATE BETWEEN '1982/01/01' AND '1983/12/31';
2) 최근 방식 : 대쉬(-)로 구분
SELECT * FROM EMP
WHERE HIREDATE BETWEEN '1982-01-01' AND '1983-12-31';
4. IN 연산자
여러 개의 값을 한번에 지정해서 검색. 특정 컬럼의 값이 여러 개의 값 중에서 하나인지를 물어보기 위해서 사용.
[ 형식 ]
커미션이 300이거나 500이거나 1400인 사원을 검색하기 위해서
SELECT * FROM EMP
WHERE COMM = 300 OR COMM = 500 OR COMM = 1400;
이를 IN 연산자로 바꾸면
SELECT * FROM EMP
WHERE COMM IN(300, 500, 1400);
커미션이 300이거나 500이거나 1400이 아닌 사원을 검색하려면
SELECT * FROM EMP
WHERE COMM <> 300 AND COMM <> 500 AND COMM <> 1400;
이를 IN 연산자로 바꾸면
SELECT * FROM EMP
WHERE COMM NOT IN(300, 500, 1400);
문제) 7521이거나 7654이거나 7844인 사원들을 검색하는 쿼리문을 IN 연산자를 사용하여 작성하라.
SELECT EMPNO, SAL FROM EMP
WHERE EMPNO IN(7521, 7654, 7844);
문제) 사원번호가 7521도 아니고 7654도 아니고 7844도 아닌 사원들을 검색하는 퀴리문을 작성하라.
1) 비교 연산자와 논리 연산자 AND를 사용하여 작성하기
SELECT EMPNO, ENAME FROM EMP
WHERE EMPNO <> 7521 AND EMPNO <> 7654 AND EMPNO <> 7844;
2) NOT IN 연산자를 사용하여 작성하기
SELECT EMPNO, ENAME FROM EMP
WHERE EMPNO NOT IN(7521, 7654, 7844);
5. LIKE 연산자와 와일드카드
컬럼에 저장된 데이터의 일부만 일치하더라도 조회가 가능한 연산자
[ 형식 ]
와일드카드
% : 문자가 없거나, 하나 이상의 문자에 어떤 값이 와도 무관
_ : 하나의 문자에 어떤 값이 와도 무관
와일드카드 % 사용하기
SELECT * FROM EMP
WHERE ENAME LIKE 'F%'; -- EMP 테이블에서 이름이 F로 시작하는 사원을 출력
SELECT * FROM EMP
WHERE ENAME LIKE '%A%'; -- EMP 테이블에서 이름에 A가 포함되어 있는 사원을 출력
SELECT * FROM EMP
WHERE TRIM(JOB) LIKE '%N'; -- EMP 테이블에서 이름이 N으로 끝나는 사원을 출력
SELECT * FROM EMP
WHERE ENAME LIKE '_A%'; -- EMP 테이블에서 사원명 2번째 글자가 A이고 그 뒤는 무엇이든 상관없는 사원 출력
SELECT * FROM EMP
WHERE ENAME LIKE '__A%'; -- EMP 테이블에서 3번째 글자가 A이고 그 뒤는 무엇이든 상관없는 사원 출력
ESCAPE 옵션
와일드카드 문자(%, _)를 와일드카드가 아닌 문자 그대로 인식하도록 한다.
SELECT EMPNO, ENAME
FROM EMP
WHERE ENAME LIKE '%\%%' ESCAPE '\'; -- \ 뒤에 오는 문자는 와일드카드로 인식하지 말고 글자 그대로 인식
NOT LIKE
SELECT *
FROM EMP
WHERE ENAME NOT LIKE '%A%'; -- 이름에 A를 포함하지 않는 사람만 검색
6. NULL을 위한 연산자 (IS NULL과 IS NOT NULL)
[형식]
대상컬럼 IS (연산자) NULL(비교값)
SELECT * FROM EMP
WHERE COMM IS NULL; -- NULL값만 조절
SELECT * FROM EMP
WHERE COMM IS NOT NULL; -- NULL값이 아닌 것을 조절
7. ORDER BY절 (정렬)
작은 값부터 출력되는 오름차순(ASCENDING)과 큰 값부터 출력되는 내림차순(DESCENDING) 정렬 방식이 있다.
[형식]
SELECT * [column1, column2, ..., columnN]
FROM table_name
WHERE 조건절
ORER BY column_name sorting
※ 정렬방식을 지정하지 않으면 기본적으로 오름차순(어센딩) 정렬된다.
1) 오름차순 ASC 어센딩(ASCENDING)
SELECT * FROM EMP
ORDER BY SAL ASC;
2) 내림차순 DESC 디센딩(DESCENDING)
SELECT * FROM EMP
ORDER BY SAL DESC;
여러개의 필드를 ,로 연결하며 오름차순, 내림차순을 자유롭게 사용 가능
SELECT * FROM EMP
ORDER BY SAL DESC, ENAME ASC;
문제) 부서번호(DEPTNO)가 빠른 사원부터 출력하되, 같은 부서내의 사원을 출력할 경우 최근 입사한 사원부터 출력하며 사원번호(EMPNO), 입사일(HIREDATE), 사원명(ENAME), 급여(SAL)순으로 출력하시오.
SELECT EMPNO, HIREDATE, ENAME, SAL FROM EMP
ORDER BY DEPTNO ASC, HIREDATE ASC;
(오라클 11g+ PL/SQL 입문 P131 13번 문제인데 답이 잘못되어 있음. 위와 같이 해야함.)
'오라클 기초' 카테고리의 다른 글
SQL의 기본: TAB, DESC, NVL, AS, ||, DISTINCT (0) | 2016.01.13 |
---|---|
Oracle SQL Developer 설치 및 접속방법 (0) | 2016.01.12 |
테이블 만들고 데이터 입력하기 연습 (0) | 2016.01.06 |
트랜잭션: 커밋, 롤백, 세이브포인트, 데드락(Dead Lock) (0) | 2016.01.06 |
테이블에 관한 SQL문 (0) | 2016.01.06 |