Oracle_DML_SELECT문

2024. 10. 20. 14:07oracle

[SELECT문]
: 데이터를 조회하거나 검색할 때 사용하는 명령어
    
 [ 표현법 ]
SELECT 조회하고자 하는 컬럼,

               조회하고자 하는 컬럼,

               조회하고자 하는 컬럼...
   FROM 테이블명;
    
 ☆★ ResultSet: 조회된 행들의 집합 / SELECT구문을 통해 조회된 데이터의 결과물을 의미 ☆★

--------------------------------------------------------------------------------------------------------------------------------------------------

SELECT
       EMP_NAME,
       EMAIL,
       PHONE
  FROM
       EMPLOYEE;

--------------------------------------------------------------------------------------------------------------------------------------------------

 [ 칼럼의 값을 통한 산술 연산 ]
: 조회하고자 하는 칼럼들을 나열하는 SELECT절에 산술연산 ( +, -< *, / )을 기술해서 결과를 조회할 수 있음

 

-- EMPLOYEE테이블로부터 직원명, 월급, 연봉( == 월급 X 12)
SELECT
       EMP_NAME,
       SALARY,
       SALARY * 12
  FROM
       EMPLOYEE  

 

-- EMPLOYEE 테이블로부터 직원명, 월급, 보너스, 보너스가 포함된 연봉((월급 * 보너스 + 월급) * 12)
SELECT
       EMP_NAME,
       SALARY,
       BONUS,
        ((SALARY * BONUS + SALARY) * 12)
  FROM
       EMPLOYEE;


   산술연산하는 과정에서 NULL값이 존재할 경우 산술연산의 과정 마저도 NULL이 된다.
--------------------------------------------------------------------------------------------------------------------------------------------------

  • DATE → 년, 월, 일, 시, 분, 초
  • DATE타입끼리도 연산 가능
  • EMPLOYEE테이블에서 직원명, 입사일, 근무일수(오늘날짜 - 입사일)
  • 오늘날짜: SYSDATE

SELECT
       EMP_NAME,
       HIRE_DATE,
       SYSDATE - HIRE_DATE
  FROM
       EMPLOYEE;


  값이 지저분한 이유는 Date타입안에 시/분/초가 포함되어있어서 연산을 수행하기 때문
--------------------------------------------------------------------------------------------------------------------------------------------------


[ 컬럼명에 별칭 부여하기 ]
[ 표현법 ]
컬럼명 AS별칭, 컬럼명 AS "별칭", 컬럼명 "별칭", 컬럼명 별칭

SELECT
       EMP_NAME AS 이름,
       SALARY "급여(월)",
       BONUS 보너스,
       ((SALARY * BONUS + SALARY) * 12) "총 소득"
  FROM
       EMPLOYEE;
--------------------------------------------------------------------------------------------------------------------------------------------------

[ 리터럴 ]
임의로 지정한 문자열('')을 SELECT절에 기술하게 되면
ResultSet을 반환받을 때 데이터를 붙여서 조회할 수 있음


-- EMPLOYEE 테이블로부터 사원명, 급여
SELECT
       EMP_NAME,
       SALARY 
       '원' 단위
  FROM
       EMPLOYEE;
--------------------------------------------------------------------------------------------------------------------------------------------------

[ DISTINCT ]
조회하고자하는 컬럼 앞에 작성하여 중복된 값을 딱 한번만 조회하는 용도로 사용
    
[ 표현법 ]
DISTINCT 컬럼명
    
(단, SELECT절에 DISTINCT구문은 한 개만 사용가능)

        
SELECT
       DISTINCT DEPT_CODE
  FROM
       EMPLOYEE;
        
--------------------------------------------------------------------------------------------------------------------------------------------------

SELECT문에서 조건을 부여하는 방법!
  
[ WHERE 절 ]
조회하고자 하는 테이블에 특정 조건을 제시해서
조건에 만족하는 데이터만을 조회하고자 할 때 기술하는 구문 
  
[ 표현법 ]
SELECT 조회하고자 하는 컬럼명, 컬럼명, 컬럼명, ...
   FROM 테이블명
WHERE 조건식;
    
실행순서:  FROM > WHERE > SELECT 순서로 동작
    
