160401: 15회차
종료하기 전 티스토리 네이버 로그아웃 할 것
That's what we have! :>
1. 툴
동일
추가시:
2. 폴더
동일
추가시:
3. 사용할 사이트
동일
추가시:
4. 공부하는 것
이제
WAS(Web Application Server)
이거 함 :>
pw: model1
[01] Oracle XE 11g 설치, Eclipse Data Management Oracle 설정
이거 할거임
이걸로 깐댕 :>
이거 되게 오래걸려... 심심해서 신상짤을 모았습니다.
- 드라이버 위치
. XE : C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc5.jar
- ojdbc14.jar(10g) 또는 ojdbc5.jar(11g) 파일을 복사하여 "/lib"에 붙입니다.
깐담에 복사해야함 :>
run sql command line! 실행하고
connect
하고
system - 1234
로 만들었음 :>
GRANT connect, resource to soldesk; <- soldesk 계정에 권한 부여
----------
이클립스에 드라이버 연결할 때 11 - thin driver <- 로 선택
파일 연결 x -> 실행만 한번 하는 용도로 저거 쓰면 됨
----------------------------
[01] 테이블(itpay) 생성, 구조 수정, 삭제
요렇게 늘어남.
-------------------------------------------------------
1. 모든 컬럼, 모든 레코드 SELECT
SELECT *
FROM itpay;
//모든 레코드 값을 가져와버린다
2. SELECT 할 레코드 정의
SELECT payno, part, sawon, age
FROM itpay;
//나는 골라서 가져와버린다
3. SELECT문에 산술 연산자 적용
SELECT payno, part, sawon, bonbong, bonbong * 13 as 연봉
FROM itpay;
-- 급여 12개월에 퇴직금해당하는 급여 달 추가
SELECT payno, part, sawon, bonbong,
bonbong * (12 + 1) as 연봉
FROM itpay;
//오라클님은 산술연산도됨 -_-ㅋㅋ
이렇게 컬럼명 같이 보이게 as 쓸 수도 있음
4. null 컬럼의 산술식 적용(null 컬럼은 연산이 되지 않음)
SELECT payno, part, sawon, bonus,
bonus + 200000 as 보너스
FROM itpay;
이러면 null값은 그냥 null값 된다는 얘기임
5. 연결기호 ||, 컬럼값이 합쳐짐
SELECT payno, part, sawon, bonus,
'(' || (bonus + 200000) || ')' as 보너스
FROM itpay;
// 요거는 ( 랑 )가 찍힘
(200000) <- 이런 식으로
//그러니까 || 를 연결 부호로 씀 <- 마치 자바의 + 처럼
SELECT sawon || '님의 급여는 ' || bonbong || '입니다.' as 급여
FROM itpay;
//이것도 David님의 급여는 200000000000입니다 <- 처럼 나옴
6. 중복 컬럼값의 출력
SELECT * FROM itpay;
-- 부서만 출력
SELECT part FROM itpay;
//요러면 사원들의 부서명이 다 나오니까 중복된 값이 많음
-- 부서명을 고유하게 출력
SELECT DISTINCT part FROM itpay;
//DISTINCT 쓰면 부서명 중복된 거 제거해서 나옴
-------------------------------------------뭔가 폭풍진도
1. WHERE절의 사용
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay;
-- 12번 레코드만 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE payno = 12;
//기본키가 index로 등록되어져서 기본키로 검색하면 빠름
//다른 걸로 찾아도 나오긴 하는데 index는 사전처럼 등록이 되어져있어서 빠름 :>
-- '가길동'만 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE sawon = '가길동';
-- 급여가 1500000 ~ 2000000만 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE bonbong >= 1500000 and bonbong <= 2000000;
//이렇게 연산을 where에 넣어줄 수도 있음
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE bonbong BETWEEN 1500000 AND 2000000;
//위에 애랑 같은 건데 between and 쓰면 그냥 값만 넣어주면 됨...
//둘중에 뭐가 더 좋은 건 없음맨
2. IN 명령어의 사용
-- 부서가 '개발팀'이나 '객체설계팀'인 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE part='개발팀' or part='객체설계팀';
// 개발팀이랑 객체설계팀 다 데려옴 :>
-- 부서가 '개발팀'이나 '객체설계팀'인 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE part IN('개발팀', '객체설계팀');
// or이랑 같은 것 :>
-- 부서가 '개발팀'이나 '객체설계팀'이 아닌 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE part NOT IN('개발팀', '객체설계팀');
//이건 개발이랑 객체설계 아닌 것 모두 출력
3. LIKE
-- 주소가 정확히 '서울시 관악구'인 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE address = '서울시 관악구';
//얘는 search 에 "" 씌운 것 같은 느낌임
// 근데 =을 왜 안쓰냐면 % 이런 애들을 <- 를 쓸 수 있어서 그럼
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE address LIKE '서울시 관악구';
-- 주소가 경기도로 시작하는 직원 전부 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE address LIKE '경기도%';
// 얘는 경기도로 시작하는 아무데나 가능
// %뜻이 그런건가바 :>
// =하고 다른 이유는 시작 + % = 시작하는 무언가 가능
-- 주소가 부천시로 끝나는 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE address LIKE '%부천시';
//얘는 부천시로 끝나는 무언가 찾기
-- 주소가 인천시인 직원 전부 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE address LIKE '%인천시%';
//얘는 중간에 인천시가 들어가는 무언가들 찾기
-- 주소 컬럼에 2번째 단어가 '기'가 들어간 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE address LIKE '_기%';
// ㅇㅇ 암거나기% = 두번째에 기가 들어간 주소를 가진 무언가를 찾기
-- 주소 컬럼에 3번째 단어가 '도'가 들어간 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE address LIKE '__도%';
//내가 해봤는데 이런것도 됨 ㅇㅇ 그러니까 자리수인가바 :>
4. NULL 컬럼만 출력
-- ERROR
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE bonus = NULL;
//얘는 안됨
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE bonus IS NULL;
//얘는 됨
// NULL값 검색시에는 IS NULL
5. OR
-- 서울이나 인천에 거주하는 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE address LIKE '%서울%' OR address LIKE '%인천%';
//오 -.-
6. AND
-- 서울에 거주하면서 급여가 300만원 이상인 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE address LIKE '%서울%' AND bonbong >= 3000000;
-- 개발팀 직원중에 서울에 거주하면서 급여가 300만원
이상인 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE part = '개발팀' AND address LIKE '%서울%'
AND bonbong >= 3000000;
// and니까 조건을 모두 만족시켜야함
7. OR, AND의 조합
-- 부서가 '개발팀'이거나 '객체설계팀' 직원중에 급여가 300만원
이상인 직원 출력
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE (part='개발팀' OR part='객체설계팀')
AND bonbong >= 3000000;
//이렇게 조건 여러개면 괄호로 묶어주는 편이 정신에 낫겠다
8. 정렬
-- 이름순으로 오름차순 정렬
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon ASC;
//근데 asc는 생략해도 됨 - 기본이 오름차순이래
-- 수령 급여순으로 오름차순 정렬
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY bonbong ASC;
-- 부서별 오름차순, 수령 급여순으로 오름차순 정렬
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY part ASC, bonbong ASC;
//아 1. 부서별로 오름차순 정리 -> 정리한 것 중에서 2. 급여순으로 오름차순 정리
-- 나이별로 내림 차순, 부서별 오름차순
, 수령 급여순으로 오름차순 정렬
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY age DESC, part ASC, bonbong ASC;
//1. 나이를 내림차순 정리 -> 2. 파트별로 오름차순 정리 -> 연봉별로 오름차순 정리
-----------------------------------------------
오늘 적절한 움짤
복붙 프린트밖에 하는 게 없따 :<
1. UPPER, LOWER
-- 소문자로 변경
SELECT payno, LOWER(part), sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon ASC;
//part명을 소문자로 바꿔줌 _-_
-- 대문자로 변경
SELECT payno, UPPER(part), sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon ASC;
//part명을 대문자로 바꿔줌 -_-
2. CONCAT
SELECT payno, CONCAT(part, '-' || sawon), age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon ASC;
이런 식으로 연결해줌 :>
3. SUBSTR, index는 1부터 시작
-- 3번째 문자이후부터 출력
SELECT payno, SUBSTR(address,3),
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon ASC;
경기/도
12 /3
를 출력
-- 1~5번째 문자 출력
SELECT payno, SUBSTR(address, 1, 5), address
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon ASC;
경기도 성
12 3 4 5/
-- 2번째 문자부터 4문자 출력
SELECT payno, SUBSTR(address, 2, 4),
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon ASC;
4. LENGTH
//길이!
SELECT payno, address, LENGTH(address),
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon ASC;
//7임
왜냐면
경기도 성남시 (빈칸까지 ) - 7개
5. INSTR, index는 1부터 시작
- 문자열이 포함되어 있는지를 조사하여 문자열의 위치를 반환합니다.
- 지정한 문자열이 발견되지 않으면 0이 반환 됩니다.
SELECT payno, address, INSTR(address, '천'),
month, gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon ASC;
조렇게!
6. LPAD, RPAD 참고
- LPAD - 왼쪽에 문자열을 끼어 놓는 역할을 합니다.
- 10은 반환되는 문자열의 전체 길이를 나타내며,
- RPAD 오른쪽에 문자열을 끼어 놓는 역할을 합니다.
SELECT bonbong, LPAD(bonbong, 10, 0)
FROM itpay
ORDER BY sawon ASC;
//600일경우 000000600이런식
SELECT bonbong, RPAD(bonbong, 10, 0)
FROM itpay
ORDER BY sawon ASC;
//600일경우 60000000이런식 ㅋㅋㅋㅋㅋ
7. REPLACE
SELECT payno, address, REPLACE(address, '계양구','남동구'),
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE address LIKE '%인천%'
ORDER BY sawon ASC;
이런 식으로 바꿔서 보여줌
8. ROUND
-- 소수 둘째 자리까지 반올림
SELECT ROUND(55.634, 2), ROUND(55.635, 2)
FROM dual;
//dual은 하나의 컬럼 & 하나의 레코드만 존재하는 기본 테이블 :>
//암것도 없어서 구냥 암거나 쓴거임... -.-
//그냥 select 해서 보여주려고 빈 테이블 쓴거십니다
어쩄든 앞의 라운드는 반올림 못해서 55.63
뒤에거는 55.64
-- 1의 자리, 10의 자리에서 반올림
SELECT ROUND(23541, -1), ROUND(23541.25, -2)
FROM dual;
-1은 첫번째 (1)의자리
-2는 두번째 (10)의 자리
그래서 첫번째 라운드는 23540 / 두번쨰 라운드는 23500
그래서 -3인 100의 자리는
첫번째 두번쨰 자리 24000 만듬 ㅇㅇ
9. TO_CHAR(): 날짜의 출력 및 비교
-- 현재 날짜 출력
SELECT sysdate FROM dual;
//옿 ㅎㅅㅎ 초도 가져옴
-- 2008-05-19일에 급여를 받는 사람 출력
SELECT gdate, SUBSTR(gdate, 1, 10)
FROM itpay;
//쳇 -_-) sysdate에서 뽑아와도 이쁘게는 못뽑아옴
//그래서 to_char() 사용해서 문자형태로 바꾼 뒤에 뽑아야함 ㅇㅇ
-- TO_CHAR() 함수를 통한 문자열 형변환
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus
FROM itpay
WHERE TO_CHAR(gdate, 'yyyy-mm-dd') = '2008-05-19';
ㅇㅇ 이렇게
10. 두 날짜 사이의 차 출력
SELECT MONTHS_BETWEEN(sysdate+1, sysdate) FROM dual;
//이거 갈비지값처럼 보이는 결과값 나옴... -_-);;
SELECT MONTHS_BETWEEN(sysdate+31, sysdate) FROM dual;
//심지어 얘도 갈비지같이 생겼지만 1.어쩌구야... - 1달 차이난단 얘긴가벼
11. 월 더하기
SELECT ADD_MONTHS(sysdate, 1) FROM dual;
12. 돌아오는 월요일의 날짜 출력
SELECT NEXT_DAY(sysdate, '월요일') FROM dual;
13. 이번달의 마지막날 출력
SELECT LAST_DAY(sysdate) FROM dual;
NEXT_DAY랑 LAST_DAY는 쫌 쓸모있음 :>
14. TO_CHAR
SELECT TO_CHAR(sysdate, 'yyyy-mm-dd hh:mi:ss') FROM dual;
SELECT TO_CHAR(sysdate, 'yyyy-mm-dd hh24:mi:ss') FROM dual;
//hour = hh -> 이거에 24 붙이면 24시간 형태로 나옴 ... 근데 지금이 11시라섴ㅋㅋㅋㅋ 구졌습니다
SELECT TO_CHAR(1500, '0999999') FROM dual;
//앞에가 빈 거를 0으로 채워준것 :>
SELECT TO_CHAR(150000, '9,999') FROM dual;
SELECT TO_CHAR(150000, '999,999') FROM dual;
SELECT TO_CHAR(150000, 'S999,999') FROM dual;
//s는 음수 양수 표시 :> +150,000 <- 이런 식으로 나옴! :>
SELECT TO_CHAR(1500.55, '9,999.99') FROM dual;
SELECT TO_CHAR(1500.55, '9,999.9') FROM dual;
SELECT TO_CHAR(1500.5, '9,999.999') FROM dual;
//뒤에 소수점은 0으로 채워짐 ..
15 NVL 함수★ - 얘는 좀 외우실것
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus,
family
FROM itpay;
//요거는 그냥 노오말한 출력 (-_-)
// null값을 그냥 null로 계산해줌
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax,
NVL(bonus, 0) + 500000 as bonus,
NVL(family, 0)
FROM itpay;
//NVL(ㅁㅁㅁ,0) <- 혹시 ㅁㅁㅁ가 null값이 있으면 0으로 바꿔줘라
// NVL(bonus, 0) + 500000 as bonus, - 그리고 50을 더해라
아 물론 실제 데이터를 건드리는 것은 아님 ㅇㅇ
그래서 이거 0 안넣고 그냥 NVL(bonus, 돈돈돈돈) <- 이런거 써도 됨
null value... l...? <- 널 밸류 값을 ㄹ....해주는것
null value Logic <- 이래 -_-)
출처: http://stackoverflow.com/questions/28935971/why-are-nvl-functions-called-nvl
16. CASE 문
SELECT payno, part, sawon, age, address,
month, gdate, bonbong, tax,
CASE part WHEN '개발팀' THEN 1.4*bonbong
WHEN '객체개발팀' THEN 1.3*bonbong
WHEN 'DB설계팀' THEN 1.2*bonbong
ELSE 1.1*bonbong END bonus
FROM itpay;
CASE part when 컬럼명 then 리턴할 수식수식
ELSE 리턴할 수식수식 END 이거 리턴할 컬럼명
같이 생겼음
- 선생님이 알리아스 어쩌구를 설명했는데 ㅁㄺㄷ
이거 볼 것 ... - 나중에 할 때 붉은 글씨 고칠 것
출처: http://joke00.tistory.com/103
보려고 좀 복붙했음
[ORACLE] CASE WHEN ~ THEN ~ ELSE END
POSTED AT 2010.04.20 20:17 | POSTED IN DATABASE/ORACLE SQLOracle 뿐만 아니라 DB2 에서도 실행되는(?) 수행되는 이라고 해야 맞으려나?? - -;; 암튼...
이번엔 JAVA 의 IF ~ ELSE 문과도 같은 CASE WHEN 문에 대해서 알아 봅시다.
CASE ~ WHEN ~ THEN ~ ELSE ~ END
[형식]
CASE 컬럼명 | 표현식 WHEN 조건식1 THEN 결과1
WHEN 조건식2 THEN 결과2
.......
WHEN 조건식n THEN 결과n
ELSE 결과
END
조건문과 조건문 사이에는 콤마(,) 를 사용하지 않는다.
CASE 문은 반드시 END 로 끝내야 한다.
CASE 표현식은 ANSI SQL 형식도 지원한다.
결과 부분은 NULL 을 사용해서는 안된다.
case when x = y then a else b end
: 조건 x =y 가 true 일 경우 a 이고 그렇지 않으면 b
case when x < y then a when x = y then b else c end
: 조건 x<y 가 true 일 경우 a 로, 조건 x = y 일 경우엔 b 로 그렇지 않으면 c 로 변경
case XYZ when 'foo' then 'moo' else 'bar' end
: XYZ 가 foo 일 경우 moo 로 변경, 그렇지 않으면 bar 로 변경
예제 만들기!
INSERT INTO TEST_CASE_WHEN VALUES ('*','*');
INSERT INTO TEST_CASE_WHEN VALUES ('+','+');
INSERT INTO TEST_CASE_WHEN VALUES ('-','-');
INSERT INTO TEST_CASE_WHEN VALUES ('.','.');
COMMIT;
토드나 SQLPLUS 혹은 SQLGATE 에서 Qurey 를 날려 봅시다.
SELECT a, CASE
WHEN b = '*' THEN 'star'
WHEN b = '+' THEN 'plus'
WHEN b = '-' THEN 'minus'
ELSE '????'
END AS B
FROM test_case_when;
결과 >>>>
출처 : http://www.adp-gmbh.ch/ora/sql/case_when.html
---------------------------------------------------
6이 없어서 7을 하도록 ... -_-);;
오늘은 저것 + 예쓰아이캔 같은 느낌입니다
1. WHERE문에 서브쿼리의 사용
-- 개발팀의 평균 급여(2550000)
SELECT AVG(bonbong)
FROM itpay
WHERE part='개발팀';
// 오우 AVG 함수를 기본적으로 제공하는군!
-- 개발팀의 평균 급여보다 급여가 많은 직원 출력
SELECT *
FROM itpay
WHERE bonbong >= (
SELECT AVG(bonbong)
FROM itpay
WHERE part='개발팀'
);
//
1. where의 서부쿼리에서 개발팀의 평균 급여를 구함
2. 걔보다 큰 걸 비교함
3. 걔네를출력함
개발팀 로동자는 DBA님에게 집니다
위대하신 룡도자급임
아 DBA 월급 보니까 열폭하고싶다
근데 개발자도 프리랜서는 돈 많이 벌던데 부럽맨
2. 조건의 중첩
-- 가길동의 부서 출력
SELECT part
FROM itpay
WHERE sawon='가길동'
-- 가길동과 같은 부서의 평균 급여 출력, 2550000
SELECT TRUNC(AVG(bonbong))
FROM itpay
WHERE part = (SELECT part
FROM itpay
WHERE sawon='가길동');
// 길동이 부서를 구해서 - 서부쿼리
// 그거를 찾아서
// 걔네 부서의 평균값을 구함
// 트렁크는 뭐람
TRUNC
얘는 소수점자리 찍어주려고 쓰는 건데 암것도 안쓰고 저렇게 쓰면 그냥 ,0이랑 같은 거임 :>
몇째자리까지 나오나 할떄
321321321321321.3333333333333, 2
하면 323321321321.33 <- 이런 식으로 나옴
ㅇㅇ problem solved
-- 가길동과 같은 부서에 근무하면서 그 부서의 평균급여 보다
급여가 많은 직원 출력
SELECT *
FROM itpay
WHERE (
bonbong > (
SELECT AVG(bonbong)
FROM itpay
WHERE part = (SELECT part
FROM itpay
WHERE sawon='가길동'
)
)
)
AND
(
part = (
SELECT part
FROM itpay
WHERE sawon='가길동'
)
)
//서부쿼리 and 서부쿼리 인것 -_-);;
// 가길동의 부서를 뽑아내고
//걔네[ 부서의 평균값보다 돈 많이 받는 사람 뽑아서 -> 걔네 부서에서 일하는 사람 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
3. Subquery + ROWNUM 컬럼을 이용한 레코드 추출
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus, rownum
FROM itpay;
rownum : 오라클에서 제공하는 시스템 변수
인데 지금 불러온 데이터들을 순서대로 올려놓음
이렇게 인덱스를 붙여줌 :< 근데 이게 밑에서 보시져 - 문제가 있음
-- rownum이 생성되고 난후 정렬됨으로 정보로서의 가치가 떨어짐
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus, rownum
FROM itpay
ORDER BY sawon;
근데 이게 정렬하고 나서 안 쓰면 막 순서가 꼬임 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
-- 먼저 정렬을 수행하고 rownum을 추가합니다.
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus, rownum as r
FROM (
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon
)
-- WHERE r >= 1 and r <= 10
-- ORA-00904: "R": invalid identifier
-- 저거 추가하면 r을 인식하지 못함 -_-)
where rownum >= 1 and rownum <=10
-- 근뎅 이건 또 된다?
-- 그리고 이건 안됨 ㅋㅋㅋㅋ
-- where rownum >= 3 and rownum <=10
-- 1부터 읽어오기 필수인것
-- 그래서 저 1에서 10까지 빼고는 다 **임미다
-- rownum 컬럼 값에 따른 레코드 추출
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus, rownum as r
FROM (
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon
);
-- rownum 컬럼 값에 따른 레코드 1~3 추출
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus, r
FROM(
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus, rownum as r
FROM (
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon
)
)
WHERE r >= 1 AND r <= 3;
-- rownum 컬럼 값에 따른 레코드 4~6 추출
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus, r
FROM(
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus, rownum as r
FROM (
SELECT payno, part, sawon, age, address, month,
gdate, bonbong, tax, bonus
FROM itpay
ORDER BY sawon
)
)
WHERE r >= 4 AND r <= 6;
이렇게 삼중쿼리를 써서 rownum - 을 이름을 또 바꿔서 r(이라던가 david라던가) 이걸로 쓰면 됨ㅋㅋㅋㅋㅋㅋㅋㅋ
게시판 사용시 쓰면 됨미다 :>
4. IN의 사용: Subquery의 결과가 2개 이상일 경우 사용
- 급여가 350만원 넘는 사람과 같은 나이를 가지고
있는 직원의 급여 내역을 출력하세요.
-- 급여가 350만원이 넘는 직원의 나이를 출력합니다.
SELECT DISTINCT age
FROM itpay
WHERE bonbong >= 3500000;
-- 그 나이에 해당하는 직원의 정보를 모두 출력합니다.
SELECT *
FROM itpay
WHERE age IN(
SELECT DISTINCT age
FROM itpay
WHERE bonbong >= 3500000
);
남의 도움을 받읍시다.
출처: http://smeffect.tistory.com/entry/120830-Oracle-%EC%97%B0%EC%82%B0%EC%9E%90-INNOT-INANDORBETWEEN
아
where 검색할 때
where first_name in ('데이비드', '김'); <- 이런식으로 사용함 ㅇㅇ
not in은 데이비드 김 빼고 다른애 다나옴
*** 부서별 본봉의 평균값의 최대값 보다 높은 본봉을 받는 사람들을 출력하는데
그중에서 나이가 40세 이상인 직원들을 출력해보세요
그룹바이로 쓰랭 :>
select * from itpay
where
bonbong >= (
SELECT trunc(max(avg(bonbong)))
FROM itpay
group by part
)
and
(age >= 40)
이거 망함 ㅠㅠ
group by 개념이 뭘까
GROUP BY는 데이터를 그룹핑해서 그 결과를 가져오는 경우 사용한다.
집계함수를 사용하여 특정 그룹으로 구분 할 때는GROUP BY 절을 사용하며, 특정 그룹 구분없이 중복된 데이터를 제거할 경우에는 DISTINCT 절을 사용 하도록 하자
http://www.gurubee.net/lecture/1032
출처2 http://smeffect.tistory.com/entry/120830-Oracle-%EC%97%B0%EC%82%B0%EC%9E%90-INNOT-INANDORBETWEEN
이 티스토리가 최고야 사랑해
Group by는 칼럼의 값이 같은 다수의 컬럼을 하나의 그룹으로 묶어서 처리하는 방법~!!!!
select 컬럼 컬럼 from 테이블명 where 컬럼 group by 컬럼; <- -_-)? 같이 사용함
응 그래
select department_id employee_id
from employees
where department_id in (50,80) 하면
50과 80부서의 id가 나옴
근뎅 id의 개수를 세고 싶은데 안 세지니까
함수랑 컬럼을 같이 쓰려면 group by 쓰면 됨
select department_id, count(employee_id)
from employees
where department_id in (50,80)
group by department_id; <- 이렇게 쓰면 id 개수 세짐 ㅇㅇ
어 그래도 어렵당 2번 더 볼 것 -_-);;
---------------------------------------------------------------
[01] Manipulating Data(DML)
1. NULL 값의 추가
INSERT INTO itpay(payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus, family)
VALUES(13, '개발팀', '가길동', 29, '서울시 관악구',
'200805', sysdate, 2500000, 0, NULL, NULL);
SELECT * FROM itpay;
2. 날짜의 추가
-- 날짜 형식에 문자열을 추가할 수 없습니다.
INSERT INTO itpay(payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus, family)
VALUES(14, '개발팀', '나길동', 29, '서울시 관악구',
'200805',
'2008-05-20 17:17:30',
2500000, 0, NULL, NULL);
SELECT * FROM itpay;
-- 24 시간제 추가
INSERT INTO itpay(payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus, family)
VALUES(14, '개발팀', '나길동', 29, '서울시 관악구',
'200805',
TO_DATE('2008-05-20 17:17:30', 'yyyy-mm-dd hh24:mi:ss'),
2500000, 0, NULL, NULL);
SELECT * FROM itpay;
-- 12 시간제 추가
INSERT INTO itpay(payno, part, sawon, age, address,
month, gdate, bonbong, tax, bonus, family)
VALUES(15, '객체설계팀', '다길동', 34, '경기도 성남시',
'200805',
TO_DATE('2008-05-20 05:17:30', 'yyyy-mm-dd hh:mi:ss'),
2300000, 0, NULL, NULL);
SELECT * FROM itpay;
//갑자기 슝슝 내려옴
3. 특정 테이블의 결과를 특정 테이블로 추가
CREATE TABLE itpay_copy(
payno NUMBER(7) NOT NULL, -- 1 ~ 9999999
part VARCHAR(20) NOT NULL, -- 부서명
sawon VARCHAR(10) NOT NULL, -- 사원명
address VARCHAR(50) NOT NULL, -- 주소
PRIMARY KEY(payno)
);
INSERT INTO itpay_copy(payno, part, sawon, address)
SELECT payno, part, sawon, address
FROM itpay
WHERE part='개발팀';
SELECT * FROM itpay_copy;
4. UPDATE
- WHERE조건을 동반하지 않을시 모든 레코드가 수정됨으로
주의합니다.
-- 개발팀의 급여를 10% 인상하세요.
UPDATE itpay
SET bonbong = bonbong * 1.1
WHERE part='개발팀';
SELECT AVG(bonbong)
FROM itpay
WHERE part='개발팀';
5. 개발팀에서 나이가 35세 이상되는 직원들의 급여를
'DB설계팀'의 평균 급여로 인상하세요.
SELECT * FROM itpay;
-- DB설계팀의 평균 급여
SELECT AVG(bonbong) FROM itpay WHERE part='DB설계팀';
-- 35세이상되는 개발팀의 평균 급여
SELECT AVG(bonbong) FROM itpay
WHERE part='개발팀' and age >= 35;
UPDATE itpay
SET bonbong = (
SELECT AVG(bonbong)
FROM itpay
WHERE part='DB설계팀'
)
WHERE part='개발팀';
6. 삭제
- WHERE조건을 동반하지 않을시 모든 레코드가 삭제됨으로
주의합니다.
DELETE FROM itpay WHERE payno=15;
SELECT * FROM itpay;
DELETE FROM itpay
WHERE sawon='가길동' and address='서울시 관악구';
------------------------------------------------------------------------------------
빨간 거랑 아까 못 푼거 마저 풀어보기 :>
------------------------------------------------------------------------------------
아니 밥먹고 그냥 뻗음 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
다시하쉬는것
출처: http://dkatlf900.tistory.com/87
DBMS의 중요한 목적 중 하나는 데이터를 효율적으로 관리하는 것이다. 그래서 개별 테이블을 만들어 가급적 중복성을 피해서 꼭 필요한 데이터를 저장하게 된다. 하지만 각각의 테이블 하나만 놓고 본다면 그안에 들어있는 데이터는 정보로서의 가치가 많이 떨어진다. 하지만 각각의 테이블에 분리되어 있는 연관성 있는 데이터들을 연결하거나 조합하여 데이터를 사용할 수 있다면 중요한 정보로서 가공될수 있다.
이런 작업들을 조인(Join)이라고 한다.
1. WHERE 절
조인에 대해 알아보기 전에 먼저 WHERE 절 에 대해 살펴 봐야 한다.
WHERE 절은 SELECT, UPDATE, DELETE 등 여러 DML 문장에서 사용되어 특정 조건을 처리하는 필터 역할을 수행한다. 그리고 조인에 사용되는 조건들 역시 WHERE 절에 기술한다. SQL 문장을 얼마나 잘 작성하느냐의 척도는 WHERE 절을 얼마만큼 잘 사용하느냐에 달려 있다.
IN
BETWEEN ..AND 조건과는 다르게 여러 개의 값을 동시에 비교해야 할 경우에는 IN 을 사용한다.
IN연산자는 OR 연산자와 동일한 기능을 수행하며 비교할 값들이 많을때 IN 을 사용하면 문장이 짧아진다.
부서 ID가 30 OR 60 OR 90 인 사원들만 구하겠다 할때 사용할 수 있다.
EXISTS
IN과 비슷한 용도로 EXISTS 조건이 있다 어떤 값에 포함되는지 여부를 체크하는 것이 IN 이라면 EXISTS는 특정 컬럼값이 존재하는지 여부를 체크한다. IN은 괄호 안에 비교할 값이 올 수도 있고 서브쿼리가 올 수도 있는 반면에 EXISTS는 오직 서브쿼리만 올 수 있다.
테이블 부서ID가 30, 60, 90인 사원을 구하고 싶을때 EXISTS를 사용했다.
결과는 IN을 사용했을때와 동일하면서 SQL 문장은 더 길어졌다 왜 사용할까?
EXISTS는 IN보다 탁월한 성능을 발휘한다 그만큼 쿼리결과가 빨리나온다. 문장은 길어졌지만 오라클 SQL 엔진 입장에서는 EXISTS가 더빨리 처리 되는 것이다. 이것에 대해서는 SQL튜닝과 관련된 곳에서 공부를 더 해야 한다.
※ employee, pay 테이블을 기준으로 합니다.
DROP TABLE employee PURGE;
DROP TABLE pay PURGE;
CREATE TABLE employee(
employeeno CHAR(6) NOT NULL, -- IT-001
name VARCHAR(10) NOT NULL, -- 홍길동
tel VARCHAR(14) NOT NULL, -- 1111-1111-1111
part VARCHAR(10) NOT NULL, -- 전산부
job VARCHAR(10) NOT NULL, -- 과장
mgr CHAR(6) NULL, -- 담당 매니저
CONSTRAINT employee_pk_employeeno PRIMARY KEY (employeeno)
);
// CONSTRAINT employee_pk_employeeno 얘는 안 써도 되는데 그냥 제약 조건의 이름을 명시하는거임
// 이 뭔소리냐면 fo...rein? -_- <- 포?린 ? 키를 찾아서 이름 변경해야 할 떄 귀찮으니까
//그냥 얘의 이름을 주는 거임 ㅇㅇ 근데 우리는 로우 라이프라 안써도 됨 ㅇㅇ
CREATE TABLE pay(
payno NUMBER(7) NOT NULL, -- 1~9999999
pay NUMBER(8) NOT NULL, -- 1~99999999
month CHAR(6) NOT NULL, -- 200801~
employeeno CHAR(6) NOT NULL, -- IT-001
CONSTRAINT pay_pk_payno PRIMARY KEY (payno),
CONSTRAINT pay_fk_employeeno
FOREIGN KEY (employeeno) REFERENCES employee(employeeno)
//포린키 (부모) 참조한다 부모테이블(부모테이블의 스타-일)
);
// ^^ ㅎㅎ
업무적으로 연관성이 있는 것: 관계
그중에 하나는 부모 - 하나는 자식
^^ㅎㅎ
우리의친구 급입니다
근데 부모랑 자식에 둘다 pk라는 애가 있음 ㅇㅇ
그러면 자식은 부모를 참조함
응 근데 자식이 뭔지 어떻게 아냐면
Foreign key가 있어서 그럼 ㅇㅇ - 얘 생긴게
//포린키 (부모) 참조한다 부모테이블(부모테이블의 아이들)
이렇게 생김
아 이거 전에 한거 같은데 데이터베이스의 머시기 책 읽으면 기억날듯 ㅇㅇ
집에있음
꺄
CREATE SEQUENCE pay_seq
START WITH 1 --시작번호
INCREMENT BY 1 --증가값
MAXVALUE 9999999 --최대값, NUMBER(7)일경우
CACHE 2 --시쿼스 변경시 자주 update되는 것을 방지하기위한 캐시값
NOCYCLE;
// 노싸이클 : 재사용 아님 :>
2. 기초데이터의 추가
INSERT INTO employee(employeeno, name, tel, part, job)
VALUES('IT-001', '나대표', '02-111-1111', '임원', '대표');
INSERT INTO employee(employeeno, name, tel, part, job,mgr)
VALUES('IT-002', '김과장', '02-222-2222', '개발부', '과장','IT-001');
INSERT INTO employee(employeeno, name, tel, part, job,mgr)
VALUES('IT-003', '박과장', '02-222-2222', '기획부', '과장','IT-001');
INSERT INTO employee(employeeno, name, tel, part, job,mgr)
VALUES('IT-004', '홍길동', '03-333-3333', '개발부', '사원','IT-002');
INSERT INTO employee(employeeno, name, tel, part, job,mgr)
VALUES('IT-005', '홍길순', '03-333-3333', '개발부', '사원','IT-002');
INSERT INTO employee(employeeno, name, tel, part, job,mgr)
VALUES('IT-006', '김길동', '03-333-3333', '기획부', '사원','IT-003');
INSERT INTO employee(employeeno, name, tel, part, job,mgr)
VALUES('IT-007', '박길순', '03-333-3333', '기획부', '사원','IT-003');
SELECT employeeno, name, tel, part, job,mgr FROM employee;
INSERT INTO pay(payno, pay, month, employeeno)
VALUES(pay_seq.nextval, 6000000, '200201', 'IT-001');
INSERT INTO pay(payno, pay, month, employeeno)
VALUES(pay_seq.nextval, 3000000, '200801', 'IT-002');
INSERT INTO pay(payno, pay, month, employeeno)
VALUES(pay_seq.nextval, 3000000, '200801', 'IT-003');
INSERT INTO pay(payno, pay, month, employeeno)
VALUES(pay_seq.nextval, 2300000, '200802', 'IT-004');
INSERT INTO pay(payno, pay, month, employeeno)
VALUES(pay_seq.nextval, 2400000, '200802', 'IT-005');
INSERT INTO pay(payno, pay, month, employeeno)
VALUES(pay_seq.nextval, 2500000, '200802', 'IT-006');
// 넥스트발은 *발이 아닙니다
// 이게 어디다 쓰는 거냐면
// 잘 모르게따
:-D
NEXTVAL : Sequence가 1개 증가된다.
랭 ^^ ㅎㅎ 아오
SELECT payno, pay, month, employeeno FROM pay;
1. Equi JOIN(INNER JOIN)
- 가장 많이 사용하는 조인방법입니다.
- WHERE 조건에서 두개 이상의 테이블에 공통으로 들어가 있는
컬럼의 값이 일치되는 행을 연결하여 생성하는 조인방법입니다.
SELECT e.employeeno, e.name, e.tel, e.part, e.job,
p.payno, p.pay, p.month, p.employeeno
FROM employee e, pay p
//썔랙트의 e랑 p를 선언을 왜 밑에서 해줄까 이쌍하당
//구냥 employee.emloyeeno 해도 됨 ㅇㅇ - 근데 기니까 짱 귀찮음
//그래서 그냥 이렇게 알...알리앙스... (얼라이언스? -_-) - 하면됨
WHERE e.employeeno = p.employeeno;
SELECT e.employeeno, e.name, e.tel, e.part, e.job,
p.payno, p.pay, p.month, p.employeeno
FROM employee e, pay p
WHERE e.employeeno = p.employeeno
AND e.name='홍길동';
//아! 포린키 쓰는 이유 - 부모의 프라이머리키를 가져다가 슴 ㅇㅇ - 이예
2. NOT Equi 조인
- 조인 조건에 특정 범위 내에 있는지를 조사하기 위해서 WHERE절에
조인조건을 = 연산자 이외의 비교연산자를 사용합니다.
- 실습용 salgrade table를 생성합니다.
CREATE TABLE salgrade (
grade CHAR(1) NOT NULL, -- 1,2,3,4,5
losal NUMBER NOT NULL, -- 등급별 최저급여
hisal NUMBER NOT NULL, -- 등급별 최고급여
CONSTRAINT salgrade_pk_grade PRIMARY KEY (grade)
);
INSERT INTO salgrade(grade, losal, hisal)
VALUES('1',1500000,2500000);
INSERT INTO salgrade(grade, losal, hisal)
VALUES('2',2600000,3500000);
INSERT INTO salgrade(grade, losal, hisal)
VALUES('3',3600000,4500000);
INSERT INTO salgrade(grade, losal, hisal)
VALUES('4',4600000,5500000);
INSERT INTO salgrade(grade, losal, hisal)
VALUES('5',5600000,6500000);
- 사원 테이블과 급여 등급테이블을 조인해서 사원의 급여 등급을 지정합니다.
SELECT e.name, p.pay, s.grade
FROM employee e, salgrade s, pay p
WHERE e.employeeno = p.employeeno
AND p.pay >= s.losal AND p.pay <= s.hisal;
또는,
SELECT e.name, p.pay, s.grade
FROM employee e, salgrade s, pay p
WHERE e.employeeno = p.employeeno
AND p.pay BETWEEN s.losal AND s.hisal;
3. SELF JOIN
- 같은 테이블내에 존재하는 사원과 사원매니저를 출력하기 위해서는
SELF JOIN을 이용해야 합니다.
SELECT e.name || '의 담당매니저는' || m.name || '입니다'
FROM employee e, employee m
WHERE e.mgr = m.employeeno ;
//이너조인이면서 셀프조인인것 -_-)
2. LEFT OUTER JOIN (아우터 조인 중 가장 많ㅇ니 씀)
ⓐ 좌측 테이블의 레코드 전부 출력
- 해당하지 않는 PK도 전부 출력
SELECT e.employeeno, e.name, e.tel, e.part, e.job,
p.payno, p.pay, p.month, p.employeeno
FROM employee e, pay p
WHERE e.employeeno = p.employeeno(+);
//요러면 부모한테는 있는데 자식한테는 없는 거도 나옴... -_-)
//부모:11개 가능
//자식: 10개 ok / 12개 x -> 자식이 부모보다 많으면 안됨! :>
ⓑ ANSI 표준 SQL(모든 DBMS 지원)
SELECT e.employeeno, e.name, e.tel, e.part, e.job,
p.payno, p.pay, p.month, p.employeeno
FROM employee e
LEFT OUTER JOIN pay p
ON(e.employeeno = p.employeeno);
- 응용 (SELF Join에서 대표의 결과값이 배제되었지만 outer join을 통해서
대표의 결과값도 출력할 수 있습니다.)
SELECT e.name || '의 담당매니저는' || m.name || '입니다'
FROM employee e, employee m
WHERE e.mgr = m.employeeno(+) ;
4. RIGHT OUTER JOIN(사용 안됨)
- PK 컬럼에 등록되지 않은 값은 FK 컬럼에 등록할 수 없음으로
사용할 수 없음.
ⓐ 오른쪽 테이블의 레코드 전부 출력
- 해당하는 PK만 출력
SELECT e.employeeno, e.name, e.tel, e.part, e.job,
p.payno, p.pay, p.month, p.employeeno
FROM employee e, pay p
WHERE e.employeeno(+) = p.employeeno;
ⓑ ANSI 표준 SQL(모든 DBMS 지원)
SELECT e.employeeno, e.name, e.tel, e.part, e.job,
p.payno, p.pay, p.month, p.employeeno
FROM employee e
RIGHT OUTER JOIN pay p
ON(e.employeeno = p.employeeno);
5. FULL OUTER JOIN
SELECT e.employeeno, e.name, e.tel, e.part, e.job,
p.payno, p.pay, p.month, p.employeeno
FROM employee e
FULL OUTER JOIN pay p
ON(e.employeeno = p.employeeno);
//ㅇㄱㄹㅇ... ㅎㅎ...
// 양쪽 다 -_-)?
아니 조인 아우터 조인부터 멘붕당함 ㅋㅋㅋㅋㅋㅋㅋ
[02] 테이블 3개 이상의 JOIN
1. 테이블 생성
DROP TABLE dev PURGE;
CREATE TABLE dev(
devno NUMBER(7) NOT NULL, -- 일련 번호
lang VARCHAR2(50) NOT NULL, -- 사용 언어
db VARCHAR(50) NOT NULL, -- 사용 DB
employeeno CHAR(6) NOT NULL, -- IT-001
CONSTRAINT dev_pk_devno PRIMARY KEY (devno), -- PK
CONSTRAINT dev_fk_employeeno
FOREIGN KEY (employeeno) REFERENCES employee(employeeno)
);
CREATE SEQUENCE dev_seq
START WITH 1 --시작번호
INCREMENT BY 1 --증가값
MAXVALUE 9999999 --최대값
CACHE 2 --시쿼스 변경시 자주 update되는 것을 방지하기위한 캐시값
NOCYCLE;
INSERT INTO dev(devno, lang, db, employeeno)
VALUES(dev_seq.nextval, 'JAVA, JSP', 'Oracle, MySQL', 'IT-001');
INSERT INTO dev(devno, lang, db, employeeno)
VALUES(dev_seq.nextval, 'JAVA, C++', 'Oracle, MySQL', 'IT-002');
INSERT INTO dev(devno, lang, db, employeeno)
VALUES(dev_seq.nextval, 'JAVA, VC++', 'Oracle, MySQL', 'IT-003');
SELECT devno, lang, db, employeeno FROM dev;
2. 3개 이상의 테이블 JOIN
- Pattern 1
직원 급여 개발정보
employee pay dev
------------ -------------- --------
PK PK PK
employeeno ◁─┐ payno devno
│
│ FK FK
├─▷employeeno ┌─▷ employeeno
│ │
└─────────┘
SELECT e.employeeno, e.name, e.tel, e.part, e.job,
p.payno, p.pay, p.month, p.employeeno,
d.devno, d.lang, d.db, d.employeeno
FROM employee e, pay p, dev d
WHERE (e.employeeno = p.employeeno)
and (e.employeeno = d.employeeno);
- Pattern 2
설문조사 설문조사항목 챠트이미지
research researchItem researchImage
------------ -------------- -------------
PK PK PK
researchnum ◁─┐ researchitemnum◁─┐ researchimageno
│ │
│ FK │ FK
└─▷researchnum └─▷researchitemnum
SELECT r.researchnum, r.content, i.researchitemnum,
i.num, i.content, m.imagefile
FROM research r, researchItem i, researchImage m
WHERE (r.researchnum = i.researchnum) and
(i.researchitemnum = m.researchitemnum);
졸았음
------------------------------------------------------------------------------------
[01] Transaction
- 데이터 파일의 내용에 영향을 미치는 모든 거래
- INSERT, UPDATE, DELETE 쿼리가 사용되는 경우 Transaction
상태가 됩니다.
- 데이터 변형되면 상황에 따라 복구되어야 하는 상태가 필요한 경우
명령어를 이용하여 최초 상태로 데이터를 돌릴 수 있습니다.
- COMMIT WORK(COMMIT): 변경된 데이터 확인후 데이터 영역에 적용
- ROLLBACK WORK(ROLLBACK): 변경된 데이터를 취소하고 원래대로
복구합니다.
//
트랜잭션 ; 하나로 묶은것
CREATE TABLE pay2(
name varchar(10) NOT NULL,
pay number(7) NOT NULL,
tax number(6) DEFAULT 0
);
SELECT * FROM tab;
2. COMMIT
INSERT INTO pay2(name,pay,tax) VALUES('왕눈이', 2000000, 100000);
SELECT * FROM pay2;
COMMIT;
3. ROLLBACK
DELETE FROM pay2 WHERE name='왕눈이';
SELECT * FROM pay2;
-- 삭제된 레코드가 복구 됩니다.
ROLLBACK WORK;
SELECT * FROM pay2;
4. 여러단계의 복구
DELETE FROM pay2 WHERE name='왕눈이';
SELECT * FROM pay2;
-- 아로미 추가
INSERT INTO pay2(name,pay,tax) VALUES('아로미', 2200000, 120000);
SELECT * FROM pay2;
-- 아로미의 급여를 10% 인상합니다.
UPDATE pay2 SET pay=pay * 1.1 WHERE name='아로미';
SELECT * FROM pay2;
-- 아로미의 세금을 11% 인상합니다.
UPDATE pay2 SET tax=tax * 0.11 WHERE name='아로미';
SELECT * FROM pay2;
-- 최초 상태로 돌아갑니다.
ROLLBACK WORK;
SELECT * FROM pay2;
5. SAVEPOINT
- 특정 지점을 ROLLBACK할 수 있는 기능을 제공합니다.
-- 원본 데이터 상태
SAVEPOINT first
INSERT INTO pay2(name,pay,tax) VALUES('아로미', 3000000, 300000);
SELECT * FROM pay2;
UPDATE pay2 SET pay=3500000, tax=350000;
SELECT * FROM pay2;
SAVEPOINT second;
INSERT INTO pay2(name,pay,tax) VALUES('투투', 4000000, 400000);
SELECT * FROM pay2;
-- SAVEPOINT second 지역으로 복구합니다.
ROLLBACK TO SAVEPOINT second;
SELECT * FROM pay2;
ROLLBACK TO SAVEPOINT first;
SELECT * FROM pay2;
6. READ Consistency(읽기 일관성)
- iSQL+ 는 브러우저를 닫으면 COMMIT 됩니다.
- SQL+는 창을 닫으면 ROLLBACK 됩니다.
- SQL+는 exit명령을 내리면 COMMIT됩니다.
따라서 로그아웃시에는 반드시 명시적으로 ROLLBACK, COMMIT명령
사용을 권장 합니다.
USER 1 --- 임시 영역 ---+ +--- COMMIT ----- Data Area
+---+
USER 2 --- 임시 영역 ---+ +--- ROLLBACK
--user1(DBEdit)
SELECT * FROM pay;
INSERT INTO pay(name, pay, tax) VALUES('아로미', 2200000, 110000);
SELECT * FROM pay;
--user2(Toad), 변경된 데이터를 읽을 수 없습니다.
SELECT * FROM pay;
--user1(DBEdit)
COMMIT;
--user2(Toad), COMMIT이 되었음으로 변경된 데이터를 읽을 수 있습니다.
SELECT * FROM pay;
[02] Sequecne
DROP TABLE emp;
CREATE TABLE emp(
num number(5) not null,
name varchar(10) not null,
salary number(7) not null,
department_id number(4) not null
);
CREATE SEQUENCE emp_seq
INCREMENT BY 1
START WITH 1
MAXVALUE 99999
CACHE 20
NOCYCLE;
DROP SEQUENCE emp_seq;
INSERT INTO emp(num,name, salary,department_id)
VALUES(emp_seq.NextVal,'aaa', 1000000, 20);
INSERT INTO emp(num,name, salary,department_id)
VALUES(emp_seq.NextVal,'bbb', 1100000, 20);
INSERT INTO emp(num,name, salary,department_id)
VALUES(emp_seq.NextVal,'ccc', 1200000, 20);
SELECT * FROM emp;
COMMIT;
SELECT sequence_name, min_value, max_value,increment_by,
last_number
FROM user_sequences;
--12-8, 다음 sequence값을 볼 수 있으나 계속적으로 값이
--증가됩니다.
SELECT emp_seq.nextval as seq FROM dual;
--현재 sequence를 봅니다.
SELECT emp_seq.currval FROM dual;
[03] INDEX 생성
--WHERE조건에 나오는 컬럼을 대상으로 합니다.
--PK컬럼은 자동으로 인덱스가 생성됩니다.
--하나의 index는 테이블 용량의 5%~20%까지도 점유할 수 있음으로
--과도한 인덱스 생성을 피해야합니다.
--index가 많아지면 Transaction시간이 길어집니다.
CREATE INDEX emp_num_idx
ON emp(num);
SELECT ic.index_name, ic.column_name,
ic.column_position col_pos, ix.uniqueness
FROM user_indexes ix,user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = 'EMPLOYEES';
함수기반 인덱스
CREATE INDEX emp_name_idx
ON emp(UPPER(name));
------------------------------------------------------------------------------------
이제 오라클 끝남 ㅋㅋㅋㅋㅋ
머리아파서 끝나고 좀 잤습니다... -_-
HTML :>
요새는 4.0하고 5씀 - 4.0이나 4.01이나
아 피곤해 -_-
3:48분 - 6시 30분에 끝나니까 - 3시간 정도 남은 거임ㅇㄴㅁㅇㄴㅁㅇㄴㅁ
새로 javadb에다가 web -> workspace 만듬
ㅇㅇ 이렇게 세팅하면 됨
그담에
WebContent -> 새 폴더 만듬(이름:html) -> 파일 만듬 (test.html)
만들 때 html 파일 생성으로 만들어야함 -_-
하는 법 보고 따라해보기 -_-);;
크롬에서 결과값 보이게 하기
------------------------------------------------------------------------------------
그리고 폭풍 진격으로 2차 넘어감
1. HTML Headings
Headings are defined with the <h1> to <h6> tags.
<h1> defines the most important heading. <h6> defines the least important heading.
응 그냥 h1이 크고 h6이 작단 얘기여
2. HTML Paragraphs
The HTML <p> element defines a paragraph.
브라우저는 문단 앞,뒤에 자동으로 빈줄을 추가한다.
그리고 <hr>은 밑줄 그어주는 태그
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>This paragraph contains a lot of lines in the source code, but
the browser ignores it.</p>
<p>This paragraph contains a lot of spaces in the source code, but
the browser ignores it.</p>
<p>The number of lines in a paragraph depends on the size of the
browser window. If you resize the browser window, the number of lines
in this paragraph will change.</p>
</body>
</html>
요렇게 엔터 들어간것같이 입력해도 <p></p> 안하면 그냥 한 덩어리인것 입니다
으아 오라클을 몇시간만에 조졌더니 혼파망 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body style="background-color: lightgrey">
<h1>This is a heading</h1>
<p>This is a paragraph</p>
</body>
</html>
속성값은 :<-로 해줌 = 말고 :>
>>>> style3.html
- Inline - using a style attribute in HTML elements //지금까지 썼던 것
- Internal - using a <style> element in the HTML <head> section //쓰타일만 따로 빼서 쓸수 있음
- External - using one or more external CSS files //아예 다른 파일에 쓰는것
스타일은 헤드 안에 있음 ㅇㅇ
>>>> External Styling (External CSS)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
h1{
color:blue;
font-family: verdana;
font-size: 300%
}
p{ color:red;
font-family:courier;
font-size:160%}
</style>
</head>
<body>
<h1>제목제목</h1>
<p>내용내용</p>
</body>
</html>
이거는 폰트 모양도 바꿔줌
근뎅 이렇게 짜면 h1 다 저거되고
p 다 저거되니까
아이디 /클래스 속성을 줘서 바꿀 수 있음
>>>> ex01.html
얘의친구는
그러니까 id: #이고 .: 클래스 속성이고
id는 p#p01{ color: blue; font-size: 300%;}
class는 p.error1 { color:red; } 이렇게 선언하고
id는 이렇게 연결하고 <p id = "p01">내용내용2</p>
class 는 이렇게 연결하고 <p class = "error1">내용내용2</p>
ㅇㅇ
------------------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<style>
a:link {
color: #000000;//꺼먼색
background-color: transparent; //기본
text-decoration: none; //밑줄 안그어
}
a:visited {
color: #000000;
background-color: transparent;
text-decoration: none;
}
a:hover {
color: #ff0000;
background-color: transparent;
text-decoration: underline;
}
a:active {
color: #ff0000;
background-color: transparent;
text-decoration: underline;
}
</style>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>You can change the default colors of links</p>
<a href="html_images.asp" target="_blank">HTML Images</a>
</body>
</html>
이제 또 혼파망함
이예~~~~~~~~~~~~~~~~
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>SPECTACULAR MOUNTAINS</h2>
<img src ="" alt ="안보일 때 대신 보여주는 글자" style ="width:304px;height:228px" >
</body>
</html>
src는 그냥
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>SPECTACULAR MOUNTAINS</h2>
<img src ="https://45.media.tumblr.com/e99114292c92b67b79894909d2965bee/tumblr_o1u7ekgA0B1v5dqido1_400.gif" alt ="안보일 때 대신 보여주는 글자" >
</body>
</html>
난 이렇게 했는데
D:\javadb\web\workspace\css_html\WebContent\html
에다가 넣어줘도됨 ㅇㅇ
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
5. 수업
진도:
hw:
6. 할것
뻘건 것을 퍼렇게 고쳐두기
'Programming' 카테고리의 다른 글
160405: 17회차 (3) | 2016.04.05 |
---|---|
160404: 16회차 (4) | 2016.04.04 |
160329: 12회차 (3) | 2016.03.29 |
160328: 11회차 (5) | 2016.03.28 |
160325: 10회차 (0) | 2016.03.25 |