Oracle Select (1)

※ Select

- DB에서 가장 많이 사용하고 가장 중요한 부분이 select 부분이다. 가장 중요하다.

- 데이터베이스는 데이터를 관리하는 목적으로 사용하며, file과 달리 원하는 자료만 추출하여 명세할 수 있다.

select 의 기본 형태

SELECT
        (값, COLUMN(항목), 함수, SUB QUERY)
    FROM
        (TABLE명, SUB QUERY)

1. 현재 계정에 가지고 있는 모든 테이블 명세

SELECT * FROM TAB;

2. 테이블에서 원하는 컬럼의 값만 명세

SELECT 컬럼명
FROM 테이블 명;

3. 컬럼에 연산처리 값 명세가능

SELECT EMPNO, ENAME, SAL, SAL+ 300 
FROM EMP;

SELECT EMPNO, ENAME, SAL, SAL*12      -- 연봉을 볼 수 있다.
FROM EMP;

위와 같이 출력을하면 모든 SAL의 값에 300 이 추가가 되어 명세가 된다.

4. ALIAS (컬럼의 명칭을 출력시 원하는 값으로 변경하여 명세)

SELECT EMPNO AS 사원번호, SAL AS "월급", SAL*12 "일년치 연봉"  
FROM EMP;

만약 “일년치 연봉” 와 같이 중간에 공백이 생기게 되면 ““를 사용하여 ALIAS가 어디까지 변환해야하는지 설정하면 오류가 없다.

5. 연결연산자 ||

SELECT ENAME || '의 월급은 ' || SAL || ' 입니다' AS "이름 + 월급"
FROM EMP;

맨위 칼럼명은 “이름 + 월급” 으로 표기가 되고 값부분에는 ||을 이용한 문자로 표시가 된다.

여기서 문자열은 ‘ ‘ 으로 하는 것을 주의하자.

6. distinct : 중복행의 삭제 – group by

SELECT DISTINCT JOB
FROM EMP;

위의 코드는 EMP 테이블의 JOB을 출력하지만 중복되는 값은 명세되지 않고 표기한다.

7. DESC : TABLE의 COLUMN들을 명세

DESC EMP;

EMP 테이블의 어떤 컬럼이 있는지 확인 할 수 있다.

8. NVL(컬럼명, 원하는값) : 컬럼이 NULL이 아니면 컬럼의 값을 출력. 만약 NULL이면 원하는 값 출력

SELECT EMPLOYEE_ID,FIRST_NAME,SALARY, NVL(COMMISSION_PCT,0) , NVL(SALARY+COMMISSION_PCT*SALARY, 0)
FROM employees;

NULL 값으로 나오는 값들이 0으로 변경이 되어서 출력이 된다.

9. NVL2(컬럼, 컬럼이 null이 아닐 경우 설정할 값, 컬럼이 null의 경우 설정할 값)

  • 총급여sal+comm가 평균 급여보다 많은 급여를 받는 사람의 부서번호, 이름, 총급여,
SELECT deptno, ename, sal+comm, NVL2(COMM, '유', '무')  as "comm유무" 
FROM emp
WHERE sal+comm > (SELECT AVG(sal) FROM emp);

Where 절

  • if 와 같다 (조건절)

  • 표현식 비교 연산자(>, <, >=, <=, =, !=, <>) != 와 <> 는 같은 의미
    NULL IS NULL, IS NOT NULL
    (), NOT, AND(&&), OR(||)

  • Query

    Select 
    From
    WHERE 
    

    1. 대소문자 구분

    SELECT first_name, last_name, salarY
    FROM employees
    WHERE first_name = 'Julia';  
    

    대소문자를 구분하기 때문에 ‘Julia’와 ‘julia’의 결과 값은 다르다.

2. 비교 연산

--급여가 $9000 이상인 사원

SELECT first_name, salary
FROM employees
WHERE salary >= 9000;
-- 이름이 Shanta 보다 큰 이름
SELECT first_name
FROM employees
WHERE first_name >= 'Shanta';

이름의 알파벳들을 ASCII 코드 값으로 크기를 비교 한다.

3. null 과 ‘’ 빈문자열 구분

SELECT first_name, last_name
FROM employees
where manager_id = ''; 

null 로 구분되어 있는 부분은 ‘‘으로 인식 하지 못한다.

SELECT first_name, last_name
FROM employees
where manager_id is null; 

'’대신 is null을 이용하여 null인 부분을 출력하게 한다.

SELECT first_name, last_name
FROM employees
where manager_id is not null; 

steven king (유일하게 manager_id 값이 null인 사원) 만 제외하고 전부 출력

4. AND

SELECT first_name, salary
FROM employees
where first_name = 'John'
    and salary >= 5000; 

이름이 John 이면서 월급이 5000 이상인 사람 출력

5. OR

SELECT first_name, last_name
FROM EMPLOYEES
WHERE first_name = 'Shanta'
    OR first_name = 'John';

Shanta와 John 둘다 출력

6. ALL, ANY

SELECT * FROM employees
where first_name = All('Julia','John');
-- WHERE first_name = 'Shanta' and first_name = 'John';  와 동일
SELECT * FROM employees
where first_name = any('Julia','John');
-- WHERE first_name = 'Shanta' or first_name = 'John';  와 동일
SELECT first_name, salary
FROM employees
where salary = any(8000, 3200, 6000); -- 보통 이렇게 많이 쓰임

월급이 8000, 3200, 6000인 사람만 출력을 하게 된다.

7. IN, NOT IN

SELECT first_name,salary  
FROM employees
where salary in(8000,3200);   -- in은 any와 동일
SELECT first_name,salary  
FROM employees
where salary not in(8000,3200); -- 지정된 값 이외의 포함하지 않은 값들을 출력

