SQL

SQL SELECT

#풀닢 2023. 1. 11. 12:04

SELECT 

기본 문법 및 연산자


 

모든 행, 코든 컬럼 조회 *
대소문자를 구분하지 않으며 코딩 컨벤션에 따라서 키워드만 대문자로 사용하는 경우도 있고
모두 대문자, 모두 소문자로 사용하는 경우도 있을 수 있다 ALT+'

 

SELECT
      *
    FROM EMPLOYEE;

원하는 칼럼 조회
사번, 이름 조회 EMP_ID   
,EMP_NAME

 

SELECT
    EMP_ID
    ,EMP_NAME
    FROM EMPLOYEE;

원하는 행 조회
부서 코드가 D9인 사원 조회 WHERE DEPT_CODE ='D9';

 

SELECT
    *
    FROM EMPLOYEE
WHERE DEPT_CODE ='D9';

직급 코드가 J1인 사원 조회 WHERE JOB_CODE = ' J 1 ';

 

SELECT
    *
    FROM EMPLOYEE
    WHERE JOB_CODE ='J1';

원하는 행과 컬럼 조회
급여가 300만원 이상(>=)인 
사원의 사번,이름,부서코드, 급여를 조회
    EMP_ID
    ,EMP_NAME
    ,DEPT_CODE
    ,SALARY
    FROM EMPLOYEE
    WHERE SALARY>=3000000;

 

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

컬럼에 별명 짓기
AS+별칭을 기술하여 별칭을 지을 수 있다
EMP_NAME AS 이름
NULL이면 0으로 대체하겠다. (SALARY + (SALARY * NVL(BONUS,0))) * 12 "총 소득"
SELECT
    EMP_NAME AS 이름
    , SALARY * 12 "1년 급여"
    , (SALARY + (SALARY * BONUS)) * 12 "총 소득"
    , (SALARY + (SALARY * NVL(BONUS,0))) * 12 "총 소득"
FROM EMPLOYEE;

임의로 지정한 문자열을 SELECT절에서 사용     EMP_ID
    , EMP_NAME
    , SALARY
    ,'원' AS 단위

 

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

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

 

SELECT
    DISTINCT JOB_CODE
FROM EMPLOYEE;
DISTINCT 키워드 셀럭트절에 딱 한번 쓸 수 있음
여러 개의 컬럼을 묶어서 중복을 제외 시킨다.

 

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

WHERE절 테이블에서 조건을 만족하는 값을 가진 행을 골라낸다.
여러 개의 조건을 만족하는 행을 골라 낼 떄 AND 혹은 OR를 사용할 수 있다.
부서 코드가 D6이고 급여가 200만원을 초과하는 
직원의
이름, 부서코드, 급여 조회


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

 

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

NULL값 조회
NULL값을 취급할 떄는 별도의 연산자가 
필요하다 IS를 적어야 한다.
WHERE BONUS IS NULL;
보너스를 지급받지 않는
사원의 사번, 이름, 급여, 보너스를 조회
    EMP_ID
    ,EMP_NAME
    ,SALARY
    ,BONUS
FROM EMPLOYEE
WHERE BONUS IS NULL;

 

SELECT
    EMP_ID
    ,EMP_NAME
    ,SALARY
    ,BONUS
FROM EMPLOYEE
WHERE BONUS IS NULL;

NULL이 아닌값 조회 WHERE BONUS IS NOT NULL;
보너스를 지급받는 사원의 사번, 이름, 급여, 보너스를 조회     EMP_ID
    ,EMP_NAME
    ,SALARY
    ,BONUS
FROM EMPLOYEE
WHERE BONUS IS NOT NULL;

NULL이 아닌값 조회
보너스를 지급받는 사원의 사번, 이름, 급여, 보너스를 조회
    EMP_ID
    ,EMP_NAME
    ,SALARY
    ,BONUS
FROM EMPLOYEE
WHERE BONUS IS NOT NULL;

 

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

 


연결 연산자를 이용하여 
여러 컬럼을 하나의 컬럼인 것처럼 연결할 수 있다 (||)
컬럼과 컬럼의 연결 연산자
    EMP_NAME || SALARY || BONUS

 

SELECT
    EMP_NAME || SALARY || BONUS
FROM EMPLOYEE;

 


컬럼과 리터럴 연결     EMP_NAME || '의 월급은' || SALARY || '원 입니다.'

 

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

비교 연산자 = 같다, >크다, <작다, >= 크거나 같다, <= 작거나 같다
-- !=, ^=, <> 같지 않다
부서 코드가 D9가 아닌 사원의 사번, 이름, 부서코드 조회     EMP_ID
    ,EMP_NAME
    ,DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE != 'D9';

 

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

퇴사 여부가 N인 직원을 조회하고 근무 여부라는 별칭으로 재직중이라는 문자열을 결과 집합에 포함해서 조회한다.
(사번, 이름, 입사일, 근무여부 조회)
    EMP_ID
    ,EMP_NAME
    ,HIRE_DATE
    ,'재직중' 근무여부
FROM EMPLOYEE
WHERE ENT_YN ='N';

 

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

급여를  350만원 이상, 550만원 이하 받는 직원의 이름, 부서코드, 급여 조회     EMP_NAME
    ,DEPT_CODE
    ,SALARY
FROM EMPLOYEE
WHERE SALARY >= 3500000
AND SALARY <= 5500000;

 

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

BETWEEN AND

컬럼명 BETWEEN 하한값 AND 상한값 : 하한값 이상 상한값 이하의 값
SELECT
    EMP_NAME
    ,DEPT_CODE
    ,SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 3500000 AND 5500000;
