만년달력(요일구하기)


1. 1년 1월 1일부터 전년도 12월 31일까지의 총 날짜수 구함.

var total = (year-1)*365 + ((year-1)/4 - (year-1)/100 + (year-1)/400);



2. 해당년도 1월 1일부터 해당년도 해당월 1일까지의 총 날짜수 구함.

var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

for (var a=0; a<month-1; a++) {

total += m[a];

}


//해당월 1일 때문에 +1

total++;

//올해가 윤년이면서 2월 이상인 경우 +1

if (month>=3 && (year%4==0 && year%100!=0 || year%400==0)) {

total++;

}


3. 해당년도 해당월의 첫 날(1일)의 요일(일, 월, 화, 수, 목, 금, 토) 구함.

var d = ["일", "월", "화", "수", "목", "금", "토"];

var days = total % 7;


var result = document.getElementById("result");

result.innerHTML = d[days] + "요일";



문제) 특정 년, 월, 일 입력시 요일 구하기. 자바스크립트 이용.

실행 예)

년도 [2012 ]  월 [10 ]  일 [8  ]  [결과]


결과 : 월요일


//Script29.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<style type="text/css">

.style01 {

width:80px;

}

</style>

<script type="text/javascript">

function myFunc() {

//입력한 년, 월, 일 값 읽어오기->문자열

var yObj = document.getElementById("year");

var mObj = document.getElementById("month");

var dObj = document.getElementById("day");

//문자열->숫자

var year = parseInt(yObj.value);

var month = parseInt(mObj.value);

var day = parseInt(dObj.value);

//전년도까지의 총 날짜수 계산

//윤년 계산시 나누기 연산이 실수형이라서 최종 결과가 정수형이 되도록 parseInt() 함수 사용.

var total = (year-1)*365 + parseInt((year-1)/4) - parseInt((year-1)/100) + parseInt((year-1)/400);

//해당년도 전월까지의 총 날짜수 계산

var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

for (var a=0; a<month-1; a++) {

total += m[a];

}

//해당년도가 윤년이면서 2월 이상인 경우 +1

if (month>=3 && (year%4==0 && year%100!=0 || year%400==0)) {

total++;

}


//해당월의 특정일까지의 총 날짜수 계산

total += day;


//총 날짜수(정수형)를 7로 나눈 나머지 계산->요일에 대한 순번

var days = total % 7;

//alert(days);

var d = ["일", "월", "화", "수", "목", "금", "토"];

var result = document.getElementById("result");

result.innerHTML = d[days] + "요일";

}

</script>

</head>

<body>

<div>

<h2>만년달력 요일 구하기</h2>

<h3>입력 ---------------</h3>

<form>

년 <input type="text" id="year" class="style01">

월 <input type="text" id="month" class="style01">

일 <input type="text" id="day" class="style01">

<input type="button" value="결과"

onclick="myFunc()">

</form>

<h3>출력 ---------------</h3>

<div id="result"></div>

</div>

</body>

</html>




//Script29.html & daysCalc.js 에서 daysCalc.js

function daysCalc(year, month, day) {

//year, month, day는 정수형 데이터만 가능

//전년도까지의 총 날짜수 계산

//윤년 계산시 나누기 연산이 실수형이라서 최종 결과가 정수형이 되도록 parseInt() 함수 사용.

var total = (year-1)*365 + parseInt((year-1)/4) - parseInt((year-1)/100) + parseInt((year-1)/400);

//해당년도 전월까지의 총 날짜수 계산

var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

for (var a=0; a<month-1; a++) {

total += m[a];

}

//해당년도가 윤년이면서 2월 이상인 경우 +1

if (month>=3 && (year%4==0 && year%100!=0 || year%400==0)) {

total++;

}


//해당월의 특정일까지의 총 날짜수 계산

total += day;


//총 날짜수(정수형)를 7로 나눈 나머지 계산->요일에 대한 순번

var days = total % 7;

return days;

}





//Script29.html & daysCalc.js 에서 Script29.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<style type="text/css">

.style01 {

width:80px;

}

</style>

<script type="text/javascript" src="daysCalc.js"></script>

<script type="text/javascript">

function myFunc() {

//입력한 년, 월, 일 값 읽어오기->문자열

var yObj = document.getElementById("year");

var mObj = document.getElementById("month");

var dObj = document.getElementById("day");

//문자열->숫자

var year = parseInt(yObj.value);

var month = parseInt(mObj.value);

var day = parseInt(dObj.value);

//년, 월, 일 데이터로 요일 계산 함수 호출

var days = daysCalc(year, month, day);

//alert(days);

var d = ["일", "월", "화", "수", "목", "금", "토"];

var result = document.getElementById("result");

result.innerHTML = d[days] + "요일";

}

</script>

</head>

<body>

<div>

<h2>만년달력 요일 구하기</h2>

