2016. 09. 23. (Fri) 서른한 번째 수업
2016. 09. 26. (Mon) 서른두 번째 수업
2016. 09. 27 (Tue) 서른세 번째 수업
안타깝게도 Mac에는 오라클 서버를 설치할 수 없기 때문에 포스팅 어려워졌다...
설치하는 과정은 패스하고 수업 중에 연습해보는 SQL문 위주로 포스팅 하겠다.
oracle 11g xe 설치 및 설정
oracle 11g xe 다운로드 및 설치
회원가입 및 로그인
Downloads 메뉴에서 Oracle Database 11g Express Edition1을 선택
Accept License Agreement 체크 후
Oracle Database Express Edition 11g Release
압축풀고 setup -> password : oracle
scott 계정 설정
sqlplus system/oracle //SYSTEM 계정으로 SQL*Plus
@C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\scott.sql
//내장 계정인 scott 계정을 사용하겠다고 명령
show user; //USER is "SCOTT"이란 말이 뜨면 성공
alter user scott identified by tiger; //tiger로 비밀번호 변경
exit //나간후 sqlplus scott/tiger로 다시 접속
*) set linesize 120;
*) set pagesize 20;
L01 SELECT
sqlplus scott/tiger //scott 계정이 가지고 있는 tablespace로 실습
select * from tab; //mysql> show tables;
desc emp;; // dept 라는 table 구조 보기
대표적인 자료형
NUMBER(PRECISION,SCALE)
숫자를 저장하기 위한 데이터 형
PRECISION: 소수점을 포함한 전체 자리 수
SCALE: 소수점 이하 자리 수
예) 72.5는 NUMBER(3,1), 10은 NUMBER(2),
7788은 NUMBER(4), 어떤 숫자도 상관없다면 NUMBER
DATE
날짜와 시간 데이터를 저장하기 위한 데이터 형
VARCHAR2(숫자)
가변적인 문자열을 저장하기 위한 데이터 형
괄호안은 바이트 수를 의미한다.
만일 컬럼의 데이터 형이 VARCHAR(15)라면
최대 15바이트의 문자열을 저장할 수 있다.
(오라클 캐리터셋이 KO16KSC5601이나KO16MSWIN949이면
한글은 2바이트, 영어는 1바이트. UTF8이나 AL32UTF8이면
한글은 3바이트, 영어는 1바이트이다.)
CHAR (!=JAVA.lang.Char)
문자 데이터를 저장하기 위한 자료형
고정 길이 문자 데이터를 저장
CHAR(20) 20BYTE의 고정 길이를 저장 공간으로 할당 받는다.
(때문에 저장 공간을 낭비하지 않기 위해 VARCHAR2를 사용)
LONG
2기가 바이트의 가변 길이 문자 저장
VARCHAR2와 유사한 특징을 가지나 아래와 같은 제한 사항이 있다.
하나의 테이블에 하나의 LONG 타입만 사용 가능 (NOT) NULL을 제외한 다른 제약 조건은 지정할 수 없다.
인덱스를 만들 수 없다.
scott 계정의 emp 테이블 구조
EMPNO(사원번호)
ENAME(이름)
JOB(직책)
MGR(직속상사 사원번호)
HIREDATE(입사일)
SAL(급여)
COMM(커미션)
DEPTNO(부서번호)
EMP 테이블에 담긴 모든 사원 레코드를 조회해보자
select * from emp;
SELECT 구조
SELECT 컬럼, 컬럼…
FROM 테이블명
WHERE 조건
GROUP BY 구문
UNION/UNION ALL/INTERSECT/MINUS 구문
ORDER BY 구문
문제1) 사원명과 입사일을 조회하시오.
답) select ename, hiredate from emp;
문제2) 사원번호와 이름을 조회하시오.
답) select empno, ename from emp;
문제3) 총 사원수를 구하시오.
답) select count(empno) from emp;
문제4) 부서번호가 10인 사원을 조회하시오.
힌트) 위 SQL문은 WHERE 조건을 사용
답) select ename from emp where deptno='10';
문제5) 월급여가 2500이상 되는 사원을 조회하시오.
힌트) WHERE 조건에 =,>,>=,<=,< 비교 연산자를 사용
답) select ename from emp where sal>=2500 order by sal asc(desc);
문제6) 사원들 중 이름이 S로 시작하는 사원의 사원번호와 이름을 조회하시오.
힌트) LIKE는 %와 _문자와 함께 검색시 사용
답) select empno, ename from emp where ename like 'S%';
문제7) 사원 이름에 T가 포함된 사원이 사원번호와 이름을 조회하시오.
답) select empno, ename from emp where ename like 'T%';
문제8-1) 커미션이 300, 500, 1400이 사원의 사번, 이름, 커미션을 조회하시오.
힌트) 2가지 경우의 SQL을 만드세요. WHERE절에 OR과 IN()을 사용
답) select empno, comm from emp where comm=300 or comm=500 or comm=1400;
select empno, comm from emp where comm in(300, 500, 1400);
문제8-2) 커미션이 300, 500, 1400이 아닌 사원을 NOT IN()으로 조회
답) select * from emp where comm not in(300, 500, 1400);
문제9) 부서번호가 10번이 아닌 사원을 조회하시오.
비교연산자를 이용하는 방법
답) select * from emp where deptno!=10;
select * from emp where deptno <>10;
select * from emp where deptno^=10; //MySQL에서 사용불가
NOT을 이용
답) select * from emp where not deptno = 10;
문제10) 급여가 2000이상이고 3000이하인 직원을 모두 조회하시오.
비교연산자를 이용
답) select ename, sal from emp where sal>=2000 and sal<=3000;
BETWEEN
답) select ename, sal from emp where sal between 2000 and 3000;
문제11) 급여가 2000이하 이거나 3000이상인 직원을 모두 조회하시오.
비교연산자를 이용
답) select ename, sal from emp where sal<=2000 or sal>=3000;
HW) 사원의 실제 급여는 SAL*10이다. 사원 이름과 커미션, 사원의 실제급여,
사원의 실제급여 + 커미션을 조회하세요.
힌트1) COMM에 NULL 때문에 실제급여 + 커미션이 되지 않는다.
NULL도 중요한 데이터로 취급되기 때문이다.
nvl() 내장함수로 NULL을 0으로 바꾸고 계산하면 된다.
답) select ename, comm frome emp nvl(comm, 0)
힌트2) 산술 연산자(+,-,*,/)를 사용하여 조회하시오.
L02 SELECT 문제
SQLPLUS 시스템 변수 조작
SET HEADING OFF //칼럼 제목 출력 끄기
SET HEADING ON //칼럼 제목 출력
SET LINESIZE 100 //ROW의 길이를 100으로 조정(기본80)
SET PAGESIZE 20 //PAGE의 크기를 20으로 조정 (기본 14)
COLUMN ENAME FORMAT A25
//문자형식의 칼럼이 출력하는 길이를 25자리로 변경
COLUMN SAL FORMAT 9,999,999
//숫자는 길이가 자동으로 변경되므로 길이 조정이 필요 없음
//대신 표현 방법을 바꿀 수 있다.
//예) 1400 -> 1,400
COLUMN COMM FORMAT 0,000,000 //예) 1400 -> 0,001,400
문제1) 이름이 A를 포함하는 사원을 모두 찾으세요.
답) select * from emp where ename like'%A%';
문제2) 이름의 두 번째 글자가 A인 사원을 찾으세요.
답) select * from emp where ename like '_A%';
UPDATE EMP SET ENAME = ‘A_LLEN’ WHERE EMPNO = 7499;
문제3) 이름에 ‘A’를 포함하는 사원을 찾으세요.
ESCAPE를 사용해’_’를 문자로 인식하도록 하세요.
답) select EMPNO, ENAME from EMP WHERE ENAME LIKE ‘%A\_%’ESCAPE’\’;
문제4) 이름에 ‘A’를 포함하지 않는 사원을 검색하세요.
답) SELECT * FROM EMP WHERE ENAME NOT LIKE ‘%A%’;
문제5) 커미션이 NULL인 사원을 검색하세요.
NULL은 연산, 할당, 비교가 불가능
답) select * from emp where comm is null;
문제6) 커미션이 NULL이 아닌 사원을 검색하세요.
답) select * from emp where comm is not null;
정렬을 위한 ORDER BY : ASC(오름차순), DESC(내림차순)
문제7) 급여 칼럼을 기준으로 사원을 오름차순으로 정렬하세요.
답) select * from emp order by sal;
문제8) 급여 칼럼을 기준으로 사원을 내림차순으로 정렬하세요.
답) select * from emp order by sal desc;
문제9) 사원의 이름을 알파벳 순으로 정렬하세요.
답) select * from emp order by ename asc;
문제10) 입사한 지 오래된 순으로 사원을 정렬하세요.
답) select * from emp order by hiredate asc;
문제11) 급여를 많이 받는 순으로 사원을 정렬할 때 급여가 같은 사람이 존재할 경우 이름의 철자가 빠른 사람부터 정렬하세요.
답) select * from emp order by sal desc, ename asc;
L03 내장함수
1. DUAL TABLE
더미 테이블로 최대 칼럼 1을 가지는 테스트 테이블
예) SELECT SYSDATE FROM DUAL;
숫자 함수
ABS() 절대값을 구한다.
i. SELECT -10, ABS(-10) FROM DUAL;
ROUND() //반올림
i. SELECT 34.5678 ROUND(34.5678) FROM DUAL;
0 : 1, default = 0
ii. SELECT 34.5678, ROUND(34.5678, 2) FROM DUAL;
1: 1/10, 2: 1/100, 3: 1/1000
iii. SELECT 34.5678, ROUND(34.5678, -1) FROM DUAL;
-1: 10, -2: 100, -3: 1000
FLOOR() //반내림(소수점을 없앤다.)
i. SELECT 34.5678 FLOOR(3.4.5678) FROM DUAL;
TRUNC() // 특정 자릿수 반내림
i. 사용법은 ROUND()와 동일
MOD() //나머지
i. SELECT MOD(27, 2), MOD(27, 5) MOD(27, 7) FROM DUAL;
문제1) 사원 번호가 홀수인 사람들을 검색하세요.
홀수는 2로 나눈 나머지가 1
답) SELECT * FROM EMP WHERE MOD(EMPNO,2) =1;
문자 처리 함수
LOWER() //소문자로 변환
i. SELECT ‘Oracle’, LOWER(‘Oracle’) FROM DUAL;
UPPER() //대문자로 변환
i. SELECT ‘Oracle’, UPPER(‘Oracle’) FROM DUAL;
INITCAP() //첫 글자만 대문자로 나머지 글자는 소문자로 변환
i. SELECT ‘ORACLE’, LOWER(‘ORACLE’) FROM DUAL;
CONCAT() //문자의 값을 연결
LENGTH() // 문자의 길이를 반환 (한글 1byte)
i. SELECT LENGTH(oracle), LENGTH(‘오라클’) FROM DUAL;
LENGTHB() // 문자의 길이를 반환 (한글 2byte)
i. SELECT LENGTHB(oracle), LENGTHB(‘오라클’) FROM DUAL;
SUBSTR() //문자를 잘라서 추출 (한글 1byte)
i. SELECT SUBSTR(‘Welcome to Oracle’, 4, 3) FROM DUAL;
ii. SELECT SUBSTR(‘Welcome to Oracle’, -4, 3) FROM DUAL;
iii. SUBSTR(대상, 시작 위치, 추출할 개수)
시작 위치가 음수면 끝에서부터 시작
SUBSTRB //문자를 잘라서 추출 (한글 2byte)
i. SELECT SUBSTR(“오라클수업”, 4, 3), SUBSTRB(“오라클수업”, 4, 3)
FROM DUAL;
ii. 한글을 1Byte로 본 것과 2Byte로 본 것의 차이
iii. 영어는 무조건 1Byte
iv. 오(1)라(2)클(3)수(4)업(5) // 오(1,2)라(3,4)클(5,6)수(7,8)업(7,8)
문제2) 직급이 ‘manager’인 사원을 소문자로 검색하세요.
답) select * from emp where LOWER(job) = 'manager';
문제3) 사원에 이름, 입사 년도, 입사한 달을 출력하세요.
답) select ename, substr(hiredate,1,2) YEAR, substr(hiredate,4,2) MON from emp;
문제4) 9월에 입사한 사원을 검색하세요.
답) select * from emp where substr(hiredate,4,2)=’09’;
문제5) 81년도에 입사한 사원을 검색하세요.
a. 연산자, BETWEEN, SUBSTR() 3가지 경우를 만드세요.
답) 1. select * from emp where substr(hiredate,1,2)=’81’;
2. select * from emp where hiredate >= '1981/01/01' AND hiredate <='1981/12/31';
3. select * from emp where hiredate between '1981/01/01' AND '1981/12/31';
문제6) ‘E’로 끝나는 사원을 SUBSTR()로 검색하세요.
답) select * from emp where substr(ename, -1,1) = 'E';
문자처리함수2
LPAD()/RPAD() 특정 기호를 채우는 함수
i. SELECT LPAD(‘ORACLE’,20,’#’) FROM DUAL;
ii. SELECT LPAD(‘ORACLE’,20,’#’) FROM DUAL;
LTRIM(), RIRIM() 공백문자를 삭제하는 함수 //자주쓰는 함수
i. SELECT LTRIM(‘ORACLE’) FROM DUAL; //왼쪽 공백을 제거
ii. SELECT RTRIM(‘ORACLE’) FROM DUAL; //오른쪽 공백을 제거
TRIM() 특정 문자를 잘라내는 함수 //왼쪽 오른쪽 다 지움
i. SELECT TRIM(‘a’ FROM ’ aaaaaOracleaaaa’) FROM DUAL;
ii. SELECT TRIM(‘ORACLE’) FROM DUAL;
'IT story > JSP' 카테고리의 다른 글
L07 group by (0) | 2016.10.22 |
---|---|
D+34~36 Oracle(SQL SELECT문: Function, Group Function) (0) | 2016.10.01 |
D+29 JDBC(Java DATABASE Connection, DELETE) (0) | 2016.09.26 |
D+28 JDBC(Java DATABASE Connection, UPDATE) (0) | 2016.09.26 |
D+27 JDBC(Java DATABASE Connection, INSERT) (0) | 2016.09.26 |