반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

Oracle SQL - 기본문법(기본연산자,논리부정연산자,별칭 부여하기,연산자 우선순위,NULL비교) 본문

Oracle SQL/Oracle SQL

Oracle SQL - 기본문법(기본연산자,논리부정연산자,별칭 부여하기,연산자 우선순위,NULL비교)

yeonee 여니 2023. 5. 31. 11:37
728x90
반응형
SMALL

안녕하세요.

#yeoneeblog 여니입니다 :)

 

/*
DML : 데이터 조작 , SELECT(DQL) , INSERT , UPDATE , DELETE
DDL : 데이터 정의 , CREATE , ALTER , DROP
TCL : 트랜잭션 제어, COMMIT, ROLLBACK
DCL : 권한 부여, GRANT, REVOKE

    <SELECT>
    데이터를 조회하거나 검색할 때 사용하는 명령어
    
    - RESERT SET : SELECT 구문을 통해 조회된 데이터의 결과물을 의미
                (조회된 행들을 집합)
    [표현법]
    SELECT 조회하고자하는 컬럼명, 컬럼명2, 컬럼명3
    FROM 테이블명;
*/

-- EMPLOYEE테이블의 전체 사원들의 사원번호, 사원이름, 급여 칼럼을 조회함
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE;

select emp_id
from employee;
-- 명령어, 키워드, 컬럼명, 테이블명은 대소문자를 가리지 않은다.
-- 소문자로 해도 무방하지만 대문자로 쓰는게 관례

-- EMPLOYEE 테이블의 전체 사원들의 모든 칼럼을 조회
SELECT *
FROM EMPLOYEE;

-- EMPLOYEE에서 전체 사원들의 이름, 이메일, 휴대폰번호 조회
SELECT EMP_NAME, EMP_EMAIL, EMP_PHONE
FROM EMPLOYEE;

--------------- 실습문제 ---------------
-- 1. JOB 테이블의 모든 칼럼 조회
SELECT *
FROM JOB;

-- 2. JOB 테이블의 직급명 칼럼만 조회
SELECT JOB_NAME
FROM JOB;

-- 3. DEPARTMENT 테이블의 모든 칼럼 조회
SELECT *
FROM DEPARTMENT;

-- 4. EMPLOYEE 테이블의 직원명, 이메일, 전화번호, 입사일 칼럼만 조회
SELECT EMP_NAME, EMAIL, PHONE, HIRE_DATE
FROM EMPLOYEE;

-- 5. EMPLOYEE 테이블의 입사일, 직원명, 급여 칼럼만 조회
SELECT HIRE_DATE, EMP_NAME, SALARY
FROM EMPLOYEE;

/*
    <컬럼값을 통한 산술연산>
    조회하고자하는 칼럼들을 나열하는 SELECT절에 산술연산(+-/*)을 기술해서 결과를 조회할 수 있다.
*/
-- EMPLOYEE테이블로부터 직원명, 월급, 연봉( == 월급 * 12)
SELECT EMP_NAME, SALARY, SALARY * 12
FROM EMPLOYEE;

-- EMPLOYEE테이블로부터 직원명, 월급, 보너스, 보너스가 포함된 연봉
SELECT EMP_NAME, SALARY, BONUS, (SALARY + BONUS * SALARY) * 12
FROM EMPLOYEE;
--> 산술연산과정에서 NULL값이 존재할 경우 산술연산의 결과마저도 NULL이 된다.

-- DATE 타입끼리도 연산이 가능(DATE => 년,월,일,시,분,초)
-- EMPLOYEE테이블로부터 직원명, 입사일, 근무일수 조회(오늘날짜 - 입사일)
-- 오늘날짜 : SYSDATE
SELECT EMP_NAME, HIRE_DATE, SYSDATE, SYSDATE - HIRE_DATE
FROM EMPLOYEE;
-- 값이 지저분한 이유 : DATE타입안에 포함된 시, 분, 초에 대한 연산까지 함께 수행하기 때문
-- 결과값은 일 단위

/*
    <컬럼명에 별칭 부여하기>
    [표현법]
    컬럼명 AS 별칭, 컬럼명 AS "별칭" , 컬럼명 별칭 ★가장많이쓰임★, 컬럼명 "별칭"

    AS를 붙이든 안붙이든 간에 별칭에 특수문자나 띄어쓰기가 포함된 경우 무조건 ""로 묶어서 표기해야함.
*/
-- EMPLOYEE 테이블로부터 직원명, 월급, 연봉 (== 월급*12)
--                           급여(월), 연봉(보너스 미포함)
SELECT EMP_NAME, SALARY AS "급여(월)", SALARY *12 AS "연봉(보너스 미포함)"
FROM EMPLOYEE;

