1. 데이터베이스
빠른 탐색과 검색을 위해 조직된 데이터의 집합체
2. DBMS(Database Management System)
DBMS의 장점
데이터 중복(redundancy)의 최소화
데이터의 공유(sharing)
일관성(consistency) 유지
무결성(integrity) 유지
DBMS의 단점
비용 증가(H/W, DBMS, 운영비, 교육비, 개발비 등)
프로그램의 복잡화
성능상의 오버헤드
DBMS의 주요 기능
CRUD(Create, Read, Update, Delete)
데이터의 무결성(integrity) 유지
트랜잭션 관리
데이터의 백업 및 복원
주요 용어
데이터베이스(Database): Table의 집합
테이블(Table): Record의 집합
레코드(Record): 테이블의 행(row), 한건의 데이터. 컬럼(필드)들의 집합
컬럼(Column), 필드(Field): 레코드의 열
Primary Key: 기본키, 테이블에서 각 레코드의 식별자
Foreign key: 외래키, 다른 테이블의 Primary Key를 참조하는 필드
3. SQL(Structured Query Language: 구조화된 질의언어
(1) select
SELECT 컬럼명1, 컬럼명2 , ...
FROM 테이블명
WHERE 조건절 ORDER BY 정렬기준컬럼명 asc or desc
(2) distinct / all
(3) order by 정렬기준: asc 오름차순, desc 내림차순
(4) alias 별칭: 컬럼명 [as] 별칭
(5) where: 데이터 검색 조건
(6) 연산자의 종류
산술연산자 : +, -, *, /
비교연산자 : =, !=, >, >=, <, <=
논리연산자 : and, or, not
기타연산자: in, all, between, like, is null, is not null
결합연산자: ||
(7) 연산자의 우선순위
✏️Quiz
(Q1) emp 테이블에서 입사일(hiredate)이 2015년 1월 1일 이전인 사원에 대해 사원의 이름(ename), 입사일, 부서번호(deptno)를 출력하시오.
SELECT ename, hiredate, deptno FROM emp WHERE hiredate < '2015-01-01' ORDER BY hiredate;
(Q2) emp 테이블에서 부서번호가 20번이나 30번인 부서에 속한 사원들에 대하여 이름, 직업코드(job), 부서번호를 출력하시오.
SELECT ename, job, deptno FROM emp WHERE deptno in (20, 30) ORDER BY ename;
SELECT ename, job, deptno FROM emp WHERE deptno=20 or deptno=30 ORDER BY ename;
1. 단일행 함수
레코드별로 한개의 결과값을 반환하는 함수
2. 집계함수
여러 개의 레코드를 집계하여 결과값을 반환하는 함수: count(), sum(), avg(), max(), min()
3. 문자함수
SELECT concat(ename, '의 직급은'), job FROM emp;
SELECT ename||'의 직급은'||job FROM emp;
SELECT replace('java program','java','자바') FROM dual;
--replace(원래내용, A, B) => A를 B로 repalce(대체)
--dual: FROM 절의 형식을 맞추기 위해 추가한 가상 테이블
SELECT substr('java program', 4,3) FROM dual;
--substr('문자열', 자리수, 추출하려는글자수) → 부분 문자열 생성
--인덱스는 1 부터 시작
4. 날짜 함수
sysdate: 시스템의 현재 시각
add_months(날짜데이터, 숫자): 날짜값에 개월 수를 더해서 결과값을 반환함. 월만 증가/감소되고 날짜는 그대로
months_between(날짜1, 날짜2): 두 날짜 사이의 개월수(날짜1-날짜2)
to_char(날짜컬럼 or 날짜데이터, '출력형식')
to_date('날짜 형태의 문자열', '날짜 변환 포맷'): 문자열을 날짜로 변환
SELECT to_char(sysdate, 'yyyy-mm-dd am hh:mi:ss day') FROM dual;
--현재 시스템날짜(sysdate)의 포맷('...') 지정
--요일 → d: 일요일~토요일을 1~6 숫자코드로
--day: 요일 이름 전체 (ex.일요일, 월요일...)
SELECT to_date('2018-01-26', 'yy-mm-dd') FROM dual;
--to_date: 문자→날짜로 바꾸는 함수, '형식지정'
5. 숫자 함수
숫자변환 함수: to_number('숫자 형태의 문자열')
trunc(숫자, 자리수) : 지정된 자리수 이하의 소수를 버림. 자리수를 생략하면 소수 부분을 버림
round(숫자, 자리수) : 반올림
ceil(숫자) : 올림
6. 조건검사 함수
--(ex)커미션이 null 인 경우, 0로 처리
SELECT ename, sal, comm, sal*12+nvl(comm,0) FROM emp;
✏️Quiz
(Q1) 직원의 이름, 직급, 급여를 출력하시오.(월급이 300 이상인 직원만 출력합니다.)
SELECT ename, job, sal fROM emp where sal>=300;
(Q2) 직원의 이름과 근무개월수를 출력하시오.(근무개월수가 100개월 이상인 직원만 출력합니다.)
SELECT ename, hiredate, round(months_between(sysdate, hiredate)) 근무개월수
FROM emp
WHERE round(months_between(sysdate, hiredate)) >=100;
(Q3) 직원의 이름과 직급, 총 근무주(week)수를 출력하시오. (근무주수 내림차순, 근무주수가 같으면 이름에 대하여 오름차순 정렬합니다.)
SELECT ename, job, round((sysdate - hiredate)/7) 총근무주수
FROM emp
OPRDER BY round((sysdate - hiredate)/7) desc, ename;
--주차 수(week)를 구하는 함수는 따로 없어서 근무일을 7로 나눈 후 계산함
1. join
2. join 형식
SELECT 컬럼 리스트
FROM 조인대상 테이블들(컴머로 구분, 별칭사용)
WHERE 조인조건 AND 일반조건;
3. 종류
4. ANSI 조인
--left outer join SELECT sname, s.major, pname FROM stud s left outer JOIN prof p ON s.profno =p.profno(+);--right outer join SELECT sname, s.majorno, pname FROM stud s right outer JOIN prof p ON s.profno = p.profno;--full outer join SELECT sname, s.majorno, pname FROM stud s left outer JOIN prof p ON s.profno = p.profno;
5. 합집합 union
--A union B (중복값 제거) UNION SELECT * FROM emp WHERE deptno=10;
--union all (중복값을 제거하지 않음) UNION all SELECT * FROM emp WHERE deptno=10;
*cf. View(뷰, 가상테이블) =>
CREATE OR REPLACE view 뷰이름 AS (sql 명령어) ;
(ex) CREATE OR REPLACE view product_sales_v --생성 변경 뷰 뷰이름 AS SELECT p.product_code, product_name, price, company, amount, price*amount money, make_date FROM product p, product_sales s WHERE p.product_code = s.product_code;
✏️Quiz
(Q1) emp와 dept 테이블을 조인하여 사원이름, 부서명, 급여를 출력하시오.
SELECT ename, e.deptno, sal FROM emp e, dept d WHERE e.deptno=d.deptno;
SELECT ename, dname, sal FROM emp_v; --뷰 emp_v 를 활용
(Q2) 직급이 ‘사원’인 사원이름, 부서명을 출력하시오.
SELECT ename, dname FROM emp e, dept d WHERE e.deptno=d.deptno and job = '사원' ;
SELECT ename, dname FROM emp_v where job = '사원'; --뷰 emp_v를 활용
(Q3) 이름이 ‘손기철’인 사원의 부서명을 출력하시오.
SELECT dname FROM emp e, dept d WHERE e.deptno=d.deptno and ename = '손기철';
SELECT dname FROM emp_v where ename = '손기철'; --뷰 emp_v를 활용
(Q4) emp테이블에 있는 empno, mgr을 이용하여 서로의 관계를 다음과 같이 출력하시오. “박종수의 매니저는 박성환이다” → 셀프조인(self join)
SELECT a.ename || '의 매니저는 ' || b.ename || '이다.' -- A || B 결합, 연결 FROM emp a, emp b WHERE a.mgr = b.empno; --조인 조건: 사원.관리자사번 = 팀장.본인사번