<h3>입력 ---------------</h3>

<form>

년 <input type="text" id="year" class="style01">

월 <input type="text" id="month" class="style01">

일 <input type="text" id="day" class="style01">

<input type="button" value="결과"

onclick="myFunc()">

</form>

<h3>출력 ---------------</h3>

<div id="result"></div>

</div>

</body>

</html>






문제) 만년달력 출력. 자바스크립트 이용.


//Script30.html & daysCalc.js 에서 daysCalc.js (lastDay() 함수 추가됨)

function daysCalc(year, month, day) {

//year, month, day는 정수형 데이터만 가능

//전년도까지의 총 날짜수 계산

//윤년 계산시 나누기 연산이 실수형이라서 최종 결과가 정수형이 되도록 parseInt() 함수 사용.

var total = (year-1)*365 + parseInt((year-1)/4) - parseInt((year-1)/100) + parseInt((year-1)/400);

//해당년도 전월까지의 총 날짜수 계산

var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

for (var a=0; a<month-1; a++) {

total += m[a];

}

//해당년도가 윤년이면서 2월 이상인 경우 +1

if (month>=3 && (year%4==0 && year%100!=0 || year%400==0)) {

total++;

}


//해당월의 특정일까지의 총 날짜수 계산

total += day;


//총 날짜수(정수형)를 7로 나눈 나머지 계산->요일에 대한 순번

var days = total % 7;

return days;

}


function lastDay(year, month) {

//year, month는 정수형만 가능

var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

var day = m[month-1];

if (month==2 && (year%4==0 && year%100!=0 || year%400==0)) {

day = 29;

}


return day;

}



//Script30.html & daysCalc.js 에서 Script30.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<style type="text/css">

.style01 {

width:80px;

}

td {

padding:2px;

}

</style>

<script type="text/javascript" src="daysCalc.js"></script>

<script type="text/javascript">

function myFunc() {

//입력한 년, 월, 일 값 읽어오기->문자열

var yObj = document.getElementById("year");

var mObj = document.getElementById("month");

var year = parseInt(yObj.value);

var month = parseInt(mObj.value);

//요일 계산 전용 함수 호출

var week = daysCalc(year, month, 1);

//alert(week);

//마지막 날짜 구하는 함수 호출

var lastday = lastDay(year, month);

var str = "";

str += "<table><tbody>";

str += "<tr><th>일</th><th>월</th><th>화</th><th>수</th><th>목</th><th>금</th><th>토</th></tr>";

str += "<tr>";

//해당월 1일의 특정 요일에 해당하는 빈 칸 출력

for (var a=1; a<=week; a++) {

str += "<td></td>";

}

//해당월 1일부터 마지막 날까지 출력

for(var a=1; a<=lastday; a++) {

str += "<td style=\"text-align:center\">"+a+"</td>";

//일주일 단위로 행 변경

if (((a+week)%7)==0) {

str += "</tr><tr>";

}

}

str += "</tr></tbody></table>";

var result = document.getElementById("result");

result.innerHTML = str;

}

</script>

</head>

<body>

<div>

<h2>만년달력 출력</h2>

<h3>입력 ---------------</h3>

<form>

년 <input type="text" id="year" class="style01">

월 <input type="text" id="month" class="style01">

<input type="button" value="결과"

onclick="myFunc()">

</form>

<h3>출력 ---------------</h3>

<div id="result"></div>

</div>

</body>

</html>






문제) 만년달력 출력2. 자바스크립트 이용.


//Script31.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<style type="text/css">

.style01 {

width:80px;

}

td {

padding:2px;

}

</style>

<script type="text/javascript" src="daysCalc.js"></script>

<script type="text/javascript">

function myFunc() {

//입력한 년, 월, 일 값 읽어오기->문자열

var yObj = document.getElementById("year");

var mObj = document.getElementById("month");

var year = parseInt(yObj.options[yObj.selectedIndex].value);

var month = parseInt(mObj.options[mObj.selectedIndex].value);

//요일 계산 전용 함수 호출

var week = daysCalc(year, month, 1);

//alert(week);

//마지막 날짜 구하는 함수 호출

var lastday = lastDay(year, month);

var str = "";

str += "<table><tbody>";

str += "<tr><th>일</th><th>월</th><th>화</th><th>수</th><th>목</th><th>금</th><th>토</th></tr>";

str += "<tr>";

//해당월 1일의 특정 요일에 해당하는 빈 칸 출력

for (var a=1; a<=week; a++) {

str += "<td></td>";

}

//해당월 1일부터 마지막 날까지 출력

for(var a=1; a<=lastday; a++) {

str += "<td style=\"text-align:center\">"+a+"</td>";

//일주일 단위로 행 변경

if (((a+week)%7)==0) {

str += "</tr><tr>";

}

}

str += "</tr></tbody></table>";

var result = document.getElementById("result");

result.innerHTML = str;

}

