본문 바로가기
Back/Database

SQL NVL, LITERAL, AS, DISTINCT, WHERE절 활용

by 시월해 2021. 3. 26.

EMP 테이블의 데이터
MEMBER10 테이블의 데이터
PRODUCTS 테이블의 데이터

-- emp 테이블에서 사번, 이름, 급여, 보너스, 급여+보너스를 화면에 출력하기

SELECT empno, ename, sal, comm, sal+comm FROM emp;


위처럼 하면 NULL 값을 가지는 컬럼때문에 잘못된 결과가 출력된다.

NULL 값을 가지는 컬럼을 다른 컬럼과 연산을 하면 모두 NULL로 처리 된다.
- NVL() 함수 : NULL 값을 특정한 값으로 변경시켜 주는 함수
                   모든 데이터 타입에 적용이 가능함
                   NVL() 함수를 사용할 때는 전환되는 값의 자료형을 일치시켜야 함.
형식) NVL(NULL값이 들어 있는 컬럼명, 변경할 값)

 

SELECT empno, ename, sal, comm, sal+NVL(comm,0) FROM emp;

제대로 출력된 결과


- NVL2() 함수 : 자바에서의 3항연산자와 비슷한 함수.
  형식) NVL2(컬럼명, expr1, expr2)
    ==> expr1 : 컬럼명의 값이 NULL이 아닌 경우 반환
    ==> expr2 : 컬럼명의 값이 NULL인 경우 반환

SELECT empno, ename, sal, comm, sal+NVL2(comm, comm, 0) FROM emp;


- AS : 컬럼명을 변경하는 키워드 ==> 별칭(별명)
  컬럼 명 바로 뒤에 사용함. 컬럼명과 별칭 사이에 AS라는 키워드를 넣어줌.
  모든 별칭은 ""안에 작성. AS 별칭은 생략 가능.

SELECT empno, ename, sal, comm, sal+NVL2(comm, comm, 0) AS "급여+보너스" FROM emp;

컬럼명이 바뀐 것을 볼 수 있다.

 


-- [문제] emp 테이블에서 사번, 사원명, 급여, 급여의 10% 인상액을 화면에 보여주세요.

SELECT empno, ename, sal, sal*1.1 AS "급여의 10% 인상액" FROM emp;

계산된 값이 AS로 인해 컬럼명이 변경되었다.




- DISTINCT 키워드 : 중복을 제거하는 키워드
 주로 하나의 컬럼에서 중복된 값을 제거하고 보여줄 때 사용함.
 DISTINCT 키워드는 항상 SELECT 키워드 다음에 기술한다.
 DISTINCT 키워드 뒤에 나오는 컬럼들은 모두 DISTINCT의 영향을 받는다.
 DISTINCT 뒤에 여러 개의 컬럼들이 기술이 되면 해당 컬러들은 중복이 되지 않게 나온다.

-- emp 테이블에서 각 사원의 관리자(mgr)를 화면에 보여주세요.

SELECT DISTINCT job FROM emp;



-- [문제] emp 테이블에서 담당업무와 부서번호의 중복을 제거한 후 화면에 보여주세요.

SELECT DISTINCT job, deptno FROM emp;

 

-- [문제] member10 테이블에서 회원의 이름과 나이, 직업을 화면에 보여주세요.

SELECT memname, age, job FROM member10;

 

-- [문제] products 테이블에서 제품명, 입고가, 출고가, 제조사를 화면에 보여주세요.

SELECT products_name, input_price, output_price, company FROM products;

 


- LITERAL 문자열
 컬럼명이나 별칭이 아닌 SELECT 목록에 포함되는 문자, 표현식 숫자를 의미.
 날짜나 문자열인 경우 단일 인용부호('')를 사용해야 한다.
 예) "KING 사원의 연봉은 60000 입니다."

SELECT ename || ' 사원의 연봉은 ' || sal*12 || ' 입니다.' as "사원의 연봉" FROM emp;


member10 테이블의 리터럴 작업을 진행해보자.
예) "홍길동 회원의 직업은 학생입니다."

SELECT memname || ' 회원의 직업은 ' || job || ' 입니다.' as "회원의 직업" FROM member10;