조건식에 다양한 연산자들을 사용할 수 있음
 
[ 비교 연산자 ]
>, <, >=, <=  대소비교
     
(일치하는가 ? 자바에서는 동등비교 == 였음)
=
!= (일치하지않는가?
         
--------------------------------------------------------------------------------------------------------------------------------------------------
              
EMPLOYEE 테이블로부터 부서코드가 D9가 아닌 사원들의 사원명, 전화번호 조회
SELECT
       EMP_NAME,
       PHONE
  FROM 
       EMPLOYEE
 WHERE 
       DEPT_CODE != 'D9';
       DEPT_CODE ^= 'D9';
       DEPT_CODE <> 'D9';
         
    <실습문제>

1. EMPLOYEE테이블에서 급여가 250만원 이상인 사원들의 이름, 급여, 입사일 조회
SELECT
       EMP_NAME "이름",
       SALARY "급여",
       HIRE_DATE "입사일"
  FROM 
       EMPLOYEE
 WHERE
       SALARY >= 2500000;

 2. EMPLOYEE테이블에서 직급코드가 J2인 사원들의 이름, 급여, 보너스 조회
SELECT
       EMP_NAME "이름",
       SALARY "급여",
       BONUS "보너스"
  FROM
       EMPLOYEE
 WHERE
       DEPT_CODE = 'J2';

3. EMPLOYEE테이블에서 현재 재직중인 사원(ENT_YN == 'N')들의 사번, 이름, 입사일 조회
SELECT
      EMP_ID "사번",
      EMP_NAME "이름",
      HIRE_DATE "입사일"
FROM 
     EMPLOYEE
WHERE 
     ENT_YN = 'N';
     
4. EMPLOYEE테이블에서 연봉이 5000만원이 이상인 사원들의 이름, 급여, 연봉, 입사일 조회
SELECT
      EMP_NAME 사원,
      SALARY 급여,
      SALARY*12 연봉,
      HIRE_DATE 입사일
FROM
     EMPLOYEE
WHERE
     SALARY*12 >= 50000000;
     -- 연봉 >= 50000000; (오류)
--> SELECT절에 부여한 별칭을 WHERE절에 사용할 수 없는 이유는 WHERE절에 실행순서가 더 빠르기 때문
-- 별칭은 SELECT절에서 부여했지만 실행순서가 WHERE절에서 조건을 먼저 검사하고 SELECT문으로 가기때문에
-- WHERE절에서는 별칭을 알 수 없음 
     
-----------------------------------------------------------------------------------------------------------------------------------------------------------

-- 모든 데이터가 구조를 잡아서 테이블 형태로 저장해놓는다
-- 테이블구조에서 원하는걸 찾을 때 사용하는 것이 SELET문인데 조회는 항상 행단위로 이루어진다
-- 조회해서 나온 행들이 집합 = RESULTSET!!중요
-- 조회에 아무것도 뜨지 않으면 조회를 해 왔는데 조회된 행의 결과가 0인것! (조회가 안된게 아님)
-- 오류라면 오류문구가 뜸
-----------------------------------------------------------------------------------------------------------------------------------------------------------

    [ 논리 연산자 ]
    여러 개의 조건을 엮을 때 사용
    
    AND(~~이면서, 그리고) /OR(~~거나, 또는)


EMPLOYEE테이블로부터 부서코드가 'D9'이면서 급여가 500만원 이상인 사원들의 사원명, 부서코드, 급여 조회
SELECT
       EMP_NAME,
       DEPT_CODE,
       SALARY
  FROM 
       EMPLOYEE
 WHERE
       DEPUT_CODE = 'D9'
   AND
       SALARY >= 5000000;
       
EMPLOYEE테이블로부터 부서코드가 D6이거나 급여가 300만원 이상인 사원들의 이름, 부서코드, 급여 조회
SELECT
       EMP_NAME,
       DEPT_CODE,
       SALARY
  FROM
       EMPLOYEE
 WHERE 
       DEPUT_CODE = 'D6'
    OR
       SALARY >= 3000000;
       
-----------------------------------------------------------------------------------------------------------------------------------------------------------

 

    [ BETWEEN AND ]
    몇 이상 몇 이하인 범위에 대한 조건을 제시할 때 사용
    
    [ 표현법 ]
    비교대상컬럼명 BETWEEN 하한값 AND 상한값


 EMPLOYEE테이블로부터 급여가 350이상 500이하인 사원들의 사번 이름 급여 직급코드 조회
SELECT
       EMP_ID,
       EMP_NAME,
       SALARY,
       JOB_CODE
  FROM
       EMPLOYEE
 WHERE
       SALARY BETWEEN 3500000 AND 5000000;
       
-- 위 조건에 포함되는 것말고 그 나머지를 찾고싶은 경우
-- EMPLOYEE테이블로부터 급여가 350만 미만이거나 500만을 초과하는 사원들의 사번, 이름, 급여, 직급코드 조회
-- BETWWEN앞에 NOT을 붙여주면 부정의 의미로 반대값이 출력된다 (자바에서 !와 같은 역할)
SELECT
       EMP_ID,
       EMP_NAME,
       SALARY,
       JOB_CODE
  FROM
       EMPLOYEE
 WHERE
       SALARY NOT BETWEEN 3500000 AND 5000000;
       
       
-- BETWEEN AND 연산자는 DATE형식에도 사용 가능
-- 입사일이 '90/01/01' ~ '03/01/01' 인 사원들의 이름과 입사일 조회
SELECT
       EMP_NAME,
       HIRE_DATE
  FROM 
       EMPLOYEE
 WHERE
       HIRE_DATE BETWEEN '90/01/01' AND '03/01/01';
       
-----------------------------------------------------------------------------------------------------------------------------------------------------------

    [ LIKE '특정패턴' ]
    비교하려는 컬럼의 값이 내가 지정한 특정 패턴에 만족할 경우 조회 
    
    [ 표현법 ]
    비교대상컬럼명 LIKE '특정패턴'
    
    - 특정패턴 -> 와일드 카드(데이터베이스 커리에서 특정패턴을 만들기 위한 특정문자들)
    - '%', '_' (와일드카드)를 가지고 패턴을 만들어낼 수 있음 
    - LIKE문에는 와일드카드가 같이 사용된다

    - 부정일 경우 NOT 붙이기

     
    '%' : 0글자 이상
     EX) 비교대상컬럼명 LIKE 'A%' => 비교대상컬럼 값 중 'A'로 시작하는 것만 조회 -> Apple, Add, A 
         비교대상컬럼명 LIKE '%A' => 비교대상컬럼 값 중 'A'로 끝나는 것만 조회 -> Banana, Golila, A
         비교대상컬럼명 LIKE '%A%' => 비교대상컬럼 값 중 'A'가 포함되는 것을 모두 조회
         
    '_' : 1글자(무조건 한글자가 있어야함)
     EX) 비교대상컬럼명 LIKE '_A' => 해당 컬럼 값중에 'A'앞에 무조건 1글자가 있으면 조회
         비교대상컬럼명 LIKE '__A' => 해당 컬럼 값중에 'A'앞에 무조건 2글자가 있으면 조회
         언더버 한개당 한글자를 의미('_A_'이면 두번째 글자가 A인 글자 조회)