8000과 3200이 아닌 사람 모두 출력이 된다.

8. BETWEEN

  • salary >= 3200 AND salary <= 9000
  • salary BETWEEN 3200 AND 9000 위의 두 소스 코드는 같다.
  • 범위 (이상,이하)를 구할때 이용한다.

9. LIKE

  • 글자 단위 탐색
SELECT first_name
FROM employees
where first_name like 'G_ra_d'; 

_ 는 한글자가 무엇이든지 허용

SELECT first_name
FROM employees
where first_name like 'K%y'; 

% 는 글자수에 관계없이 모두 허용 (꼭 3글자가 아닐 수 있다.)

SELECT first_name
FROM employees
where first_name like 'A%';   

맨 앞에 A로 시작하는 사람들 모두 출력

SELECT first_name
FROM employees
where first_name like '%y';  

맨끝에 y로 끝나는 사람 모두 출력

SELECT first_name
FROM employees
where first_name like '%e%'; 

맨끝이 e 이거나 중간에 있는 사람 모두 출력 (e라는 문자만 있으면 출력)

SELECT first_name, hire_date
FROM employees
where hire_date like '06/01%';

2006년 1월 이후의 모든 날짜의 입사날짜가 탐색된다.

SELECT ename,deptno
FROM emp
where deptno = 20
    and ename not like('%S%');

not like 를 활용하여 이름에 S 가 없는 사람중 부서번호가 20인 사람을 조회하여 이름과 부서 번호를 명세

※ Select 2

1. ORDER BY (sorting)

기본 형태

SELECT *
    FROM   TABLE
    ORDER BY sal ASC   -> 오름차순
    ORDER BY sal DESC  -> 내림차순
    
    ORDER BY sal -> 오름차순 (ASC 생략가능)
 오름차순
SELECT ENAME,SAL
FROM EMP
ORDER BY SAL ASC;

 내림차순
SELECT ENAME, SAL
FROM EMP
ORDER BY SAL DESC;

alias

  • alias (annsal) 으로 sort 가능
SELECT empno, ename, sal*12 AS annsal
FROM emp
ORDER BY annsal DESC;
  • null 값을 제일 위로
    SELECT ename, comm
    FROM emp
    ORDER BY comm NULLS FIRST;
    
  • null 값을 제일 아래로
SELECT ename, comm
FROM emp
ORDER BY comm NULLS Last;
  • job id 부터 sorting 되고 그 안에서 salary 내림차순 sorting
SELECT employee_id, job_id, salary
FROM employees
ORDER by job_id asc, salary desc;

2. 날짜 및 시간 관련 함수

  • months_between 두 날짜 간의 월수(월간격)을 구하는 함수
SELECT MONTHS_BETWEEN('2020-12-13', '2020-05-04')
FROM dual;
  • add_months : 특정 날짜 월에 정수를 더한다음 해당 날짜를 반환
select add_months('2020-06-19',3)
from dual;
  • 날짜 정보에서 특정한 연도, 월, 일, 시, 분, 초 구하는 함수 (EXTRACT)
SELECT EXTRACT(year from to_date('200619', 'yymmdd')) as 연도,
    EXTRACT(month from to_date('200815', 'yymmdd')) as ,
    EXTRACT(day from sysdate) as 
FROM dual;

SELECT EXTRACT(hour from CAST(datetime AS TIMESTAMP)) as ,
    EXTRACT(minute from CAST(datetime AS TIMESTAMP)) as ,
    EXTRACT(second from CAST(datetime AS TIMESTAMP)) as 
FROM (
    select to_date('2020-06-19 09:42:01', 'yyyy-mm-dd hh24:mi:ss')as datetime from dual);

3. GROUP BY (그룹 관리)

  • 통계용으로 사용을 많이 하며 HAVING 조건절과 같이 사용을 한다.
SELECT department_id, employee_id  -- 그룹으로 묶은 후에는 개개인적으로 가지고 있는 정보는 출력 불가능 (특징)
FROM employees
GROUP BY department_id
ORDER BY DEPARTMENT_ID ASC;

위의 소스코드로 실행을 하게 되면 오류가 뜬다. department_id 로 그룹후 컬럼은 department_id 또는 통계 함수만 명시가 가능하며

employee_id 와 같은 개개인적인 정보 (기본키) 값은 명시가 불가능하다.

  • GROUP BY 함수들
    COUNT
    SUM
    AVG
    MAX
    MIN
  • IT_PROG의 job_id를 가진 사람들을 다음 함수들을 이용하여 표시할 수 있다.
SELECT COUNT(salary), COUNT(*), SUM(SALARY), AVG(SALARY), MAX(SALARY), MIN(SALARY)
FROM employees
WHERE job_id = 'IT_PROG';
  • job_id로 그룹화 하여 그 안에서 통계를 낼 수 있다.
SELECT job_id, COUNT(salary),SUM(salary),AVG(salary)
FROM employees
GROUP BY job_id;
  • HAVING 절 : 반드시 GROUP BY와 같이 사용 GROUP BY 밑에 사용
SELECT job_id, SUM(SALARY)
FROM employees
GROUP BY job_id
HAVING SUM(SALARY) >= 100000;

EX

  • 급여가 5000이상 받는 사원만으로 합계를 내서 업무(job_ID)로 그룹화하여 급여의 합계가 20000을 초과하는 업무명을 구하라
SELECT job_id, SUM(salary)  -- 그룹으로 묶은 후 그룹함수 및 그럼으로 묶은 컬럼만 명시 할 수 있다.
FROM employees
WHERE salary >= 5000
GROUP BY job_id
HAVING SUM(SALARY) > 20000
ORDER BY SUM(SALARY) ASC;