테이블 조회(SELECT)

Joy🌱·2023년 1월 11일
0

🐚 Oracle

목록 보기
1/11
post-thumbnail

💁‍♀️ 테이블 조회(SELECT)란,
데이터베이스에서 정보를 검색할 때 사용하는 기본 명령어. SELECT 문을 사용하여 테이블 전체를 불러올 수도 있고 특정 컬럼이나 특정 행 혹은 특정 행/특정 컬럼을 조회할 수 있음


🙋‍ 잠깐 ! SQL부터 알아봅시다 !
💁‍♀️ SQL(Structured Query Language)이란,
관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색언어
원하는 데이터를 찾는 방법이나 절차를 기술하는 것이 아닌 조건을 기술하여 작성


👀 SELECT의 기본 문법

1) 모든 행, 모든 컬럼 조회

-- 대소문자를 구분하지 않으며 코딩 컨벤션에 따라서 키워드만 대문자로 사용하는 경우도 있고 모두 대문자, 모두 소문자로 사용하는 경우도 있을 수 있음

SELECT
		* -- *은 모든 컬럼을 의미
   FROM EMPLOYEE;

2) 원하는 컬럼 조회

◼ 사번, 이름 조회

SELECT
		EMP_ID
      , EMP_NAME
   FROM EMPLOYEE;

3) 원하는 행 조회

◼ 부서 코드가 D9인 사원 조회

SELECT
		*
   FROM EMPLOYEE
  WHERE DEPT_CODE = 'D9';

◼ 직급 코드가 J1인 사원 조회

SELECT
        *
   FROM EMPLOYEE
  WHERE JOB_CODE = 'J1'; 

4) 원하는 행과 컬럼 조회

◼ 급여가 300만원 이상(>=)인 사원의 사번, 이름, 부서코드, 급여를 조회

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

5) 컬럼에 별칭 지기

AS ""

SELECT
		EMP_NAME AS 이름
      , SALARY * 12 "1년 급여"
      , (SALARY + (SALARY * BONUS)) * 12 AS "총 소득" 
      , (SALARY + (SALARY * NVL(BONUS, 0))) * 12 
       					>>> NVL : NULL에 대한 함수처리
   FROM EMPLOYEE;

📌 Ref.

* AS는 생략가능
* 별칭에 띄어쓰기가 포함된 경우, ""로 반드시 묶어줘야함
* BONUS가 NULL일 경우 연산결과가 모두 NULL이 되어버림 (NVL사용해야함)
  

6) 임의로 지정한 문자열을 SELECT절에서 사용

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

7) DISTINCT

◼ DISTINCT 키워드는 중복 된 컬럼 값을 제거하여 조회

SELECT
		DISTINCT JOB_CODE
   FROM EMPLOYEE;

◼ DISTINCT 키워드는 SELECT절에 딱 한 번만 사용 가능

SELECT
        DISTINCT JOB_CODE
      , /*DISTINCT*/ DEPT_CODE 
   FROM EMPLOYEE;

📌 Ref.

* 여러 개의 컬럼의 중복을 제거하고 싶을 때는 간단하게 ','로 묶어 제외시키면 됨

👀 WHERE절

💁‍♀️ WHERE절이란,
테이블에서 조건을 만족하는 값을 가진 행을 골라내는 절.
여러 개의 조건을 만족하는 행을 골라낼 때 AND 혹은 OR을 사용할 수 있음

1) 조건을 만족하는 값을 가진 행 조회

◼ 부서코드가 D6이고 급여가 200만원을 초과하는 직원의 이름, 부서코드, 급여 조회

SELECT
        EMP_NAME
      , DEPT_CODE
      , SALARY
   FROM EMPLOYEE
  WHERE DEPT_CODE = 'D6'
    AND SALARY > 2000000;

2) NULL값

[1] NULL값 조회

◼ 보너스를 지급받지 않는 사원의 사번, 이름, 급여, 보너스를 조회

SELECT
        EMP_ID
      , EMP_NAME
      , SALARY
      , BONUS
   FROM EMPLOYEE
  WHERE BONUS IS NULL;	>>> 값이 NULL일 때는, '='이 아닌 'IS'를 사용해야함