</script>

</head>

<body>

<div>

<h2>만년달력 출력</h2>

<h3>입력 ---------------</h3>

<form>

년 <select id="year" onchange="myFunc()"><option value="2011">2011년</option><option value="2012">2012년</option><option value="2013">2013년</option></select>

월 <select id="month" onchange="myFunc()"><option value="1">1월</option><option value="2">2월</option><option value="3">3월</option><option value="4">4월</option><option value="5">5월</option><option value="6">6월</option><option value="7">7월</option><option value="8">8월</option><option value="9">9월</option><option value="10">10월</option><option value="11">11월</option><option value="12">12월</option></select>

</form>

<h3>출력 ---------------</h3>

<div id="result"></div>

</div>

</body>

</html>







난수 발생


1. 0 부터 1 사이의 무작위 숫자를 난수라고 함.


2. Math.random() 메소드 이용.



//Script32.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">

function myFunc() {

var str ="";

for (var a=1; a<=10; a++) {

//1~100 사이의 난수

str += (parseInt(Math.random()*100)+1) + " ";  

}

var result = document.getElementById("result");

result.innerHTML = str;

}

</script>

</head>

<body>

<div>

<h2>난수 발생 테스트</h2>

<form>

<input type="button" value="결과"

onclick="myFunc()">

</form>

<h3>출력 ------------</h3>

<div id="result"></div>

</div>

</body>

</html>






문제) 여러개의 난수를 발생시키고, 난수들 중에서 가장 큰 값과 가장 작은 값을 별도 출력. 

중복되지 않은 난수만 허용. 난수 허용 범위는 1~100. 배열 이용. 자바스크립트 이용.


실행 예)

난수 갯수(2~20) [5   ] [결과]


난수 결과 : 55 9 12 6 90 

가장 큰 값 : 90

가장 작은 값 : 6


//Script33.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<style type="text/css">


.style01

{

width: 40px;

}


</style>

<script type="text/javascript">

function myFunc() {

var msg = "난수 결과 : ";

var str = "";

var temp = document.getElementById("data");

var number = parseInt(temp.value);

for (var a=0; a<number ; a++) {

str += (parseInt(Math.random()*100)+1) + " ";

}

var arr = new Array();

arr = str.split(" ");

var max = arr[0];

var min = arr[0];

for (var a=1; a<arr.length; a++) {

if (max < parseInt(arr[a])) {

max = arr[a];

}

if (min > parseInt(arr[a])) {

min = arr[a];

}

}

msg += str + "<br>가장 큰 값 : " + max + "<br>가장 작은 값 : " + min;

var result = document.getElementById("result");

result.innerHTML = msg;

}

</script>

</head>

<body>

<div>

<h2>난수 발생 테스트2</h2>

<form>

난수 갯수(2~20) <input type="text" id="data" class="style01"> <input type="button" value="입력" onclick="myFunc()" >

</form>

<h3>출력-----------------</h3>

<div id="result"></div>

</div>

</body>

</html>






문제) 가위,바위,보 게임. 

1~3 사이의 난수가 발생하면 가위, 바위, 보라고 생각하고 사용자가 내는 가위, 바위, 보와 비교해서 승패 결정.


사용자 선택 [가위] [바위] [ 보 ]


사용자:가위, 컴퓨터:바위

결과 : 컴퓨터 승!


//Script34.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">

//전역변수

var userCount = 0;

var compCount = 0;

function myFunc(user) {

var comp = parseInt(Math.random()*3) + 1;

var msg = "";


if (user == comp) {

msg = "비겼습니다.";

} else if (user%3 == (comp+1)%3) {

msg = "사용자 승!";

userCount++;

} else {

msg = "컴퓨터 승!";

compCount++;

}

var arr = ["가위", "바위", "보"];

var str = "";

str += "사용자:" + arr[user-1] + ", 컴퓨터:" + arr[comp-1] + "<br>";

str += "결과 : "+ msg +"<br>";

str += "사용자승: " + userCount + "회, 컴퓨터승: " + compCount + "회";

var result = document.getElementById("result");

result.innerHTML = str;

}


</script>

</head>

<body>

<div>

<h2>가위, 바위, 보 게임</h2>

<form>

사용자 선택

<input type="button" value="가위" onclick="myFunc(1)">

<input type="button" value="바위" onclick="myFunc(2)">

<input type="button" value=" 보 " onclick="myFunc(3)">

</form>

<h3>출력 -------------------</h3>

<div id="result"></div>

</div>

</body>

</html>






문제) 로또 번호를 원하는 장수 만큼 출력. 자바스크립트 이용.

로또 번호는 1~45 범위의 숫자를 중복되지 않은 상태에서 6개가 되면 1장에 해당.


실행 예)

로또 장수(1~20) [3  ]  [결과]


번호1 :  1 12 13 34 35 36