SELECT
    EMP_NAME
    ,DEPT_CODE
    ,SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 3500000 AND 5500000;

반대로 350만원 미만, 550만원 초과하는 직원 조회 
NOT 연산자는 컬럼 앞에 또는 BETWEEN 연산자 앞에 붙을 수 있다.
SELECT
    EMP_NAME
    ,DEPT_CODE
    ,SALARY
FROM EMPLOYEE
--NOT 연산자는 컬럼 앞에,
-- WHERE NOT SALARY BETWEEN 3500000 AND 5500000;
--또는 BETWEEN 연산자 앞에 붙을 수 있다.
WHERE SALARY NOT BETWEEN 3500000 AND 5500000;
SELECT
    EMP_NAME
    ,DEPT_CODE
    ,SALARY
FROM EMPLOYEE
--NOT 연산자는 컬럼 앞에,
-- WHERE NOT SALARY BETWEEN 3500000 AND 5500000;
--또는 BETWEEN 연산자 앞에 붙을 수 있다.
WHERE SALARY NOT BETWEEN 3500000 AND 5500000;

LIKE 연산자 문자 패턴이 일치하는 값을 조회할 때 사용
컬럼명 LIKE '문자 패턴'
문자 패턴 글자 %'(글자로 시작하는 값)
'%글자' (글자로 끝나는 값)
'%글자%' (글자가 포함 된 값)

성이 김씨인 직원의 이름, 입사일 조회 SELECT
    EMP_NAME
    ,HIRE_DATE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '김%';
SELECT
    EMP_NAME
    ,HIRE_DATE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '김%';

성이 김씨가 아닌 직원의 이름, 입사일 조회 SELECT
    EMP_NAME
    ,HIRE_DATE
FROM EMPLOYEE
WHERE NOT EMP_NAME LIKE '김%';
SELECT
    EMP_NAME
    ,HIRE_DATE
FROM EMPLOYEE
WHERE NOT EMP_NAME LIKE '김%';

-- 하 가 이름에 포함 된 직원의 이름, 부서 코드 조회 SELECT
    EMP_NAME
    , DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%하%';
SELECT
    EMP_NAME
    , DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%하%';

전화번호 국번이 9로 시작하는 직원의 이름, 전화번호 조회
-- 와일드 카드 사용 : _(글자 한 자리), %(0개 이상의 글자)
SELECT
    EMP_NAME
    ,PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '___9%';
SELECT
    EMP_NAME
    ,PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '___9%';

전화번호 국번이 4자리이면서 9로 시작하는 직원의 이름, 전화번호 조회 SELECT
    EMP_NAME
    ,PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '___9_______';
SELECT
    EMP_NAME
    ,PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '___9_______';

이메일에서 _ 앞글자가 3자리인 이메일 주소를 가진 사원의 이름, 이메일 주소 조회 SELECT
    EMP_NAME
    ,EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '__#_%' ESCAPE '#';
ESCAPE #_ 이스캐이프 , 문자 언더바임 그리고 그 뒤에 샵은 이스캐프로 할게요 라고 초기화_은 자리차지 %은 있다.

IN 연산자 비교하는 값 목록에 일치하는 값이 있는지 확인
부서 코드가 D6이거나 D8인 직원의 이름, 부서, 급여 조회 SELECT
    EMP_NAME
    ,DEPT_CODE
    ,SALARY
    FROM EMPLOYEE
    WHERE DEPT_CODE IN ('D6','D8');
SELECT
    EMP_NAME
    ,DEPT_CODE
    ,SALARY
    FROM EMPLOYEE
    WHERE DEPT_CODE IN ('D6','D8');

부서 코드가 D6이거나 D8인 직원을 제외한 나머지 이름, 부서, 급여 조회
NULL 값은 NOI IN에서 취급되지 않으므로 별도로 처리해야 한다.
    WHERE DEPT_CODE NOT IN ('D6','D8')
    OR DEPT_CODE IS NULL;
SELECT
    EMP_NAME
    ,DEPT_CODE
    ,SALARY
    FROM EMPLOYEE
--    WHERE NOT DEPT_CODE IN ('D6','D8');
    WHERE DEPT_CODE NOT IN ('D6','D8')
    --NULL 값은 NOI IN에서 취급되지 않으므로 별도로 처리해야 한다.
    OR DEPT_CODE IS NULL;

연산자 우선 순위 (AND,OR) AND먼저 진행
J2 직급의 급여 200만원 이상 받는 직원이거나
J7 직급인 직원의 이름,급여, 직급 코드 조회
    WHERE JOB_CODE = 'J7'
    
    --AND먼저 진행
    OR JOB_CODE = 'J2'
    AND SALARY >= 2000000;
SELECT
    EMP_NAME
    ,SALARY
    ,JOB_CODE
    FROM EMPLOYEE
    WHERE JOB_CODE = 'J7'
    
    --AND먼저 진행
    OR JOB_CODE = 'J2'
    AND SALARY >= 2000000;

J7 직급이거나 J2 직급인 직원들 중
급여가 200만원 이상인 직원의 이름, 급여, 직급 코드 조회
    WHERE (JOB_CODE = 'J7'
    OR JOB_CODE = 'J2')
    AND SALARY >= 2000000;
SELECT
    EMP_NAME
    ,SALARY
    ,JOB_CODE
    FROM EMPLOYEE
    WHERE (JOB_CODE = 'J7'
    OR JOB_CODE = 'J2')
    AND SALARY >= 2000000;

 

SMALL