-- EMPLOYEE 테이블로부터 성이 '강'씨인 사원들의 사원명, 부서코드 조회 
SELECT
       EMP_NAME,
       DEPT_CODE
  FROM
       EMPLOYEE
 WHERE
       EMP_NAME LIKE '강%';
       
-- EMPLOYEE 테이블로부터 이름에 '민'이라는 글자가 포함된 사원들의 사원명, 부서코드 
SELECT
       EMP_NAME,
       DEPT_CODE
  FROM
       EMPLOYEE
 WHERE
       EMP_NAME LIKE '%민%';
       
-- EMPLOYEE 테이블로부터 이름의 두번째 글자가 '길'인 사원들의 사원명, 부서코드 
SELECT
       EMP_NAME,
       DEPT_CODE
  FROM 
       EMPLOYEE
 WHERE
       EMP_NAME LIKE '_길_';
       
-- EMPLOYEE 테이블로부터 이름의 두번째 글자가 '길'이 아닌! 사원들의 사원명, 부서코드 
SELECT
       EMP_NAME,
       DEPT_CODE
  FROM 
       EMPLOYEE
 WHERE
       EMP_NAME NOT LIKE '_길_';      
       
-----------------------------------------------------------------------------------------------------------------------------------------------------------

    < 실습문제 >