번호2 : 12 20 25 30 39 45

번호3 :  1  4  9 20 30 42



//Script35.html










라디오(<input type="radio" name="식별자"> 태그) 객체 다루기



실행 예)

 - 사이즈 선택 -

 o 싱글레귤러(1)

 o 파인트(3)

 o 쿼터(5)


   [확인]



//Script36.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">

function myFunc() {

//NodeList(DOM) 자료형 반환됨 -> 컬렉션.

var radios = document.getElementsByName("size");

var result = 0;

for (var a=0; a<radios.length; a++) {

if (radios[a].checked) {

result = parseInt(radios[a].value);

}

}

var str = "";

switch (result) {

case 0 : str = "선택한 항목이 없습니다."; break;

case 1 : str = "선택한 사이즈는 싱글레귤러이며, 1개의 품목을 선택할 수 있습니다."; break;

case 3 : str = "선택한 사이즈는 파인트이며, 3개의 품목을 선택할 수 있습니다."; break;

case 5 : str = "선택한 사이즈는 쿼터이며, 5개의 품목을 선택할 수 있습니다."; break;

}

var result = document.getElementById("result");

result.innerHTML = str;

}


</script>

</head>

<body>

<div>

<h2>라디오 객체 다루기</h2>

<form>

-사이즈 선택- <br>

<input type="radio" name="size" value="1"> 싱글레귤러(1)<br>

<input type="radio" name="size" value="3"> 파인트(3)<br>

<input type="radio" name="size" value="5"> 쿼터(5)<br>

<input type="button" value="확인" onclick="myFunc()">

</form>

<h3>출력 -----------------</h3>

<div id ="result"></div>

</div>

</body>

</html>





라디오(<input type="radio" name="식별자"> 태그) 객체 다루기2



실행 예)

 - 사이즈 선택 -

 o 싱글레귤러(1)

 o 파인트(3)

 o 쿼터(5)



//Script37.html (확인 버튼 없이 라디오 객체에서 직접 클릭 이벤트 처리)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>


<script type="text/javascript">

function myFunc(obj) {

var result = 0;

result = parseInt(obj.value);

var str = "";

switch(result) {

case 1: str="선택한 사이즈는 싱글레귤러(1)입니다."; break;

case 3: str="선택한 사이즈는 파인트(3)입니다."; break;

case 5: str="선택한 사이즈는 쿼터(5)입니다."; break;

}

var result = document.getElementById("result");

result.innerHTML = str;

}

</script>


</head>

<body>

<div>

<h2>라디오 객체 다루기2</h2>

<form>

- 사이즈 선택-<br><br>

<input type="radio" name="size" value="1"

onclick="myFunc(this)"> 싱글레귤러(1)<br>

<input type="radio" name="size" value="3"

onclick="myFunc(this)"> 파인트(3)<br>

<input type="radio" name="size" value="5"

onclick="myFunc(this)"> 쿼터(5)<br><br>

<!-- <input type="button" value="확인"

onclick="myFunc()"> -->

</form>

<h3>출력-----------</h3>

<div id="result"></div>

</div>

</body>

</html>






체크박스(<input type="checkbox"> 태그) 객체 다루기



실행 예)

           - 종류 선택 -

 [v]고스트월드      [v]엄마는 외계인

 [ ]바나나몬스터    [ ]초코라떼크런치

 [ ]뉴욕치즈케익    [ ]슈팅스타

              [확인]




//Script38.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">


function myFunc() {

var names = ["고스트월드", "엄마는 외계인", "바나나몬스터", "초코라떼크런치", "뉴욕치즈케익", "슈팅스타"];

var checkboxes = document.getElementsByName("icecream");

var icecream = new Array();

for (var a=0, b=0; a<checkboxes.length; a++) {

if (checkboxes[a].checked) {

icecream[b] = parseInt(checkboxes[a].value);

b++;

}

}

var str = "";

if (icecream.length == 0) {

str = "선택된 항목이 없습니다.";

} else {

str += "선택한 종류는 <br>";

for (var a=0; a<icecream.length; a++) {

str += (a+1) + ". " + names[icecream[a]-1] + "<br>";

}

str += "입니다.<br>";

}

var result = document.getElementById("result");

result.innerHTML = str;

}


</script>

</head>

<body>

<div>

<h2>체크박스 객체 다루기</h2>

<form>

- 종류 선택 -<br>

<input type="checkbox" name="icecream" value="1">고스트월드<br>

<input type="checkbox" name="icecream" value="2">엄마는 외계인<br>

<input type="checkbox" name="icecream" value="3">바나나몬스터<br>

<input type="checkbox" name="icecream" value="4">초코라떼크런치<br>

<input type="checkbox" name="icecream" value="5">뉴욕치즈케익<br>

<input type="checkbox" name="icecream" value="6">슈팅스타<br>

<input type="button" value="확인" onclick="myFunc()">

