SELECT문 (데이터 조회) (p51 참조)

테이블에 저장된 데이터를 조회하는 SQL 명령어.


SELECT [DISTINCT] {*, column[Alias], ...} -- DISTINCT는 중복 데이터 제거 키워드 (생략 가능)
FROM table_name; -- 조회할 테이블 명
WHERE conditions; -- 특정 부분 조회시의 조건 (생략가능)

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 연산자


하나의 컬럼 같이 특정 범위에 속하는지를 물어보기 위해서 사용. (숫자, 날짜, 문자형에 사용 가능)


[ 형식 ]

WHERE column_name BETWEEN A AND B

2000에서 3000 사이의 사원을 검색하기 위해서는 비교 연산자와 논리 연산자를 결합하여 표현할 수 있다.


SELECT * FROM EMP

WHERE SAL >= 2000 AND SAL <= 3000;


이를 BETWEEN 연산자로 바꾸면

SELECT * FROM EMP
WHERE SAL BETWEEN 2000 AND 3000;


2000 미만 3000 초과의 사원을 검색하기 위해서는

SELECT * FROM EMP

WHERE SAL < 2000 AND SAL > 3000;


이를 BETWEEN 연산자로 바꾸면


SELECT * FROM EMP
WHERE SAL NOT BETWEEN 2000 AND 3000;


[ 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 연산자


여러 개의 값을 한번에 지정해서 검색. 특정 컬럼의 값이 여러 개의 값 중에서 하나인지를 물어보기 위해서 사용.


[ 형식 ]

WHERE column_name IN(A, B, C...)

커미션이 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 연산자와 와일드카드


컬럼에 저장된 데이터의 일부만 일치하더라도 조회가 가능한 연산자


[ 형식 ]

WHERE column_name LIKE pattern
pattern에는 와일드카드를 붙여 사용한다.

와일드카드

%  : 문자가 없거나, 하나 이상의 문자에 어떤 값이 와도 무관

_   : 하나의 문자에 어떤 값이 와도 무관


와일드카드 % 사용하기

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으로 끝나는 사원을 출력

TRIM : 공백을 제거하는 명령어


와일드카드 _ 사용하기

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번 문제인데 답이 잘못되어 있음. 위와 같이 해야함.)





Posted by netyhobby
,