본문 바로가기
코딩공부/DB

Oracle - Select문 (01)

by Dobby_72 2025. 1. 20.
반응형

SELECT (DML 또는 DQL) : 조회

데이터를 조회(SELECT) 하면 조건에 맞는 행들이 조회됨.

이때, 조회된 행들의 집합을 "RESULT SET"이라고 한다. RESULT SET에는 0개 이상의 행이 포함될 수 있다. 왜 0개? 조건에 맞는 행이 없을 수도 있기 때문에

 

 

--EMPLOYEE 테이블에서 모든 사원의 정보를 조회
--'*' : ALL, 모든, 전부
select * from employee;

-- [select 컬럼명 from 테이블명]
-- EMPLOYEE 테이블에서 모든 사원의 이름만 조회

select emp_name from employee;

-- [select 컬럼명, 컬럼명, ...FROM 테이블명]
-- EMPLOYEE 테이블에서 모든 사원의 사번, 이름, 전화번호 조회
select emp_id,emp_name,phone from employee;

-- EMPLOYEE 테이블에서 모든사원의 사번, 이름, 이메일,입사일 조회
select emp_id,emp_name,email,hire_date from employee;

-- DEPARTMENT 테이블에 있는 모든 행 조회
select * from department;

 


<컬럼 값 산술 연산>

컬럼 값 : 테이블의 한 칸(== 한 셀)에 작성된 값(DATA)

SELECT 문 작성 시 컬럼명에 산술 연산을 작성하면

조회되는 결과 컬럼 값에 산술 연산이 반영된다.

 

--EMPLOYEE 테이블에서 모든 사원의 사번, 이름,급여, 급여+ 100만원을 조회

select emp_no, emp_name, salary, salary + 1000000 from employee;

--EMPLOYEE 테이블에서 모든 사원의 이름, 급여,연봉(급여 *12개월)을 조회

select emp_name, salary, salary *12 as "연봉" from employee;

 


<오늘 날짜 조회>

 

select SYSDATE from dual;

-- SYSDATE : 시스템상의 현재 날짜
--             (년,월,일,시,분,초 단위까지 표현 가능하지만,
--              디벨로퍼의 날짜 표기 방법이 년/월/일로 지정되어 있는 것이다.

--DUAL(Dummy Table :  가짜 테이블(임시 테이블, 단순 조회 테이블)

-- ** DB는 날짜 데이터의 연산 (+,-)이 가능하다 (일 단위) **
select sysdate, sysdate+1, sysdate -1 from dual;

--EMPLOYEE 테이블에서 이름, 입사일, 오늘까지 근무한 날짜 조회
select emp_name, hire_date ,(sysdate - hire_date) /365 from employee;

 


<컬럼 별칭 지정>

 

--select 조회 결과의 집합인 RESULT SET에 컬럼명을 지정

/*
    1) 컬럼명 AS 별칭 : 띄어쓰기X, 특수문자X, 문자o
    2) 컬럼명 별칭 : 1번에서 AS만 생략한 것
    
    3) 컬럼명 AS "별칭" : 띄어쓰기O, 특수문자O, 문자o
    4) 컬럼명 "별칭" : 3번에서 AS만 생략한 것

*/

-- EMPLOYEE 테이블에서
-- 사번 이름 급여(원), 근무일수를 모추 조회

select emp_id as 사번, emp_name 이름, salary as "급여(원)", sysdate-hire_date "근무 일수"
from employee;

-- 리터럴 : 값 자체

-- DB에서의 리터럴 : 임의로 지정한 값을 기존테이블에 존재하는 값처럼 사용
-->리터럴 표기법 '' (홑따옴표)
select emp_name, salary, '원' as 단위 from employee;

DISTINCT : 조회 시 컬럼에 포함된 중복 값을 한 번만 표시할 때 사용

--(주의사항)
-- 1) DISTINCT는 select 문에 딱 한번만 작성할 수 있다.
-- 2) DISTINCT는 select문 가장 앞에 작성 되어야 한다.

--EMPLOYEE 테이블에 저장된 직원들이 속해있는 부서코드 종류 조회
select DISTINCT dept_code from employee;

 


where 절

-- 테이블에서 조건을 충족하는 값을 가진 행만 조회하고자 할 때 사용

-- 비교 연산자 : >, <, >=, <=, =(같다), !=, <>(같지않다)

--employee 테이블에서 급여가 3백막원 초과인 직원의
--사번, 이름, 급여, 부서코드를 조회
/* 해석순서 */
    /*3*/select emp_id, emp_name, salary, dept_code 
    /*1*/from employee 
    /*2*/where salary > 3000000;

-- employee 테이블에서
-- 부서코드가 'd9'인 직원의
--사번, 이름,부서코드,전화번호 출력
select emp_id,emp_name,dept_code,phone from employee where dept_code = 'D9';

 


논리연산자(AND,OR)

 