</form>

<h3> 출력 ----------------</h3>

<div id="result"></div>

</div>

</body>

</html>










문제) 선택 갯수 제한하기. 자바스크립트 이용.

제약조건

1. 사이즈 선택한 갯수를 초과해서 선택할 수 있다.

2. 제한된 갯수를 넘는 경우 '갯수 초과' 메세지 출력

3. 최종적으로 주문 버튼 클릭시는 주문 내역(사이즈, 종류)출력



실행 예)

          - 사이즈 선택 -

            o 싱글레귤러(1)

            o 파인트(3)

            o 쿼터(5)



           - 종류 선택 -

 [v]고스트월드      [v]엄마는 외계인

 [ ]바나나몬스터    [ ]초코라떼크런치

 [ ]뉴욕치즈케익    [ ]슈팅스타

              [확인]





//Script39.html


WRITTEN BY
빨강꼬마

,

DQL(Data Query Lenguage) - 데이터 질의어, SELECT

-> 

DML (Data Manipulation Language) - 데이터 조작어, INSERT, UPDATE, DELETE


DDL 정의

DCL 컨트롤





INSERT


1. INSERT 문은 테이블에 새 행(row)을 추가하는데 이용하며, single table insert 나 multi table insert를 수행할 수 있다.


single table insert : 오직 하나의 테이블이나 뷰에 오직 하나의 행(row)의 값들을 삽입할 수 있다.

multi table insert : 하나 이상의 테이블로부터 스브쿼리로 얻은 여러 행(row)을 삽입하는 경우이다.


2.

insert into 테이블명 (컬럼명1, 컬럼명2, ...) values (값1, 값2, ...);

-> 컬럼명과 값은 1:1 매칭이 되어야 한다. 자료형, 순서, 갯수.



insert into 테이블 values (값1, 값2, ...);

-> 테이블에 있는 모든 컬럼을 대상으로 값을 입력하는 경우 컬럼명 부분을 생략할 수 있다.








자료형


1. VARCHAR2, NVARCHAR2 : 문자열형. 길이 지정. 최대 4000자.

2. NUMBER : 숫자형(정수, 실수). 길이 지정. 최대 38자리

3. DATE : 날짜형. 날짜, 시간이 저장됨.






NUMBER 자료형 자료 입력 테스트


CREATE TABLE test1 (

col1 number -- 38자리까지 입력가능

,col2 number(3) -- 3자리까지만 입력가능

,col3 number(5, 2) -- 5자리인데, 소수이하 2자리 입력가능. (소수이하 자리 포함해서 5자리)

);


insert into test1 (col1, col2, col3) values (123, 123, 123); -- 123, 123, 123

insert into test1 (col1, col2, col3) values (123.45, 123.45, 123.45); -- 123.45, 123, 123.45

insert into test1 (col1, col2, col3) values (123.456, 123.456, 123.456); -- 123.456, 123, 123.46

insert into test1 (col1, col2, col3) values (1234, 1234, 1234); -- 입력시도하는 정수가 크므로 아예 입력 불가





DATE 자료형 자료 입력 테스트


CREATE TABLE test2 (

col1 date --날짜, 시간 저장

);


insert into test1 (col1) values (SYSDATE); -- 2012-10-25 10:05:30

insert into test1 (col1) values ('20121025'); -- 2012-10-25 00:00:00

insert into test1 (col1) values ('2012-10-25'); -- 2012-10-25 00:00:00

insert into test1 (col1) values ('2012/10/25'); -- 2012-10-25 00:00:00





VARCHAR2, NVARCHAR2 자료형 자료 입력 테스트


CREATE TABLE test3 (

col1 VARCHAR2(1) -- 1글자만 허용.

,col2 VARCHAR2(10) -- 10글자까지 허용. 영어는 1글자, 한글은 한글자당 3글자 차지

,col3 NVARCHAR2(10) -- 10글자까지 허용. 영어, 한글 상관없이 한글자당 1글자 차지

);


insert into test3(col1, col2, col3) values ('A', 'B', 'C'); --A, B, C

SELECT * FROM test3;

insert into test3(col1, col2, col3) values ('TEST', 'TEST', 'TEST'); -- 허용 글자수 오버로 입력 불가.


insert into test3(col2, col3) values ('ORACLEDATA', 'ORACLEDATA'); -- 널, ORACLEDATA, ORACLEDATA

insert into test3(col2, col3) values ('ORACLEDATABASE', 'ORACLEDATABASE'); -- 허용 글자수 오버로 입력 불가.


insert into test3(col2, col3) values ('오라클', '오라클'); -- 널, 오라클, 오라클,

insert into test3(col2, col3) values ('오라클데이터베이스', '오라클데이터베이스'); -- 허용 글자수 오버로 입력 불가.


insert into test3(col3) values ('오라클데이터베이스'); -- 널, 널, 오라클데이터베이스

