Database(데이터베이스)

Liberte Koo·2022년 12월 21일
0

Database

목록 보기
1/12

DataBase란

필요한 정보를 여러 응용시스템에서 공용할 수 있도록 논리적으로 연관된 데이터를 모으고, 중복되는 데이터를 최소화하여 구조적으로 통합/저장해 놓은 것

DataBase의 특징

  1. 실시간 접근성(real time accessibility)
    사용자가 데이터를 요청하면 실시간으로 결과를 서비스한다.
  2. 계속적인 변화(continuous change)
    데이터 값은 시간에 따라 항상 바뀐다.
  3. 동시공유(concurrent sharing)
    데이터베이스는 서로 다른 업무 또는 여러 사용자에게 동시 공유된다.
  4. 내용에 따른 참조(referency by content)
    데이터베이스에 저장된 데이터는 데이터의 물리적 위치가 아니라 데이터 값에 따라 참조된다.

DMBS(Database Management System)

데이터베이스에서 데이터를 추출, 조작, 정의, 제어 등을 할 수 있게 해주는 데이터베이스 전용 관리 프로그램
ex) Oracle, Mysqul, MS-SQL, Maria

DBMS 기능

  • 데이터 추출(Retrieval)
  • 데이터 조작(Manipulation)
  • 데이터 정의(Definition)
  • 데이터 제어(Control)

DBMS 사용 이점

  • 데이터 독립화(데이터와 응용 프로그램을 분리시킴으로써 상호 영향 줄임)
  • 데이터 중복 최소화, 데이터 무결성 보장
  • 데이터 보안 향상(데이터 접근 제한, 데이터 암호화)
  • 관리 편의성 향상(데이터 백업, 데이터 복구)

ORACLE

가장 널리 쓰이는 DMBS

ORACLE로 SQL 사용

전체 테이블 조회방법

select * from employee;

특정테이블 조회하는 방법

내용
1. SELECT 컬럼
2. FROM 테이블
3. WHERE 조건
4. ORDER BY 정렬기준

순서
1. 어떤테이블에서
2. 어떤조건으로
3. 어떤컬럼을검색할지
4. 어떤 정렬로

EMPLOYEE 테이블에서 조건없이 모든 정보 (모든을 의미하는 *)

SELECT *FROM EMPLOYEE;

EMPLOYEE테이블에서 조건없이 이름, 주민등록번호, 이메일

SELECT EMP_NAME, EMP_NO, EMAIL
FROM EMPLOYEE;

EMPLOYEE 테이블에서 월급이 300만원 이상인 직원의 이름, 전화번호, 월급 조회

SELECT EMP_NAME, PHONE, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3000000;

EMPLOYEE 테이블에서 직급코드(JOB_CODE)가 J2인 직원의 이름, 이메일, 전화번호, 직급코드

SELECT EMP_NAME,EMAIL, PHONE, JOB_CODE
FROM EMPLOYEE
WHERE JOB_CODE = 'J2';

오라클에서는 문자열을 'J2'로 표현한다.

EMPLOYEE 테이블에서 월급이 350만원 이상이면서 직급코드가 J3인 직원의 이름, 전화번호, 월급, 직급코드를 조회

SELECT NAME, PHONE, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE SALARY>=3500000 AND JOB_CODE='J2';

EMPLOYEE테이블에서 모든 직원의 이름, 급여, 연봉(급여*12)

SELECT EMP_NAME 이름, SALARY 월급, SALARY12 "연봉(원)" /특수기호가 들어갈 때에 쌍따옴표*/
FROM EMPLOYEE;

'원'을 붙여주면 리터럴이 하나의 컬럼을 만든다. '원'이 적힌 쭉 하나의 열이 생성된다.

SELECT EMP_NAME, SALARY, '원'
FROM EMPLOYEE;

똑같은 결과는 한번만 보고 중복된 값을 지우려면 DISTINCT를 쓴다.

SELECT DISTINCT DEPT_CODE FROM EMPLOYEE;
SELECT DISTINCT JOB_CODE FROM EMPLOYEE;
-- 한 조건에는 중복이지만 다른 조건에서 중복이 안 될 경우에는 지워지지 않는다.
SELECT DISTINCT DEPT_CODE, JOB_CODE FROM EMPLOYEE;

SALARY에 숫자만 있는데 '원'을 붙여주고싶으면 ||(OR 연산자를 붙인다)

SELECT EMP_NAME, SALARY||' 원' FROM EMPLOYEE;

급여가 350만원 이상, 600만원 이하

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3500000 AND SALARY <= 6000000;

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 3500000 AND 6000000;

입사일이 1990년 1월 1일에서 2001년 1월 1일인 직원의 이름과 입사일

SELECT EMP_NAME, HIRE_DATE
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '90/01/01' AND '01/01/01';

LIKE, NOT LIKE

**EMPLOYEE 테이블에서 이름중에 성이 전씨인 직원의 이름, 급여
와일드 카드 : 아무거나 대체할 수 있는 문자 (_ , %)

  • _ : 아무거나 한글자를 대체
  • % : 아무거나 대체(글자수 제한없음)**

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전';
전씨가 아닌 사람을 뽑고싶으면 WHERE EMP_NAME NOT LIKE '전
';

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전%';

EMPLOYEE 테이블에서 이름 중 전이 포함된 직원의 이름, 급여

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전%';

이메일 주소 중 _앞에 글씨가 3개인 직원

SELECT EMP_NAME, EMAIL FROM EMPLOYEE
WHERE EMAIL LIKE '__#%' ESCAPE '#';
ESCAPE '#' 의미 : #뒤에 오는 것은 문자열이 아니다