-- 1. EMPLOYEE테이블로부터 전화번호 4번째 자리가 9로 시작하는 사원들의 사원명, 전화번호 조회
SELECT
       EMP_NAME,
       PHONE
  FROM 
       EMPLOYEE
 WHERE 
       PHONE LIKE '___9%';

-- 2. EMPLOYEE테이블로부터 이름이 '동'으로 끝나는 사원들의 이름, 입사일 조회
SELECT
        EMP_NAME,
        HIRE_DATE
  FROM 
        EMPLOYEE
 WHERE 
        EMP_NAME LIKE '%동';
       
-- 3. EMPLOYEE테이블로부터 전화번호 처음 3글자가 010이 아닌 사원들의 이름, 전화번호 조회
SELECT
        EMP_NAME,
        PHONE
  FROM 
        EMPLOYEE
 WHERE
        PHONE NOT LIKE '010%';
       
-- 4. DEPARTMENT 테이블로부터 해외영업과 관련된 부서들의 부서명 조회
SELECT
       DEPT_TITLE
  FROM 
       DEPARTMENT
 WHERE 
       DEPT_TITLE LIKE '해외%';
     
----------------------------------------------------------------------------------------------------------------------------------------------------------- 


    [ IS NULL ]
    [ 표현법 ] 
    비교대상컬럼 IS NULL : 컬럼값이 NULL일 경우
    비교대상컬럼 IS NOT NULL : 컬럼값이 NULL이 아닐 경우 
       
-- EMPLOYEE테이블로부터 보너스를 받지 않은 사원들의 사원명, 보너스 조회
SELECT
        EMP_NAME,
        BONUS
  FROM
        EMPLOYEE
 WHERE 
        BONUS IS NULL;
        
        
-----------------------------------------------------------------------------------------------------------------------------------------------------------
-- EMPLOYEE테이블로부터 부서코드가 D6이거나 D8이거나 D5인 사원들의 사원명, 부서코드 조회 
SELECT
        EMP_NAME,
        DEPT_CODE
  FROM 
        EMPLOYEE
 WHERE
        DEPT_CODE = 'D6'
    OR   
        DEPT_CODE = 'D8'
    OR  
        DEPT_CODE = 'D5';
-- 이코드도 맞지만 비교연산을 많이 해서 코드가 길어짐 그럴때 아래와 같은 IN을 사용할 수 있다 

    < IN >
    비교대상 컬럼 값에 내가 제시한 목록들 중에서 일치하는 값이 있는지
    
    [표현법]
    비교대상컬럼 IN {값, 값, 값, ...}

SELECT
        EMP_NAME,
        DEPT_CODE
  FROM 
        EMPLOYEE
 WHERE
        DEPT_CODE IN ('D6', 'D8', 'D5');    

-----------------------------------------------------------------------------------------------------------------------------------------------------------
    [ 연산자 우선순위 ]
    
    0. ( ) 괄호
    1. 산술연산자  +, -< *, / 
    2. 연결연산자 ||
    3. 비교연산자 >, <, >=, <=
    4. ISNULL, LIKE, IN
    5. BETWEEN AND
    6. NOT
    7. AND
    8. OR
    
EX]
 WHERE
        DEPT_CODE = 'D6'
    OR   
        DEPT_CODE = 'D8'
    AND  
        DEPT_CODE = 'D5';
=> AND연산이 먼저 실행되어 D8과 D5의 AND연산이 먼저 이루어진다 값은 NULL이 결과이고 다음
D6과 OR연산이 이루어진다
    
        
-----------------------------------------------------------------------------------------------------------------------------------------------------------

    [ 연결 연산자 ]
    여려개의 컬럼값들을 마치 하나의 컬럼인것처럼 연결시켜주는 연산자
    컬럼값 또는 리터럴(임의의 문자열)을 전부 다 연결 할 수 있음 
    
    RESULTSET에서 따로따로 나오는 것이 아니라 하나의 값처럼 출력
    칼럼값뿐만 아니라 문자열도 같이 포함하여 연결할 수 있어 문장처럼 만들 수도 있다
   
    
    System.out.println("num : " + num);