-- EMPLOYEE테이블로부터 직원명, 입사일, 근무일수(오늘날짜 - 입사일) 조회
SELECT EMP_NAME 직원명, HIRE_DATE 입사일, SYSDATE - HIRE_DATE 근무일수
FROM EMPLOYEE;

/*
    <리터럴>
    임의로 지정한 문자열('')을 SELECT절에 기술하면 실제 그 테이블에 존재하는 데이터처럼 조회가 
    가능하다.
*/
-- EMPLOYEE 테이블로부터 사번, 사원명, 급여 
SELECT EMP_ID, EMP_NAME, SALARY, '원' 단위
FROM EMPLOYEE;
-- SELECT절에 제시한 리터럴 값이 조회 결과인 RESULT SET의 모든행에 반복적으로 출력된다.
/*
    <DISTINCT>
    조회하고자하는 컬럼에 중복된 값을 딱 한번만 조회하고자 할 때 사용
    칼럼명 앞에 기술
    
    [표현법]
    DISTINCT 칼럼명
*/
-- EMPLOYEE테이블에서 부서코드들만 조회
SELECT DISTINCT DEPT_CODE
FROM EMPLOYEE;

-- EMPLOYEE테이블에서 직급코드들만 조회
SELECT DISTINCT JOB_CODE
FROM EMPLOYEE;

-- DEPT_CODE, JOB_CODE를 세트로 묶어서 중복된 값인지 판별
SELECT DISTINCT DEPT_CODE, JOB_CODE
FROM EMPLOYEE;

-------------------------------------------------
/*
    <WHERE 절>
    조회하고자 하는 테이블에 특정 조건을 제시해서
    그 조건에 만족하는 데이터들만 조회하고자 할 때 기술하는 구문
    
    [표현법]
    SELECT 컬럼명, 컬럼명... => 컬럼들을 뽑아내겠다.
    FROM 테이블명
    WHERE 조건식; => 조건에 만족하는 행들을 뽑아내겠다.
    
    실행순서 ★짱 암기★
    FROM(1등) => 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';
-- WHERE DEPT_CODE ^= 'D9';
WHERE DEPT_CODE <> 'D9';
-------------------------------------------------
-- 1. EMPLOYEE 테이블에서 급여가 300만원 이상인 사원들의 이름, 급여, 입사일 조회.
SELECT EMP_NAME 이름, SALARY 급여, HIRE_DATE 입사일
FROM EMPLOYEE
WHERE SALARY >= 3000000;

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

-- 3. EMPLOYEE 테이블에서 현재 재직중인 사원들의 사번, 이름, 입사일 조회
SELECT EMP_ID 사번, EMP_NAME 이름, HIRE_DATE 입사일
FROM EMPLOYEE
WHERE ENT_YN != 'Y';

-- 4. EMPLOYEE 테이블에서 연봉이 5000만원 이상인 사원들의 이름, 급여, 연봉, 입사일 조회
SELECT EMP_NAME 이름, SALARY 급여, SALARY * 12 연봉, HIRE_DATE 입사일
FROM EMPLOYEE
--WHERE 연봉 >= 50000000; --오류
WHERE SALARY *12 >= 50000000;
--> SELECT절에서 부여한 별칭을 WHERE절에서는 사용할 수 없음.

/*
    <논리연산자>
    여러 개의 조건을 엮을 때 사용
    AND(자바 &&), OR(자바 ||)
    AND : ~이면서, 그리고
    OR : ~이거나, 또는
*/

--EMPLOYEE 테이블에서 부서코드가 D9이면서 급여가 500만원 이상인 사원들의 이름, 부서코드, 급여 조회
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9' AND SALARY >= 5000000;

-- 부서코드가 D6이거나 급여가 300만원 이상인 사원들의 이름, 부서코드, 급여조회
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DERT_CODE = 'D6' OR SALARY >= 3000000;

-- 급여가 350만원 이상이고 600만원 이하인 사원들의 이름, 사번, 급여, 직급코드 조회
SELECT EMP_NAME, EMP_ID, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE SALARY >=3500000 AND SALARY <= 6000000; 

