본문 바로가기
Oracle/정리

[Oracle] SELECT문

by 콧등치기국수 2021. 6. 19.
SELECT문 기본

DQL(Data Query Language)은 데이터를 검색 추출하기 위해 사용하는 언어이다.  
DQL은 DML에 속한언어이기도 하다.

SELECT 컬럼명 [,컬럼명, ...]
FROM 테이블명
WHERE 조건
ORDER BY 컬럼명;

WHERE과 ORDER BY는 생략가능하다.

 

SELECT문 사용

EMPLOYEE계정에 있는 EMPLOYEE테이블에서 SELECT를 이용하여 원하는 컬럼 및 행을 조회할 것이다.

1. EMPLOYEE테이블에서 원하는 컬럼 조회

- EMP_ID(사원번호) , EMP_NAME(사원명) 조회

SELECT
    EMP_ID
    ,EMP_NAME
FROM EMPLOYEE;

원하는 컬럼 조회

 

2. 원하는 행 조회

SELECT *  : 모든 행 조회

SELECT
    *
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9';

DEPT_CODE가 D9인 행 조회

 

3. 원하는 행과 컬럼 조회
EMPLOYEE테이블에서 급여가 300만원이상인 사원의 사번, 이름, 부서코드, 급여를 조회하시오

SELECT
    EMP_ID
    ,EMP_NAME
    , DEPT_CODE
    , SALARY
FROM EMPLOYEE
WHERE SALARY>=3000000;

 

3-1. EMPLOYEE 테이블에서 이름, 근무 일수(반올림)를 출력해보시오 

1) SYSDATE : 사용하면 현재 시간 출력

2) ROUND : 반올림

SELECT EMP_NAME
    ,ROUND(SYSDATE - HIRE_DATE) 근무일수
FROM EMPLOYEE;

 

 

4. 별칭 & 계산값도 컬럼으로 사용 가능

1) 별칭

- AS 별칭

- "별칭" : AS사용 / '(', ')'와 같이 특수기호 있는 경우 ""사용

==> 모든 컬럼명을 다 외울 수 없으므로 내가 알 수 있는 이름으로 별칭 보통 짓는게 좋다고 한다!

2) 내가 원하는 값도 컬럼으로 사용가능!

3) NVL 함수 : BONUS컬럼의 값이 NULL인 경우 0으로 대체

SELECT 
    EMP_NAME AS ENAME
    , SALARY * 12 "1년급여(원)"
    , (SALARY+(SALARY*NVL(BONUS,0))) * 12 AS "총소득(원)"
FROM EMPLOYEE;

 

5. 리터럴

테이블에 없는 값이지만 테이블에 있는 값처럼 모든 행에 반복적으로 적어줄 수 있다.

임의로 지정한 문자열을 SELECT절에 사용하면 테이블에 존재하는 데이터처럼 활용가능하다.

' ' 사용한다.

SELECT 
    EMP_ID
    ,EMP_NAME
    ,SALARY
    ,'원' AS 단위
FROM EMPLOYEE;

 

6. DISTINCT

컬럼의 데이터 중 중복된 값을 제외하고 한번씩만 표시하고자 할때 사용

JOB_CODE를 중복되지 않게 출력된다. 

SELECT 
	DISTINCT JOB_CODE
FROM EMPLOYEE;

 

6-1. DISTINCT는  SELECT문에서 한번만 적용된다.

2개의 컬럼명을 쓰는 경우 JOB_CODE도 중복되지 않게 나오고 DEPT_CODE도 중복되지 않게 출력되는 것이 아니다.

JOB_CODE와 DEPT_CODE의 조합이 중복되지 않게 출력된다.

SELECT DISTINCT JOB_CODE, DEPT_CODE
FROM EMPLOYEE;

J7이 여러개인데 DEPT_CODE는 다 다른 것을 볼 수 있다!

7. 연결연산자(||)

연결연산자를 이용하여 여러 컬럼을 하나의 컬럼처럼 조회할 수 있다.

컬럼과 컬럼 뿐만 아니라 컬럼과 리터럴을 연결 할 수 있다.

SELECT
    EMP_NAME || '의 월급은' || SALARY ||'원입니다.' AS VAL
FROM EMPLOYEE;

 

WHERE절 & 비교연산자

여러 개 조건 작성시 AND / OR 사용한다.

연산자 의미 예제    
= 같다 -- 퇴사여부가 'N'인 직원의 사번, 이름, 입사일, 리터럴(컬럼명:근무여부) -- -- 조회
SELECT
    EMP_ID
    , EMP_NAME
    , HIRE_DATE
    , '재직중' 근무여부
FROM EMPLOYEE
WHERE 1=1
AND ENT_YN = 'N';
> , < 크다 / 작다 -- 20년 초과 근무한 직원의 이름, 연봉, 보너스를 조회
SELECT 
    EMP_NAME
    , SALARY
    , NVL(BONUS,0)
