고래씌

[Oracle] 1-1. DML(SELECT) - 기본문법(산술연산, 컬럼명 별칭, 리터럴, 컬럼명 별칭, DISTINCT, WHERE 절) 본문

Database/Oracle

[Oracle] 1-1. DML(SELECT) - 기본문법(산술연산, 컬럼명 별칭, 리터럴, 컬럼명 별칭, DISTINCT, WHERE 절)

고래씌 2023. 11. 23. 11:15

DML : 데이터 조작, SELECT(DQL), INSERT, UPDATE, DELETE

DDL : 데이터 정의, CREATE, ALTER, DROP

TCL : 트랜잭션 제어, COMMIT, ROLLBACK

DCL : 권한부여, GRANT, REVOKE

 

1. SELECT

데이터를 조회하거나 검색할 때 사용하는 명령어

RESULT SET : SELECT 구문을 통해 조회된 데이터의 결과물을 의미(조회된 행들의 집합)

 

 

 

▶ EMPLOYEE테이블의 "전체" 사원들의 사번, 이름, 급여 칼럼을 조회

SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE;    -- 실행시 CTRL+ENTER

 

▶ 명령어, 키워드, 컬럼명 등 대소문자를 가리지 않음
소문자로 작성해도 무방. 단, 대문자로 쓰는게 관례

 

 EMPLOYEE 테이블의 전체 사원들의 "모든" (*) 칼럼을 조회

SELECT *
FROM EMPLOYEE;

 

 

▶ EMPLOYEE 테이블의 전체 사원들의 이름, 이메일, 휴대폰 번호 조회

SELECT EMP_NAME, EMAIL, PHONE
FROM EMPLOYEE;

 

 

 

2. 컬럼값을 통한 산술연산

: 조회하고자 하는 컬럼들을 나열하는 SELECT 절에 산술연산을 기술하여 결과를 조회할 수 있다.

 

▶ EMPLOYEE 테이블로부터 직원명, 월급, 연봉(월급 * 12)

SELECT EMP_NAME, SALARY * 12
FROM EMPLOYEE;

 

 

▶ EMPLOYEE 테이블로부터 직원명, 월급, 보너스, 보너스가 포함된 연봉(월급 * 12 + (보너스 * 월급)* 12)
☞ 산술연산과정에서 NULL값이 존재할 경우 결과값도 항상 NULL이 나온다.

SELECT EMP_NAME, SALARY, BONUS, ((SALARY + BONUS * SALARY)* 12)
FROM EMPLOYEE;

 

 

 

▶ EMPLOYEE 테이블로부터 직원명, 입사일, 근무일수(오늘날짜 - 입사일) 조회
DATE자료형 - DATE 자료형
오늘날짜 SYSDATE - HIRE_DATE

SELECT EMP_NAME, HIRE_DATE, SYSDATE - HIRE_DATE
FROM EMPLOYEE;

 

☞ 결과값이 지저분한 이유 : DATE 타입안에 포함된 시, 분, 초에 대한 연산까지 수행하기 때문

☞ 결과값은 '일'수로 출력

 

 

 

 

3. 컬럼명에 별칭 부여하기

    [표현법]
    컬럼명 AS 별칭, 컬럼명 AS "별칭", 컬럼명 별칭 , 컬럼명 "별칭"
    
    AS를 붙이든 안붙이든 간에 별칭에 특수문자나 띄어쓰기가 포함될 경우 반드시 ""를 묶어서 표기해야함

 

 

▶ EMPLOYEE 테이블로부터 직원명, 월급, 연봉(월급 * 12)

SELECT EMP_NAME, SALARY * 12 AS "연봉(보너스 미포함)"
FROM EMPLOYEE;

 

▶ EMPLOYEE 테이블로부터 직원명, 월급, 보너스, 보너스가 포함된 연봉(월급 * 12 + (보너스 * 월급)* 12)

SELECT EMP_NAME, SALARY, BONUS, ((SALARY + BONUS * SALARY)* 12) AS "보너스 포함된 연봉"
FROM EMPLOYEE;

 

 

▶ EMPLOYEE 테이블로부터 직원명, 입사일, 근무일수(오늘날짜 - 입사일) 조회

SELECT EMP_NAME, HIRE_DATE, SYSDATE - HIRE_DATE "근무일수"
FROM EMPLOYEE;

 

 

4. 리터럴

: 임의로 지정된 문자열('')을 SELECT 절에 기술하면 실제 그 테이블에 존재하는 데이터처럼 조회가 가능하다.

 

 

▶ EMPLOYEE 테이블로부터 사번, 사원명, 급여, 급여단위(원) 조회하기

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

 

 

5. DISTINCT   - 중복 값 제거

    [표현법]
    DISTINCT 중복값이 있는 칼럼명
    
    (단, SELECT 절에 DISTINCT 구문은 한개만 가능하다)

 

 

▶ EMPLOYEE 테이블에서 부서코드들만 조회

SELECT DISTINCT DEPT_CODE
FROM EMPLOYEE;

SELECT DISTINCT JOB_CODE
FROM EMPLOYEE;

 

SELECT DISTINCT DEPT_CODE, JOB_CODE
FROM EMPLOYEE; 

 

 

☞ 이렇게 작성하면 제대로 작동안함. DEPT_CODE, JOB_CODE를 세트로 하나의 키값으로 묶어 중복제거를 한 것

 


6. WHERE 절 - 조건

: 조회하고자 하는 테이블에 특정 조건을 제시해서 그 조건에 만족하는 데이터들만 조회하고자 할 때 기술하는 구문
    
    [표현법]
    SELECT 조회하고자하는 컬럼명, ... => 컬럼들을 뽑아내겠다.
    FROM 테이블명
    WHERE 조건식;  => 조건에 해당하는 행들을 뽑아내겠다.
    

실행순서
    FROM → WHERE → SELECT


조건식에 사용가능한 연산자들
    > , <, >=, <=
    = (일치하는가? => 자바에서는 == 였다), 동등비교 연산자)
    !=, ^= , <>(일치하지 않는가?)

 

 

 EMPLOYEE 테이블로부터 급여가 400만원 이상인 사원들만 조회(모든 칼럼)

SELECT *
FROM EMPLOYEE
WHERE SALARY >= 4000000;

 

 

 

EMPLOYEE 테이블로부터 부서코드가 D9인 사원들의 사원명, 부서코드, 급여 조회

SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9';

 

 

 

EMPLOYEE 테이블로부터 부서코드가 D9인 아닌 사원들의 사원명, 부서코드 급여 조회

SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE != 'D9';

 

☞ NULL값인 데이터는 사원의 데이터를 못 불러온다!

 

 

EMPLOYEE 테이블에서 연봉(보너스 미포함)이 5000만원 이상인 사원들의 이름, 급여, 연봉, 입사일을 조회

SELECT EMP_NAME, SALARY, SALARY*12 AS 연봉 , HIRE_DATE
FROM EMPLOYEE
WHERE SALARY * 12 >= 50000000;

 

WHERE 연봉 >= 50000000;  ☞ 실행순서상 SELECT가 가장 늦게 실행되기때문에 오류가 발생한다.

SELECT 절에서 부여한 별칭을 WHERE 절에서 사용할수가 없다.(실행순서상 불가능함)