본문 바로가기
Oracle SQL/기초 SQL

SQL SELECT문으로 이것저것 다 해보기(1)

by 호두빵 2021. 5. 26.

기본적인 형식 : 
SELECT (값, 컬럼명, 함수, SUB QUERY)
FROM (테이블명, SUB QUERY)

 

SELECT문을 쓸 때에는 기본적으로 어디서 뭘 가져와라~ 시키는 것이기 때문에 SELECT ~ FROM ~을 씁니다. 여기서 SUB QUERY라는 친구가 조금 낯설게 느껴지는데요, 서브쿼리란 하나의 SQL문장 안에 들어있는 또 다른 SQL문을 이야기합니다. 즉 메인 쿼리는 SELECT문이 되고, 추가적으로 조건을 더 줄 때 서브쿼리를 쓰는 것이지요! 이번에는 저번에 만들어뒀던 scott 계정의 employees 테이블로 실습을 해보겠습니다. 

--현재 계정 (scott)의 모든 테이블 정보 나타내기
SELECT * FROM TAB;

일단 우리가 요리조리 만져볼 테이블의 이름과, 타입 그리고 클러스터링이 되어있는지 아닌지를 한 눈에 쫙 보고 싶다면 어떤 걸 활용해야 할까요? scott계정으로 미리 접속한 상태이기 때문에 테이블 정보를 읽어올 때 SELECT * FROM TAB;이라고만 해주면 다음과 같이 나오게 됩니다. 

SELECT empno, ename, sal
FROM emp;

SELECT empno, ename, sal*12 --연봉을 나타내고 싶을 때
from emp;

예를 들어 사원의 번호, 이름, 월급을 알고 싶을 때는, 내가 알고자 하는 항목의 컬럼 이름을 SELECT 다음에 써주고 FROM에는 당연히 그 테이블의 이름을 써주고 세미콜론으로 마쳐주면 됩니다. 월급이 아니라 나는 연봉이 알고 싶어! 그러면 간단하게 salary에 12를 곱해주면 되겠죠~

 

1. ALIAS

--ALIAS
SELECT empno AS 사원번호, sal AS "월 급" , sal * 12 "일년치 연봉" --AS는 생략도 가능
--표기할 때만 ""쓰고 문자열 표기는 작은 따옴표('') '일년치 연봉' 은 안 됨
FROM emp;

저는 일리아스는 들어봤는데 앨리어스는 처음 봤습니다. 구글에 뜻을 검색해보니 별명! 이라는 뜻이네요? 그렇다면 ALIAS는 SQL에서 어떻게 쓰이는 것일까요? ~으로 하라는 뜻으로 AS ~를 씁니다.

empno를 AS 사원번호라고 하면 컬럼명에 empno가 아닌 사원번호가 짠 나타납니다. 나머지 컬럼들도 동일합니다.

 

2. || 연결 연산자

-- || 연결연산자
SELECT ename|| '의 월급은 ' || sal ||'입니다' AS "이름 + 월급"
FROM emp;

우리가 표현할 때, 딸랑 데이터만 갖고 오는 것이 아니라 여러개의 데이터를 잘 뭉쳐서 하나의 문장으로 나오게 하고 싶을 수 있죠. 그럴 때 자바에서는 +를 썼다면 SQL에서는 ||을 사용합니다.

 

역할은 동일합니다. 위와 같이 SELECT문을 입력하면 ~~의 월급은 ~~입니다 가 나타나게 됩니다. 

 

3. DISTINCT

--distinct : 중복되는 행을 삭제함
SELECT DISTINCT job
FROM emp;

어떤 직무가 있는지 알고는 싶은데 굳이 여러개가 한꺼번에 나올 필요는 없겠죠? 한 눈에 들어오지 않아서 괜히 더 헷갈리기만 할 것입니다. 그럴 때에는 DISTINCT를 씁니다. 영어 뜻으로는 구분되는 이라는 뜻이 있는데 중복되는 값을 제거하고 하나씩만 보여주는 기특한 녀석입니다. 밑의 사진은 DISTINCT를 쓰지 않았을 때의 결과값이고 사진을 옆으로 넘겨보시면 DISTINCT가 적용된 깔끔한 결과값을 확인할 수 있습니다. 

 

01

4.DESC

--desc : table의 column(항목)의 명세(describe)
DESC emp;