/*
    <BETWEEN A AND B>
    몇 이상 몇 이하인 범위에 대한 조건을 제시할 때 사용  
    [표현법]
    비교대상칼럼명 BETWEEN 하한값 AND 상한값;
*/
SELECT EMP_NAME, EMP_ID, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE SALARY BETWEEN 3500000 AND 6000000;

-- 급여가 350만원 미만이고 600만원 초과인 사원들의 이름, 사번, 급여, 직급코드 조회
SELECT EMP_NAME, EMP_ID, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE NOT SALARY BETWEEN 3500000 AND 6000000;
--WHERE SALARY NOT BETWEEN 3500000 AND 6000000;
--> 오라클의 NOT은 자바의 논리부정연산자와 동일한 의미를 가짐. 위치는 칼럼명 앞, 뒤 상관없음.

-- ** BETWEEN AND 연산자는 DATE 형식간의 범위에도 사용 가능함.
-- 입사일이 '90/01/01' ~ '03/01/01'인 사원들의 모든 컬럼 조회
SELECT *
FROM EMPLOYEE
-- WHERE HIRE_DATE >= '90/01/01' AND HIRE_DATE <= '03/01/01';
WHERE HIRE_DATE BETWEEN '90/01/01' AND '03/01/01';

-- 입사일이 '90/01/01' ~ '03/01/01'가 아닌 사원들의 모든 컬럼을 조회
SELECT *
FROM EMPLOYEE
WHERE HIRE_DATE NOT BETWEEN '90/01/01' AND '03/01/01';

/*
    <LIKE '특정패턴'>
    비교하고자하는 칼럼 값이 내가 지정한 특정 패턴에 만족될 경우 조회
    
    [표현법]
    비교대상컬럼명 LIKE '특정패턴'
    
    - 옵션 : 특정패턴부분에 와일드카드인 '%', '_'를 가지고 제시할 수 있음
    
    '%' : 0글자 이상
          비교대상 칼럼명 LIKE '문자%' => 컬럼값중에 '문자'로 시작하는 것을 조회
          비교대상 칼럼명 LIKE '%문자' => 컬럼값중에 '문자'로 끝나는 것을 조회
          비교대상 칼럼명 LIKE '%문자%' => 칼럼값 중에 '문자'가 포함되는 것 조회
          
    '_' : 1글자
          비교대상 컬럼명 LIKE '_문자' => 해당 칼럼값 중에 '문자'앞에 무조건 1글자가 존재
          비교대상 컬럼명 LIKE '__문자' => 해당 칼럼값 중에 '문자'앞에 무조건 2글자가 존재
*/

-- 성이 전씨인 사원들의 이름, 급여, 입사일 조회
SELECT EMP_NAME, SALARY, HIRE_DATE
FROM EMPLOYEE
--WHERE EMP_NAME LIKE '전%';
WHERE EMP_NAME LIKE '전_%';

-- 이름 중에 '하'가 포함된 사원들의 이름, 주민번호, 부서코드 조회
SELECT EMP_NAME, EMP_NO, DEPT_CODE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%하%';

-- 전화번호 4번째 자리가 9로 시작하는 사원들의 사번, 사원명, 전화번호, 이메일 조회
SELECT EMP_ID, EMP_NAME, PHONE, EMAIL
FROM EMPLOYEE
WHERE PHONE LIKE '___9%';

-- 이름 가운데 글자가 '지'인 사원들의 모든 칼럼
SELECT *
FROM EMPLOYEE
WHERE EMP_NAME LIKE '_지_';
---------------------------------------------------------
-- 1. 이름이 '연'으로 끝나는 사원들의 이름, 입사일 조회
SELECT EMP_NAME, HIRE_DATE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%연';

-- 2. 전화번호 처음 3글자가 010이 아닌 사원들의 이름, 전화번호 조회
SELECT EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';

-- 3. DEPARTMENT 테이블에서 해외영업과 관련된 부서들의 모든 컬럼 조회
SELECT *
FROM DEPARTMENT
WHERE DEPT_TITLE LIKE '%해외영업%';

/*
    <IS NULL>
    해당 값이 NULL인지 비교해준다.
    
    [표현법]
    비교대상 컬럼 IN NULL : 컬럼값이 NULL일 경우
    비교대상 컬럼 IS NOT NULL : 컬럼값이 NULL이 아닌 경우
*/

-- 보너스를 받지 않는 사원들의 사번, 이름, 급여, 보너스
SELECT EMP_ID, EMP_NAME, SALARY, BONUS
FROM EMPLOYEE
WHERE BONUS IS NULL; 
--★NULL 값 비교 대상 헷갈리지않게★

