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;