SELECT
        EMP_ID ||
        EMP_NAME
  FROM
        EMPLOYEE; 
        
SELECT  EMP_ID || '번 사원' || EMP_NAME || '님의 핸드폰 번호는 ' || PHONE || '입니다.' AS "사원정보"
  FROM
        EMPLOYEE;
-- 200번 사원이승철님의 핸드폰 번호는 01099546325입니다.

----------------------------------------------------------------------------

    ★< ORDER BY 절 >★
    조회된 RESULTSET을 정렬하는 용도로 사용
    
    SELECT문 가장 마지막에 가입하는 문법 + 실행순서 또한 항상 가장 마지막
    
    사용하지 않는 경우 RESULTSET은 정렬하지 않기 때문에 정렬하고 싶다면 반드시 작성해야함!
    (조회결과가 2행 이상이고 SELECT절을 사용했으면 무조건 정렬하기위해 항상 사용되는 절)
    
    [ 표현법 ]
    SELECT
           조회할 컬럼명,
           조회할 컬럼명,
           ...
     FROM  
           조회할 테이블명
    WHERE
           조건식(생략가능)
    ORDER
       BY
           [정렬기준으로 잡고싶은 컬럼명 / 컬럼의 별칭/ 컬럼의 순번] [ASC / DESC ] [ NULLS FIRST / NULLS LAST] (생략가능)
           
    - ASC : 오름차순 (생략 시 기본 값)
    - DESC : 내림차순
    
    - NULLS FIRST : 정렬하고자 하는 컬럼값에 NULL값이 존재할 경우 해당 NULL값들을 조회 결과의 위쪽으로 배치(내림차순일 경우 기본값)
    - NULLS LAST : 정렬하고자 하는 컬럼값에 NULL값이 존재할 경우 해당 NULL값들을 조회 결과의 하단으로 배치(오름차순일 경우 기본값)
    
    - 정렬기준을 여러개로 잡을 수도 있음 
    (첫번째로 제시한 정렬기준의 컬럼값이 동일할 경우 두번째 정렬 기준을 가지고 또 정렬을 할 수 있음 )
    
    - 실행순서가 맨마지막에 실행 (SELECT절에서 별칭을 지었다면 ORDER BY절에서 사용가능)


-- 보너스 컬럼의 값을 가지고 정렬
SELECT
        EMP_ID,
        EMP_NAME,
        BONUS
  FROM 
        EMPLOYEE
 ORDER
    BY
        BONUS;                                          → ASC/ DESC 생략시 기본값은 ASC(오름차순). NULL값은 하단에 배치
        BONUS DESC;                               → 내림차순으로 정렬 시 기본적으로 NULLSFIRST NULL값이 상단에 배치
        BONUS DESC NULLS LAST;         → 내림차순으로 정렬하고 NULL값을 하단에 배치해라
        BONUS, EMP_ID ASC;                  → 보너스값을 ASC로 먼저 정렬하고 같은 값끼리 EMP_ID를 ASC로 정렬
         → 첫번째로 제시한 정렬기준의 컬럼값이 동일할 경우 두번째 정렬 기준을 가지고 또 정렬을 할 수 있음 
     
     
SELECT
        EMP_NAME 사원명,
        SALARY * 12 연봉
  FROM
        EMPLOYEE
 ORDER
    BY 
        -- 연봉; : 별칭사용가능
  
[기억하기]
행단위로 조회된다
조회결과를 RESULTSET이라 한다
순서
ORDER BY절을 사용하자

'oracle' 카테고리의 다른 글

Oracle_DDL_CREATE / ALTER / DROP  (1) 2024.10.27
Orcale_DML_INSERT / UPDATE / DELETE  (0) 2024.10.27
Orcale_DDL_CREATE / ALTER/ DROP  (5) 2024.10.23
Oracle_DML_SUB QUERY 서브쿼리  (3) 2024.10.21
Oracle_DML_FUNCTION  (2) 2024.10.20