insert into test3(col2) values ('오라클데'); -- 한글 하나당 3자리 차지하므로 입력 불가.






테이블 객체 관리


1. 새 테이블 생성

create table 테이블명 (

컬럼명 자료형 [제약조건]

,...

);



2. 기존 테이블 구조 확인

desc 테이블명;



3. 기존 테이블 구조 복사해서 새 테이블 생성

create table 새테이블명

as

select 컬럼리스트 from 기존테이블명 where 1=0;



4. 기존 테이블 구조 및 자료 복사해서 새 테이블 생성

create table 새테이블명

as

select 컬럼리스트 from 기존테이블명 [where 조건식]; -- 조건식이있을 경우 조건식에 만족하는 행만 복사



-- insa 테이블 복사해서 test4 테이블 생성. 구조와 자료 전체 복사.

create table test4 as 

select * from insa;



5. 기존 테이블에 새 열(column) 추가

alter table 기존테이블명

add (열이름 자료형, ....);



6. 기존 테이블에 기존 열(column) 자료형 변경

alter table 기존테이블명

modify 열이름 새로운자료형;



7. 기존 테이블에 기존 열(column) 이름 변경

alter table 기존테이블명

rename column 기존열이름 to 새열이름;



8. 기존 테이블에 기존 열(column) 삭제

alter table 기존테이블명

drop column (열이름, ....);


9. 기존 테이블의 이름 변경

rename 기존테이블명 to 새로운테이블명;


10. 기존 테이블 삭제 (휴지통 기능)

drop table 테이블명; -- 휴지통으로 이동한 상태


-- 휴지통에 있는 객체 확인.

select *

from recyclebin;


-- 휴지통에 있는 객체 복원.

flashback table 테이블명 to before drop;


-- 휴지통 비우기

purge recyclebin;


-- 완전 삭제(휴지통을 거치지 않고 바로 삭제)

drop table 테이블명 PURGE;







제약 조건


1. Primary Key(PK), Unique(UK), NOT NULL, Check(CK), Foreign Key(FK)


2. 무결성 유지를 위한 조건 추가. 개체 무결성, 참조 무결성, 도메인 무결성.


3. 제약조건 지정방법

- 컬럼레벨

CREATE TABLE 테이블명 (

컬럼명 자료형 [CONSTRAINT 제약명] 제약조건명  // [] 은 제약조건명이 제약명을 가진 객체로 오라클이 가지고 있게 하여, 추후 수정할때 사용함.

,...

);



- 테이블레벨 (권장)

CREATE TABLE 테이블명 (

컬럼명 자료형 

,...

,CONSTRAINT 제약명 제약조건명 (컬럼지정)

);



4. 제약조건 확인

select * from user_constraints;


-- 특정 테이블에 있는 제약조건 확인 (제약 종류만 확인)

select * from user_constraints 

where table_name = 'TEST7'; -- 테이블명 대문자로 표기



-- 특정 테이블에 있는 제약조건이 지정된 컬럼 정보 확인 (제약조건 걸린 컬럼명만 확인)

select *

from user_cons_columns

where table_name = 'TEST7';



-- 제약종류와 컬럼 정보를 동시에 확인. constraint_name 컬럼을 기준으로 join


select uc.owner, uc.table_name, column_name, constraint_type, uc.constraint_name

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name AND uc.table_name = '테이블명';


****

-> 자주 사용하는 select 쿼리는 view 객체로 등록


create view constraint_check

as

select uc.owner, uc.table_name as table_name, column_name, constraint_type, uc.constraint_name

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name;


-> view 객체를 이용한 제약조건 확인


select * from constraint_check

where table_name ='테이블명';



-- 특정 테이블의 NOT NULL 제약 여부 확인


DESC 테이블명;




-- DEFAULT 제약 확인 

SELECT *

FROM user_tab_columns

where table_name = '테이블명';



-- 제약 확인용 VIEW 객체 수정 (CHECK 제약 확인 추가)


create or replace view constraint_check

as

select uc.owner, uc.table_name as table_name, column_name, constraint_type, uc.constraint_name, uc.search_condition

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name;






◆ Primary Key(PK)

 * 특성

- PK가 지정된 컬럼에는 중복된 데이터 입력 불가.

- 테이블에는 PK를 한번만 지정가능.

- PK가 지정된 컬럼에는 NULL 값을 허용하지 않는다.

- PK가 지정된 컬럼에는 UNIQUE INDEX가 자동 생성된다.

- PK가 지정된 컬럼이 두 개 이상인 경우는 묶어서 하나로 처리해야 한다.

-- 컬럼지정시 컬럼을 다중으로 기재하면 복합키 처리가 됨.


 * 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 

,...

,CONSTRAINT 제약명 PRIMARY KEY (컬럼지정)

);



--PK 지정전