--employee테이블에서 급여가 200만 이상이고
--부서코드가 'D6'인 직원의
--이름 ,급여, 부서코드를 조회

select emp_name, salary, dept_code from employee where salary >=2000000 and dept_code = 'D6';

--employee 테이블에서
--급여가 300만이상, 500만 이하인 직원으ㅏㅣ
--사번 , 이름, 급여 조회
select emp_id,emp_name,salary from employee where salary >=3000000 and salary <=5000000;
--employee 테이블에서
--부서코드가 'd6'또는 'd9'인 사원의
--사번, 이름, 부서코드 조회
select emp_id,emp_name,dept_code from employee where dept_code = 'D6' or dept_code= 'D9';

 


컬럼명 BETWEEN A AND B : 컬럼 값이 A이상 B이하인 경우

--employee 테이블에서
--급여가 300만이상, 500만 이하인 직원의
--사번 , 이름, 급여 조회


select emp_id,emp_name,salary from employee where salary BETWEEN 3000000 and 5000000;

--컬럼명 not BETWEEN A and B : 컬럼 값이 A이상 B이하 가 아닌경우
--                             == 컬럼 겂이 A미만, B 초과인경우

--BETWEEN 테이블에서
--급여가 300만 미만, 500만 초과인 직원의
--사번, 이름, 급여 조회

select emp_id,emp_name,salary from employee where salary NOT BETWEEN 3000000 and 5000000;

--컬럼명 not BETWEEN A and B : 컬럼 값이 A이상 B이하 가 아닌경우
--                             == 컬럼 겂이 A미만, B 초과인경우

--BETWEEN 테이블에서
--급여가 300만 미만, 500만 초과인 직원의
--사번, 이름, 급여 조회

select emp_id,emp_name,salary from employee where salary NOT BETWEEN 3000000 and 5000000;

/* BETWEEN을 이용한 날짜 비교*/
-- EMPLOYEE 테이블에서
--입사일이 1990/01/01 ~ 1999/12/31인 (90년도 입사자)
--직원의 사번, 이름, 입사일 조회

SELECT EMP_ID, EMP_NAME, HIRE_DATE
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '1990/01/01' and '1990/12/31';

/** '1990/01/01 날짜를 문자열 형식으로 작성하게 되면 
DB가 알아서 판단하여 날짜타입(DATE)으로 형변환을 진행함. **/

LIKE

비교하려는 값이 특정한 패턴을 만족 시키면 조회하는 연산자
    [작성법]
    where 컬럼병 LIKE '패턴'
    - LIKE 패턴(와일드카드) : '%'(포함), '_'(글자 수)
    
    '%'예시
    1) 'A%' : 문자열이 A로 시작하는 모든 컬럼 값
    2) '%A' : 문자열이 A로 끝나는 모든 컬럼 값
    3) '%A%' : 문자열에 A가 포함 되어있는 모든 컬럼 값

    '_' 예시
    1) 'A_' : A 뒤에 아무거나 한 글자
    2) '___A' A앞에 아무거나 세글자(4글자 문자열이면서 A로 끝나야함)
*/

--EMPLOYEE 테이블에서 성이 '전'씨인 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME FROM EMPLOYEE WHERE emp_name LIKE '전%';

--EMPLOYEE 테이블에서 이름에 '하'가 포함된 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME FROM EMPLOYEE WHERE emp_name LIKE '%하%';

-- EMPLOYEE 테이블에서
--전화번호가 010으로 시작하는 사원의 사번, 이름, 전화번호 조회

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

SELECT EMP_ID, EMP_NAME, PHONE FROM EMPLOYEE WHERE PHONE LIKE '010________';

--010으로 시작하지 "않는" 사람들 조회
--> NOT LIKE (LIKE 결과 부정)
SELECT EMP_ID, EMP_NAME, PHONE FROM
EMPLOYEE WHERE
PHONE NOT LIKE '010%';

--EMPLOYEE 테이블에서
-- 이메일에 _ 앞글자가 세글자인 사원사번,이름,이메일 조회
SELECT EMP_ID,EMP_NAME, EMAIL FROM EMPLOYEE WHERE EMAIL LIKE '___%';

--문제점 : 와일드 카드 문자(_)와 패턴에 사용된 일반 문자(_)의 모양이 같아서 문제 발생
-- 해결방법: ESCAPE OPTION을 이용하여 일반 문자로 처리할 '_','%'앞에 아무 특수문자나 붙임

SELECT EMP_ID,EMP_NAME, EMAIL FROM EMPLOYEE WHERE EMAIL LIKE '___$_%' ESCAPE '$';
                                                        --> $뒤 한 글자만(_)을 일반 문자 취급

연산자 우선순위

 

1. 산술연산자
2. 연결연산자
3. 비교연산자
4. IS NULL / IS NOT NULL, LIKE, IN / NOT IN
5. BETWEEN AND / NOT BETWEEN AND
6. NOT(논리연산자)
7. AND(논리연산자)
8. OR(논리연산자)

 