-- 사수가 없는 사원들의 사원명, 사수사번, 부서코드 조회
SELECT EMP_NAME, MANAGER_ID, DEPT_CODE
FROM EMPLOYEE
WHERE MANAGER_ID IS NULL;

-- 사수도 없고 부서배치도 아직 받지 않은 사원들의 모든 칼럼 조회
SELECT *
FROM EMPLOYEE
WHERE MANAGER_ID IS NULL AND DEPT_CODE IS NULL;

-- 부서배치는 받지 않았지만 보너스는 받는 사원의 모든 컬럼 조회
SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE IS NULL AND BONUS IS NOT NULL; 

/*
    <IN>
    비교 대상 칼럼값에 내가 제시한 목록들 중에 일치하는 값이 있는지 판단

    [표현법]
    비교대상칼럼 IN (값1, 값2, 값3, 값4,..,..)
*/
-- 부서코드가 D6이거나 또는 D8이거나 또는 D5인 사원들의 이름, 부서코드, 급여를 조회
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
--WHERE DEPT_CODE = 'D6' OR DEPT_CODE = 'D8' OR DEPT_CODE = 'D5';
WHERE DEPT_CODE IN ('D6','D8','D5');

-- 직급코드가 J1이거나 또는 J3이거나 또는 J4인 사원들을 제외한 모든 사원의 칼럼 조회
SELECT *
FROM EMPLOYEE
WHERE JOB_CODE NOT IN('J1','J3','J4');

/*
    <연결 연산자 ||>
    여러 칼럼값들을 마치 하나의 컬럼인것처럼 연결시켜주는 연산자
    컬럼과 리터럴(임이의 문자열)을 연결할 수 있음
    
*/
SELECT EMP_ID || EMP_NAME || SALARY
FROM EMPLOYEE;

-- XX번 XXX의 월급은 XXXX원 입니다. AS 급여정보
SELECT 
EMP_ID || '번 ' || EMP_NAME || '의 월급은 ' || SALARY || '원 입니다.' AS 급여정보
FROM EMPLOYEE;
--★자주 사용된다.★

/*
    <연산자 우선순위>
    0. ()
    1. 산술연산자
    2. 연결연산자
    3. 비교연산자
    4. IS NULL, LIKE, IN
    5. BETWEEN AND
    6. NOT
    7. 논리연산자 (AND)
    8. 논리연산자 (OR)
*/

/*
    <ORDER BY 절>
    SELECT문 가장 마지막에 기입하는 구문일뿐만 아니라 실제로도 가장 마지막에 실행되는 구문
    최종 조회된 결과물들에 대해서 정렬 기준을 세워주는 구문
    
    [표현법]
    SELECT 조회할 칼럼 1,2,3....
    FROM 조회할 테이블명
    WHERE 조건식(생략가능)
    ORDER BY [정렬기준으로 세우고자하는 컬럼명/별칭/컬럼 순번] [ASC/DESC] (생략가능) [NULLS FIRST/NULLS LAST] (생략가능)

    오름차순 / 내림차순
    - ASC : 오름차순 (생략시 기본값)
    - DESC : 내림차순
    
    정렬하고자하는 컬럼값에 NULL이 있을 경우
    - NULLS FIRST : NULL값들을 앞으로 배치하겠다.(내림차순의 기본값)
    - NULLS LAST : NULL값들을 뒤쪽으로 배치하겠다.(오름차순의 기본값)
*/

-- 월급이 높은 사람들부터 나열하고 싶다.. (내림차순)
SELECT *
FROM EMPLOYEE
ORDER BY SALARY DESC;

-- 보너스 기준 정렬
SELECT *
FROM EMPLOYEE
--ORDER BY BONUS; -- ASC(오름차순) & NULLS LAST 기본값
--ORDER BY BONUS ASC NULLS FIRST; -- 오름차순
ORDER BY BONUS DESC , SALARY; -- 내림차순 + , + 같은 값들끼리 정렬할 기준 추가

-- 연봉 기준 오름차순 정렬하기
SELECT EMP_NAME, SALARY, (SALARY * 12) "연봉"
FROM EMPLOYEE
--ORDER BY 3 ASC;
--ORDER BY "연봉" ASC;
ORDER BY (SALARY * 12) ASC;
--ORDER BY는 숫자 뿐만아니라 문자열, 날짜에 대해서도 정렬가능하다.

728x90
반응형
LIST