CREATE TABLE test6 (

col1 NUMBER

,col2 VARCHAR2(10)

);


INSERT INTO test6(col1, col2) values (1, 'hong'); -- 1, hong

INSERT INTO test6(col1, col2) values (2, 'kim'); -- 2, kim

INSERT INTO test6(col1, col2) values (2, 'park'); -- 2, park

INSERT INTO test6(col2) values ('choi'); -- NULL, choi

INSERT INTO test6(col1, col2) values (NULL, NULL); -- NULL, NULL



--PK 지정후

CREATE TABLE test7 (

col1 NUMBER

,col2 VARCHAR2(10)

,CONSTRAINT test7_col1_pk PRIMARY KEY (col1)

);


INSERT INTO test7(col1, col2) values (1, 'hong'); -- O

INSERT INTO test7(col1, col2) values (2, 'kim'); -- O

INSERT INTO test7(col1, col2) values (2, 'park'); -- X

INSERT INTO test7(col2) values ('choi'); -- X

INSERT INTO test7(col1, col2) values (NULL, NULL); -- X






◆ Unique(UK)

 * 특성

- UK가 지정된 컬럼에는 중복된 데이터 입력 불가.

- 테이블에 UK를 여러번 지정 가능.

- UK가 지정된 컬럼은 NULL 값을 허용한다.


 * 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 

,...

,CONSTRAINT 제약명 UNIQUE (컬럼지정)

);


-- UK 지정전

CREATE TABLE test8 (

col1 NUMBER -- PK 지정대상

,col2 VARCHAR2(10)

,col3 VARCHAR2(20) -- UK 지정대상

);


INSERT INTO test8 (col1, col2, col3) VALUES (1, 'kim', 'test@nate.com'); - 입력 가능

INSERT INTO test8 (col1, col2, col3) VALUES (2, 'park', 'test@nate.com'); - 입력 가능



--UK 지정 후

CREATE TABLE test9 (

col1 NUMBER

,col2 VARCHAR2(10)

,col3 VARCHAR2(20)

,CONSTRAINT test9_col1_pk PRIMARY KEY (col1)

,CONSTRAINT test9_col2_uk UNIQUE (col2)

);


INSERT INTO test8 (col1, col2, col3) VALUES (1, 'kim', 'test@nate.com'); - 입력 가능

INSERT INTO test8 (col1, col2, col3) VALUES (2, 'park', 'test@nate.com'); - 입력 불가






◆ NOT NULL 키워드


1. 특정 컬럼이 NULL 값이 가지지 못하도록 막는다. PK가 지정된 컬럼은 자동으로 NOT NULL 특성을 가진다.


2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 NOT NULL

,...

);



-- NOT NULL 지정


CREATE TABLE test10 (

col1 VARCHAR2(10) NOT NULL --NULL 허용안함

,col2 VARCHAR2(10) -- NULL 허용

);


INSERT INTO test10 (col1, col2) VALUES ('test', 'test'); --O

INSERT INTO test10 (col1, col2) VALUES (NULL, NULL); --X









◆ DEFAULT 키워드


1. 입력시 미리 약속된 값을 자동 삽입 하는 경우. 단, 명시적으로 값을 입력하는 경우는 무시됨.


2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 DEFAULT 값

,...

);




CREATE TABLE test11 (

col1 NUMBER

,col2 VARCHAR2(10)

,col3 DATE DEFAULT SYSDATE

);


INSERT INTO test11 (col1, col2, col3) values (1, 'hong', '20120101'); -- DEFAULT 값 무시됨

INSERT INTO test11 (col1, col2) values (2, 'kim');

INSERT INTO test11 (col1, col2) values (3, 'park', DEFAULT); -- DEFAULT값 자동 삽입.




-- DEFAULT 제약 확인 

SELECT *

FROM user_tab_columns

where table_name = '테이블명';







 CHECK 


1. 특정 컬럼에 입력되는 데이터에 대한 허용 범위를 지정할 때 사용.


2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료형

,...

,CONSTRAINT 제약명 CHECK (조건식)

);


CREATE TABLE test12 (

col1 VARCHAR2(10)

,col2 NUMBER(3) --점수 입력 컬럼(0~100)

,CONSTRAINT test12_col2_ck CHECK (col2 between 0 and 100)

);



INSERT INTO test12 (col1, col2) values ('hong', 100); --O

INSERT INTO test12 (col1, col2) values ('park', 200); --X



-- 제약 확인용 VIEW 객체 수정 (CHECK 제약 확인 추가)


create or replace view constraint_check

as

select uc.owner, uc.table_name as table_name as table_name, column_name, constraint_type, uc.constraint_name, uc.search_condition

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name;



-- NOT NULL 지정을 CHECK 제약으로 하는 방법