[2] NULL이 아닌 값 조회

◼ 보너스를 지급받는 사원의 사번, 이름, 급여, 보너스를 조회

SELECT
        EMP_ID
      , EMP_NAME
      , SALARY
      , BONUS
   FROM EMPLOYEE
  WHERE BONUS IS NOT NULL;	>>> 값이 NULL일 때는, '!='이 아닌 'IS NOT'을 사용해야함

👀 연산자

1) 연결 연산자

||

◼ 컬럼과 컬럼의 연결

SELECT
        EMP_NAME || SALARY || BONUS
   FROM EMPLOYEE; -- 조회된 컬럼이 모두 병합되어 하나의 컬럼이 됨

◼ 컬럼과 리터럴 연결

SELECT
        EMP_NAME || '님의 월급은 ' || SALARY || '원 입니다 :)' AS 월급조회
   FROM EMPLOYEE;

2) 비교 연산자

= 같다
> 크다
< 작다
>= 크거나 같다
<= 작거나 같다
!= ^= <> 같지 않다

◼ 부서코드가 D9이 아닌 사원의 사번, 이름, 부서코드 조회

SELECT
        EMP_ID
      , EMP_NAME
      , DEPT_CODE
   FROM EMPLOYEE
--WHERE DEPT_CODE != 'D9';
--WHERE DEPT_CODE ^= 'D9';
  WHERE DEPT_CODE <> 'D9'; -- 세 가지 모두 '같지 않다'의 의미로 출력 결과 동일

◼ 퇴사 여부가 N인 직원을 조회하고 근무 여부라는 별칭으로 재직중이라는 문자열을 결과 집합에 포함해서 조회 (사번, 이름, 입사일, 근무여부 조회)

SELECT
        EMP_ID
      , EMP_NAME
      , HIRE_DATE
      , '재직중' AS 근무여부
   FROM EMPLOYEE
  WHERE ENT_YN = 'N';

◼ 급여를 350만원 이상, 550만원 이하 받는 직원의 이름, 부서코드, 급여 조회

SELECT
        EMP_NAME
      , DEPT_CODE
      , SALARY
   FROM EMPLOYEE
  WHERE SALARY >= 3500000
    AND SALARY <= 5500000;

3) BETWEEN AND 연산자

컬럼명 BETWEEN 하한값 AND 상한값 : 하한값 이상 상한값 이하의 값

SELECT
		EMP_NAME
	  , DEPT_CODE
	  , SALARY
   FROM EMPLOYEE
  WHERE SALARY BETWEEN 3500000 AND 5500000; >>> 바로 위와 동일한 결과의 식

◼ 반대로 350만원 미만, 550만원 초과하는 직원 조회

SELECT
		EMP_NAME
      , DEPT_CODE
      , SALARY
   FROM EMPLOYEE
--WHERE NOT SALARY BETWEEN 3500000 AND 5500000; >>> 1. 컬럼 앞에 NOT
  WHERE SALARY NOT BETWEEN 3500000 AND 5500000; >>> 2. 연산자 앞에 NOT

📌 Ref.

* NOT 연산자는 컬럼명 앞, 또는 BETWEEN 연산자 앞에 붙을 수 있음 (모두 가능)

4) LIKE 연산자

컬럼명 LIKE '문자 패턴'

💁‍♀️ LIKE 연산자란,
문자 패턴이 일치하는 값을 조회할 때 사용하는 연산자

  • 문자 패턴
    • 글자로 시작하는 값 : '글자%'
    • 글자로 끝나는 값 : '%글자'
    • 글자가 포함된 값 : '%글자%'

◼ 성이 김씨인 직원의 이름, 입사일 조회

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

◼ 성이 김씨가 아닌 직원의 이름, 입사일 조회

SELECT
        EMP_NAME
      , HIRE_DATE
   FROM EMPLOYEE
--WHERE NOT EMP_NAME LIKE '김%'; >>> 1. 컬럼 앞에 NOT
  WHERE EMP_NAME NOT LIKE '김%'; >>> 2. 연산자 앞에 NOT