IN 연산자

 

-비교하려는 값과 목록에 작성된 값 중 일치하는 것이 있으면 조회하는 연산자
--> OR 연산을 연달아 작성한 효과

[작성법]
컬럼명 IN (값1,값2,값3...)
            (목록)

*/

--EMPLOYEE 테이블에서
--부서코드가 D1또는 D6 또는 D9인 사원의 사번,이름,부서코드 조회
SELECT EMP_ID, EMP_NAME,DEPT_CODE 
FROM EMPLOYEE 
--WHERE DEPT_CODE ='D1' OR DEPT_CODE ='D6' OR DEPT_CODE ='D9';
WHERE DEPT_CODE IN ('D1','D6','D9');

--사번이 200,205,210인 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME 
FROM EMPLOYEE WHERE EMP_ID IN ('200','205','210');

--사번이 200,205,210이 아닌(NOT)사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME 
FROM EMPLOYEE WHERE EMP_ID NOT IN ('200','205','210');

연결 연산자 ( || )

 

--여러 값을 하나의 컬럼 값으로 연결하는 연산자
--(자바의 문자열 + (이어쓰기) 효과)
SELECT EMP_NAME || '의 급여는' || SALARY||'원 입니다.' AS "결과"
FROM EMPLOYEE;

 


NULL 처리 연산자

 

--JAVA에서 NULL : 참조하는 객체가 없다.
--DB에서 NULL : 컬럼 값이 없다.

1) IS NULL : 컬럼 값이 NULL인 경우 조회

2) IS NOT NULL : 컬럼 값이 NULL이 아닌 경우 조회 

*/

-- EMPLOYEE 테이블에서 전화번호가 없는 사원의 사번, 이름, 전화번호 조회

SELECT EMP_ID,EMP_NAME,PHONE FROM EMPLOYEE WHERE PHONE IS NULL;

-- EMPLOYEE 테이블에서 보너스를 받는 사원의 이름, 보너스 조회

SELECT EMP_NAME,BONUS FROM EMPLOYEE WHERE BONUS IS NOT NULL;

ORDER BY 절

-SELECT 문의 조회결과(RESULT SET)을 정렬할 때 작성하는 구문

-*** SELECT문 가장 마지막에 해석***

[작성법]
3 : SELECT 컬럼명 AS 별칭, 컬럼명, 컬럼명 ...
1 : FROM 테이블명
2 : WHERE 조건식
4 : ORDER BY 컬럼명 | 별칭 | 컬럼순서 [정렬방식(오름/내림)] [NULLS FIRST | LAST]


*/

-- EMPLOYEE 테이블에서 급여 "오름차순"으로 이름,급여 조회

SELECT EMP_NAME,SALARY FROM EMPLOYEE ORDER BY SALARY ASC; -- *ASENDING 값이 점점커짐

--EMPLOYEE 테이블에서 급여 "내림차순"으로 이름,급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
ORDER BY SALARY DESC; -- *DESENDING 값이 점점 작아짐


--급여가 200만원 이상인 사원을 오름차순 정렬

SELECT * FROM EMPLOYEE 
WHERE SALARY >=2000000 
ORDER BY SALARY
/*ASC 생략가능*/;
--ORDER BY 정렬 방식은 기본적으로 오름차순

-- 정렬은 숫자,문자,날짜 모두 사용 가능
-- 이름 오름차순 정렬
SELECT EMP_NAME
FROM EMPLOYEE
ORDER BY EMP_NAME;

--고용일 내림차순
SELECT EMP_NAME,HIRE_DATE 
FROM EMPLOYEE 
--ORDER BY HIRE_DATE DESC;
ORDER BY 2 DESC;

--연봉 내림차순
SELECT EMP_NAME, SALARY * 12 AS "연봉"
FROM EMPLOYEE
--WHERE 연봉 >= 5000000 --> 해석 순서가 별칭 해석 전이기 때문에 오류 발생 
ORDER BY 연봉 DESC; -- 별칭
ORDER BY SALARY DESC; --컬럼명
ORDER BY 2 DESC; -- 컬럼순서

-- 보너스 정렬
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
--ORDER BY BONUS; -- NULLS LAST 기본값

--ORDER BY BONUS DESC; -- NULLS FIRST 기본 값

ORDER BY BONUS NULLS FIRST;

--오름차순 정렬 시 NULLS LAST가 기본값
--내림차순 정렬 시 NULLS FIRST가 기본값

--EMPLOYEE 테이블에서 부서코드 오름차순 정렬 후
--부서별 급여 내림차순 정렬
728x90
반응형

'코딩공부 > DB' 카테고리의 다른 글

Oracle - Select문 (05)  (0) 2025.02.08
Oracle - DML (01)  (0) 2025.02.08
Oracle - Select문 (04)  (0) 2025.01.20
Oracle - Select문 (03)  (0) 2025.01.20
Oracle - Select문 (02)  (0) 2025.01.20