CREATE TABLE test13 (

col1 VARCHAR2(10) --NULL 허용안함

,col2 VARCHAR2(10) -- NULL 허용

,CONSTRAINT test13_col1_NN CHECK (col1 IS NOT NULL)

);


INSERT INTO test10 (col1, col2) VALUES ('test', 'test'); --O

INSERT INTO test10 (col1, col2) VALUES (NULL, NULL); --X







 FOREIGN KEY


1. 관계 설정시 사용하는 제약.

- FK가 지정된 컬럼에는 자료 입력이 참조를 하고 있는 PK 또는 UK 컬럼의 값들로 제한된다.

- FK가 지정된 컬럼에 자료입력하려면 먼저 PK 또는 UK컬럼에 해당 자료가 존재해야 한다.

- FK가 지정되고 나면 참조 당하는 PK 또는 UK 컬럼의 테이블 또는 자료는 삭제가 안된다.



2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료명

,...

,CONSTRAINT 제약명 FOREIGN KEY (컬럼지정)

REFERENCES 참조테이블명(참조컬럼지정)

);


-- PK 제약 지정된 테이블

CREATE TABLE test14 (

col1 NUMBER -- PK

,col2 VARCHAR2(10)

,CONSTRAINT test14_col1_PK PRIMARY KEY (col1)

);


-- FK 제약 지정된 테이블

CREATE TABLE test15 (

col3 NUMBER -- PK

,col4 VARCHAR2(10)

,col1 NUMBER -- FK

,CONSTRAINT test15_col3_PK PRIMARY KEY (col3)

,CONSTRAINT test15_col1_FK FOREIGN KEY (col1) REFERENCES test14 (col1)

);



-- PK 자료 입력

INSERT INTO test14 (col1, col2) values (1, 'kim');

INSERT INTO test14 (col1, col2) values (2, 'park');

INSERT INTO test14 (col1, col2) values (3, 'hong');


-- FK 자료 입력

insert into test15 (col3, con4, col1) values (1, 'kim', 1);

insert into test15 (col3, con4, col1) values (2, 'park', 3);

insert into test15 (col3, con4, col1) values (3, 'hong', 4);



-- PK 자료 삭제 테스트

delete from test14

where col1 = 1;  --X



delete fron test14

where col1 = 3; --O








제약 조건 관리


1. 테이블 생성 후 제약 조건 추가

ALTER TABLE 테이블명

ADD (CONSTRAINT 제약명 제약조건 (컬럼지정)

, ...);


2. 제약 조건 삭제

ALTER TABLE 테이블명

DROP CONSTRAINT 제약명;


3. 제약 조건 확인

SELECT uc.owner                         --소유자

, uc.constraint_name            --제약명

, uc.table_name AS table_name   --테이블명

, uc.constraint_type            --제약조건 종류(P, R, U, C)

, uc.search_condition           --CHECK 제약 조건식

, ucc.column_name               --지정된 컬럼

, (SELECT table_name 

FROM user_constraints 

WHERE constraint_name=uc.r_constraint_name) 

AS r_table_name --참조하는 테이블

, (SELECT column_name 

FROM user_constraints 

WHERE constraint_name=uc.r_constraint_name) 

AS r_conlumn_name --참조하는 컬럼

FROM user_constraints uc, user_cons_columns ucc

WHERE uc.constraint_name = ucc.constraint_name


4. NOT NULL, DEFAULT 지정은 별도 확인

--NOT NULL 확인

DESC 테이블명;


--DEFAULT 확인

SELECT *

FROM user_tab_columns

WHERE table_name='테이블명';







문제) emp, city, buseo, jikwi 테이블에서 제약 조건 추가할 것.

아래 형태의 테이블 생성이 된 후에 제약 조건 추가 명령을 내린다고 가정함.


--city 테이블 생성

CREATE TABLE city (

city_id NUMBER --PK

, city VARCHAR2(10) --CK. 서울,충남,인천,부산,제주,전북,강원,경북,전남,경기 한정

);


--buseo 테이블 생성

CREATE TABLE buseo (

buseo_id NUMBER --PK

, buseo VARCHAR2(15) --CK. 총무부,개발부,영업부,기획부,인사부,자재부,홍보부 한정

);


--jikwi 테이블 생성

CREATE TABLE jikwi (

jikwi_id NUMBER --PK

, jikwi VARCHAR2(15) --CK. 과장,대리,부장,사원,사장,이사 한정

);


--emp 테이블 생성

CREATE TABLE emp (

num NUMBER --PK

, name VARCHAR2(20) -- NOT NULL

, ssn  VARCHAR2(14) -- NOT NULL

, ibsaDate DATE

, city_id NUMBER --FK

, tel   VARCHAR2(15)

, buseo_id NUMBER --FK

, jikwi_id NUMBER --FK

, basicPay NUMBER(10) --CK. 0 이상

, sudang NUMBER(10) --CK. 0 이상

);



WRITTEN BY
빨강꼬마

,