FROM EMPLOYEE
WHERE 1=1
AND (SYSDATE - HIRE_DATE)/365 > 20;
>=, <= 크거나 같다 / 작거나 같다  
<> , !=, ^= 같지 않다.
(3가지 연산자 다 기억해두기)
-- 부서번호가 D9인 사번, 이름, 부서코드 조회
SELECT
    EMP_ID
    , EMP_NAME
    , DEPT_CODE
FROM EMPLOYEE
--WHERE DEPT_CODE != 'D9';
--WHERE DEPT_CODE <> 'D9';
WHERE DEPT_CODE ^= 'D9';
BETWEEN AND 특정 범위에 포함되는지 비교
(상한값, 하한값 포함!)
--EMPLOYEE 테이블에서 고용일이 90/01/01 ~ 01/01/01 인 사원의
--전체 내용을 출력하시오 
SELECT
    *
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '90/01/01' AND '01/01/01';

 

LIKE 연산자 & NOT LIKE

원하는 문자가 포함된 자료를 검색할때 사용한다.

'%' 와 '_' 를 와일드카드로 사용한다. 와일드카드를 사용하여 특정글자로 시작하거나, 끝나는 자료를 찾거나

특정글자가 포함된 자료를 찾을 수 있다. 또한 몇 번째 글자가 원하는 글자인지 확인하여 검색할 수도 있다.

 

▶ % : 뒤에 어떤 글자가 와도 상관없음 / 0개 이상의 글자

▶ _ : 글자 한자리

 

1. EMLPLOYEE 테이블에서 성이 김씨인 직원이 사번, 이름, 입사일을 조회

SELECT
    EMP_ID
    ,EMP_NAME
    , HIRE_DATE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '김%';

1) WHERE 컬럼명  LIKE '김%';

: 해당 컬럼에서 김으로 시작하는 자료 찾기

2) WHERE 컬럼명  LIKE '%김';

: 해당 컬럼에서 김으로 끝나는 자료 찾기

3) WHERE 컬럼명  LIKE '%김%';

: 해당 컬럼에서 김을 포함하는 자료 찾기

 

1-1. NOT LIKE : 김씨가 아닌

SELECT
    EMP_ID
    ,EMP_NAME
    , HIRE_DATE
FROM EMPLOYEE
WHERE EMP_NAME NOT LIKE '김%';
-- WHERE NOT EMP_NAME LIKE '김%';

1) WHERE EMP_NAME NOT LIKE '김%';

2) WHERE NOT EMP_NAME LIKE '김%';

 

2. EMPLOYEE 테이블에서 전화번호 ex(010X)  X->9 로 시작하는 직원의 사번, 이름, 전화번호를 조회하시오.

SELECT
    EMP_ID
    , EMP_NAME
    , PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '___9%';

WHERE 컬럼명 LIKE '___9%';

1) 4번째 자리의 숫자가 9인지 확인해주기 위해 '_'를 3번 적어준다.

2) 9% : 9뒤에는 어떤 문자가 와도 상관없기 때문에 %를 적어준다

안적어주면 9로 끝나는 글자를 찾기때문에 적어줘야 한다!

 

 

LIKE & ESCAPE

와일드카드 문자와 패턴의 특수문자가 동일한 경우 어떤 것을 패턴으로 결정하는지 구분하지 못하기 때문에 데이터로 처리할 와일드 카드 문자 패턴 기호 앞에 임의의 특수문자를 사용하고 ESCAPE OPTION으로 등록하여 처리한다.

 

1. EMPLOYEE 테이블에서 '_'앞글자가 3자리인 이메일 주소를 가진 사원의 사번, 이름, 이메일 주소를 조회 

EX) JOO_DI@SY.OR.KR

SELECT
    EMP_ID
    , EMP_NAME
    , EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___^_%' ESCAPE '^';

1) WHERE EMAIL LIKE '___#_%' ESCAPE '#';  => 가능

 

 

 

IS NULL & IS NOT NULL

1. 부서배치를 받지 않았지만 보너스를 지급받는 직원 조회

SELECT
	*
FROM EMPLOYEE
WHERE DEPT_CODE IS NULL AND BONUS IS NOT NULL;

 

 

IN

비교하려는 값 목록에 일치하는 값이 있으면 TRUE를 반환하는 연산자

WHERE 컬럼명 IN('값1','값2');

WHERE DEPT_CODE IN('D6','D8');

--아래와 같다.
WHERE DEPT_CODE = 'D6' OR DEPT_CODE = 'D9';

 

 

 

 

 

출처:

KH정보교육원 교육자료

'Oracle > 정리' 카테고리의 다른 글

[Oracle] 단일행함수  (0) 2021.06.23
[Oracle] DML, DDL, TCL 이란?  (0) 2021.06.17
[Oracle] cmd에서 sqlplus사용 / sql devleper와 비교  (0) 2021.06.17