SELECT EMP_NAME FROM EMPLOYEE WHERE EMP_NAME LIKE '%연';
-- 혹은 WHERE EMP_NAME LIKE '__연'; 도 된다.

SELECT EMP_NAME, PHONE FROM EMPLOYEE WHERE PHONE NOT LIKE '010%';

SELECT * FROM EMPLOYEE
WHERE EMAIL LIKE '%s%' AND (DEPT_CODE='D9' OR DEPT_CODE='D6') AND
(HIRE_DATE BETWEEN '90/01/01' AND '00/12/01') AND SALARY>=2700000;

IN, NOT IN

텍스트DEPT_CODE가 D6이거나 D9인 직원의 이름, 부서코드 조회
SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IN ('D6', 'D9', 'D5');

풀어쓰면 이와 같다 WHERE DEPT_CODE='D6' OR DEPT_CODE='D9' OR DEPT_CODE='D5'

NULL은 NULL전용 문법을 써야한다 IS/ IS NOT

SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE
WHERE DEPT_CODE IS NULL;
SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE
WHERE DEPT_CODE IS NOT NULL;

SELECT EMP_NAME, SALARY, BONUS, (SALARY + SALARYBONUS)12 연봉
FROM EMPLOYEE WHERE BONUS IS NOT NULL;

직원 중 직급코드(JOB_CODE)가 J7 또는 J2이고,
급여가 2000000원 초과인 직원의
이름, 급여, 직급코드

SELECT EMP_NAME, SALARY, JOB_CODE FROM EMPLOYEE
WHERE JOB_CODE IN ('J7', 'J2') AND SALARY > 2000000;

- 날짜

날짜데이터 + OR - 정수 => 정수만큼 더한날짜 OR 뺀날짜
날짜-날짜 => 몇일 차이나는지 확인
SYSDATE : 년/월/일/시/분/초-- SYSDATE : 현재 시스템시간을 가져옴
SYSDATE+1 : 현재 시스템시간을 가져온 후 +1
SELECT EMP_NAME, HIRE_DATE, SYSDATE 오늘, SYSDATE+1 내일, SYSDATE-1 어제,
SYSDATE+3-SYSDATE, FLOOR(SYSDATE-HIRE_DATE)
FROM EMPLOYEE;

- 정렬

SELECT EMP_NAME, EMAIL, SALARY
FROM EMPLOYEE
ORDER BY SALARY DESC;
-- ORDER BY SALARY; 는 오름차순 월급 정렬 (ASC는 오름차순으로 디폴트 값으로 생략)
-- ORDER BY SALARY DESC; 은 내림차순 월급 정렬

SELECT EMP_NAME, EMAIL, SALARY
FROM EMPLOYEE
ORDER BY 3 DESC;
-- ORDER BY는 마지막 순서이므로, 출력 기준으로 샐러리가 3열에 있기때문에
-- SALARY 대신 3을 적어도 데이터 출력 된다.

SELECT EMP_NAME, EMAIL, SALARY
FROM EMPLOYEE
ORDER BY SALARY DESC, EMP_NAME ASC;
-- 첫번째 기준이 같을 때 두번째 조건으로 정렬

SELECT EMP_NAME, EMAIL, SALARY, DEPT_CODE
FROM EMPLOYEE
ORDER BY DEPT_CODE DESC NULLS FIRST;
-- NULL 값을 처음 보내 DEPT_CODE 오름차순으로 정렬. DESC NULLS LAST면 맨아래로 보냄.

문제1. 입사일이 5년 이상, 10년 이하인 직원의 이름, 주민번호, 급여, 입사일을 이름순으로 검색

SELECT EMP_NAME, EMP_NO, SALARY, HIRE_DATE
FROM EMPLOYEE
WHERE (SYDDATE-HIRE_DATE) BETWEEN 5365 AND 10365
ORDER BY EMP_NAME;

문제2. 재직중이 아닌 직원의 이름,부서코드,입사일, 퇴사일을 검색하여라 (퇴사 여부 : ENT_YN)

SELECT EMP_NAME, DEPT_CODE, HIRE_DATE, ENT_DATE
FROM EMPLOYEE
WHERE ENT_YN LIKE '%Y%';
혹은 WHERE ENT_DATE IS NOT NULL

문제3. 근속년수가 10년 이상인 직원들을 검색하여 출력결과는 이름, 급여, 근속년수를, 근속년수가 오름차순으로 정렬하여 출력하여라.

SELECT EMP_NAME, SALARY, FLOOR((SYSDATE-HIRE_DATE)/365) 근속년수
FROM EMPLOYEE
WHERE (SYSDATE-HIRE_DATE)/365 >=10
ORDER BY 3;

문제4. 입사일이 99/01/01 ~ 10/01/01 인 사람 중에서 급여가 2000000 원 이하인 사람의 이름,주민번호,이메일,폰번호,급여를 검색 하시오

SELECT EMP_NAME, EMP_NO, EMAIL, SALARY
FROM EMPLOYEE
WHERE (HIRE_DATE BETWEEN '99/01/01' AND '10/01/01') AND SALARY <=2000000;

문제5.급여가 2000000원 ~ 3000000원 인 여직원 중에서 4월 생일자를 검색하여 이름,주민번호,급여,부서코드를 주민번호 순으로(내림차순) 출력하여라.

SELECT EMP_NAME, EMP_NO, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE (SALARY BETWEEN 2000000 AND 3000000) WHERE (SALARY BETWEEN 2000000 AND 3000000) AND(EMP_NO LIKE '__04%-2%')
ORDER BY EMP_NO DESC;

profile
A previous generalist who strives to become a genuine Specialist.

0개의 댓글