- WHERE 조건절
모든 데이터를 가져오는 것이 아니라 사용자가 원하는 데이터만 조회할 경우에 사용.
WHERE절은 FROM 테이블 이름 뒤에 기술해야 한다.
형식) SELECT 컬럼명1, 컬럼명2.... FROM 테이블명 WHERE 조건식;
WHERE 조건절은 자료를 검색할 때 사용되는 키워드.
 1) = : 조건이 같은가?
 2) < : 조건이 작은가?
 3) <= : 조건이 작거나 같은가?

 4) > : 조건이 큰가?
 5) >== : 조건이 크거나 같은가?
 6) != : 조건이 같지 않은가?
 7) <> : 조건이 같지 않은가? !=와 같은 의미.
 8) BETWEEN A AND B : A와 B 사이에 있는가?
    주의) 작은 값을 앞에 기술하고 큰 값을 뒤에 기술해야 함.
 9) IN(LIST) : LIST 값 중에 어느 하나와 일치하는가?
 10) NOT BETWEEN A AND B : A와 B 사이에 있지 않은가?(A,B 값 포함하지 않음)
 11) NOT IN(LIST) : LIST 값과 일치하지 않는가?


-- emp 테이블에서 담당업무가 'MANAGER' 인 사원의 모든 정보를 화면에 보여주세요.

SELECT * FROM emp WHERE job = 'MANAGER';

 

SELECT * FROM emp WHERE job = 'SALESMAN';

 

-- [문제1] emp 테이블에서 담당업무가 'CLERK'인 사람의 사번, 이름, 담당업무, 급여 출력
SELECT empno, ename, job, sal FROM emp WHERE job = 'CLERK';

 

-- [문제2] emp 테이블에서 1982년 1월 1일 이후에 입사한 사원의
-- 사번, 이름, 담당업무, 급여, 입사일자 출력
SELECT empno, ename, job, sal, hiredate FROM emp WHERE hiredate > '19820101';
SELECT empno, ename, job, sal, hiredate FROM emp WHERE hiredate > '82/01/01';



-- [문제3] emp 테이블에서 급여가 1300 ~ 1500 사이인 사원의 이름과 담당업무, 급여, 부서번호 출력
SELECT ename, job, sal, deptno FROM emp WHERE sal BETWEEN 1300 AND 1500;
SELECT ename, job, sal, deptno FROM emp WHERE sal >= 1300 AND sal <= 1500;

 

-- [문제4] emp 테이블에서 사번이 7902, 7788,7566인 사원의 사번, 이름, 담당업무 출력
SELECT empno, ename, job FROM emp WHERE empno IN(7902, 7788, 7566);
SELECT empno, ename, job FROM emp WHERE empno = 7902 OR empno = 7788 OR empno = 7566;

 

-- [문제5] emp 테이블에서 보너스가 300이거나 500이거나 1400인 사원의 모든 정보 출력
SELECT * FROM emp WHERE comm IN(300, 500, 1400);
SELECT * FROM emp WHERE comm = 300 OR comm = 500 OR comm = 1400;



-- [문제6] member10 테이블에서 이름이 홍길동이면서 직업이 학생인 회원의 모든 정보 출력
SELECT * FROM member10 WHERE memname = '홍길동' AND job = '학생';



 -- [문제7] products 테이블에서 제조사가 '삼성' 또는 '현대' 이면서
 -- 입고가가 100만원 이하인 상품의 상품명과 입고가, 출고가 출력
SELECT products_name, input_price, output_price
FROM products
WHERE company IN('삼성','현대') AND input_price <= 1000000;



-- [문제8] emp 테이블에서 급여가 1100 이상이고,
-- 담당업무가 'MANAGER'인 사원의 사번, 이름, 담당업무, 급여 출력
SELECT empno, ename, job, sal FROM emp WHERE sal >= 1100 AND job = 'MANAGER';

'Back > Database' 카테고리의 다른 글

GROPU BY  (0) 2021.04.07
서브 쿼리(SUB QUERY)  (0) 2021.04.07
Oracle(SQL) 기본 제공 함수  (0) 2021.04.07
SQL JOIN  (0) 2021.03.31
SQL 기본 개념(테이블 생성 및 변경, 컬럼 생성 및 변경)  (0) 2021.03.26