◼ '하'가 포함된 직원의 이름, 부서코드 조회

SELECT
        EMP_NAME
      , DEPT_CODE
   FROM EMPLOYEE
  WHERE EMP_NAME LIKE '%하%';

◼ 전화번호 국번이 9로 시작하는 직원의 이름, 전화번호 조회

SELECT
        EMP_NAME
      , PHONE
   FROM EMPLOYEE
  WHERE PHONE LIKE '___9%'; >>> 언더바(_)3개면 PHONE의 010이 제외

📌 Ref.

* 와일드 카드 사용 : _(글자 한 자리), %(0개 이상의 글자)

◼ 전화번호 국번이 4자리면서 9로 시작하는 직원의 이름, 전화번호 조회

SELECT
        EMP_NAME
      , PHONE
   FROM EMPLOYEE
  WHERE PHONE LIKE '___9_______'; 

◼ 이메일에서 _ 앞글자가 3자리인 이메일 주소를 가진 사원의 이름, 이메일 주소 조회

SELECT
        EMP_NAME
        , EMAIL
   FROM EMPLOYEE
  WHERE EMAIL LIKE '___#_%' ESCAPE '#'; 
						>>> ESCAPE '#'로 표시해줘야함 (#말고 다른 문자 가능)

📌 Ref.

* ESCAPE '문자'
  : 언더바(_)를 사용한 후, 조회해올 컬럼에 언더바(_)가 포함되어있는 경우 프로그램이 구분을 하지 못 함. 
    따라서 EXCAPE와 '문자(Any type)'를 사용하여 구분해줘야함 

5) IN 연산자

💁‍♀️ IN 연산자란,
비교하는 값 목록에 일치하는 값이 있는지 확인하는 연산자

◼ 부서 코드가 D6이거나 D8인 직원의 이름, 부서, 급여 조회

SELECT
        EMP_NAME
        , DEPT_CODE
        , SALARY
    FROM EMPLOYEE
    WHERE DEPT_CODE IN ('D6', 'D8'); >>> : 'D6', 'D8'인 사람이 DEPT_CODE에 있나?

◼ 부서 코드가 D6이거나 D8인 직원을 제외한 직원들의 이름, 부서, 급여 조회

SELECT
        EMP_NAME
      , DEPT_CODE
      , SALARY
   FROM EMPLOYEE
--WHERE NOT DEPT_CODE IN ('D6', 'D8') >>> 1. 컬럼 앞에 NOT
  WHERE DEPT_CODE NOT IN ('D6', 'D8') >>> 2. 연산자 앞에 NOT
  
>>> 부서코드가 NULL값인 직원들은 NOT IN에도 나오지 않음. 만약 나오게 하려면,
    OR DEPT_CODE IS NULL;
>>> NULL 값은 NOT IN에서 취급되지 않으므로 이렇게 별도로 처리해야함

6) 연산자 우선순위 (AND, OR)

◼ J2 직급의 급여 200만원 이상 받는 직원이거나 J7 직급인 직원의 이름, 급여, 직급 코드 조회

SELECT
        EMP_NAME
      , SALARY
      , JOB_CODE
   FROM EMPLOYEE
  WHERE JOB_CODE = 'J7'
     OR JOB_CODE = 'J2'
    AND SALARY >= 2000000;	>>> ANDOR보다 먼저 동작 (J2 직급의 급여 200만원 이상 받는 직원)

◼ J7 직급이거나 J2 직급인 직원들 중 급여가 200만원 이상인 직원의 이름, 급여, 직급 코드 조회

SELECT
        EMP_NAME
      , SALARY
      , JOB_CODE
   FROM EMPLOYEE
  WHERE (JOB_CODE = 'J7'
     OR JOB_CODE = 'J2')	>>> ANDOR보다 먼저 동작하기 때문에 OR을 소괄호로 묶어야함 
    AND SALARY >= 2000000;

📌 Ref.

* 우선순위를 고려하여 OR가 먼저 처리되도록 ()를 이용하여 우선순위 변경

profile
Tiny little habits make me

0개의 댓글