컬럼에 무엇무엇이 있는지 확인하고 싶을 때는 describe의 약자인 DESC를 씁니다! 나에게 테이블을 설명해줘! 라고 하는 거라면 이해가 쉬울까요? 간단하게 입력하면 다음과 같은 결과가 뜹니다. 

다음은 scott계정의 emp테이블을 바탕으로 한 실습 예제입니다

--1. emp테이블에서 사원번호, 사원이름, 월급 출력
SELECT empno, ename, sal 
FROM emp;

--2. emp테이블에서 사원이름과 월급 출력, 컬럼명은 이 름, 월 급으로
SELECT ename AS "이 름" , sal AS "월 급"
FROM emp;

--3. emp테이블에서 사원번호, 사원이름, 월급, 연봉 구하고 각각 컬럼명은
--   사원번호, 사원이름, 월급, 연봉으로
SELECT empno AS 사원번호, ename AS 사원이름, sal AS 월급, sal*12 AS 연봉
FROM emp;

--4. emp테이블의 업무(job)을 중복되지 않게 표시
SELECT DISTINCT job
FROM emp;

--5. emp테이블의 사원명과 업무로 연결해서(SMITH, CLERK) 표시, 컬럼명은 Employee and Job으로 표시
SELECT '('|| ename ||', '|| job ||')' AS "Employee and Job"
FROM emp;

위에서 scott계정의 문제를 풀어봤으니 다음은 hr계정의 문제입니다. 중간에 익숙하지 않은 함수가 뜨는데 바로 NVL함수입니다. 만약 해당 컬럼의 값이 null값인 경우에 숫자 0으로 치환해주는 역할을 합니다. 예를 들어 NVL(salary*commission_pct, 0)인 경우에는 영업 사원이 아닐시 commission pct가 아예 존재하지 않게 되는데 그런 경우에는 0을 집어넣어 계산을 할 수 있도록 해줍니다~

--HR 문제1) EMPLOYEES Table의 모든 자료를 출력하여라.
SELECT * FROM employees;

--HR 문제2) EMPLOYEES Table의 컬럼들을 모두 출력하라.
DESC employees;

--HR 문제3) EMPLOYEES Table에서 사원 번호, 이름, 급여, 담당업무를 출력하여라.
SELECT employee_id AS "사원 번호", first_name||' ' || last_name AS 이름, 
    salary AS 급여, job_id AS 담당업무
FROM employees;

--HR 문제4) 모든 종업원의 급여를 $300증가 시키기 위해서 덧셈 연산자를 사용하고 결과에 SALARY+300을 디스플레이 합니다.
SELECT First_name, salary + 300 AS "SALARY + 300" 
FROM employees;

--HR 문제5) EMP 테이블에서 사원번호, 이름, 급여, 보너스, 보너스 금액을 출력하여라. 
--         (참고로 보너스는 월급 + (월급*커미션))
SELECT employee_id AS 사원번호 , First_name||Last_name AS 이름,
    salary AS 급여, NVL(salary*commission_pct,0) AS 보너스, salary + (NVL(salary*commission_pct,0)) AS "보너스 금액"
FROM employees; 

--NVL함수

--HR 문제6) EMPLOYEES 테이블에서 LAST_NAME을 이름으로 SALARY을 급여로 출력하여라.
SELECT last_name AS 이름, salary AS 급여
FROM employees;

--HR 문제7) EMPLOYEES 테이블에서 LAST_NAME을 Name으로 SALARY * 12를 Annual Salary(연봉)로 출력하여라
SELECT last_name AS 이름, salary*12 AS "Annual Salary(연봉)"
FROM employees;

--HR 문제8) EMPLOYEES 테이블에서 이름과 업무를 연결하여 출력하여라. 
SELECT First_name||' ' || Last_name||','||job_id AS "이름과 업무"
FROM employees;

--HR 문제9) EMPLOYEES 테이블에서 이름과 업무를 “KING is a PRESIDENT” 형식으로 출력하여라. 
SELECT Last_name || ' is a ' || substr(job_id,4)
FROM employees;

--HR 문제10)EMPLOYEES 테이블에서 이름과 연봉을 “KING: 1 Year salary = 60000” 형식으로 출력하여라.
SELECT Last_name || ' 1 year salary = ' || salary*12
FROM employees;

--HR 문제11) EMPLOYEES 테이블에서 JOB을 모두 출력하라.
SELECT DISTINCT job_id
FROM employees;