<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>TMI1</title>
    <link>https://aluck.tistory.com/</link>
    <description>매일을 새롭게 다시 시작하는 마음으로, 꾸준히 해내자.
</description>
    <language>ko</language>
    <pubDate>Sun, 12 Apr 2026 20:55:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>TMI1</managingEditor>
    <item>
      <title>HTML 태그 관련 테스트</title>
      <link>https://aluck.tistory.com/253</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvsY10/btsPHIWlDJP/ZQrytpkZkFdxKqV3fog7L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvsY10/btsPHIWlDJP/ZQrytpkZkFdxKqV3fog7L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvsY10/btsPHIWlDJP/ZQrytpkZkFdxKqV3fog7L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvsY10%2FbtsPHIWlDJP%2FZQrytpkZkFdxKqV3fog7L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;117&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754374237248&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Test023.html&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div&amp;gt;
	&amp;lt;h1&amp;gt;드롭다운메뉴(selectbox) 만들기&amp;lt;/h1&amp;gt;
	&amp;lt;hr&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;
	&amp;lt;form&amp;gt;
		&amp;lt;p&amp;gt; 당신이 가장 좋아하는 스포츠는?&amp;lt;/p&amp;gt;
		&amp;lt;select name=&quot;selectSport&quot;&amp;gt;
			&amp;lt;option&amp;gt;-- 선택하세요 --&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;val1&quot;&amp;gt;야구&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;val2&quot;&amp;gt;축구&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;val3&quot;&amp;gt;배구&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;val4&quot;&amp;gt;농구&amp;lt;/option&amp;gt;
		&amp;lt;/select&amp;gt;
		&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
		
		&amp;lt;p&amp;gt;당신의 직책은?&amp;lt;/p&amp;gt;
		&amp;lt;select name=&quot;selectJikwi&quot;&amp;gt;
			&amp;lt;option value=&quot;code1&quot;&amp;gt;회장&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;code2&quot;&amp;gt;사장&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;code3&quot;&amp;gt;이사&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;code4&quot;&amp;gt;부장&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;code5&quot;&amp;gt;과장&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;code6&quot;&amp;gt;대리&amp;lt;/option&amp;gt;
			&amp;lt;!-- 사원이 선택되어 진 채로 페이지가 랜더링됨   --&amp;gt;
			&amp;lt;option value=&quot;code7&quot; selected=&quot;selected&quot;&amp;gt;사원&amp;lt;/option&amp;gt;
		&amp;lt;/select&amp;gt;
		&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
		
		&amp;lt;p&amp;gt;가을에 단풍구경 가고 싶은 곳은? (다중 선택 가능)&amp;lt;/p&amp;gt;
		&amp;lt;select name=&quot;trav&quot; multiple=&quot;multiple&quot; size=&quot;5&quot;&amp;gt;
			&amp;lt;option value=&quot;mt1&quot;&amp;gt;백두산&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;mt2&quot;&amp;gt;한라산&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;mt3&quot;&amp;gt;지리산&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;mt4&quot;&amp;gt;설악산&amp;lt;/option&amp;gt;
			&amp;lt;option value=&quot;mt5&quot;&amp;gt;속리산&amp;lt;/option&amp;gt;
		&amp;lt;/select&amp;gt;
		&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
		
		&amp;lt;button type=&quot;button&quot;&amp;gt;서버로 전송&amp;lt;/button&amp;gt;
		&amp;lt;button type=&quot;reset&quot;&amp;gt;취소&amp;lt;/button&amp;gt;
		&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/WEB</category>
      <category>CSS</category>
      <category>html</category>
      <category>html5</category>
      <category>javascript</category>
      <category>url</category>
      <category>w3c</category>
      <category>web</category>
      <category>웹표준</category>
      <category>프론트엔드</category>
      <category>플랫폼</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/253</guid>
      <comments>https://aluck.tistory.com/253#entry253comment</comments>
      <pubDate>Tue, 5 Aug 2025 15:10:40 +0900</pubDate>
    </item>
    <item>
      <title>HTML 태그 관련 테스트</title>
      <link>https://aluck.tistory.com/252</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3csvh/btsPIYKQ3FF/TTPOJtMxU6c4GcFlPafEFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3csvh/btsPIYKQ3FF/TTPOJtMxU6c4GcFlPafEFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3csvh/btsPIYKQ3FF/TTPOJtMxU6c4GcFlPafEFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3csvh%2FbtsPIYKQ3FF%2FTTPOJtMxU6c4GcFlPafEFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;120&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754374137215&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Test020.html&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

	&amp;lt;div&amp;gt;
		&amp;lt;h1&amp;gt;라디오 버튼 만들기&amp;lt;/h1&amp;gt;
		&amp;lt;hr&amp;gt;
	&amp;lt;/div&amp;gt;

	&amp;lt;div&amp;gt;
		&amp;lt;!-- &amp;lt;name=&quot;gender&quot;인 애를 찾아서 value(서버에서 실제로 수신하는 것 값)을 확인하는 절차..&amp;gt; --&amp;gt;
		
		&amp;lt;form&amp;gt;
			&amp;lt;p&amp;gt;1. 당신의 성별은?&amp;lt;/p&amp;gt;
			&amp;lt;label&amp;gt; &amp;lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;female&quot; id=&quot;f&quot; checked=&quot;checked&quot;&amp;gt; 여성
			&amp;lt;/label&amp;gt; &amp;lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;male&quot; id=&quot;m&quot;&amp;gt; 남성 &amp;lt;br&amp;gt;
			&amp;lt;br&amp;gt;

			&amp;lt;p&amp;gt;2. 당신이 좋아하는 과목은?&amp;lt;/p&amp;gt;
			&amp;lt;label&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;input type=&quot;radio&quot; name=&quot;subject&quot; value=&quot;kor&quot;&amp;gt; 국어 &amp;lt;/label&amp;gt;
			&amp;lt;label&amp;gt;&amp;lt;input type=&quot;radio&quot; name=&quot;subject&quot; value=&quot;eng&quot;&amp;gt; 영어 &amp;lt;/label&amp;gt; 
			&amp;lt;label&amp;gt;&amp;lt;input type=&quot;radio&quot; name=&quot;subject&quot; value=&quot;mat&quot; checked=&quot;checked&quot;&amp;gt; 수학  &amp;lt;/label&amp;gt;
			&amp;lt;label&amp;gt;&amp;lt;input type=&quot;radio&quot; name=&quot;sbuject&quot; value=&quot;soc&quot;&amp;gt; 사회  &amp;lt;/label&amp;gt;
			&amp;lt;label&amp;gt;&amp;lt;input type=&quot;radio&quot; name=&quot;subject&quot; value=&quot;sic&quot;&amp;gt; 과학  &amp;lt;/label&amp;gt;
			&amp;lt;label&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;서버로 전송&quot;&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1754374115624&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Test019.html&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div&amp;gt;
	&amp;lt;h1&amp;gt;체크박스 만들기&amp;lt;/h1&amp;gt;
	&amp;lt;hr&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;
	&amp;lt;form&amp;gt;
		&amp;lt;p&amp;gt; 오늘 점심으로 먹고싶은 메뉴는?&amp;lt;/p&amp;gt;
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot; value=&quot;1&quot; id=&quot;rice&quot;&amp;gt; 
		&amp;lt;label for=&quot;rice&quot;&amp;gt;쌀밥&amp;lt;/label&amp;gt;
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot; value=&quot;2&quot;&amp;gt; 보리밥
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot; value=&quot;3&quot;&amp;gt; 잡곡밥
		&amp;lt;br&amp;gt;
		
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot;&amp;gt; 김치찌개
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot;&amp;gt; 순두부찌개
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot;&amp;gt; 청국장
		&amp;lt;br&amp;gt;
		
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot;&amp;gt; 달걀말이
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot;&amp;gt; 멸치볶음
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot;&amp;gt; 감자조림
		&amp;lt;br&amp;gt;
		
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot;&amp;gt; 배추김치
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot;&amp;gt; 열무김치
		&amp;lt;label&amp;gt; 
		&amp;lt;input type=&quot;checkbox&quot; name=&quot;foodchk01&quot;&amp;gt; 갓김치
		&amp;lt;/label&amp;gt;
		&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
		&amp;lt;input type=&quot;button&quot; value=&quot;확인&quot;&amp;gt; 
		
	&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/WEB</category>
      <category>CSS</category>
      <category>html</category>
      <category>html5</category>
      <category>javascript</category>
      <category>url</category>
      <category>w3c</category>
      <category>web</category>
      <category>웹표준</category>
      <category>프론트엔드</category>
      <category>플랫폼</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/252</guid>
      <comments>https://aluck.tistory.com/252#entry252comment</comments>
      <pubDate>Tue, 5 Aug 2025 15:09:19 +0900</pubDate>
    </item>
    <item>
      <title>HTML 태그 관련 테스트</title>
      <link>https://aluck.tistory.com/251</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qBSPz/btsPJiigSn3/gSPQqDI83cBWVGaxg3cpJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qBSPz/btsPJiigSn3/gSPQqDI83cBWVGaxg3cpJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qBSPz/btsPJiigSn3/gSPQqDI83cBWVGaxg3cpJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqBSPz%2FbtsPJiigSn3%2FgSPQqDI83cBWVGaxg3cpJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;276&quot; height=&quot;126&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754373956745&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Test016.html&amp;lt;/title&amp;gt;

&amp;lt;meta name=&quot;keywords&quot; content=&quot;html 연습, 웹, 예제, 태그, 속성&quot;&amp;gt;
&amp;lt;meta name=&quot;description&quot; content=&quot;html 연습하는 페이지임&quot;&amp;gt;
&amp;lt;meta name=&quot;author&quot; content=&quot;mj&quot;&amp;gt;
&amp;lt;meta name=&quot;generator&quot; content=&quot;eclipse&quot;&amp;gt;

&amp;lt;meta http-equiv=&quot;refresh&quot; content=&quot;5; url=http://www.daum.net&quot;&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div&amp;gt;
	&amp;lt;h1&amp;gt;메타 태그 관찰 및 실습&amp;lt;/h1&amp;gt;
	&amp;lt;hr&amp;gt;
	&amp;lt;/div&amp;gt;
	
	&amp;lt;div&amp;gt;
	&amp;lt;h2&amp;gt;하나~ 두울~ 세엣~ 네엣~ 짠~ !!!&amp;lt;/h2&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1754373988959&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Test017.html&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

	&amp;lt;div&amp;gt;
		&amp;lt;h1&amp;gt;한 줄 데이터 입력상자/ 암호 입력상자&amp;lt;/h1&amp;gt;
		&amp;lt;hr&amp;gt;
	&amp;lt;/div&amp;gt;

	&amp;lt;form&amp;gt;
		&amp;lt;div&amp;gt;
			회원 아이디 &amp;lt;input type=&quot;text&quot; name=&quot;id&quot; size=&quot;10&quot; maxlength=&quot;5&quot;&amp;gt;&amp;lt;br&amp;gt;
			&amp;lt;br&amp;gt; 패스워드 &amp;lt;input type=&quot;password&quot; name=&quot;pwd&quot; size=&quot;10&quot;
				maxlength=&quot;10&quot;&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;div&amp;gt;
		&amp;lt;form&amp;gt;
			휴대폰 번호 &amp;lt;input type=&quot;text&quot; name=&quot;phone1&quot; size=&quot;5&quot; maxlength=&quot;3&quot;&amp;gt;
			- &amp;lt;input type=&quot;text&quot; name=&quot;phone2&quot; size=&quot;6&quot; maxlength=&quot;4&quot;&amp;gt; -
			&amp;lt;input type=&quot;text&quot; name=&quot;phone2&quot; size=&quot;6&quot; maxlength=&quot;4&quot;&amp;gt;
		&amp;lt;/form&amp;gt;

	&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1754374047894&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Test018.html&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

	&amp;lt;div&amp;gt;
		&amp;lt;h1&amp;gt;여러 줄 데이터 입력 글 상자&amp;lt;/h1&amp;gt;
		&amp;lt;hr&amp;gt;
	&amp;lt;/div&amp;gt;

	&amp;lt;div&amp;gt;
		&amp;lt;form&amp;gt;
        &amp;lt;textarea rows=&quot;10&quot; cols=&quot;50&quot;&amp;gt;많은 내용을 기재할 수 있는 엘리먼트로
태그 사의의 공백 문자를 인식한다.
또한, 엔터키를 통한 개행 처리를 수행한다.&amp;lt;/textarea&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;

	&amp;lt;div&amp;gt;
		&amp;lt;form&amp;gt;
			&amp;lt;input type=&quot;text&quot; value=&quot;입력 내용 확인&quot;&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;br&amp;gt;
	&amp;lt;br&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/WEB</category>
      <category>CSS</category>
      <category>html</category>
      <category>html5</category>
      <category>javascript</category>
      <category>url</category>
      <category>w3c</category>
      <category>web</category>
      <category>웹표준</category>
      <category>플랫폼</category>
      <category>환경설정</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/251</guid>
      <comments>https://aluck.tistory.com/251#entry251comment</comments>
      <pubDate>Tue, 5 Aug 2025 15:07:45 +0900</pubDate>
    </item>
    <item>
      <title>HTML 태그 관련 테스트</title>
      <link>https://aluck.tistory.com/250</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tuFAs/btsPHMYiNS2/emCDyRByJP6mPB11S3bHkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tuFAs/btsPHMYiNS2/emCDyRByJP6mPB11S3bHkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tuFAs/btsPHMYiNS2/emCDyRByJP6mPB11S3bHkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtuFAs%2FbtsPHMYiNS2%2FemCDyRByJP6mPB11S3bHkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;315&quot; height=&quot;144&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754364451285&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Test012.html&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

	&amp;lt;div&amp;gt;
		&amp;lt;h1&amp;gt;테이블(표) 만들기&amp;lt;/h1&amp;gt;
		&amp;lt;h2&amp;gt;테이블에 속성 적용하기&amp;lt;/h2&amp;gt;
		&amp;lt;hr&amp;gt;
	&amp;lt;/div&amp;gt;

	&amp;lt;!-- 실타래형태 div table  --&amp;gt;
	&amp;lt;div&amp;gt;
		&amp;lt;!-- CSS 를 통해 관리해야 할 속성들 --&amp;gt;
		&amp;lt;table border=&quot;2&quot; cellpading=&quot;10&quot; cellspacing=&quot;2&quot;&amp;gt;

			&amp;lt;!-- &amp;lt;tr height=&quot;200&quot;&amp;gt;	
				&amp;lt;td width=&quot;200&quot;&amp;gt;한식&amp;lt;/td&amp;gt;
				&amp;lt;td&amp;gt;중식&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt; --&amp;gt;
			&amp;lt;thead&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;한식&amp;lt;/th&amp;gt;
					&amp;lt;th&amp;gt;중식&amp;lt;/th&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/thead&amp;gt;
			&amp;lt;tbody&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;td&amp;gt;김치찌개&amp;lt;/td&amp;gt;
					&amp;lt;td&amp;gt;짜장면&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;td&amp;gt;된장찌개&amp;lt;/td&amp;gt;
					&amp;lt;td&amp;gt;고추짬뽕&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;td&amp;gt;순두부찌개&amp;lt;/td&amp;gt;
					&amp;lt;td&amp;gt;사천탕수육&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/tbody&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/WEB</category>
      <category>CSS</category>
      <category>html</category>
      <category>html5</category>
      <category>javascript</category>
      <category>url</category>
      <category>w3c</category>
      <category>web</category>
      <category>웹표준</category>
      <category>플랫폼</category>
      <category>환경설정</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/250</guid>
      <comments>https://aluck.tistory.com/250#entry250comment</comments>
      <pubDate>Tue, 5 Aug 2025 12:30:45 +0900</pubDate>
    </item>
    <item>
      <title>HTML 태그 관련 테스트</title>
      <link>https://aluck.tistory.com/249</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z3A6r/btsPD1pny6v/tRkVrGs5ZLgzEiorRAAVm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z3A6r/btsPD1pny6v/tRkVrGs5ZLgzEiorRAAVm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z3A6r/btsPD1pny6v/tRkVrGs5ZLgzEiorRAAVm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ3A6r%2FbtsPD1pny6v%2FtRkVrGs5ZLgzEiorRAAVm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;238&quot; height=&quot;109&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754295471169&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Test008.java&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div&amp;gt;
	&amp;lt;h1&amp;gt; 기타 글꼴 꾸미기 관련 태그&amp;lt;/h1&amp;gt;
	&amp;lt;hr&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;!-- check ~!!! --&amp;gt;
&amp;lt;!-- 쓰지 말아라~!!! --&amp;gt;
&amp;lt;div&amp;gt;
	기본 텍스트 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	&amp;lt;b&amp;gt; 글자를 굵게(진하게) 설정하기&amp;lt;/b&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	&amp;lt;i&amp;gt;이탤릭체(기울여)로  설정하기&amp;lt;/i&amp;gt; 
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	&amp;lt;u&amp;gt;밑줄 긋기로 설정하기&amp;lt;/u&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	&amp;lt;tt&amp;gt;타이프체로 설정하기&amp;lt;/tt&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	&amp;lt;small&amp;gt;현재 글자 크기보다 한 단계 줄이기&amp;lt;/small&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	&amp;lt;big&amp;gt;현재 글자 크기보다 한 단계 키우기&amp;lt;/big&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	&amp;lt;Strong&amp;gt;글자 강조하기&amp;lt;/Strong&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	&amp;lt;!-- 시각적 효과를 담고 있는 태그이므로 쓰면 안됨  --&amp;gt;
	&amp;lt;s&amp;gt;취소선 설정하기&amp;lt;/s&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;BR&amp;gt;
	
	&amp;lt;!-- 	의미를 담고 있는 태그  --&amp;gt;
	&amp;lt;del&amp;gt;취소선 설정하기&amp;lt;/del&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	&amp;lt;em&amp;gt;강조하기, 글자 비스듬히 출력&amp;lt;/em&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	아래 첨자 설정하기&amp;lt;sub&amp;gt;아래첨자&amp;lt;/sub&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	위 첨자 설정하기&amp;lt;sup&amp;gt;위첨자&amp;lt;/sup&amp;gt;
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;
	&amp;lt;h1&amp;gt;pre 태그 / xmp 태그&amp;lt;/h1&amp;gt;
	&amp;lt;hr&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;
	나 보기가 역겨워 가실 때에는
	
	말 없이 고이 보내드리오리다. 
	
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
	&amp;lt;pre&amp;gt;
	
	&amp;lt;font color=&quot;blue&quot;&amp;gt;나 보기가 						역겨워 가실 때에는&amp;lt;/font&amp;gt;
	
	말 없이 고이 보내드리오리다. 
	&amp;lt;/pre&amp;gt;
	
	&amp;lt;xmp&amp;gt;
	
	&amp;lt;font color=&quot;blue&quot;&amp;gt;나 보기가 						역겨워 가실 때에는&amp;lt;/font&amp;gt;
	
	말 없이 고이 보내드리오리다. 
	&amp;lt;/xmp&amp;gt;
	
	&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
	
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/WEB</category>
      <category>CSS</category>
      <category>html</category>
      <category>html5</category>
      <category>javascript</category>
      <category>url</category>
      <category>w3c</category>
      <category>web</category>
      <category>웹표준</category>
      <category>플랫폼</category>
      <category>환경설정</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/249</guid>
      <comments>https://aluck.tistory.com/249#entry249comment</comments>
      <pubDate>Mon, 4 Aug 2025 17:17:53 +0900</pubDate>
    </item>
    <item>
      <title>HTML 태그 관련 테스트</title>
      <link>https://aluck.tistory.com/248</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBt2vM/btsPHiJP0Kc/DH8T1qNMkISRbkMoTkHrh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBt2vM/btsPHiJP0Kc/DH8T1qNMkISRbkMoTkHrh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBt2vM/btsPHiJP0Kc/DH8T1qNMkISRbkMoTkHrh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBt2vM%2FbtsPHiJP0Kc%2FDH8T1qNMkISRbkMoTkHrh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;278&quot; height=&quot;127&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754294600624&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Test006.html&amp;lt;/title&amp;gt;

&amp;lt;style type=&quot;text/css&quot;&amp;gt;
	*		
	{
		font-size: 20pt;
		font-weight : bold;
		font-family : 맑은 고딕;
		color : #334433;	/* RGB 색상표 R red G green B bule  */
	}
&amp;lt;/style&amp;gt;

&amp;lt;script type = &quot;text/javascript&quot;&amp;gt;
	function actionPerformed()
	{
		//alert(&quot;함수 호출 확인~!!!&quot;);
		// test006문서객체/ kor.값 후 변수vKor에 담는다 
		var vKor = document.getElementById(&quot;kor&quot;).value;	//	&quot;90&quot;
		var vEng = document.getElementById(&quot;eng&quot;).value;	//	&quot;80&quot;
		var vMat = document.getElementById(&quot;mat&quot;).value;	//	&quot;70&quot;
			
		var vTot = 0;		// 총점
		var vAvg = 0;		// 평균
		
		vTot = vKor + vEng + vMat;	//	&quot;90&quot; + &quot;80&quot; + &quot;70&quot; &amp;rarr; &quot;908070&quot;
		
		//parseInt()
		// vTot = parseInt(vkor + vEng + vMat);	&amp;lt;x&amp;gt; 908070
		vTot = parseInt(vKor) + parseInt(vEng) + parseInt(vMat);
		
		//vAvg = vTot / 3; // 정수/정수 
		vAvg = Math.round(vTot / 3); 
		
		document.getElementById(&quot;tot&quot;).value = vTot;
		document.getElementById(&quot;avg&quot;).value = vAvg;
		
		
	}
&amp;lt;/script&amp;gt;
	
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;div&amp;gt;
	&amp;lt;h1&amp;gt;데이터 입력 관련 태그&amp;lt;/h1&amp;gt;
	&amp;lt;hr&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;
	&amp;lt;form&amp;gt;
		이름 &amp;lt;input type=&quot;text&quot; id=&quot;name&quot;&amp;gt;&amp;lt;br&amp;gt;  &amp;lt;!-- 구분이 안되서 ID 속성 부여 --&amp;gt;
		국어 &amp;lt;input type=&quot;text&quot; id=&quot;kor&quot;&amp;gt;&amp;lt;br&amp;gt;
		영어 &amp;lt;input type=&quot;text&quot; id=&quot;eng&quot;&amp;gt;&amp;lt;br&amp;gt;
		수학 &amp;lt;input type=&quot;text&quot; id=&quot;mat&quot;&amp;gt;&amp;lt;br&amp;gt;
		&amp;lt;br&amp;gt;
		
		&amp;lt;input type=&quot;button&quot; value=&quot;결과&quot; onclick=&quot;actionPerformed()&quot;&amp;gt; 
		&amp;lt;input type=&quot;reset&quot; value=&quot;취소&quot;&amp;gt;
		&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;
		
		총점&amp;lt;input type id=&quot;tot&quot; &amp;gt;평균&amp;lt;input type id=&quot;avg&quot;&amp;gt;

	&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/WEB</category>
      <category>CSS</category>
      <category>html</category>
      <category>html5</category>
      <category>javascript</category>
      <category>url</category>
      <category>w3c</category>
      <category>web</category>
      <category>웹표준</category>
      <category>플랫폼</category>
      <category>환경설정</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/248</guid>
      <comments>https://aluck.tistory.com/248#entry248comment</comments>
      <pubDate>Mon, 4 Aug 2025 17:03:24 +0900</pubDate>
    </item>
    <item>
      <title>HTML 태그 관련 테스트</title>
      <link>https://aluck.tistory.com/247</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSnWSX/btsPF8t4onu/F5gKnISKaXD02Hav88oHT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSnWSX/btsPF8t4onu/F5gKnISKaXD02Hav88oHT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSnWSX/btsPF8t4onu/F5gKnISKaXD02Hav88oHT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSnWSX%2FbtsPF8t4onu%2FF5gKnISKaXD02Hav88oHT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;188&quot; height=&quot;86&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754290202371&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- 영역 구성 &amp;rarr; 첫 번째 영역  --&amp;gt;
&amp;lt;!-- http://localhost:8090/WebApp01/Test002.html --&amp;gt;
&amp;lt;div&amp;gt;
	&amp;lt;h1&amp;gt;목록 관련 태그&amp;lt;/h1&amp;gt;
	&amp;lt;hr&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;!-- 영역 구성 &amp;rarr; 두 번째 영역 --&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;!-- 순서 있는 목록  --&amp;gt;
&amp;lt;!-- 개행도 되서 나오네  --&amp;gt;
&amp;lt;ol&amp;gt;
	&amp;lt;li&amp;gt; 텍스트 관려 태그&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt; 목록 관련 태그&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt; 다른 여러가지 태그 &amp;lt;/li&amp;gt;
&amp;lt;/ol&amp;gt;

&amp;lt;!--  ※ 관찰 &amp;rarr; 앞에 띄어쓰기나 들여쓰기를 하지 않은 상황
		      &amp;rarr; 순서 있는 목록에서 사용한 li 엘리먼트  --&amp;gt;
&amp;lt;!-- 순서 없는 목록  --&amp;gt;
&amp;lt;ul&amp;gt;
	&amp;lt;li&amp;gt; 텍스트 관려 태그&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt; 목록 관련 태그&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt; 다른 여러가지 태그 &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;!-- ※ 관찰 &amp;rarr; 각 항목들 사이에는 개행 태그(br)를 넣지 않은 상황--&amp;gt; 
&amp;lt;!-- 		 &amp;rarr; 순서 없는 목록에서 사용한 li 엘리먼트  --&amp;gt; 

&amp;lt;!-- 목록 구성 --&amp;gt;
&amp;lt;dl&amp;gt;
	&amp;lt;!-- 소제목 --&amp;gt;
	&amp;lt;dt&amp;gt;HTML 태그의 종류(중간 제목)&amp;lt;/dt&amp;gt;
	
	&amp;lt;!-- 내용 --&amp;gt;
	&amp;lt;DD&amp;gt;텍스트 관려 태그&amp;lt;/DD&amp;gt;
	&amp;lt;dd&amp;gt;목록 관련 태그&amp;lt;/dd&amp;gt;
	&amp;lt;dd&amp;gt;다른 여러가지 태그&amp;lt;/dd&amp;gt;
	
&amp;lt;/dl&amp;gt;

&amp;lt;!-- ※ 관찰 &amp;rarr; 태그만으로 계층 구성 --&amp;gt;

&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Test003.html&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body bgcolor=&quot;blue&quot; text=&quot;green&quot; background=&quot;images/sky.jpg&quot; leftmargin=&quot;50&quot; topmargin=&quot;100&quot;&amp;gt;

&amp;lt;div&amp;gt;
	&amp;lt;h1&amp;gt;body 태그에 관한 속성 관찰하기&amp;lt;/h1&amp;gt;
	&amp;lt;hr&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;
	본문 내용&amp;lt;br&amp;gt;
	각자 배경색과 배경 이미지도 바꾸어 보고 ... &amp;lt;BR&amp;gt;
	본문에서 사용하는 글자 색과 여백도 설정해 보자.&amp;lt;br&amp;gt;
	단, 이와 같은 처리는 CSS 를 활용하는 것이 바람직하다.&amp;lt;br&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/WEB</category>
      <category>CSS</category>
      <category>html</category>
      <category>html5</category>
      <category>javascript</category>
      <category>url</category>
      <category>w3c</category>
      <category>web</category>
      <category>웹표준</category>
      <category>플랫폼</category>
      <category>환경설정</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/247</guid>
      <comments>https://aluck.tistory.com/247#entry247comment</comments>
      <pubDate>Mon, 4 Aug 2025 15:50:05 +0900</pubDate>
    </item>
    <item>
      <title>select  쿼리문 수행</title>
      <link>https://aluck.tistory.com/246</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;JDBC.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcLwf6/btsPHKeyu9c/mEQQ8r5TeVikpeRqMQBmFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcLwf6/btsPHKeyu9c/mEQQ8r5TeVikpeRqMQBmFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcLwf6/btsPHKeyu9c/mEQQ8r5TeVikpeRqMQBmFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcLwf6%2FbtsPHKeyu9c%2FmEQQ8r5TeVikpeRqMQBmFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;273&quot; height=&quot;154&quot; data-filename=&quot;JDBC.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754278041183&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// select  쿼리문 수행
// &amp;rarr; 데이터베이스로부터 질의 결과를 가져와야 하는 경우
// &amp;rarr; executeQuery() 메소드 사용
// &amp;rarr; ResultSet 객체 반환 
// &amp;rarr; (반복문 활용) 

package comm.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.naming.spi.DirStateFactory.Result;
import javax.print.DocFlavor.STRING;

import comm.util.DBConn;

public class Test03
{

	public static void main(String[] args)
	{
		Connection conn = DBConn.getConnection(); 
		
		if (conn != null)
		{
			System.out.println(&quot;&amp;gt;&amp;gt; 데이터베이스 연결 성공~!!! &quot;);
		try
		{
			// 작업 객체 생성
			Statement stmt = conn.createStatement();
			
			// 쿼리문 준비 
			String sql = &quot;SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID&quot;;
			
			// 작업 객체를 활용하여 쿼리문 실행

			// 데이터베이스로부터 질의 결과를 가져와야 하는 경우
			// &amp;rarr; executeQuery() 메소드 사용
			// 즉, executeQuery(&quot;SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID&quot;) 를 사용하면
			// 질의 결과를 ResultSet 타입의 객체로 가져올 수 있다.(ResultSet 카세트 테이프 뽑아내는 것처럼 뽑는 구조 )
			// ResultSet 객체가 질의에 대한 결과물 모두를 수신 완료한 것은 아니다.
			// 단지, 데이터베이스로부터 획득한 질의 결과물에 대한 관리만 수행할 뿐이다.
			// 즉, ResultSet을 얻어냈다고 해서 데이터베이스와의 연결을 끊게 되면
			// ResultSet 객체는 더 이상 질의 결과를 관리할 수 없게 된다. 
			
			ResultSet rs = stmt.executeQuery(sql);
			
			// 연결된 형태의 데이터(레코드)로 결과값이 넘어온다.
			// 레코드들은 ResultSet 객체의 next() 메소드에 의해
			// 다음 레코드로 이동할 수 있다.
			// 모든 레코드를 출력해보기 위해서는 next() 메소드를 가지고
			// 다음으로 ... 또 그다음으로 ... 다시 또 그 다음으로 ... 이동하며 처리해야 한다.
			// 다음 레코드가 존재하면 next() 메소드는 true 를 반환한다. 
			
			while (rs.next()) 
			{
				String sid = rs.getString(&quot;SID&quot;);
				String name = rs.getString(&quot;NAME&quot;);
				String tel = rs.getString(&quot;TEL&quot;);
				String str = String.format(&quot;%3s %8s %16s&quot;, sid, name, tel);
				System.out.println(str);
			} 
			rs.close();
			
			stmt.close(); 
		} catch (Exception e)
			{
			System.out.println(e.toString());
			}
		
		}
		DBConn.close();
		
		System.out.println(&quot;&amp;gt;&amp;gt;데이터베이스 연결 닫힘 ~!!! &quot;);		
		System.out.println(&quot;&amp;gt;&amp;gt; 프로그램 종료됨~!!!\n&quot;);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>API</category>
      <category>Java</category>
      <category>JDBC</category>
      <category>SQL</category>
      <category>thin driver</category>
      <category>데이터베이스</category>
      <category>서버</category>
      <category>오라클</category>
      <category>자바</category>
      <category>함수</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/246</guid>
      <comments>https://aluck.tistory.com/246#entry246comment</comments>
      <pubDate>Mon, 4 Aug 2025 12:28:13 +0900</pubDate>
    </item>
    <item>
      <title>JDBC 프로그램의 작성</title>
      <link>https://aluck.tistory.com/245</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;JDBC.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqJzCv/btsPFjvK6PB/yeqSCmqMup6DUiTnaZLwo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqJzCv/btsPFjvK6PB/yeqSCmqMup6DUiTnaZLwo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqJzCv/btsPFjvK6PB/yeqSCmqMup6DUiTnaZLwo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqJzCv%2FbtsPFjvK6PB%2FyeqSCmqMup6DUiTnaZLwo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;141&quot; data-filename=&quot;JDBC.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754277791695&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 드라이버 객체 생성
   데이터베이스와 연결을 위해 사용할 파일들이 있는지 확인한다.
   여기서는 굳이 객체를 생성하지 않고
   드라이버가 있는지만 확인하더라도 프로그램을 실행하는 데는 지장이 없다.
   
   ※ 드라이버 클래스 찾는 방법
      Class  라는 클래스의 forName() 메소드 사용   
      이 메소드는 매개변수로 받은 이름의 클래스를 찾아주는 역할열 하며(JVM에 로딩)
      해당 클래스를 찾지 못할 경우 ClassNotFoundException 예외를 발생시킨다.

2. 연결 객체 생성
   찾은 드라이버 클래스를 가지고
   설치된 데이터베이스 서버와 연결하는 Connection 객체를 생성한다.
   
    ※ Connection 객체는 DriverManager 클래스의 getConnection() 이라는
       static 메소드로 생성하게 된다.
       예외는 데이터베이스 서버와 연결하는 시점에서 발생하며
       SQLException 예외를 발생시키게 된다.

3. 작업 객체 생성
   연결된 포트를 통해 질의문을 보낼 수 있도록 도와주는 객체를 생성한다.
   자바에서는 크게 세 가지 방법으로 질의를 처리한다.
   
   1) Statement 객체 생성
      정적 질의를 처리할 때 주로 사용
   2) PreparedStatement 객체 생성 -- 재활용느낌 
      동적 질의를 처리할 때 주로 사용
   3) CallblestStatement  객체 생성
      프로시저나 함수를 호출할 수 있도록 처리해주는 객체 
      
4. 생성된 작업 객체가 수행하는 작업
   『executeUpdate()』 or 『executeQuery()』
*/

// 실행 예)
// 번호를 입력하세요(-1 종료) : 2 
// 이름을 입력하세요 : 김지형
// 전화번호를 입력하세요 : 010-2222-2222
// &amp;gt;&amp;gt; 데이터베이스 연결 성공~!!! 
// &amp;gt;&amp;gt; 회원 정보가 입력되었습니다~!!! 

// 번호를 입력하세요(-1 종료) : 3
// 이름을 입력하세요 : 유한수 
// 전화번호를 입력하세요 : 010-3333-3333
// &amp;gt;&amp;gt; 데이터베이스 연결 성공~!!! 
// &amp;gt;&amp;gt; 회원 정보가 입력되었습니다~!!! 

// 번호를 입력하세요(-1 종료) : -1
// &amp;gt;&amp;gt; 데이터베이스 연결 닫힘 ~!!! 
// &amp;gt;&amp;gt; 프로그램 종료됨~!!! 
package com.test;

import java.sql.Connection;
import java.sql.Statement;
import java.util.Scanner;

import com.util.DBConn;

public class Test02
{
	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in);

		// DBConn에 있는 getConnection 호출하면 얘가 반환하는 건 Connection임 
		Connection conn = DBConn.getConnection();
		
		
		
		// 연산처리 
		do { 
			System.out.print(&quot;번호를 입력하세요(-1 종료) : &quot;);
			String sid = sc.next(); // next는 문자열 
			
			// 반복문을 깨뜨리는 조건 구성 
			if(sid.equals(&quot;-1&quot;))
			{
			   break; // -1을 끝내 
			}
			System.out.print(&quot;이름을 입력하세요 : &quot;);
			String name = sc.next();
			System.out.print(&quot;전화번호를 입력하세요 : &quot;);
			String tel = sc.next();
			
			// db 커넥션을 가지고 확인하는 순간 
			if (conn != null) {
				System.out.println(&quot;데이터베이스 연결 성공~!!!&quot;);
				
				try {
					// 작업 객체 생성 - 수레 생성 
				Statement stmt = conn.createStatement(); // 3(작업객체) 4 =1 2(메소드 호출) 반환 
				
				   // 쿼리문 준비
				   //String sql = &quot;INSERT INTO TBL_MEMBER(SID, NAME,TEL) VALUES(1, '최용', '010-1111-1111')&quot;;
				
					String sql = String.format(&quot;INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(%s, '%s', '%s')&quot;
												// VALUES(1, '최용', '010-1111-1111') 모두 문자열이니까 
							, sid, name, tel);

					// &amp;rarr; executeQuery() 메소드 사용

					int result = stmt.executeUpdate(sql);
					
					if (result &amp;gt; 0) {
						System.out.println(&quot;&amp;gt;&amp;gt;회원정보 입력되었습니다.&quot;);
					} 
				} catch (Exception e) {
					System.out.println(e.toString());
			}
		}

		}
		while (true);
		
		DBConn.close();
		System.out.println(&quot;&amp;gt;&amp;gt;데이터베이스 연결 닫힘 ~!!! &quot;);		
		System.out.println(&quot;&amp;gt;&amp;gt; 프로그램 종료됨~!!!\n&quot;);
		sc.close();
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>API</category>
      <category>Java</category>
      <category>JDBC</category>
      <category>SQL</category>
      <category>thin driver</category>
      <category>데이터베이스</category>
      <category>서버</category>
      <category>오라클</category>
      <category>자바</category>
      <category>함수</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/245</guid>
      <comments>https://aluck.tistory.com/245#entry245comment</comments>
      <pubDate>Mon, 4 Aug 2025 12:23:48 +0900</pubDate>
    </item>
    <item>
      <title>싱글톤 패턴을 이용한 데이터베이스 연결 객체 생성</title>
      <link>https://aluck.tistory.com/244</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;JDBC.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KcWBb/btsPFDnaX0d/NEHjJzerPcTLF1v6WhQK5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KcWBb/btsPFDnaX0d/NEHjJzerPcTLF1v6WhQK5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KcWBb/btsPFDnaX0d/NEHjJzerPcTLF1v6WhQK5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKcWBb%2FbtsPFDnaX0d%2FNEHjJzerPcTLF1v6WhQK5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;355&quot; height=&quot;200&quot; data-filename=&quot;JDBC.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754277519182&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*=====================
 	DBConn.java
======================= */ 
// 싱글톤 패턴을 이용한 데이터베이스 연결 객체 생성 전용 클래스 설계
//-- DB 연결 과정이 가장 부하가 크기 때문에
//   한 번 연결된 객체를 계속 하용하는 것이 리소스 낭비를 줄일 수 있다. 

package conn.util;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConn
{
	private static Connection dbConn; 
	
	// 연결 메소드 리턴자료형 Connection 
	public static Connection getConnection()
	{
		if(dbConn == null)
		{				   	
			try
			{
				//ip앞에는 @붙이기 211.238.142.168 &amp;gt;&amp;gt; 자기 pc 아이피
								
				String user = &quot;scott&quot;;
				String pwd = &quot;tiger&quot;; 
				
				Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
								
				dbConn = DriverManager.getConnection(url, user, pwd);
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
		}
		return dbConn;
	}
		// 메소드 정의 &amp;rarr; 오버로딩 &amp;rarr; 연결
    	// getConnection() 메소드 오버로딩 // 전역변수로 접근 가능 
		public static Connection getConnection(String url, String user, String pwd)
		{
			if(dbConn == null)
			{
				try
				{
					Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;);
					dbConn = DriverManager.getConnection(url, user, pwd);
				} catch (Exception e)
				{
					System.out.println(e.toString());
				}
			}
			return dbConn; 
		}
		
		// 연결 종료(해제)
		public static void close()
		{
			// 연결된 상태일 경우에만 해제를 수행 
			if (dbConn != null) 
			{
				try
				{
					
					if(!dbConn.isClosed()
				} catch (Exception e)
				{
					System.out.println(e.toString());
				}
			}
			dbConn = null; // 연결 해제 후 꼭 null로 해줘야 함 // check~!!! 
		}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBConn 연결 테스트&lt;/p&gt;
&lt;pre id=&quot;code_1754277556358&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*=====================
 	Test00.java
======================= */
package conn.test;

import java.sql.Connection;

import conn.util.DBConn; // 서로 다른 패키지에 있으므로 

public class Test00
{
	public static void main(String[] args)
	{
		 Connection conn = DBConn.getConnection();
		 //-- getConnection() 메소드를 통해 연결 수행 
		 
		 if (conn != null)
		 {
			System.out.println(&quot;데이터베이스 연결 성공 ~!!! &quot;);
		 }
		 else {
			System.out.println(&quot;데이터베이스 연결 실패 ~!!! &quot;);
		 }
		 DBConn.close();
		 //-- close() 메소드를 통해 연결 종료 
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>API</category>
      <category>Java</category>
      <category>JDBC</category>
      <category>SQL</category>
      <category>thin driver</category>
      <category>데이터베이스</category>
      <category>서버</category>
      <category>오라클</category>
      <category>자바</category>
      <category>함수</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/244</guid>
      <comments>https://aluck.tistory.com/244#entry244comment</comments>
      <pubDate>Mon, 4 Aug 2025 12:20:35 +0900</pubDate>
    </item>
    <item>
      <title>HTML의 정의</title>
      <link>https://aluck.tistory.com/243</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhUXso/btsPEFsqsjC/WjqLBCkJmiikqAuLXlpQZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhUXso/btsPEFsqsjC/WjqLBCkJmiikqAuLXlpQZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhUXso/btsPEFsqsjC/WjqLBCkJmiikqAuLXlpQZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhUXso%2FbtsPEFsqsjC%2FWjqLBCkJmiikqAuLXlpQZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;361&quot; height=&quot;165&quot; data-filename=&quot;WEB.png&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754276953061&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;■■■ HTML 개요 ■■■
HTML 이란 Hyper Text(링크) Markup Language 의 약어로,
웹 페이지를 기술하기 위한 언어이다.
마크업 언어(Markup Language)는 텍스트에 태그(ex&amp;lt;title&amp;gt;)를 붙여서
텍스트가 문서의 어디에 해당하는지를 기술한 것이다.
기본적으로 시작 태그가 있으면 종료태그가 있는 것이 일반적인 형태이다.
(ex. &amp;lt;title&amp;gt; 문서의 제목 &amp;lt;/title&amp;gt;)

○ HTML 의 변천사(축약)
최초의 HTML 은 팀 버너스 리 라는 CERN(유럽 원자핵 공동 연구소)의
물리학자가 만들었다.
이후 W3C(World Wide Consortium) 이 창립디어
팀 버너스 리의 주도 아래 HTML 에 대한 표준을 관장하고 있다.

- 1989년
HTML 의 시작은 CERN의 팀 버너스 리가 인콰이어를 제안하며 시작되었다.
인콰이어는 CERN의 연구원들이 문서를 이용/공유하기 위한 체계였다.

- 1991년 
비공식적인 CERN의 문서를 보면 1991년 말 팀 버너스 리가 HTML 태그를 대중에 언급했다고 한다.
HTML 기본서에서 제일 먼저 언급되는 HTML 태그가 1991년 처음 공개된 것이다.
이 때 만들어진 태그 중 일부가 HTML5 버전에도 여전히 존재한다.

- 1992년
1992년 7월 HTML DTD*1.0 의 첫 번째 비공식 초안이 나왔으며
11월 HTML DTD 1.1 비공식 초안이 발표되었다.

※ DTD(Document Type Declaration)
DOCTYPE 이라고 불린다. DTD 는 HTML 이나 XML* 문서에서 사용이 허가되는 요소나 속성을 정리한 것.
즉, HTML 이나 XML 문서가 특정 형식 정의를 따르고 있다는 것을
이를 수신하는 웹 브라우저에서 알려주는 것을 말한다.
간단히 말하자면, &quot;이러이러한 형식으로 문서가 작성되었다.&quot; 
라고 선언하는 것이다.

※ XML(eXTensible Markup Language)
W3C 에서 마크업 언어를 만드는 용도에서 권장되는 다목적 마크업 언어.
XML 은 주로 다른 시스템, 특히 인터넷이 연결된 시스템끼리
데이터를 쉽게 주고받을 수 있게 하여 HTML 의 한계를 극복할 목적으로 만들어졌다.

- (중략.. )

- 1999년 ~ 2000년
1999년 12월 HTML 4.01 발표.

- 2001년
2001년 5월 W3C 에서 XHTML 1.1 권고안 발표.
XHTML 1.1 은 모듈 기반의 XHTML.

- 2002년 ~ 2006년
2002년 8월부터 2006년 7월까지 총 8번의 XHTML 2.0 초안을 W3C 에서 발표.
하지만, 하위 호환성 문제와 HTML 5 에 의해 XHTML 2.0은 2009년에 개발 중단.

-2007년~ 2014년
2007년 Web Application 1.0 이 XHTML 2.0을 앞서면서(호환성 문제)
W3C는 Web Application 1.0을 기초로 HTML Working Group 을 출범시키고,
이 표준안의 명칭을 HTML5로 변경.

&amp;rarr;1989년 부터 HTML은 등장 이후
1999년에 4.01, 2014년에 HTML 5 까지 나오게 된다. 

○ HTML 과 웹 브라우저

우리가 보는 웹 페이지는 사실 HTML 문서이다.
텍스트 기반으로 작성된 문서를 웹 브라우저가 시작적으로 향상된 형태로
해석해서 우리에게 보여주게 되는 것이다.
웹 브라우저마다 여러가지 장단점이 있다.
우리나라 같은 경우는 윈도우 운영체제 및 ActiveX로 인해
인터넷 익스플로러를 많이 사용하게 되었지만
HTML5 를 가장 잘 지원하는 브라우저는 크롬이다. (2022년 3월 30일 기준)

※ HTML5 호환 정보 확인
&amp;rarr; http://html5test.com
---------------------------------------------------------------------------------------
○ HTML 5 표준 기술과 API
1. 웹 페이지의 내용은 HTML로 작성한다.				(구조) 뼈대 
2. 웹 페이지의 스타일은 CSS로 작성한다.				(표현) 메이크업
3. 웹 페이지의 상호작용(동작, 행위)은 Javascript 로 작성한다.   (기능) 기능,동작,행위 

※ 구조와 표현과 기능을 분리한다.~!!! check!!!※
----------------------------------------------------------------------------------------
오래전부터 이와 같은 개발 방식을 사용하고는 있지만
HTML 5 부터 웹 표준 기술로 확립되었다.
이와 같이 작업하며 웹 프로그래머와 웹 디자이너라는 업무 영역을 
나눌 수 있기 때문에 효율적인 개발이 가능하다.

※가장 오래 사용되었던 HTML 4.01 에서 HTML 5 로 넘어오면서 바뀐 점은
[https:// ko.wikipedia.org/wiki/HTML5]
문서를 참조해서 확인할 수 있도록 한다.

위의 해당 URL Document(문서)에서 빠진 항목을 보충하자면
- 오프라인으로 웹 애플리케이션 실행 가능
- 드래그 앤 드롭
- 웹 스토리지
- 위치 정보 제공
- 웹 SQL 데이터베이스
- 파일 업로드와 관리 기능 제공
- 웹 소켓 API
등이 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/WEB</category>
      <category>CSS</category>
      <category>html</category>
      <category>html5</category>
      <category>javascript</category>
      <category>url</category>
      <category>w3c</category>
      <category>web</category>
      <category>웹표준</category>
      <category>플랫폼</category>
      <category>환경설정</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/243</guid>
      <comments>https://aluck.tistory.com/243#entry243comment</comments>
      <pubDate>Mon, 4 Aug 2025 12:09:23 +0900</pubDate>
    </item>
    <item>
      <title>작업객체의 의미와 종류</title>
      <link>https://aluck.tistory.com/242</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;JDBC.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AVL0C/btsPGq1XeLQ/zQ1DH6wrs3oFnBHQczOfgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AVL0C/btsPGq1XeLQ/zQ1DH6wrs3oFnBHQczOfgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AVL0C/btsPGq1XeLQ/zQ1DH6wrs3oFnBHQczOfgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAVL0C%2FbtsPGq1XeLQ%2FzQ1DH6wrs3oFnBHQczOfgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;273&quot; height=&quot;154&quot; data-filename=&quot;JDBC.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1754275985640&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;■■■ Statement 종류 및 의미 ■■■ 

○ Statement 의 종류
- Statement
  : 하나의 쿼리를 사용하고나면 더 이상 사용할 수 없다.
- PrepareStatement
  : 하나의 PrepareStatement 로 쿼리를 여러 번 처리할 수 있다.
- CallableStatement
  : 데이터베이스 내의 스토어드 프로시저를 호출할 수 있는 Statement이다. 

○ Statement 의 의미
   자바에서 사용되는 3가지 종류의 스테이트먼트들은
   데이터베이스로 쿼리를 담아서 보내는 그릇 정도로 상상할 수 있다.
   즉, 스테이트먼트에 쿼리를 실어 데이터베이스로 보내면
   데이터베이스에서 처리되는 것이다.
   이 때, 한 번 사용하고 버리는 그릇은 Statement 이며,
   재사용이 가능한 그릇은 PrepareStatement 이다. 
   
■■■ PreparedStatement ■■■ 
1. Statement 의 execute 메소드는
 문자열로 구성된  SQL 구문을 DBMS 로 전달하는 역할을 수행하며,
 내부적으로 SQL  구문을 JDBC 드라이버가 읽어낼 수 있는 형식으로
 전처리(procompile)하게 된다.

이후 드라이버는 DBMS 에 전처리된 요구사항을 전송하게 되는데,
SQL 구문을 매번 전처리 과정을 거쳐서 전송하게 되기 때문에
반복적인 작업에서 속도가 느려질 수 있는 한계를 갖고 있다.

이에 반하여, PreparedStatement는
전처리된 Statement 로 주어진 sql 문을 미리 전처리 과정을 수행한 상태로
보관해 두기 때문에 반복적인 작업을 수행하는데 있어서 매우 유리하다.

Statement 의 하위 객체인 PreparedStatement 는
Statement 의 모든 기능을 상속 받으며
IN 매개변수의 위치에 데이터베이스로 전송되어질 값을 지정하기 위해
필요한 전체 모든 메소드들의 집합을 포함시킨다.

또한 , 세 개의 메소드 『execute()』, 『executeUpdate()』,『 executeQuery()』는
아무런 파라미터도 가지지 않는다.
이러한 메소드들의 Statement 형태(즉,SQL 문 매개변수를 가지는 형태)는
PreparedStatement 객체에서 사용되지 않는다.

2. IN 매개변수 넘겨주기
PreparedStatement 객체를 실행하기 전에
각 [?] 매개변수의 값이 설정되어져 있어야 한다.
이것은 [setXxx()] 메소드를 호출하여 이루어지게 되며
[Xxx]는 매개변수에 대한 적당한 형(Type)이다.
[setXxx()] 메소드의 첫 번째 인자는 설정된 매개변수의 순번이고,
두 번째 인자는 매개변수가 설정될 값이다. 

■■■ CallableStatement ■■■

1. CallableStatement 인터페이스는 모든 DBMS 들에 대한 표준 방법으로 
   저장 프로시저(stored procedure)를 호출하는 방법을 제공하는 인터페이스이며,
   호출은 escape 문법으로 작성된다.

2. 결과 매개변수를 가지는 형태와 결과 매개변수가 없는 형태이며
   OUT 매개변수의 종류인 결과 매개변수는 저장 프로시저에 대한 리턴값이다.
   두 형태 모두 IN 매개변수(입력), OUT 매개변수(출력), INOUT 매개변수(입출력)
   를 위해 사용되는 매개변수의 변수 번호를 가지며
   『?』는 매개변수의 저장 위치로 나타낸다.

3. JDBC 에서 저장 프로시저를 호출하기 위한 문법은 다음과 같으며 『[]』 내의 내용은 선택적이다. 

   IN 매개변수를 반환하는 프로시저 호출
   {call procedure_name[(?, ?, ...)]}	

   OUT 매개변수를 리턴하는 프로시저 호출 / 반환자료형이 존재하는 함수 호출
   {? = call procedure_name[(?, ?, ...)]}

   매개변수가 없는 저장 프로시저 호출
   {call procedure_name}
	
   INOUT 매개변수를 리턴하는 프로시저 호출
   ※ 상황에 따라 상이함. 

4. CallableStatement 객체 생성
   CallableStatement 객체는 
   Connection 의 prepareCall() 메소드에 의해 생성된다.
   예를 들어, 두 개의 인자값을 가지고 있으며 결과 매개변수가 없는
   저장 프로시저 『prcData』를 호출하는 방법은 다음과 같다.

   CallableStatement cstmt = conn.prepareCall(&quot;{call prcData(?, ?)}&quot;);
   // conn : Connection 객체 

   ※ 물음표(『?』) 의 위치가 IN, OUT, INOUT 중 어떤 매개변수인지는
      저장 프로시저 prcData에 의존한다.

5. IN, OUT 매개변수
   CallableStatement 객체로 IN 매개변수를 넘겨주는 것은
   PreparedStatement 로 부터 상속받은 setXxx() 메소드이다.
   에를 들어, setFloat() 메소드는 float 값을 넘겨준다. 

   만약,저장 프로시저가 OUT 매개변수를 리턴한다면
   각 OUT 매개변수의 SQL형(Type)은 CallableStatement 객체를
   실행할 수 있는 상태가 되기 전에 등록되어져야 한다.(사전에 등록)
   이는 몇 몇 DBMS들이 SQL 형(Type)을 필요로하기 때문이며
   이 때, SQL 형(Type)을 등록하는 것은 registerOutParameter() 메소드를 사용하게 된다.
   그리고, SQL 구문이 실행되어진 다음에
   CallableStatement 의 getXxx() 메소드는 매개변수의 값을 검색하며,
   사용되는 정확한 getXxx() 메소드는 그 매개변수를 위해 등록되어진
   SQL에 상응하는 자바 형(Type)이다.
   즉, registerOutParameter() 메소드는 SQL 형을 사용하고,
   getXxx() 메소드는 이것을 자바 타입으로 캐스트(Cast)한다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>API</category>
      <category>Java</category>
      <category>JDBC</category>
      <category>SQL</category>
      <category>thin driver</category>
      <category>데이터베이스</category>
      <category>서버</category>
      <category>오라클</category>
      <category>자바</category>
      <category>함수</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/242</guid>
      <comments>https://aluck.tistory.com/242#entry242comment</comments>
      <pubDate>Mon, 4 Aug 2025 11:53:28 +0900</pubDate>
    </item>
    <item>
      <title>JDBC 개념 및 환경설정</title>
      <link>https://aluck.tistory.com/241</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;JDBC.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4m2l2/btsPF8UMApE/SRs95X6EraeGLZFinjUnn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4m2l2/btsPF8UMApE/SRs95X6EraeGLZFinjUnn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4m2l2/btsPF8UMApE/SRs95X6EraeGLZFinjUnn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4m2l2%2FbtsPF8UMApE%2FSRs95X6EraeGLZFinjUnn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;255&quot; height=&quot;144&quot; data-filename=&quot;JDBC.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1753859021549&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;■■■ JDBC개념 및 환경설정 ■■■
JDBC - EX) 케이블

1. JDBC(Java DataBase Connectivity)는 자바 프로그램이  
DBMS 에 일관된 방식으로 접근할 수 있도록 API 를 제공하는
자바 클래스들의 모임으로 다음과 같은 특징을 갖는다.

1) JDBC 는 함수 호출용 SQL 인터페이스
2) JDBC 는 ANSI SQL-92 표준을 지원
3) JDBC 는 공통된 SQL 인터페이스를 바탕
4) JDBC 는 익히고 사용하기 쉽다.

JDBC 란 데이터베이스에 연결 및 작업을 하기 위한 자바 표준 인터페이스이다.

2. JDBC 구성
1) 응용 프로그램
- 데이터베이스에 연결을 요청
- 데이터베이스에 SQL문을 전송
- SQL 문의 결과를 요청
- 오류가 발생하는 경우에 오류 처리 
- 트랜잭션을 제어
- 연결 종료

2) 드라이버 매니저
- 데이터베이스에 맞는 드라이버를 찾는다.
- JDBC 초기화를 위한 작업을 수행

3) 드라이버
- 데이터베이스에 연결
- 데이터베이스에 SQL 문을 전달
- 응용 프로그램에 검색 결과를 전달
- 필요한 경우에 커서를 조작
- 필요한 경우에 트랜잭션을 시작

4) DBMS
- 데이터가 저장되어 있는 장소

3. Systen Architecture
JDBC API 는 2-tier 와 3-tier 를 모두 지원한다.

tier 란? 
※ 일련의 유사한 객체가 나열된 상태에서의 열 또는 계층을 의미한다.
프로그램의 일부가 여러 객체에 나뉘어 존재할 수 있으며
그 계층 또한 네트워크 상의 서로 다른 컴퓨터에 위치할 수 있다.

1) 2-tier (일반적인 c/s 프로그램 구조)
- 자바 애플릿이나 애플리케이션이 JDBC 를 이용하여 DBMS 에 직접 접근
- 가장 대표적인 C/S 구조 (Client and Server)
- 프로그램이 간단하다는 장점
- 보안, 로드밸런싱, 확장성(오브젝트 재사용) 등의 문제점
-  2-tier 디자인이 적합한 경우
- 애플리케이션이 하나의 데이터베이스만을 사용
- 데이터베이스 엔진이 하나의 CPU에서 동작
- 데이터베이스가 계속 거의 같은 크기로 유지
- 사용자 기반이 같은 크기로 유지
- 요구가 확정되어 변화 가능성이 극히 적거나 없는 경우
- 애플리케이션을 종료한 후에도 최소한의 지속성을 요구하는 경우
 ( * 2-tier : EX) 국수집 할머니 혼자 주문 받고, 국수 말고, 계산하고... 하나로 통합!)

2) 3-tier
- 자바 애플릿이나 애플리케이션이 DBMS 에 직접 접근하는 것이 아니라
   중간에 미들웨어(미들티어)를 거쳐 데이터베이스에 접근
- 데이터베이스와의 연동 부분을 분리시킴으로써
   Presentation Layer 가 데이터베이스 저장 방법에 신경을 쓰지 않아도 된다.
- 클라이언트는 단지 미들 티어를 참조
- 미들티어 서버는 DBMS와 같이 특정한 작업만을 수행하는 최종 서버와
  통신을 하여 겨로가르 얻은 후 이 결과를 클라이언트에 전달
 ( * 3-tier : 한 티어 - 주방장, 한 티어 - 계산, 한 티어 - 서빙 --&amp;gt; 역할이 종업원별로 나뉨!)

2-tier 모델보다 안정적이고 유연하며 보안이 강화 
 - tier-1 : 사용자 인터페이스를 담당하는 클라이언트
 - tier-2 : http, 코바 등을 지원하는 응용 처리 서버
 - tier-3 : DBMS 와 같이 사용자가 최종적으로 원하는 기능을 수행할 서버

※ 보통 3 티어라고 하면
클라이언트 - 애플리케이션 서버- DB 서버의 구조를 말한다.
클라이언트(프론트엔드)에 쿼리문이 있고 없고는 개발에 따라 다른 문제일 뿐이지
3티어냐 2티어냐는 그다지 해당 사항이 없다.
다만, 해킹 위험이나 기타 데이터구조의 노출 위험 등
여러가지 문제로 인해 DB서버에 대한 직접 접근을 막고,
쿼리의 구조를 클라이언트에게 노출되지 않게 하고,
애플리케이션 서버단에서 데이터 처리 등의 일을 하게 되는 것이다.
클라이언트는 주 업무가 애플케이션에서 보내주는 데이터의 처리 및 
보여주기 역할에 집중하게 되는 것이라 하겠다.
다만, 이런 것도 하나의 방법이기 때문에 정답은 없다.
가벼운 클라이언트, 무거운 애플리케이션 서버가 꼭 정답은 아닌 것이다.  

EX) 헬스장 사물함 - 사물함은 헬스장 소유, 비용은 헬스장에서 지불
목욕탕 - 목욕시 파우치 들고 다님.--&amp;gt; 이 두가지 케이스 모두 정답은 아닌것임  

4. JDBC Driver 유형

1) Type 1
   - JDBC-ODBC Driver
     - 특징
     가. 데이터베이스를 연동하기 위해 브릿지 기술을 사용
     나. ODBC API로의 게이트웨이를 제공하여 
	 실제로는 ODBC의 API를 구현함으로써 데이터베이스를 연동 
     다. 브릿지 솔루션은 보통 클라이언트에 소프트웨어가 설치될 것을 요구
     라. JDBC-ODBC 드라이버는 ODBC 드라이버가 풍부하기 때문에
	 거의 대부분 데이터베이스 시스템에서 사용할 수 있으며,
 	 JDBC-ODBC 드라이버를 사용하는 클라이언트에
	 사전에 ODBC 드라이버가 설치되어 있는 경우에 매우 유용하게 사용할 수 있다.
     마. 속도와 관련한 가장 큰 문제
	 JDBC 를 통해 호출된 명령이 다시 ODBC를 통해 나가야 하기 때문에
	 두 개의 브릿지를 거치며, 이로 인해 빠른 속도를 기대하기 어렵다.
         빠른 성능을 요구하는 애플리케이션의 경우에는 Type 1. DBC-ODBC 브짓지는 적당하지 않다. 
     바. JDBC-ODBC 브릿지를 사용하는 시스템에는
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 반드시 해당 데이터베이스에 연결하기 위한 ODBC-Driver 가 설치되어야 하며,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 이 단점은 애플릿에서 JDBC 를 사용하여 프로그래밍 해야 하는 경우 많은 문제가 된다.
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 애플릿을 사용하여 JDBC-ODBC 를 사용할 경우,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 애플릿을 다운 받은 클라이언트에 미리 해당 ODBC-Driver가 설치되어 있어야 하기 때문에
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 배포 등에 많은 문제가 발생하게 된다.

2)&amp;nbsp;Type 2 
     - Native-API / Partly Java Driver(사용 일부 자바)&amp;nbsp;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;가. 각각의 데이터베이스 제조업체들이 제공한 C 혹은 C++ 메소드를 자바 코드가 호출하는 방식
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;나. 부분적으로 자바 드라이버인 원시API 라고 일컬어짐
     다. 데이터베이스와 연결되는 부분이 Native Code 로 구련현되어 있는 만큼 
         JDBC-ODBC 브릿지에 비해 빠른 속도를 제공한다.
     라. JDBC 드라이버를 사용하고자 하는 각각의 클라이언트에 DBMS Vendor 의 데이터베이스 
         라이브러리가 로드되어야 하기 때문에 인터넷이나 CS환경에서는 사용하기 적합하지 않다.
         또한, Type 3, 4 드라이버에 비해 낮은 성능

3)&amp;nbsp;Type 3 
     - Net-Protocol / All-Java Driver(순수 자바)
     ex) Protocol - 통신규약 
     - 클라이언트에서 일반적인 Network API 를 이용해 보낸 정보를 
       서버가 Database 에 독점적 형태로 변환하는 방식
     - 특징 
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;가. 클라이언트에 존재하는 JDBC Driver 는 소켓을 사용하여
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;서버에 존재하는 미들웨어(Middleware) 애플리케이션에 연결
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;나. 애플리케이션은 클라이언트의 요청을 사용하고자 하는 
         데이터베이스에 독점적인 API로 전환
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;다. 하나의 드라이버로 여러 개의 데이터 베이스를 연동
&amp;nbsp; &amp;nbsp; &amp;nbsp;라. 클라이언트에 소프트웨어를 설치할 필요가 없음

4) ※ Type4
     - Native-Protocol / All-Java Driver(순수 자바)
     - Database Engine 에 사용되는 Network Protocal 을 
       Java Socket 으로 직접 Database 에 교신하는 방식 - 속도가 빠름 
     - 특징
  &amp;nbsp;&amp;nbsp;&amp;nbsp;가. 가장 직접적인 순수 자바 솔루션
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;나. 거의 대부분 데이터베이스의 제조업체가 제공한다.
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;다. ODBC 나 Nativelib 형태로 request 를 변환하지 않기 때문에 Performance 가 매우 좋다.
&amp;nbsp; &amp;nbsp; &amp;nbsp;라. 또한, 특별하게 Driver 나 Lib, Middleware 등을 설치할 필요가 없기 때문에 배포 등이 매우 용이하다.

5.Oracle JDBC Driver
1) Type 2
- 오라클 &quot;OCI Driver&quot;로 불리운다.
- OCIx 드라이버 : Oraclex 데이터베이스를 지원하는 구조
     8			8
     9		        9
     :		        :
- 이러한 드라이버는 한정된 플랫폼으로 모든 오라클 드라이버는 JDK 1.0과
  1.1.x 에 종속적이며 JDBC 1.22 표준을 지원한다.
- 또한, Net8을 포함하는 Oracle client를 설치해야 사용이 가능하다. 

2) Type 4 ★
- 오라클&amp;nbsp;&quot;Thin Driver&quot; 라고 불리운다.
- 자바로 작성된 Net8의 TCP/IP 버전의&amp;nbsp;자체적인 실행을 포함하며
플랫폼에 독립적이고 실행 시간에 브라우저로 다운로드 된다.
- 그리고 서버 측에서는&amp;nbsp;TCP/IP Listener 가 필요하며,
연결 스트링은 TNSNAMES 엔트리가 아닌&amp;nbsp;TCP/IP 주소와 포트번호이다.
- 외워야 함 ★★★ 
- URL Format &amp;rarr; jdbc:oracle:thin:@[host]:[port]:[database]
&amp;gt;&amp;gt; host - IP주소 /port - ORACLE 1521/ database - xe(아이디)

6. JDBC API
JDBC API 는 데이터베이스의 데이터를 액세스할 수 있도록 제공되는
표준 자바 API 클래스와 인터페이스로 구성되며, 다음의 기능을 실행하기 위한
클래스와 인터페이스를 제공한다.

- Java 프로그램에서 데이터베이스 서버에 접속하기
- SQL 문을 구성, 데이터베이스 서버에서 실행시키기
- 데이터베이스 서버가 처리한 결과를 가져오기
- 데이터베이스의 정보, 처리 결과에 대한 정보 등을 가져오기&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>API</category>
      <category>Java</category>
      <category>JDBC</category>
      <category>SQL</category>
      <category>thin driver</category>
      <category>데이터베이스</category>
      <category>서버</category>
      <category>오라클</category>
      <category>자바</category>
      <category>함수</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/241</guid>
      <comments>https://aluck.tistory.com/241#entry241comment</comments>
      <pubDate>Mon, 4 Aug 2025 11:46:08 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - PACKAGE 실습</title>
      <link>https://aluck.tistory.com/240</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZpcMu/btsPkrammzc/JaUMWQ7Vmt9rrzxqi21kX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZpcMu/btsPkrammzc/JaUMWQ7Vmt9rrzxqi21kX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZpcMu/btsPkrammzc/JaUMWQ7Vmt9rrzxqi21kX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZpcMu%2FbtsPkrammzc%2FJaUMWQ7Vmt9rrzxqi21kX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;155&quot; height=&quot;155&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752645698406&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--■■■ PACKAGE(패키지) ■■■ --

-- 1. PL/SQL 의 패키지는 관계되는 타입, 프로그램 객체,
--    서브 프로그램을(PROCEDURE, FUNCTION 등)을
--    논리적으로 묶어놓은 것으로 &amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;
--    오라클에서 제공하는 패키지 중 하나가 바로 [DBMS_OUTPUT] 이다.

-- 2. 패키지는 서로 유사한 업무에  사용되는 여러 개의 프로시저와 함수를
--    하나의 패키지로 만들어 관리함으로써 향후 유지보수가 편리하고
--    전체 프로그램을 모듈화 할 수 있는 장점이 있다.

-- 3. 패키지는 명세부(PACKAGE SPECIFICATION)와
--    몸체부(PACKAGE BODY)로 구성되어 있으며
--    명세 부분에는 TYPE, CONSTRAINT, VARIABLE, EXCEPTION, CURSOR, SUBPROGRAM 등이 선언되고
--    몸체 부분에는 이들의 실제 내용이 존재하게 된다. 
--    그리고, 호출할 때에는 『패키지명.프로시저명』 형식의 참조를 이용해야 한다.

-- 4. 형식 및 구조(명세부)
/*
CREATE [OR REPLACE] PACKAGE 패키지명
IS
    전역변수 선언;
    커서 선언;
    예외 선언;
    함수 선언;
    프로시저 선언;
        :
END 패키지명;

-- 4. 형식 및 구조(몸체부) 
/*
CREATE [OR REPLACE] PACKAGE BODY 패키지명
IS
    FUNCTION 함수명[(인수, ...)]
    RETURN 자료형
    IS
        변수 선언;
    BEGIN
        함수 몸체 구성 코드;
        RETURN 값;
    END;
    
    PROCEDURE 프로시저명[(인수, ... )]
    IS
        변수 선언;
    BEGIN
        프로시저 몸체 구성 코드;
    END;
END 패키지명; 
*/

--○ 주민번호 입력 시 성별을 반환하는 함수
--   이 함수를 구성요소로 취하는 패키지 작성 

-- 함수 준비
CREATE OR REPLACE FUNCTION FN_GENDER(V_SSN VARCHAR2)
RETURN VARCHAR2
IS
    V_RESULT    VARCHAR2(20); 
BEGIN
    IF (SUBSTR(V_SSN, 8, 1) IN ('1', '3'))
            THEN V_RESULT := '남자';
        ELSIF (SUBSTR(V_SSN, 8, 1) IN ('2', '4'))
            THEN V_RESULT := '여자';
        ELSE
            V_RESULT := '성별확인불가';
        END IF;
        
        RETURN V_RESULT; 
END;
--==&amp;gt;&amp;gt; Function FN_GENDER이(가) 컴파일되었습니다.

-- 패키지 등록

-- 1. 명세부 작성
CREATE OR REPLACE PACKAGE INSA_PACK
IS
    FUNCTION FN_GENDER(V_SSN VARCHAR2)
    RETURN VARCHAR2;
END INSA_PACK; 
--==&amp;gt; Package INSA_PACK이(가) 컴파일되었습니다.

-- 2. 몸체부 작성 
CREATE OR REPLACE PACKAGE BODY INSA_PACK
IS  
    FUNCTION FN_GENDER(V_SSN VARCHAR2)
    RETURN VARCHAR2
    IS
        V_RESULT    VARCHAR2(20); 
BEGIN
    IF (SUBSTR(V_SSN, 8, 1) IN ('1', '3'))
            THEN V_RESULT := '남자';
        ELSIF (SUBSTR(V_SSN, 8, 1) IN ('2', '4'))
            THEN V_RESULT := '여자';
        ELSE
            V_RESULT := '성별확인불가';
        END IF;
        
        RETURN V_RESULT; 
END ;

END INSA_PACK; 
--==&amp;gt;&amp;gt; Package Body INSA_PACK이(가) 컴파일되었습니다.
-- 2번 시트로 이동&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>commit</category>
      <category>db</category>
      <category>dbms</category>
      <category>insert</category>
      <category>Oracle</category>
      <category>pl/sql</category>
      <category>관계</category>
      <category>관계형데이터베이스</category>
      <category>트리거</category>
      <category>패키지</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/240</guid>
      <comments>https://aluck.tistory.com/240#entry240comment</comments>
      <pubDate>Wed, 16 Jul 2025 15:11:29 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - TRIGGER 실습</title>
      <link>https://aluck.tistory.com/239</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU5ips/btsPj4FEw4u/xbfJPdk3KPm7vtf0HB4t51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU5ips/btsPj4FEw4u/xbfJPdk3KPm7vtf0HB4t51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU5ips/btsPj4FEw4u/xbfJPdk3KPm7vtf0HB4t51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU5ips%2FbtsPj4FEw4u%2FxbfJPdk3KPm7vtf0HB4t51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;147&quot; height=&quot;147&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752631218357&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- ■■■ BEFORE STATEMENT TRIGGER 상황 실습 ■■■ -- 
--※ DML 작업 수행 전에 작업 가능여부 확인
--   (보안 정책 적용 / 업무 규칙 적용)

--○ TRIGGER(트리거) 생성 
--   트리거명 : TRG_TEST_DML
/*
CREATE OR REPLACE TRIGGER TRG_TEST_DML
        BEFORE
        INSERT OR UPDATE OR DELETE ON TBL_TEST      
BEGIN
    IF(시간이 오전 8시 이전이거나.. 오후 6시 이후라면...)
        THEN 해당 작업을 수행하지 못하도록 처리하겠다.
      == THEN RAISE_APPLICATION_ERROR(-20003, '작업은 08:00 ~ 18:00 까지만 가능함.');  
    END IF;
END;
*/

CREATE OR REPLACE TRIGGER TRG_TEST_DML
        BEFORE
        INSERT OR UPDATE OR DELETE ON TBL_TEST      
BEGIN
    -- TO_CHAR(SYSDATE, 'HH24') &amp;lt; 8 -- 문자타입이라 이렇게 비교하면 안됨. 
    IF (TO_NUMBER(TO_CHAR(SYSDATE, 'HH24')) &amp;lt; 9 OR TO_NUMBER(TO_CHAR(SYSDATE, 'HH24')) &amp;gt; 17)
        THEN RAISE_APPLICATION_ERROR(-20003, '작업은 08:00 ~ 18:00 까지만 가능함.'); 
    END IF;
END;
--==&amp;gt;&amp;gt; Trigger TRG_TEST_DML이(가) 컴파일되었습니다.
--17시59분은 되는데 18시 되면 안되는거니까 / 시간 이후조건시 CHECK~!!! 

--■■■ BEFORE ROW TRIGGER 상황 실습 ■■■--
-- ※ 참조 관계가 설정된 데이터(자식) 삭제를 먼저 수행하는 모델
-- ▣(부모 테이블)- 여러개의 선으로 연결 ▤(자식 테이블)
-- EX) (과거 9:45)분에 자식테이블에 행들을 확인해가며 지운 후 DELETE 수행(현재 09:46))

-- 실습 테이블 생성 &amp;rarr; 『20250716_02_scott.sql』 파일 참조(2번파일에서 테이블 생성)
-- 테이블명 : TBL_TEST2 -&amp;gt; 부모 테이블
-- 테이블명 : TBL_TEST3 -&amp;gt; 자식 테이블
-- 
--○트리거(TRIGGER) 생성
--  트리거명 : TRG_TEST2_DELETE 
CREATE OR REPLACE TRIGGER TRG_TEST2_DELETE 
        BEFORE
        DELETE ON TBL_TEST2 -- 부모테이블에 DELETE 작업을 수행할 때 
        FOR EACH ROW    -- 각각의 행에 대해서       
BEGIN 
    DELETE 
    FROM TBL_TEST3
    WHERE CODE = : OLD.CODE; -- WHERE CODE =:제거하기 이전코드 
END;
-- Trigger TRG_TEST2_DELETE이(가) 컴파일되었습니다.

--※ 『:OLD』
--    참조 전 열의 값
--   -(INSERT  : 입력하기 이전 자료 즉, 입력할 자료, DELETE :  삭제하기 이전 자료 즉, 삭제할 자료)

--※ UPDATE -- 개념적으로 DELETE 그리고 INSERT가 결합된 형태로 이해
--             이 과정에서 UPDATE 하기 이전의 자료는 [:OLD]
--             이 과정에서 UPDATE 한 이후의 자료는 [:NEW]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1752637333005&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--■■■ AFTER ROW TRIGGER 상황 실습 ■■■--
--※ 참조 관계의 테이블 관련 트랜잭션 처리 모델 

-- 테이블명 : TBL_입고, TBL_상품, TBL_출고 
-- 자꾸 사용하다보면 경계가 뚜렷해 질 것임... 
-- 프로시저와 트리거의 차이 
-- 프로시저 입고 10 재고 10 출고 10 재고 0 &amp;gt; 출고 5 하려고 하면 너 이거 출고못시켜 하고 예외처리함
-- 트리거는 위의 상황이라면 출고 5하려고 할때 -5를 출력 함. 이후 다시 입고 10개 들어오면 재고 5개 
-- 2번시트로 

--○트리거(TRIGGER) 생성
--  TBL_입고 테이블의 데이터 입력시 (즉, 입고 이벤트 발생 시)
--  TBL_상품 테이블의 재고 수량 변동 트리거 작성 
--  트리거명 : TRG_IBGO
/*
CREATE OR REPLACE TRIGGER TRG_IBGO 
        AFTER
        INSERT ON TBL_입고 
        FOR EACH ROW        
BEGIN 
    IF (INSERTING)
    THEN UPDATE TBL_상품
         SET 재고수량 = 재고수량 + 새로입고되는입고수량 
         WHERE 상품코드 = 새로입고되는상품코드;   
    END IF;
END;
*/

CREATE OR REPLACE TRIGGER TRG_IBGO 
        AFTER
        INSERT ON TBL_입고 -- INSERT INTO TBL_입고(...) VALUES( ... , 'H001'..10.); 
        FOR EACH ROW        
BEGIN 
    IF (INSERTING) -- 트리거가 INSERT 작업에 의해 호출되었는지 판단하는 구문 
    THEN UPDATE TBL_상품
         SET 재고수량 = 재고수량 + :NEW.입고수량 
         WHERE 상품코드 = :NEW.상품코드;   
    END IF;
END;
--==&amp;gt;&amp;gt; Trigger TRG_IBGO이(가) 컴파일되었습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>commit</category>
      <category>db</category>
      <category>dbms</category>
      <category>insert</category>
      <category>Oracle</category>
      <category>pl/sql</category>
      <category>관계</category>
      <category>관계형데이터베이스</category>
      <category>트리거</category>
      <category>패키지</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/239</guid>
      <comments>https://aluck.tistory.com/239#entry239comment</comments>
      <pubDate>Wed, 16 Jul 2025 12:42:23 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 프로시저(4)</title>
      <link>https://aluck.tistory.com/238</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRtW4/btsPj0imPwG/YroXciiidgHuXaxlThKoQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRtW4/btsPj0imPwG/YroXciiidgHuXaxlThKoQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRtW4/btsPj0imPwG/YroXciiidgHuXaxlThKoQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRtW4%2FbtsPj0imPwG%2FYroXciiidgHuXaxlThKoQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;154&quot; height=&quot;154&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752561112560&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 문제 
-- ○ TBL_출고 테이블에 데이터 입력 시(즉, 출고 이벤트 발생 시)
--    TBL_상품 테이블의 해당 상품의 재고수량이 변동될 수 있는 프로시저를 작성한다.
--    단, 출고번호는 입고번호와 마찬가지로 자동증가.
--    또한, 출고수량이 재고수량보다 많은 경우...
--    출고 액션이 처리되지 않도록 구성한다.(출고가 이루어지지 않도록...)
--    프로시저명 : PRC_출고_INSERT(상품코드, 출고수량, 출고단가) 

CREATE OR REPLACE PROCEDURE PRC_출고_INSERT
( V_상품코드    IN TBL_상품.상품코드%TYPE
, V_출고수량    IN TBL_출고.출고수량%TYPE
, V_출고단가    IN TBL_출고.출고단가%TYPE
)
IS
    V_출고번호  TBL_출고.출고번호%TYPE; 
     -- 출고를 끝낸 후 재고수량 8번 수행
    V_재고수량  TBL_상품.재고수량%TYPE; 
    
    -- 사용자 정의 예외 선언
    USER_DEFINE_ERROR   EXCEPTION; -- 사용자 정의 예외 9
    
BEGIN
    
    SELECT 재고수량 INTO V_재고수량
    FROM TBL_상품
    WHERE 상품코드 = V_상품코드;
    
    -- 출고를 정상적으로 진행해 줄 것인지에 대한 여부 확인 7
    -- &amp;rarr; 파악한 재고수량보다 출고수량이 많으면 ... 예외발생
    IF (V_출고수량 &amp;gt; V_재고수량)
        -- 예외 발생
        THEN RAISE USER_DEFINE_ERROR;
    END IF;
    
    SELECT NVL(MAX(출고번호), 0) + 1 INTO V_출고번호 
    FROM TBL_출고;
    
    -- 쿼리문 구성 &amp;rarr; INSERT  &amp;rarr; TBL_출고컬럼 인서트 (출고일자는 SYSDATE라 제외) 2
    INSERT INTO TBL_출고(출고번호, 상품코드, 출고수량, 출고단가)
    VALUES(V_출고번호, V_상품코드, V_출고수량, V_출고단가);
    
    -- 쿼리문 구성 &amp;rarr; UPDATE  &amp;rarr; TBL_상품  5 파라미터(매개변수)로 넘겨받은 V_출고수량 
    UPDATE TBL_상품
    SET 재고수량 = 재고수량 - V_출고수량
    WHERE 상품코드 = V_상품코드;
  
    EXCEPTION
        WHEN USER_DEFINE_ERROR
            THEN RAISE_APPLICATION_ERROR(-20002, '재고 부족~!!!');
                 ROLLBACK;
        WHEN OTHERS
            THEN ROLLBACK;
 
    -- 커밋 6 
    COMMIT;

END;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;○&amp;nbsp;TBL_출고&amp;nbsp;테이블에서&amp;nbsp;출고수량을&amp;nbsp;변경(수정)하는&amp;nbsp;프로시저를&amp;nbsp;작성한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;프로시저명:&amp;nbsp;PRC_출고_UPDATE(출고번호,&amp;nbsp;변경할수량)&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1752561192336&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE PRC_출고_UPDATE
( V_출고번호        IN TBL_출고.출고번호%TYPE
, V_변경할수량      IN TBL_출고.출고수량%TYPE
)
IS
   
    V_상품코드      TBL_상품.상품코드%TYPE;
    
    V_이전출고수량   TBL_출고.출고수량%TYPE;  
    
    V_재고수량       TBL_상품.재고수량%TYPE;
    
   
     USER_DEFINE_ERROR EXCEPTION;
BEGIN
 
    SELECT 상품코드, 출고수량 INTO V_상품코드, V_이전출고수량
    FROM TBL_출고
    WHERE 출고번호 = V_출고번호;
    
    SET 재고수량 INTO V_재고수량
    FROM TBL_상품
    WHERE 상품코드 = V_상품코드; 
    
    IF (V_재고수량 &amp;gt; V_이전출고수량) &amp;lt; V_출고수량)
        -- 예외발생
        THEN RAISE USER_DEFINE_ERROR3;
    END IF;

    -- UPDATE -&amp;gt; TBL_출고 
    UPDATE TBL_출고
    SET 출고수량 = V_출고수량
    WHERE 출고번호 =  V_출고번호;
    
    UPDATE TBL_상품
  
    SET 재고수량 = 재고수량+ V_이전출고수량 - V_출고수량
    WHERE 상품코드 = V_상품코드;
    
    COMMIT;
   
    EXCEPTION
        WHEN USER_DEFINE_ERROR
            THEN RAISE_APPLICATION_ERROR(-20003, '재고 부족~!!!');
                 ROLLBACK;
        
        WHEN OTHERS
            THEN ROLLBACK;             
END;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>commit</category>
      <category>db</category>
      <category>dbms</category>
      <category>insert</category>
      <category>Oracle</category>
      <category>pl/sql</category>
      <category>PLSQL</category>
      <category>관계</category>
      <category>관계형데이터베이스</category>
      <category>프로시저</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/238</guid>
      <comments>https://aluck.tistory.com/238#entry238comment</comments>
      <pubDate>Tue, 15 Jul 2025 15:33:59 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 프로시저(3)</title>
      <link>https://aluck.tistory.com/237</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nS1Rs/btsPiDnkZJc/fWCHPKA8iIwB3SPm198ktK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nS1Rs/btsPiDnkZJc/fWCHPKA8iIwB3SPm198ktK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nS1Rs/btsPiDnkZJc/fWCHPKA8iIwB3SPm198ktK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnS1Rs%2FbtsPiDnkZJc%2FfWCHPKA8iIwB3SPm198ktK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;199&quot; height=&quot;199&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제 &lt;br /&gt;--○&amp;nbsp;TBL_STUDENTS&amp;nbsp;테이블에서 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;전화번호와&amp;nbsp;주소&amp;nbsp;데이터를&amp;nbsp;변경하는(수정하는)&amp;nbsp;프로시저를&amp;nbsp;작성한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;단,&amp;nbsp;ID와&amp;nbsp;PW가&amp;nbsp;일치하는&amp;nbsp;경우에만&amp;nbsp;수정을&amp;nbsp;진행할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;처리한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;프로시저명&amp;nbsp;:&amp;nbsp;PRC_STUDENTS_UPDATE &lt;br /&gt;/* &lt;br /&gt;실행&amp;nbsp;예) &lt;br /&gt;EXEC&amp;nbsp;PRC_STUDENTS_UPDATE('superman','java006$',&amp;nbsp;'010-1234-1234',&amp;nbsp;'인천&amp;nbsp;서구'); &lt;br /&gt;--&amp;rarr;&amp;nbsp;프로시저&amp;nbsp;호출로&amp;nbsp;처리된&amp;nbsp;결과&amp;nbsp; &lt;br /&gt;superman 김 010-1111-1111 제주도 서귀포시 &amp;lt;&amp;lt; 패스워드 잘못입력한 경우 처리안됨&amp;nbsp; &lt;br /&gt;&lt;br /&gt;EXEC&amp;nbsp;PRC_STUDENTS_UPDATE('superman','java006$',&amp;nbsp;'010-1234-1234',&amp;nbsp;'인천&amp;nbsp;서구'); &lt;br /&gt;--&amp;rarr;&amp;nbsp;프로시저&amp;nbsp;호출로&amp;nbsp;처리된&amp;nbsp;결과&amp;nbsp; &lt;br /&gt;superman 김 010-1111-1111 010-1234-1234 인천 서구 &lt;br /&gt;*/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1752482744525&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE PRC_STUDENTS_UPDATE
( V_ID      IN TBL_IDPW.ID%TYPE
, V_PW      IN TBL_IDPW.PW%TYPE
, V_TEL     IN TBL_STUDENTS.TEL%TYPE
, V_ADDR    IN TBL_STUDENTS.ADDR%TYPE
)
IS
BEGIN
     UPDATE(SELECT I.PW,I.ID, S.ADDR, S.TEL
        FROM TBL_STUDENTS S JOIN TBL_IDPW I
        ON S.ID = I.ID) T
    SET T.TEL = V_TEL, T.ADDR = V_ADDR
    WHERE T.ID = V_ID AND T.PW = V_PW; 
    
    COMMIT;
END; 
--==&amp;gt;&amp;gt; Procedure PRC_STUDENTS_UPDATE이(가) 컴파일되었습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제&amp;nbsp; &lt;br /&gt;--○&amp;nbsp;TBL_INSABACKUP&amp;nbsp;테이블을&amp;nbsp;대상으로&amp;nbsp;신규&amp;nbsp;데이터&amp;nbsp;입력&amp;nbsp;프로시저를&amp;nbsp;작성한다. &lt;br /&gt;--&amp;nbsp;NUM,&amp;nbsp;NAME,&amp;nbsp;SSN,&amp;nbsp;IBSDATE,&amp;nbsp;CITY,&amp;nbsp;TEL,&amp;nbsp;BUSEO,&amp;nbsp;JIKWI,&amp;nbsp;BASICPAY,&amp;nbsp;SUDANG &lt;br /&gt;--&amp;nbsp;구조를&amp;nbsp;갖고&amp;nbsp;있는&amp;nbsp;대상&amp;nbsp;테이블에&amp;nbsp;데이터&amp;nbsp;입력시&amp;nbsp; &lt;br /&gt;--&amp;nbsp;NUM&amp;nbsp;항목(사원번호)의&amp;nbsp;값은 &lt;br /&gt;--&amp;nbsp;기존&amp;nbsp;부여된&amp;nbsp;사원번호&amp;nbsp;마지막&amp;nbsp;번호의&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;번호를 &lt;br /&gt;--&amp;nbsp;자동으로&amp;nbsp;입력처리할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;프로시저로&amp;nbsp;구성한다.&amp;nbsp; &lt;br /&gt;--&amp;nbsp;프로시저명&amp;nbsp;:&amp;nbsp;PRC_INSA_INSERT &lt;br /&gt;/* &lt;br /&gt;실행&amp;nbsp;예) &lt;br /&gt;PRC_INSA_INSERT('이','777777-2222222',SYSDATE,'서울','010-1234-1234' &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,'영업부',&amp;nbsp;'대리',&amp;nbsp;5000000,&amp;nbsp;&amp;nbsp;500000); &lt;br /&gt;&amp;rarr;&amp;nbsp;프로시저&amp;nbsp;호출로&amp;nbsp;처리된&amp;nbsp;결과&amp;nbsp; &lt;br /&gt;1061 이 777777-2222222 2025-07-14 서울&amp;nbsp; 010-1234-1234 &amp;nbsp;영업부 대리 5000000 500000&lt;/p&gt;
&lt;pre id=&quot;code_1752482834708&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE PRC_INSA_INSERT
( V_NAME        IN  TBL_INSABACKUP.NAME%TYPE
, V_SSN         IN  TBL_INSABACKUP.SSN%TYPE
, V_IBSADATE    IN  TBL_INSABACKUP.IBSADATE%TYPE
, V_CITY        IN  TBL_INSABACKUP.CITY%TYPE
, V_TEL         IN  TBL_INSABACKUP.TEL%TYPE
, V_BUSEO       IN  TBL_INSABACKUP.BUSEO%TYPE
, V_JIKWI       IN  TBL_INSABACKUP.JIKWI%TYPE
, V_BASICPAY    IN  TBL_INSABACKUP.BASICPAY%TYPE
, V_SUDANG      IN  TBL_INSABACKUP.SUDANG%TYPE
)
IS
    -- INSERT 쿼리문 수행에 필요한 주요변수선언 
    V_NUM   TBL_INSABACKUP.NUM%TYPE; 
BEGIN
    -- INSERT 쿼리문 구성 - V_NUM 매개변수는 없는상태임 
    -- 선언한 변수에 값 담아내기 
    SELECT MAX(NUM) + 1 INTO V_NUM 
    FROM TBL_INSABACKUP;
    
    INSERT INTO TBL_INSA(NUM, NAME, SSN, IBSADATE, CITY, TEL, BUSEO, JIKWI, BASICPAY, SUDANG)
    VALUES(V_NUM, V_NAME, V_SSN, V_IBSADATE, V_CITY, V_TEL, V_BUSEO, V_JIKWI, V_BASICPAY, V_SUDANG);
    
    -- 커밋
    COMMIT;
END; 

--==&amp;gt;&amp;gt; Procedure PRC_INSA_INSERT이(가) 컴파일되었습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--○&amp;nbsp;TBL_입고,&amp;nbsp;TBL_상품&amp;nbsp;테이블을&amp;nbsp;대상으로 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;TBL_입고&amp;nbsp;테이블에&amp;nbsp;데이터&amp;nbsp;입력&amp;nbsp;시(즉,&amp;nbsp;입고&amp;nbsp;이벤트&amp;nbsp;발생&amp;nbsp;시) &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;TBL_상품&amp;nbsp;테이블&amp;nbsp;해당&amp;nbsp;상품의&amp;nbsp;재고수량이&amp;nbsp;함께&amp;nbsp;변동될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;기능을&amp;nbsp;가진 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;프로시저를&amp;nbsp;작성한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;단,&amp;nbsp;이&amp;nbsp;과정에서&amp;nbsp;입고번호는&amp;nbsp;자동&amp;nbsp;증가&amp;nbsp;처리한다.(시퀀스&amp;nbsp;사용&amp;nbsp;X) &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;TBL&amp;nbsp;입고&amp;nbsp;테이블&amp;nbsp;구성&amp;nbsp;컬럼 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;입고번호,&amp;nbsp;상품코드,&amp;nbsp;입고일자,&amp;nbsp;입고수량,&amp;nbsp;입고단가 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;프로시저명&amp;nbsp;PRC_입고_INSERT &lt;br /&gt;/* &lt;br /&gt;실행&amp;nbsp;예) &lt;br /&gt;EXEC&amp;nbsp;PRC_입고_INSERT('H001',&amp;nbsp;10,&amp;nbsp;1000); &lt;br /&gt;&amp;rarr;&amp;nbsp;이&amp;nbsp;프로시저&amp;nbsp;호출로&amp;nbsp;처리되는&amp;nbsp;업무&amp;nbsp;A)&amp;nbsp; &lt;br /&gt;H001 홈런볼 1500&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10 &lt;br /&gt;한번더&amp;nbsp;호출하면&amp;nbsp;갯수가&amp;nbsp;20개로&amp;nbsp;업&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;rarr;&amp;nbsp;이&amp;nbsp;프로시저&amp;nbsp;호출로&amp;nbsp;처리되는&amp;nbsp;업무&amp;nbsp;B)&amp;nbsp; &lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;H001&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2025-07-11&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;1000 &lt;br /&gt;한번더&amp;nbsp;호출하면&amp;nbsp;갯수가&amp;nbsp;20개로&amp;nbsp;업&amp;nbsp; &lt;/p&gt;
&lt;pre id=&quot;code_1752482879877&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE PRC_입고_INSERT
(   V상품코드  IN TBL_상품.상품코드%TYPE
,   V입고수량  IN TBL_입고.입고수량%TYPE
,   V입고단가  IN TBL_입고.입고단가%TYPE   
)


IS
    -- 아래 쿼리문 수행하기 위해 필요한 데이터 변수로 추가 선언 
    V입고번호 TBL_입고.입고번호%TYPE; 
    V입고일자 TBL_입고.입고일자%TYPE;
BEGIN
    -- 선언한 변수(V입고번호)에 값 담아내기 
    SELECT NVL(MAX(입고번호),0) INTO V입고번호
    FROM TBL_입고; 

    --쿼리문 구성 
    --1) INSERT -&amp;gt; TBL_입고
        INSERT INTO TBL_입고(입고번호, 상품코드, 입고수량, 입고단가)
        VALUES((V입고번호+1), V상품코드, V입고수량, V입고단가); 
        
    --  2) UPDATE -&amp;gt; TBL_상품
    -- 논리적으로, 입고수량 테이블에 레코드가 추가되어야 UPDATE TBL_상품 을 할 수 있으므로
    -- INSERT INTO 이후에 UPDATE를 한 것이다.
        UPDATE TBL_상품
        SET 재고수량 = 재고수량 + V입고수량
        WHERE 상품코드=V상품코드; 
     
    -- 커밋
    COMMIT;
    
     -- 예외 처리
    EXCEPTION -- 자바의 CATCH 
        -- 코드레벨에서 명시한 상황이 아닌 다른 상황이 발생하게 되면...
        -- THEN 롤백해라!!
        WHEN OTHERS THEN ROLLBACK;
        -- 기존 상황이 아닌 상황이 발생했을 경우 모두 ROLLBACK!
        -- 그 어떠한 것도 반영하지 않는다.
END;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--○&amp;nbsp;TBL_MEMBER&amp;nbsp;테이블에서&amp;nbsp;데이터를&amp;nbsp;입력하는&amp;nbsp;프로시저&amp;nbsp;생성&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;단,&amp;nbsp;이&amp;nbsp;프로시저를&amp;nbsp;통해&amp;nbsp;데이터를&amp;nbsp;입력할&amp;nbsp;경우 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;CITY(지역)&amp;nbsp;항목에&amp;nbsp;'서울',&amp;nbsp;'경기',&amp;nbsp;'인천'&amp;nbsp;만&amp;nbsp;입력이&amp;nbsp;가능하도록&amp;nbsp;구성한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;이&amp;nbsp;지역&amp;nbsp;이외의&amp;nbsp;다른&amp;nbsp;지역을&amp;nbsp;프로시저&amp;nbsp;호출을&amp;nbsp;통해&amp;nbsp;입력하려&amp;nbsp;하는&amp;nbsp;경우 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;예외&amp;nbsp;처리를&amp;nbsp;하려고&amp;nbsp;한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;프로시저명&amp;nbsp;:&amp;nbsp;PRC_MEMBER_INSERT(이름,&amp;nbsp;전화번호,&amp;nbsp;지역)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1752482924749&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE PRC_MEMBER_INSERT
( V_NAME    IN  TBL_MEMBER.NAME%TYPE
, V_TEL     IN  TBL_MEMBER.TEL%TYPE
, V_CITY    IN  TBL_MEMBER.CITY%TYPE
)
IS
    -- 실행 영역의 쿼리문 수행을 위해 필요한 데이터 변수 추가 선언
    V_NUM   TBL_MEMBER.NUM%TYPE;
    
    --  사용자 정의 예외에 대한 변수(USER_DEFINE_ERROR 변수명) 선언~!!!  CHECK~!!!
    --  EXCEPTION 타입
    USER_DEFINE_ERROR EXCEPTION;
BEGIN
    -- 프로시저를 통해 입력 액션 처리를 정상적으로 진행해야 할 데이터인지
    -- 아닌지의 여부를 가장 먼저 확인할 수 있도록 해당 위치에 코드 구성
    IF(V_CITY NOT IN('서울', '인천', '경기'))    -- V_CITY에 '서울', '경기', '인천' 중 하나가 들어있지 않다면... 
       -- 예외 발생~!!! 
       THEN RAISE USER_DEFINE_ERROR; --예외를 발생시키겠다. 
    END IF; 
    
    -- 추가로 선언한 변수에 값 담아내기 
    SELECT NVL(MAX(NUM), 0) INTO V_NUM
    FROM TBL_MEMBER;
    -- 쿼리문 구성 -&amp;gt; INSERT 
    INSERT INTO TBL_MEMBER(NUM, NAME, TEL, CITY) 
    VALUES((V_NUM+1),V_NAME,V_TEL,V_CITY); 
    
    -- 커밋
    COMMIT;
    
    -- 예외처리
    EXCEPTION
        WHEN USER_DEFINE_ERROR
            THEN RAISE_APPLICATION_ERROR(-20001,'서울,경기, 인천만 입력 가능.');
            ROLLBACK;
        WHEN OTHERS
            THEN ROLLBACK;             
END; 

--==&amp;gt;&amp;gt; Procedure PRC_MEMBER_INSERT이(가) 컴파일되었습니다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>commit</category>
      <category>db</category>
      <category>dbms</category>
      <category>insert</category>
      <category>Oracle</category>
      <category>pl/sql</category>
      <category>PLSQL</category>
      <category>관계</category>
      <category>관계형데이터베이스</category>
      <category>프로시저</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/237</guid>
      <comments>https://aluck.tistory.com/237#entry237comment</comments>
      <pubDate>Mon, 14 Jul 2025 17:48:49 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 동적/정적SQL + 프로시저(2)</title>
      <link>https://aluck.tistory.com/236</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oOYeI/btsPf2htXCl/HrHL1BktXnLpWOUeF8La50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oOYeI/btsPf2htXCl/HrHL1BktXnLpWOUeF8La50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oOYeI/btsPf2htXCl/HrHL1BktXnLpWOUeF8La50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoOYeI%2FbtsPf2htXCl%2FHrHL1BktXnLpWOUeF8La50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;150&quot; height=&quot;150&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752460860702&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT USER
FROM DUAL;
-- SCOTT

--○ INSERT 프로시저 실습을 위한 테이블 생성
-- 테이블명 : TBL_STUDENTS
CREATE TABLE TBL_STUDENTS
(   ID      VARCHAR2(10)
,   NAME    VARCHAR2(40)
,   TEL     VARCHAR2(20)
,   ADDR    VARCHAR2(100)
,   CONSTRAINT STUDENTS_ID_PK PRIMARY KEY(ID) 
); 

--==&amp;gt;&amp;gt; Table TBL_STUDENTS이(가) 생성되었습니다.

-- 테이블명 : TBL_IDPW
CREATE TABLE TBL_IDPW
(   ID      VARCHAR2(10)
,   PW      VARCHAR2(20)
,   CONSTRAINT IDPW_ID_PW PRIMARY KEY(ID)
);

--==&amp;gt;&amp;gt; Table TBL_IDPW이(가) 생성되었습니다.

-- 한 명의 학생 정보 등록 &amp;rarr; 두 테이블 모두에 데이터 입력 
INSERT INTO TBL_STUDENTS(ID, NAME, TEL, ADDR)
VALUES('superman', '김', '010-1111-1111', '제주도 서귀포시'); 
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_IDPW(ID, PW)
VALUES('superman', 'java006$');
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다.

SELECT *
FROM TBL_STUDENTS;
--==&amp;gt;&amp;gt; superman	김	010-1111-1111	제주도 서귀포시

SELECT *
FROM TBL_IDPW; 
--==&amp;gt;&amp;gt; superman	java006$

--※ 위의 업무를 프로시저를 생성하여 처리하게 되면
EXEC PRC_STUDENTS_INSERT('happyday', 'PW', '이', '010-2222-2222', '서울 마포구');
-- 이와 같은 구문 한 줄로 양쪽 테이블에 데이터를 모두 제데로 입력할 수 있다. 

-- 다시 1번 시트로 프로시저 생성 후

-- 생성한 프로시저(PRC_STUDENTS_INSERT)가 제데로 작동하는지 여부 확인
-- &amp;rarr; 프로시저 호출 
EXEC PRC_STUDENTS_INSERT('happyday', 'PW', '이', '010-2222-2222', '서울 마포구');
--==&amp;gt;&amp;gt;PL/SQL 프로시저가 성공적으로 완료되었습니다.

-- 확인

-- 프로시저 한 번 더 호출 테스트 
EXEC PRC_STUDENTS_INSERT('happytest', 'PW', '최', '010-3333-3333', '서울 은평구');
--==&amp;gt;&amp;gt; PL/SQL 프로시저가 성공적으로 완료되었습니다.

-- 확인
SELECT *
FROM TBL_STUDENTS;
/*
superman	김	010-1111-1111	제주도 서귀포시
happyday	이	010-2222-2222	서울 마포구
happytest	최	010-3333-3333	서울 은평구
*/

SELECT *
FROM TBL_IDPW; 
/*
superman	pw
happyday	pw
happytest	pw
*/

--○ INSERT 프로시저 실습 
-- 테이블명 : TBL_SUNGJUK
CREATE TABLE TBL_SUNGJUK
(   HAKBUN  NUMBER
,   NAME    VARCHAR2(40)
,   KOR     NUMBER(3)
,   ENG    NUMBER(3)
,   MAT    NUMBER(3)
,   CONSTRAINT SUNGJUK_HAKBUN_PK PRIMARY KEY(HAKBUN) 
); 
--== Table TBL_SUNGJUK이(가) 생성되었습니다.

-- 학번, 이름, 국어, 영어, 수학 점수 데이터를 
-- 입력받을 수 있는 실습 테이블 생성

-- 생성된 테이블의 컬럼 구조 변경
-- (총점 &amp;rarr; TOT, 평균&amp;rarr; AVG, 등급&amp;rarr;GRADE)
ALTER TABLE TBL_SUNGJUK 
ADD (TOT NUMBER(3), AVG NUMBER(4,1), GRADE CHAR); 
--==&amp;gt;&amp;gt; Table TBL_SUNGJUK이(가) 변경되었습니다.

--※ 여기서 추가한 컬럼에 대한 항목들은
--   프로시저 실습을 위해 추가하는 것일 뿐
--   실제 테이블 구조에 적합하지도, 바람직하지도 않은 내용이다. 

--   변경된 테이블 구조 확인
DESC TBL_SUNGJUK;
/*
이름     널?       유형           
------ -------- ------------ 
HAKBUN NOT NULL NUMBER       
NAME            VARCHAR2(40) 
KOR             NUMBER(3)    
ENG             NUMBER(3)    
MAT             NUMBER(3)    
TOT             NUMBER(3)    
AVG             NUMBER(4,1)  
GRADE           CHAR(1)      
*/

-- 위의 업무 프로-----------------
EXEC PRC_SUNGJUK_INSERT(1, '조', 90,80,70);
--이와 같은 구문 한 줄로 총점, 평균, 등급 데이터를 모두 제데로 입력할 수 있다. 

EXEC PRC_SUNGJUK_INSERT(1, '조', 90,80,70);
--==&amp;gt;&amp;gt; PL/SQL 프로시저가 성공적으로 완료되었습니다.

SELECT *
FROM TBL_SUNGJUK;
--==&amp;gt;&amp;gt; 1	조	90	80	70	240	80	B
--2	유	87	96	73	256	85.3	B

-- 생성한 프로시저(PRC_SUNGJUK_INSERT)가 제데로 작동하는지 여부 확인
-- &amp;rarr; 프로시저 호출 
EXEC PRC_SUNGJUK_INSERT(1, '조', 90,80,70);
--==&amp;gt;&amp;gt; PL/SQL 프로시저가 성공적으로 완료되었습니다.

SELECT *
FROM TBL_SUNGJUK;
-- 1	조	90	80	70	240	80	B

EXEC PRC_SUNGJUK_INSERT(2, '유', 87,96,73);
--==&amp;gt;&amp;gt; PL/SQL 프로시저가 성공적으로 완료되었습니다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>commit</category>
      <category>db</category>
      <category>dbms</category>
      <category>insert</category>
      <category>Oracle</category>
      <category>pl/sql</category>
      <category>PLSQL</category>
      <category>관계</category>
      <category>관계형데이터베이스</category>
      <category>프로시저</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/236</guid>
      <comments>https://aluck.tistory.com/236#entry236comment</comments>
      <pubDate>Mon, 14 Jul 2025 11:42:12 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 동적/정적SQL + 프로시저(1)</title>
      <link>https://aluck.tistory.com/235</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AYr4m/btsPgjC6czI/JEw5pEsHWJuMVjsc1JnyK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AYr4m/btsPgjC6czI/JEw5pEsHWJuMVjsc1JnyK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AYr4m/btsPgjC6czI/JEw5pEsHWJuMVjsc1JnyK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAYr4m%2FbtsPgjC6czI%2FJEw5pEsHWJuMVjsc1JnyK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;159&quot; height=&quot;159&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;1.&amp;nbsp;INSERT,&amp;nbsp;UPDATE,&amp;nbsp;DELETE,&amp;nbsp;(MERGE) &lt;br /&gt;--&amp;nbsp;&amp;rarr;&amp;nbsp;DML(Data&amp;nbsp;Maniplulation&amp;nbsp;Language) &lt;br /&gt;--&amp;nbsp;&amp;rarr;&amp;nbsp;COMMIT&amp;nbsp;/&amp;nbsp;ROLLBACK&amp;nbsp;이&amp;nbsp;필요하다. &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;2.&amp;nbsp;CREATE&amp;nbsp;,&amp;nbsp;DROP,&amp;nbsp;ALTER,&amp;nbsp;(TRUNCATE) &lt;br /&gt;--&amp;nbsp;&amp;rarr;&amp;nbsp;DDL(Data&amp;nbsp;Definition&amp;nbsp;Language) &lt;br /&gt;--&amp;nbsp;&amp;rarr;&amp;nbsp;실행하면&amp;nbsp;자동으로&amp;nbsp;COMMIT&amp;nbsp;된다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;3.&amp;nbsp;GRANT,&amp;nbsp;REVOKE &lt;br /&gt;--&amp;nbsp;&amp;rarr;&amp;nbsp;DCL(Data&amp;nbsp;Control&amp;nbsp;Language) &lt;br /&gt;--&amp;nbsp;실행하면&amp;nbsp;자동으로&amp;nbsp;COMMIT&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;4.&amp;nbsp;COMMIT,&amp;nbsp;ROLLBACK &lt;br /&gt;--&amp;nbsp;&amp;rarr;&amp;nbsp;TCL(Transaction&amp;nbsp;Control&amp;nbsp;Language) &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;정적&amp;nbsp;PL/SQL문&amp;nbsp;&amp;rarr;&amp;nbsp;DML문,&amp;nbsp;TCL문만&amp;nbsp;사용&amp;nbsp;가능하다. &lt;br /&gt;--&amp;nbsp;동적&amp;nbsp;PL/SQL문&amp;nbsp;&amp;rarr;&amp;nbsp;DML문,&amp;nbsp;DDL문,&amp;nbsp;DCL문,&amp;nbsp;TCL문&amp;nbsp;사용&amp;nbsp;가능 &lt;br /&gt;&lt;br /&gt;--※&amp;nbsp;정적&amp;nbsp;SQL(정적&amp;nbsp;PL/SQL) &lt;br /&gt;--&amp;gt;&amp;nbsp;기본적으로&amp;nbsp;사용하는&amp;nbsp;SQL&amp;nbsp;구문과 &lt;br /&gt;--&amp;nbsp;PL/SQL&amp;nbsp;구문&amp;nbsp;안에&amp;nbsp;SQL&amp;nbsp;구문을&amp;nbsp;직접&amp;nbsp;삽입하는&amp;nbsp;방법 &lt;br /&gt;--&amp;gt;&amp;nbsp;작성이&amp;nbsp;쉽고&amp;nbsp;성능이&amp;nbsp;좋다. &lt;br /&gt;&lt;br /&gt;--※&amp;nbsp;동적&amp;nbsp;SQL(정적&amp;nbsp;PL/SQL) &lt;br /&gt;--&amp;gt;&amp;nbsp;완성되지&amp;nbsp;않은&amp;nbsp;SQL&amp;nbsp;구믄을&amp;nbsp;기반으로 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;실행&amp;nbsp;중&amp;nbsp;변경&amp;nbsp;가능한&amp;nbsp;문자열&amp;nbsp;변수&amp;nbsp;또는&amp;nbsp;문자열&amp;nbsp;상수를&amp;nbsp;통해 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;SQL&amp;nbsp;구문을&amp;nbsp;동적으로&amp;nbsp;완성하여&amp;nbsp;실행하는&amp;nbsp;방법 &lt;br /&gt;--&amp;gt;&amp;nbsp;사전에&amp;nbsp;정의되지&amp;nbsp;않은&amp;nbsp;SQL&amp;nbsp;을&amp;nbsp;실행할&amp;nbsp;때&amp;nbsp;완성&amp;nbsp;및&amp;nbsp;확정하여&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;DML,&amp;nbsp;TCL&amp;nbsp;외에도&amp;nbsp;DDL,&amp;nbsp;DCL&amp;nbsp;등의&amp;nbsp;사용이&amp;nbsp;가능하다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------- &lt;br /&gt;--&amp;nbsp;■■■&amp;nbsp;PROCEDURE(프로시저)&amp;nbsp;■■■&amp;nbsp;--&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;1.&amp;nbsp;PL/SQL&amp;nbsp;에서&amp;nbsp;가장&amp;nbsp;대표적인&amp;nbsp;구조인&amp;nbsp;스토어드&amp;nbsp;프로시저는 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;개발자가&amp;nbsp;자주&amp;nbsp;작성해야&amp;nbsp;하는&amp;nbsp;업문의&amp;nbsp;흐름을&amp;nbsp;미리&amp;nbsp;작성하여 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;데이터베이스&amp;nbsp;내에&amp;nbsp;저장해&amp;nbsp;두었다가&amp;nbsp;필요할&amp;nbsp;때&amp;nbsp;마다&amp;nbsp;호출하여 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;처리해&amp;nbsp;주는&amp;nbsp;구문이다. &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;2.&amp;nbsp;형식&amp;nbsp;및&amp;nbsp;구조 &lt;br /&gt;/* &lt;br /&gt;CREATE&amp;nbsp;[OR&amp;nbsp;REPLACE]&amp;nbsp;PROCEDURE&amp;nbsp;프로시저명 &lt;br /&gt;[(&amp;nbsp;&amp;nbsp;매개변수&amp;nbsp;IN&amp;nbsp;데이터타입 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,매개변수&amp;nbsp;OUT&amp;nbsp;데이터타입 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,매개변수&amp;nbsp;INOUT&amp;nbsp;데이터타입 &lt;br /&gt;)] &lt;br /&gt;IS &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[--&amp;nbsp;주요&amp;nbsp;변수&amp;nbsp;선언;] &lt;br /&gt;BEGIN &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;실행구문; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[EXCEPTION &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;예외&amp;nbsp;처리&amp;nbsp;구문;] &lt;br /&gt;END; &lt;br /&gt;*/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;--※&amp;nbsp;FUNCTION&amp;nbsp;과&amp;nbsp;비교했을&amp;nbsp;때&amp;nbsp;... &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;[RETURN&amp;nbsp;반환자료형]&amp;nbsp;부분이&amp;nbsp;존재하지&amp;nbsp;않으며, &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;[RETURN]문&amp;nbsp;자체도&amp;nbsp;존재하지&amp;nbsp;않고, &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;프로시저&amp;nbsp;실행&amp;nbsp;시&amp;nbsp;넘겨주게&amp;nbsp;되는&amp;nbsp;매개변수의&amp;nbsp;종류는 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;IN,&amp;nbsp;OUT,&amp;nbsp;INPUT&amp;nbsp;으로&amp;nbsp;구분된다. &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;&amp;nbsp;3.&amp;nbsp;실행(호출) &lt;br /&gt;/* &lt;br /&gt;EXEC[UTE]&amp;nbsp;프로시저명[(인수1,&amp;nbsp;인수2)]; &lt;br /&gt;*/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--○&amp;nbsp;INSERT&amp;nbsp;프로시저 &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;실습&amp;nbsp;테이블&amp;nbsp;생성&amp;nbsp;&amp;rarr;&amp;nbsp;『20250714_02_scott.sql』&amp;nbsp;파일&amp;nbsp;참조&amp;nbsp; &lt;br /&gt;--&amp;nbsp;테이블명&amp;nbsp;:&amp;nbsp;TBL_STUDENTS &lt;br /&gt;--&amp;nbsp;테이블명&amp;nbsp;:&amp;nbsp;TBL_IDPW&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;프로시저&amp;nbsp;생성 &lt;br /&gt;--&amp;nbsp;프로시저명&amp;nbsp;:&amp;nbsp;PRC_STUDENTS_INSERT(아이디,&amp;nbsp;패스워드,&amp;nbsp;이름,&amp;nbsp;전화번호,&amp;nbsp;주소);&lt;/p&gt;
&lt;pre id=&quot;code_1752455761481&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 1번 처리                         -- 저 테이블에 ID 데이터타입을 참조해
CREATE OR REPLACE PROCEDURE PRC_STUDENTS_INSERT
(   V_ID        IN  TBL_IDPW.ID%TYPE   
,   V_PW        IN  TBL_IDPW.PW%TYPE
,   V_NAME      IN  TBL_STUDENTS.NAME%TYPE  
,   V_TEL       IN  TBL_STUDENTS.TEL%TYPE  
,   V_ADDR      IN  TBL_STUDENTS.ADDR%TYPE  
)
IS
BEGIN -- 2번 처리 (매개변수 넘겨받은걸로 충분히 작업수행 가능) 
    -- TBL_IDPW 테이블에 데이터 입력
    INSERT INTO TBL_IDPW(ID, PW)
    VALUES(V_ID, V_PW);
    
    -- TBL_STUDENTS 테이블에 데이터 입력
    INSERT INTO TBL_STUDENTS(ID, NAME, TEL, ADDR)
    VALUES(V_ID, V_NAME, V_TEL, V_ADDR); 
    
    -- 커밋 (DML구문이니까)
    COMMIT; 
END; 
--==&amp;gt;&amp;gt; Procedure PRC_STUDENTS_INSERT이(가) 컴파일되었습니다.
-- 다시 2번시트로 가서 프로시저 호출&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--○&amp;nbsp;INSERT&amp;nbsp;프로시저 &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;실습&amp;nbsp;테이블&amp;nbsp;생성&amp;nbsp;&amp;rarr;&amp;nbsp;『20250714_02_scott.sql』&amp;nbsp;파일&amp;nbsp;참조&amp;nbsp; &lt;br /&gt;--&amp;nbsp;문제&amp;nbsp; &lt;br /&gt;--&amp;nbsp;테이블명&amp;nbsp;:&amp;nbsp;TBL_SUNGJUK &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;데이터&amp;nbsp;입력&amp;nbsp;시&amp;nbsp;특정&amp;nbsp;항목의&amp;nbsp;데이터만&amp;nbsp;입력하면 &lt;br /&gt;--&amp;nbsp;내부적으로&amp;nbsp;나머지&amp;nbsp;다른&amp;nbsp;항목이&amp;nbsp;함께&amp;nbsp;입력&amp;nbsp;처리될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;프로시저를&amp;nbsp;생성한다. &lt;br /&gt;--&amp;nbsp;프로시저명&amp;nbsp;:&amp;nbsp;PRC_SUNGJUK_INSERT&amp;nbsp; &lt;br /&gt;/* &lt;br /&gt;실행&amp;nbsp;예) &lt;br /&gt;EXEC PRC_SUNGJUK_INSERT(1, '조', 90,80,70); &lt;br /&gt;&lt;br /&gt;프로시저&amp;nbsp;호출로&amp;nbsp;처리된&amp;nbsp;결과 &lt;br /&gt;학번&amp;nbsp;&amp;nbsp;이름&amp;nbsp;&amp;nbsp;국어&amp;nbsp;&amp;nbsp;영어&amp;nbsp;&amp;nbsp;수학&amp;nbsp;&amp;nbsp;총점&amp;nbsp;&amp;nbsp;평균&amp;nbsp;&amp;nbsp;등급 &lt;br /&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;조&amp;nbsp; 90&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;70&amp;nbsp;&amp;nbsp;&amp;nbsp;240&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;B&amp;nbsp; &lt;br /&gt;*/ &lt;br /&gt;&lt;br /&gt;-- 1&amp;nbsp;&amp;nbsp;&amp;nbsp;조&amp;nbsp; 90&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;70&amp;nbsp;&amp;nbsp;&amp;nbsp;240&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;B&amp;nbsp;&amp;nbsp; &lt;br /&gt;--&amp;nbsp;(&amp;nbsp;&amp;nbsp;&amp;nbsp;V_HAKBUN&amp;nbsp;&amp;nbsp;&amp;nbsp;IN&amp;nbsp;&amp;nbsp;TBL_SUNGJUK.HAKBUN%TYPE&amp;nbsp;&amp;nbsp;&amp;nbsp;입력매개변수&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1752460680582&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE PROCEDURE PRC_SUNGJUK_INSERT
(   V_HAKBUN   IN  TBL_SUNGJUK.HAKBUN%TYPE  
,   V_NAME     IN  TBL_SUNGJUK.NAME%TYPE
,   V_KOR      IN  TBL_SUNGJUK.KOR%TYPE
,   V_ENG      IN  TBL_SUNGJUK.ENG%TYPE
,   V_MAT      IN  TBL_SUNGJUK.MAT%TYPE  
) 
IS
    -- 선언부 (총점, 평균, 등급을 넘겨줄 게 없으므로 변수로 선언해 주면서 ;로 구분이 되야함 ) 
    -- INSERT 쿼리문을 수행하는데 필요한 주요 변수 선언 -- 지역변수처럼 사용해 줄 것임. 
    V_TOT   TBL_SUNGJUK.TOT%TYPE;
    V_AVG   TBL_SUNGJUK.AVG%TYPE;
    V_GRADE TBL_SUNGJUK.GRADE%TYPE; 
    
BEGIN 
    -- 실행부
    -- 아래의 쿼리문을 수행하기 위해서는
    -- 위에서 선언한 변수들에 값을 담아내야 한다.(V_TOT,V_AVG,V_GRADE)   
    V_TOT := V_KOR + V_ENG + V_MAT;
    V_AVG := V_TOT/3; 

    -- V_GRADE := 'F'; 
    IF  (V_AVG &amp;gt;=90)
        THEN V_GRADE := 'A'; 
    ELSIF(V_AVG &amp;gt;=80)
        THEN V_GRADE := 'B'; 
    ELSIF(V_AVG &amp;gt;=70)
        THEN V_GRADE := 'C';
    ELSIF(V_AVG &amp;gt;= 60)
        THEN V_GRADE := 'D';
    ELSE
        V_GRADE := 'F'; 
    END IF; 
    
     -- INSERT 쿼리문 구성
    INSERT INTO TBL_SUNGJUK(HAKBUN, NAME, KOR, ENG, MAT, TOT, AVG, GRADE)
    VALUES(V_HAKBUN, V_NAME, V_KOR, V_ENG, V_MAT, V_TOT, V_AVG, V_GRADE);
    
    -- 커밋
    COMMIT; 
END; 
--==&amp;gt;&amp;gt; Procedure PRC_SUNGJUK_INSERT이(가) 컴파일되었습니다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>commit</category>
      <category>db</category>
      <category>dbms</category>
      <category>insert</category>
      <category>Oracle</category>
      <category>pl/sql</category>
      <category>PLSQL</category>
      <category>관계</category>
      <category>관계형데이터베이스</category>
      <category>프로시저</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/235</guid>
      <comments>https://aluck.tistory.com/235#entry235comment</comments>
      <pubDate>Mon, 14 Jul 2025 11:39:02 +0900</pubDate>
    </item>
    <item>
      <title>Oracle -PLSQL 함수</title>
      <link>https://aluck.tistory.com/234</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjOj4H/btsPgwHQP9M/WMR8tWUMt6QKKDtKlNUuv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjOj4H/btsPgwHQP9M/WMR8tWUMt6QKKDtKlNUuv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjOj4H/btsPgwHQP9M/WMR8tWUMt6QKKDtKlNUuv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjOj4H%2FbtsPgwHQP9M%2FWMR8tWUMt6QKKDtKlNUuv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;142&quot; height=&quot;142&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752223772218&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--○ TBL_INSA 테이블의 여러명 데이터 여러개를 변수에 저장하여 출력
--  (단순 반복문 활용 출력)
DECLARE
    VINSA   TBL_INSA%ROWTYPE;
    VNUM    TBL_INSA.NUM%TYPE := 1001;
BEGIN
    LOOP
        SELECT NAME, TEL, BUSEO INTO VINSA.NAME, VINSA.TEL, VINSA.BUSEO
        FROM TBL_INSA
        --WHERE NUM = 1001;
        WHERE NUM = VNUM;
        
         DBMS_OUTPUT.PUT_LINE(VINSA.NAME || ' - ' ||  VINSA.TEL || ' - ' || VINSA.BUSEO);
         
         EXIT WHEN VNUM &amp;gt;= 1060; 
         
         VNUM := VNUM + 1;  -- VNUM을 1만큼 증가
         
    END LOOP; 
END; 
--==&amp;gt;&amp;gt;
/*
홍길동 - 011-2356-4528 - 기획부
이순신 - 010-4758-6532 - 총무부
이순애 - 010-4231-1236 - 개발부
김정훈 - 019-5236-4221 - 영업부
한석봉 - 018-5211-3542 - 총무부
이기자 - 010-3214-5357 - 개발부
장인철 - 011-2345-2525 - 개발부
김영년 - 016-2222-4444 - 홍보부
나윤균 - 019-1111-2222 - 인사부
김종서 - 011-3214-5555 - 영업부
유관순 - 010-8888-4422 - 영업부
정한국 - 018-2222-4242 - 홍보부
조미숙 - 019-6666-4444 - 홍보부
황진이 - 010-3214-5467 - 개발부
이현숙 - 016-2548-3365 - 총무부
이상헌 - 010-4526-1234 - 개발부
엄용수 - 010-3254-2542 - 개발부
이성길 - 018-1333-3333 - 개발부
박문수 - 017-4747-4848 - 인사부
유영희 - 011-9595-8585 - 자재부
홍길남 - 011-9999-7575 - 개발부
이영숙 - 017-5214-5282 - 기획부
김인수 -  - 영업부
김말자 - 011-5248-7789 - 기획부
우재옥 - 010-4563-2587 - 영업부
김숙남 - 010-2112-5225 - 영업부
김영길 - 019-8523-1478 - 총무부
이남신 - 016-1818-4848 - 인사부
김말숙 - 016-3535-3636 - 총무부
정정해 - 019-6564-6752 - 총무부
지재환 - 019-5552-7511 - 기획부
심심해 - 016-8888-7474 - 자재부
김미나 - 011-2444-4444 - 영업부
이정석 - 011-3697-7412 - 기획부
정영희 -  - 개발부
이재영 - 011-9999-9999 - 자재부
최석규 - 011-7777-7777 - 홍보부
손인수 - 010-6542-7412 - 영업부
고순정 - 010-2587-7895 - 영업부
박세열 - 016-4444-7777 - 인사부
문길수 - 016-4444-5555 - 자재부
채정희 - 011-5125-5511 - 개발부
양미옥 - 016-8548-6547 - 영업부
지수환 - 011-5555-7548 - 영업부
홍원신 - 011-7777-7777 - 영업부
허경운 - 017-3333-3333 - 총무부
산마루 - 018-0505-0505 - 영업부
이기상 -  - 개발부
이미성 - 010-6654-8854 - 개발부
이미인 - 011-8585-5252 - 홍보부
권영미 - 011-5555-7548 - 영업부
권옥경 - 010-3644-5577 - 기획부
김싱식 - 011-7585-7474 - 자재부
정상호 - 016-1919-4242 - 홍보부
정한나 - 016-2424-4242 - 영업부
전용재 - 010-7549-8654 - 영업부
이미경 - 016-6542-7546 - 자재부
김신제 - 010-2415-5444 - 기획부
임수봉 - 011-4151-4154 - 개발부
김신애 - 011-4151-4444 - 개발부

PL/SQL 프로시저가 성공적으로 완료되었습니다
*/

-- ■■■ FUNCTION(함수) ■■■-- 

-- 1. 함수란 하나 이상의 PL/SQL 문으로 구성된 서브루틴으로
--    코드를 다시 사용할 수 있도록 캡슐화 하는데 사용된다.
--    오라클에서는 오라클에 정의된 기본 제공 함수를 사용하거나
--    직접 스토어드 함수를 만들 수 있다.(&amp;rarr; 사용자 정의 함수)
--    이 사용자 정의 함수는 시스템 함수처럼 쿼리에서 호출하거나
--    저장 프로시저처럼 EXECUTE 문을 통해 실행할 수 있다. 

-- 2. 형식 및 구조
/*
CREATE [OR REPLACE] FUNCTION 함수명
[(
    매개변수1 자료형
  , 매개변수2 자료형
)]
RETURN 데이터타입
IS
    -- 주요 변수 선언(지역변수)
BEGIN
    -- 실행문;
    ...
    RETURN 값;       
    
    [EXCEPTION]
    -- 예외 처리 구문;
END;
*/

--※ 사용자 정의 함수(스토어드 함수)는
--   IN 파라미터(입력 매개변수)만 사용할 수 있으며
--   반드시 반환될 값의 데이터타입을 RETURN 문에 선언해야 하고,
--   FUNCTION 은 반드시 &quot;단일 값만&quot; 반환한다. 

--○ TBL_INSA 테이블을 대상으로
--   주민번호를 가지고 성별을 조회한다.

SELECT NAME, SSN, DECODE(SUBSTR(SSN, 8, 1), 1,'남자', 2, '여자', '확인불가') &quot;성별&quot; 
-- 8번째 하나 꺼낸게 1이면 남자 
FROM TBL_INSA;
/* 홍길동	771212-1022432	남자
.. 총 60건
*/

-- 이 기능을 하는 함수를 정의해봐라 .. 
--○ FUNCTION 정의(생성)
-- 함수명 : FN_GENDER()                            &amp;darr;
--                      SSN(주민등록번호) &amp;rarr; 'YYMMDD-NNNNNNN'
--'여자' OR '남자' OR '성별확인불가'

CREATE OR REPLACE FUNCTION FN_GENDER
(
    VSSN    VARCHAR2    -- 길이는 명시하지않음. 
    -- VSSN은 매개변수 
)
RETURN VARCHAR2 -- 길이 노 명시
IS
    -- 주요 변수 선언 및 초기화
    VRESULT VARCHAR2(20);
BEGIN
    -- 연산 및 처리
    IF(SUBSTR(VSSN, 8, 1) IN ('1', '3'))
       THEN VRESULT := '남자';
    ELSIF(SUBSTR(VSSN,8,1) IN ('2', '4'))
        THEN VRESULT := '여자';
    ELSE
        VRESULT := '성별확인불가';
    END IF;
    -- 최종 결과값 반환 
    RETURN VRESULT;    
END;

/*
PL/SQL 프로시저가 성공적으로 완료되었습니다.

Function FN_GENDER이(가) 컴파일되었습니다.
*/

-- 01_scott.sql 로 가서 접속 
-- 함수 호출 후 다시 5번 시트로 접속 

-- 문제
--○ 임의의 정수 두 개를 매개변수(입력 파라미터)로 넘겨받아
--   A 의 B승의 값을 반환하는 사용자 정의 함수를 만든다. 
-- 함수명 : FN_POW()
/*
사용 예)
SELECT FN_POW(10,3) &quot;결과확인&quot;
FROM DAUL; 
--==&amp;gt;&amp;gt; 1000 
*/

-- 10의 3승 계산법 10*10*10  = 1000 

-- FN_POW(10,3)
--        -----
--          10 * 10 * 10 = 1000
--      0 * 10 * 10 * 10 = 0
--      1 * 10 * 10 * 10 = 1000

CREATE OR REPLACE FUNCTION FN_POW
(  A NUMBER                     --10
,   B NUMBER                     --3
)
RETURN NUMBER
IS
    -- VRESULT NUMBER := 0;
    VRESULT NUMBER := 1;    -- 반복문을 활용한 누적곱 연산
    VNUM    NUMBER;
BEGIN    
    -- 반복문
    FOR VNUM IN 1 .. B LOOP    -- VNUM 에 1 ~ 3
    VRESULT := VRESULT * A;  -- 1 * 10 * 10 * 10
    END LOOP;
    -- 최종 결과값 반환 
    RETURN VRESULT;
END;    

--○ TBL_INSA 테이블의 급여 계산 전용 함수를 정의한다.
--   급여는 (기본급 * 12) + 수당 기반으로 연산을 수행한다.
--   함수명 : FN_PAY(기본급,수당)

CREATE OR REPLACE FUNCTION FN_PAY(VBASICPAY NUMBER, VSUDANG NUMBER)
RETURN NUMBER
IS
    -- 주요 변수 선언 
    VRESULT NUMBER;
BEGIN
    -- 연산 및 처리 
    -- 항상 NULL 값이 들어올 수 있음을 예상하고 함수를 정의
    -- 값이 둘 중 하나라도 NULL 일 경우 제대로 된 처리가 이루어지지 않는다
    VRESULT := (NVL(VBASICPAY,0) * 12) + NVL(VSUDANG, 0);
    -- 최종 결과값 
    RETRUN VRESULT;
END; 

SELECT *
FROM TBL_INSA; 

--○ TBL_INSA 테이블의 입사일을 기준으로
--   현재까지의 근무년수를 반환하는 함수를 정의한다.
--   단, 근무년수는 소수점 이하 한자리까지 계산한 결과를 반환할 수 있도록 한다.
--   함수명 : FN_WORKYEAR(입사일) 

CREATE OR REPLACE FUNCTION FN_WORKYEAR(VIBSADATE DATE)
RETURN VARCHAR2
IS
    -- 주요 변수 선언 
    VRESULT VARCHAR2(20);

BEGIN
    -- 연산 및 처리 
    VRESULT :=  TRUNC(MONTHS_BETWEEN(SYSDATE, VIBSADATE) / 12) || '년' ||
               TRUNC(MOD(MONTHS_BETWEEN(SYSDATE, VIBSADATE), 12)) || '개월';
               -- 최종 결과값 
    RETURN VRESULT;
END;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <category>제약조건</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/234</guid>
      <comments>https://aluck.tistory.com/234#entry234comment</comments>
      <pubDate>Fri, 11 Jul 2025 17:50:06 +0900</pubDate>
    </item>
    <item>
      <title>Oracle -PLSQL 실습2(반복문)</title>
      <link>https://aluck.tistory.com/233</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UDq0q/btsPfXZMZsq/iG8t6PGG0GR8oN2As7nuf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UDq0q/btsPfXZMZsq/iG8t6PGG0GR8oN2As7nuf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UDq0q/btsPfXZMZsq/iG8t6PGG0GR8oN2As7nuf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUDq0q%2FbtsPfXZMZsq%2FiG8t6PGG0GR8oN2As7nuf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;142&quot; height=&quot;142&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752217333823&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--○ 기본 반복문
-- LOOP ~ END LOOP;

-- 1. 조건과 상관없이 무조건 반복하는 구문 

-- 2. 형식 및 구조
/*
LOOP
    --실행문;
    EXIT WHEN 조건;       -- 조건이 참인 경우 반복문을 빠져나간다. 
END LOOP;
*/

--○ 1부터 10까지의 수 출력(LOOP 문 활용)

DECLARE
    --N NUMBER := 1;
    N NUMBER;
BEGIN
    N := 1;
    
    LOOP
        DBMS_OUTPUT.PUT.LINE(N);
        EXIT WHEN N&amp;gt;=10;
        N := N + 1; -- N++; N+=1;
    END LOOP;
END;

--==&amp;gt;&amp;gt;
/*
1
2
3
4
5
6
7
8
9
10


PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/

--○ WHILE 반복문
-- WHILE LOOP ~ END LOOP;

-- 1. 제어 조건이 TRUE 인 동안 일련의 문장을 반복하기 위해
--    WHILE LOOP 문장을 사용함.
--    조건은 반복이 시작될 때 체크하게 되어
--    LOOP 내의 문장이 한 번도 수행되지 않을 경우도 있다.
--    LOOP 시작할 때 조건이 FALSE 이면 반복 문장을 탈출하게 된다.

-- 2. 형식 및 구조
/*
WHILE 조건 LOOP       -- 조건이 참인 경우 반복 수행
    -- 실행문
END LOOP;
*/ 

--○ 1부터 10까지의 수 출력(LOOP 문 활용)
DECLARE
    N   NUMBER;
BEGIN
    N := 0;
    
    WHILE N&amp;lt;10 LOOP
        N := N + 1;             --[JAVA] : N++;, N+=1;
         DBMS_OUTPUT.PUT_LINE(N);
    END LOOP;
END;
--==&amp;gt;&amp;gt;
/*
1
2
3
4
5
6
7
8
9
10


PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/

--○FOR 반복문
-- FOR LOOP ~ END LOOP;

-- 1. 시작 수 에서 1씩 증가하여
--    끝낸 수가 될 때 까지 반복 수행한다.

-- 2. 형식 및 구조
/*
FOR 카운터 IN [REVERSE] 시작수 .. 끝냄수 LOOP
    -- 실행문;
END LOOP; 
*/

--○ 1부터 10까지의 수 출력(FOR LOOP 문 활용)
DECLARE 
    N   NUMBER;
BEGIN 
    FOR N IN 1 .. 10 LOOP
        DBMS_OUTPUT.PUT_LINE(N);
    END LOOP;
END;
/*
1
2
3
4
5
6
7
8
9
10


PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
--==&amp;gt;&amp;gt;

--○ 사용자로부터 임의의 단(구구단)을 입력받아
--   해당 단수의 구구단을 출력하는 PL/SQL 구문을 작성한다.
--  LOOP, WHILE LOOP, FOR LOOP 를 통해 해결한다. 

-- LOOP 문 활용
ACCEPT INPUT PROMPT '단을 입력하세요.'; 

DECLARE 
    DAN NUMBER := &amp;amp;NUM; -- 변수선언 
    N NUMBER;
BEGIN
    N := 1;

    LOOP
        DBMS_OUTPUT.PUT_LINE(DAN || ' *' || N || '=' || (DAN * N));     
    EXIT WHEN N&amp;gt;=9;
    N := N +1;
    
    END LOOP;
END;

/*
2 *1=2
2 *2=4
2 *3=6
2 *4=8
2 *5=10
2 *6=12
2 *7=14
2 *8=16
2 *9=18


PL/SQL 프로시저가 성공적으로 완료되었습니다
*/

--○ WHILE LOOP 반복문
--○ 1부터 10까지의 수 출력(LOOP 문 활용)

ACCEPT INPUT PROMPT '단을 입력'; 

DECLARE
    DAN NUMBER := &amp;amp;NUM;
    N NUMBER;
BEGIN
    N := 0;
    WHILE (N=&amp;lt;9) LOOP
        N := N +1;
        DBMS_OUTPUT.PUT_LINE(DAN || ' *' || N || '=' || (DAN * N));    
    END LOOP;      
END



/*
2 *1=2
2 *2=4
2 *3=6
2 *4=8
2 *5=10
2 *6=12
2 *7=14
2 *8=16
2 *9=18


PL/SQL 프로시저가 성공적으로 완료되었습니다
*/

ACCEPT INPUT PROMPT '단을 입력하세요.'; 

DECLARE 
    DAN NUMBER := &amp;amp;NUM;
    N   NUMBER;
BEGIN 
    FOR N IN 1 .. 9 LOOP
        DBMS_OUTPUT.PUT_LINE(DAN || ' *' || N || '=' || (DAN * N)); 
    END LOOP;
END;
/*
7 *1=7
7 *2=14
7 *3=21
7 *4=28
7 *5=35
7 *6=42
7 *7=49
7 *8=56
7 *9=63


PL/SQL 프로시저가 성공적으로 완료되었습니다
*/&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>PLSQL</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/233</guid>
      <comments>https://aluck.tistory.com/233#entry233comment</comments>
      <pubDate>Fri, 11 Jul 2025 16:02:43 +0900</pubDate>
    </item>
    <item>
      <title>Oracle -PLSQL 실습1</title>
      <link>https://aluck.tistory.com/232</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXsMxa/btsPgcRAgFW/mhNs8WhUcCkkKaGL6Thu6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXsMxa/btsPgcRAgFW/mhNs8WhUcCkkKaGL6Thu6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXsMxa/btsPgcRAgFW/mhNs8WhUcCkkKaGL6Thu6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXsMxa%2FbtsPgcRAgFW%2FmhNs8WhUcCkkKaGL6Thu6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;158&quot; height=&quot;158&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752197613992&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT USER
FROM DUAL;
--==&amp;gt;&amp;gt; SCOTT
/* SQL 접속 모두 해제 
같은 시트에 작업해도 상관없지만, 그럼 헷갈림. 
SQL 워크시트와 PL SQL 워크시트 구분해서 작업할것임 */ 

-- ■■■ PL/SQL ■■■--

-- 1. PL/SQL(Procedural Language extension to SQL)은
--    프로그래밍 언어의 특성을 가지는 SQL 의 확장이며,
--    데이터 조작과 질의 문장은 PL/SQL 의 절차적 코드 안에 포함된다.
--    또한, PL/SQL 을 사용하면 SQL로 할 수 없는 절차적 작업이 가능하다.
--    여기에서 [절차적] 이라는 단어가 가지는 의미는
--    어떤 것이 어떤 과정을 거쳐 어떻게 완료되는지
--    그 방법을 정확하게 코드에 기술한다는 것을 의미한다.

-- 2. PL/SQL 은 절차적으로 표현하기 위해
--    변수를 선언할 수 있는 기능, 
--    참과 거짓을 구별할 수 있는 기능,
--    실행 흐름을 컨트롤할 수 있는 기능 등을 제공한다.

-- 3. PL/SQL 은 블럭 구조로 되어 있으며,
--    블럭은 선언 부분, 실행 부분, 예외 처리 부분의
--    세 부분으로 구성되어 있다.
--    또한, 반드시 실행 부분은 존재해야 하며, 구조는 다음과 같다.

-- 4. 형식 및 구조
/*
([] : 생략가능)
[DECLARE]
    -- 선언문(declarations)  
BEGIN
    -- 실행문(startments)
        
    [EXCEPTON]
    -- 예외 처리문(exception handlers)
END;            
*/

-- 5. 변수 선언
/*
DECLARE
    변수명 자료형;
    변수명 자료형 := 초기값;
    
BEGIN
    PL/SQL 구문;
END;
*/
-- ERD 클라우드    
-- 트랜잭션 ROLLBACK;

SET SERVEROUTPUT ON;
--==&amp;gt;&amp;gt; 작업이 완료되었습니다.(0.064초) 
-- DBMS_OUTPUT.PUT.LINE()을 통해 
-- 화면에 결과를 출력하기 위한 환경변수 설정 

--○ 변수에 임의의 값을 대입하고 해당 변수에 담긴 값을 출력하는 
-- PL/SQL 구문 작성 

--  ■■■ ■■■ 블럭 잡아서 실행 해 줘야 함. 
DECLARE
    -- 선언부
    D1  NUMBER := 10; --D1의 데이터타입은 NUMBER이야. 
    D2  VARCHAR(30) := 'HELLO';
    D3  VARCHAR(20) := 'ORACLE';
BEGIN
    -- 실행부 
    -- System.out.prntln(D1);
    DBMS_OUTPUT.PUT_LINE(D1); -- 패키지 안에 담겨있는 PUT_LINE 함수 호출 
    DBMS_OUTPUT.PUT_LINE(D2);
    DBMS_OUTPUT.PUT_LINE(D3);
END;
--==&amp;gt;&amp;gt; 
/*
10
HELLO
ORACLE

PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/ 

--○ 변수에 임의의 값을 대입하고 추가 연산 처리하여 
--   해당 변수에 담긴 값을 출력하는 PL/SQL 구문 작성 

DECLARE
    --선언부
    V1  NUMBER := 20;
    V2  VARCHAR(30) := 'HELLO';
    V3  VARCHAR(20) := 'ORACLE';
BEGIN
    --실행부
    V1 := V1 + 10;  -- V1 +=10 ; &amp;lt;&amp;lt; 자바 형식 
    -- 위의 V1 값인 20에 10을 더한값이 출력됨 
    
    V2 := V2 || '주형이'; 
    V3 := V3 || 'World';
    DBMS_OUTPUT.PUT_LINE(V1);
    DBMS_OUTPUT.PUT_LINE(V2);
    DBMS_OUTPUT.PUT_LINE(V3);
END;
/*
30
HELLO주형이
ORACLEWorld

PL/SQL 프로시저가 성공적으로 완료되었습니다.
*/
-- JAVA

    구문
    { --시작
    
    } --끝


-- ORACLE ( {}를 사용하지 않음. )

    구문
    
    END 구문
    
    (IF (IF 시작) ~ END IF (IF문 종료))
*/

-- 블레이스가 없으므로 들여쓰기를 잘 해줘야 함 
--○ IF 문(조건문)
--   IF ~ END IF;
--   IF ~ THEN ~ ELSE ~ END IF; 
--   IF ~ THEN ~ ELSIF ~ THEN ~ ELSIF ~ THEN ~ END IF; -- ELSIF라고 쓴다. 

-- 1. PL/SQL 의 IF 문장은 다른 언어의 IF 조건문과 거의 유사하다.
--    일치하는 조건에 따라 선택적으로 작업을 수행할 수 있도록 한다.
--    TRUE 이면 THEN 과 ELSE 사이의 문장을 수행하고
--    FALSE 나 NULL 이면 ELSE 와 END IF; 사이의 문장을 수행하게 된다.

-- 2. 형식 및 구조
/*
IF 조건
    THEN 처리구문; 
END IF; -- IF시작했다 IF 끝났다. 라고 조건 잡아주기 
*/
--※ ELSE 에는 THEN 을 사용하지 않는다! 주의!

/*
IF 조건
    THEN 처리구문;
ELSE
    처리문; -- 아닐때 처리는 THEN이 없음 
END IF;
*/

--중첩구문
/*
IF (조건) -- 조건에 ()를 쓰는 걸 강사님 추천
    THEN 처리문;
ELSIF (조건)
    THEN 처리문
ELSIF (조건)
    THEN 처리문
ELSE
    처리문;
END IF;
*/

--○ 변수에 담겨있는 값에 따라
--   Excellent, Good, Fail 로 구분하여
--   결과를 출력하는 PL/SQL 구믄을 작성한다.

DECLARE
    -- 선언부
    GRADE   CHAR;
BEGIN
    GRADE := 'B';
    
    --DBMS_OUTPUT.PUT_LINE(GRADE);
    
    IF GRADE = 'A'                               
        THEN DBMS_OUTPUT.PUT_LINE('EXCELLENT');           
    ELSIF GRADE = 'B'                            
         THEN DBMS_OUTPUT.PUT_LINE('GOOD');  
    ELSE
        DBMS_OUTPUT.PUT_LINE('FAIL');
    
    END IF;
   
END;
--==&amp;gt;&amp;gt; EXCELLENT
--==&amp;gt;&amp;gt; GOOD
--==&amp;gt;&amp;gt; FAIL

--※ 외부 입력 처리

-- 1. ACCEPT 문
-- ACCEPT 변수명 PROMPT '메세지';
-- 외부 변수로부터 입력받은 데이터를 내부 변수에 전달할 때
-- [&amp;amp;외부변수명] 형태로 접근하게 된다. 

--○ 정수 2개를 외부로부터(사용자로부터) 입력받아
--   이들의 덧셈 연산 결과를 출력하는 PL/SQL 구문을 작성한다.

ACCEPT N1 PROMPT '첫 번째 정수를 입력하세요'; 
-- 창에서 10을 입력하면 외부변수인 N1에 값이 담김
ACCEPT N2 PROMPT '두 번째 정수를 입력하세요'; 

DECLARE
    --선언부
    -- &amp;rarr; 주요 변수 선언 및 초기화
    --VNUM1    NUMBER := 10;
    VNUM1    NUMBER := &amp;amp;N1; -- 위에서  입력한 10을 VNUM1 으로 끌고들어온다. 
    --VNUM2    NUMBER := 20;
    NUM2    NUMBER := &amp;amp;N2;
    VRESULT   NUMBER := 0;
BEGIN
    -- 실행부
    -- &amp;rarr; 연산 및 처리
    VRESULT := VNUM1  + VNUM2;
    
    -- &amp;rarr; 결과 출력
    DBMS_OUTPUT.PUT_LINE('처리결과 : ' || VRESULT);
END;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제 &lt;br /&gt;--&amp;nbsp;사용자로부터&amp;nbsp;입력받은&amp;nbsp;금액을&amp;nbsp;화폐&amp;nbsp;단위로&amp;nbsp;출력하는&amp;nbsp;프로그램을&amp;nbsp;작성한다. &lt;br /&gt;--&amp;nbsp;단,&amp;nbsp;반환금액은&amp;nbsp;편의상&amp;nbsp;1천원&amp;nbsp;미만,&amp;nbsp;10원&amp;nbsp;이상만&amp;nbsp;가능하다고&amp;nbsp;가정한다. &lt;br /&gt;/* &lt;br /&gt;실행&amp;nbsp;예) &lt;br /&gt;바인딩 변수 입력 대화창 &amp;rarr; 금액 입력 : 990 OR 980 이라고 입력하면&lt;br /&gt;입력받은&amp;nbsp;금액&amp;nbsp;총액&amp;nbsp;:&amp;nbsp;980원 &lt;br /&gt;화폐단위&amp;nbsp;:&amp;nbsp;오백원&amp;nbsp;1,&amp;nbsp;백원&amp;nbsp;4,&amp;nbsp;오십원&amp;nbsp;1,&amp;nbsp;십원&amp;nbsp;3&amp;nbsp; &lt;br /&gt;*/&lt;/p&gt;
&lt;pre id=&quot;code_1752217255476&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ACCEPT INPUT PROMPT '금액 입력';
DECLARE
    --○ 주요 변수 선언 및 초기화
    MONEY   NUMBER := &amp;amp;INPUT;       -- 연산을 위해 담아둘 변수
    MONEY2  NUMBER := &amp;amp;INPUT;       -- 결과 출력을 위해 입력값을 담아둘 변수(&amp;rarr; 연산과정에서 값이 변하기 때문에)
    M500    NUMBER;                 -- 500원짜리 갯수를 담아둘 변수
    M100    NUMBER;                 -- 100원 짜리 개수를 담아둘 변수
    M50     NUMBER;                 --  50원 짜리 개수를 담아둘 변수
    M10     NUMBER;                 --  10원 짜리 개수를 담아둘 변수  
BEGIN
    --○ 연산 및 처리
    -- MONEY 를 500으로 나눠서 몫을 취하고 나머지는 버린다.   &amp;rarr; 500원의 갯수
    M500 := TRUNC(MONEY / 500);
    
    -- MONEY를 500으로 나눠서 몫은 버리고 나머지를 취한다.&amp;lt;&amp;lt; MOD(MONEY, 500)  &amp;rarr; 500원의 갯수를 뺀 나머지. 
    -- 500원짜리는 빠져나가고 남은 금액으로 처리해야 하기에 
    MONEY := MOD(MONEY, 500); 
    
    -- MONEY 를 100으로 나눠서 몫을 취하고 나머지는 버린다.   &amp;rarr; 100원의 갯수
    M100 := TRUNC(MONEY / 100);
    
    -- MONEY 를 100으로 나눠서 몫은 버리고 나머지를 취한다.   &amp;rarr; 100원의 갯수 확인하고 남은 금액
    -- 이 금액으로 MONEY 를 갱신.    
    MONEY := MOD(MONEY, 100);
    
    -- MONEY 를 50으로 나눠서 몫을 취하고 나머지는 버린다.    &amp;rarr; 50원의 갯수
    M50 := TRUNC(MONEY / 50);
 
    -- MONEY 를 50으로 나눠서 몫은 버리고 나머지를 취한다.    &amp;rarr; 50원의 갯수 확인하고 남은 금액
    -- 이 금액으로 MONEY 를 갱신
    MONEY := MOD(MONEY, 50);
    
    -- MONEY 를 10으로 나눠서 몫을 취하고 나머지는 버린다.    &amp;rarr; 10원의 갯수
    M10 := TRUNC(MONEY / 10);

    MONEY := MOD(MONEY, 10);
    
    --○ 결과 출력
    -- 취합된 결과(화폐 단위별 개수)를 형식에 맞게 최종 출력한다.
    
   DBMS_OUTPUT.PUT_LINE('입력받은 금액 총액 : ' || MONEY2 || '원');
   DBMS_OUTPUT.PUT_LINE('화폐 단위 : 오백원 ' || M500   
                                       || ', 백원 '  ||  M100 
                                       || ', 오십원 '||  M50   
                                       || ', 십원 '  ||  M10);                             
END;

/*
END;
입력받은 금액 총액 : 950원
화폐 단위 : 오백원 1, 백원 4, 오십원 1, 십원 0

PL/SQL 프로시저가 성공적으로 완료되었습니다.

*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>PLSQL</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/232</guid>
      <comments>https://aluck.tistory.com/232#entry232comment</comments>
      <pubDate>Fri, 11 Jul 2025 16:01:31 +0900</pubDate>
    </item>
    <item>
      <title>Oracle -DELETE, VIEW 생성</title>
      <link>https://aluck.tistory.com/231</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I6HiC/btsPdBXMoSs/vGwQmwjw6VeCKny3Ub7gyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I6HiC/btsPdBXMoSs/vGwQmwjw6VeCKny3Ub7gyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I6HiC/btsPdBXMoSs/vGwQmwjw6VeCKny3Ub7gyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI6HiC%2FbtsPdBXMoSs%2FvGwQmwjw6VeCKny3Ub7gyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;115&quot; height=&quot;115&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752196982425&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--■■■ DELETE ■■■-- 
-- 1. 테이블에서 지정된 행(레코드)을 삭제하는데 사용하는 구문

-- 2. 형식 및 구조
-- DELETE [FROM] 테이블명
-- [WHERE 조건절]; 

SELECT *
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 198;
-- 198	Donald	OConnell	DOCONNEL	650.507.9833	2007-06-21	SH_CLERK	2600		124	50

DELETE
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 198;
-- 1 행 이(가) 삭제되었습니다.
SELECT *
FROM EMPLOYEES;

ROLLBACK;
-- 롤백완료 

--○ EMPLOYEES 테이블에서 직원들의 데이터를 삭제한다.
--  단, 부서명이 'IT'인 경우로 한정한다.
--※ 실제로는 EMPLOYEES 테이블의 데이터가(삭제하고자 하는 대상)
--   다른 테이블(혹은 자기 자신 테이블)에 의해 참조당하고 있는 경우
--   삭제되지 않을 수 있다는 상황을 인지해야 하며...
--   그에 대한 이유도 알아야 한다. 

SELECT *
FROM EMPLOYEES;

SELECT *
FROM DEPARTMENTS;
-- 60 

DELETE
FROM EMPLOYEES
WHERE DEPARTMENT_ID = (
                         SELECT DEPARTMENT_ID
                         FROM DEPARTMENTS
                         WHERE DEPARTMENT_NAME = 'IT'
                         );
--==&amp;gt;&amp;gt; 에러 발생
/*
ORA-02292: integrity constraint (HR.DEPT_MGR_FK) violated - child record found
*/

--■■■ 뷰(VIEW) ■■■-- 

-- 1. 뷰(VIEW)란 이미 특정한 데이터베이스 내에 존재하는
--    하나 이상의 테이블에서 사용자가 얻기 원하는 데이터들만을
--    원하는 형태로 정확하고 편하게 가져오기 위하여
--    사전에 원하는 컬럼들만 모아서 만들어놓은 가상의 테이블로
--    편의성 및 보안에 목적이 있다.

--    가상의 테이블이란 뷰가 실제로 존재하는 테이블(객체)이 아니라
--    하나 이상의 테이블에서 파생된 또다른 정보를 볼 수 있는 방법이며
--    그 정보를 추출해내는 SQL 문장이라고 볼 수 있다. (뷰는 하드디스크에 있는게 아님) 

-- 2. 형식 및 구조
-- CREATE [OR REPLACE] VIEW 뷰이름
-- [(ALIAS[, ALIAS, ...])]
-- AS
-- 서브쿼리
-- [WITH CHECK OPTION]
-- [WITH READ ONLY];

--○ 뷰(VIEW) 생성
CREATE OR REPLACE VIEW VIEW_EMPLOYEES
AS
SELECT E.FIRST_NAME, E.LAST_NAME 
     , D.DEPARTMENT_NAME, L.CITY
     , C.COUNTRY_NAME, R.REGION_NAME
FROM EMPLOYEES E, DEPARTMENTS D, LOCATIONS L, COUNTRIES C, REGIONS R
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID(+)
  AND D.LOCATION_ID = L.LOCATION_ID(+)
  AND L.COUNTRY_ID = C.COUNTRY_ID(+)
  AND C.REGION_ID = R.REGION_ID(+);
--==&amp;gt;&amp;gt; View VIEW_EMPLOYEES이(가) 생성되었습니다.

--○ 뷰(VIEW) 조회
SELECT *
FROM VIEW_EMPLOYEES;
--==&amp;gt;&amp;gt; 
/*
Alexander	Hunold	IT	Southlake	United States of America	Americas
Bruce	Ernst	IT	Southlake	United States of America	Americas
David	Austin	IT	Southlake	United States of America	Americas
Valli	Pataballa	IT	Southlake	United States of America	Americas
Diana	Lorentz	IT	Southlake	United States of America	Americas
Matthew	Weiss	Shipping	South San Francisco	United States of America	Americas
Adam	Fripp	Shipping	South San Francisco	United States of America	Americas
Payam	Kaufling	Shipping	South San Francisco	United States of America	Americas
Shanta	Vollman	Shipping	South San Francisco	United States of America	Americas
Kevin	Mourgos	Shipping	South San Francisco	United States of America	Americas
Julia	Nayer	Shipping	South San Francisco	United States of America	Americas
Irene	Mikkilineni	Shipping	South San Francisco	United States of America	Americas
James	Landry	Shipping	South San Francisco	United States of America	Americas
Steven	Markle	Shipping	South San Francisco	United States of America	Americas
Laura	Bissot	Shipping	South San Francisco	United States of America	Americas
Mozhe	Atkinson	Shipping	South San Francisco	United States of America	Americas
James	Marlow	Shipping	South San Francisco	United States of America	Americas
TJ	Olson	Shipping	South San Francisco	United States of America	Americas
Jason	Mallin	Shipping	South San Francisco	United States of America	Americas
Michael	Rogers	Shipping	South San Francisco	United States of America	Americas
Ki	Gee	Shipping	South San Francisco	United States of America	Americas
Hazel	Philtanker	Shipping	South San Francisco	United States of America	Americas
Renske	Ladwig	Shipping	South San Francisco	United States of America	Americas
Stephen	Stiles	Shipping	South San Francisco	United States of America	Americas
John	Seo	Shipping	South San Francisco	United States of America	Americas
Joshua	Patel	Shipping	South San Francisco	United States of America	Americas
Trenna	Rajs	Shipping	South San Francisco	United States of America	Americas
Curtis	Davies	Shipping	South San Francisco	United States of America	Americas
Randall	Matos	Shipping	South San Francisco	United States of America	Americas
Peter	Vargas	Shipping	South San Francisco	United States of America	Americas
Winston	Taylor	Shipping	South San Francisco	United States of America	Americas
Jean	Fleaur	Shipping	South San Francisco	United States of America	Americas
Martha	Sullivan	Shipping	South San Francisco	United States of America	Americas
Girard	Geoni	Shipping	South San Francisco	United States of America	Americas
Nandita	Sarchand	Shipping	South San Francisco	United States of America	Americas
Alexis	Bull	Shipping	South San Francisco	United States of America	Americas
Julia	Dellinger	Shipping	South San Francisco	United States of America	Americas
Anthony	Cabrio	Shipping	South San Francisco	United States of America	Americas
Kelly	Chung	Shipping	South San Francisco	United States of America	Americas
Jennifer	Dilly	Shipping	South San Francisco	United States of America	Americas
Timothy	Gates	Shipping	South San Francisco	United States of America	Americas
Randall	Perkins	Shipping	South San Francisco	United States of America	Americas
Sarah	Bell	Shipping	South San Francisco	United States of America	Americas
Britney	Everett	Shipping	South San Francisco	United States of America	Americas
Samuel	McCain	Shipping	South San Francisco	United States of America	Americas
Vance	Jones	Shipping	South San Francisco	United States of America	Americas
Alana	Walsh	Shipping	South San Francisco	United States of America	Americas
Kevin	Feeney	Shipping	South San Francisco	United States of America	Americas
Donald	OConnell	Shipping	South San Francisco	United States of America	Americas
Douglas	Grant	Shipping	South San Francisco	United States of America	Americas
Shelley	Higgins	Accounting	Seattle	United States of America	Americas
William	Gietz	Accounting	Seattle	United States of America	Americas
Nancy	Greenberg	Finance	Seattle	United States of America	Americas
Daniel	Faviet	Finance	Seattle	United States of America	Americas
John	Chen	Finance	Seattle	United States of America	Americas
Ismael	Sciarra	Finance	Seattle	United States of America	Americas
Jose Manuel	Urman	Finance	Seattle	United States of America	Americas
Luis	Popp	Finance	Seattle	United States of America	Americas
Steven	King	Executive	Seattle	United States of America	Americas
Neena	Kochhar	Executive	Seattle	United States of America	Americas
Lex	De Haan	Executive	Seattle	United States of America	Americas
Den	Raphaely	Purchasing	Seattle	United States of America	Americas
Alexander	Khoo	Purchasing	Seattle	United States of America	Americas
Shelli	Baida	Purchasing	Seattle	United States of America	Americas
Sigal	Tobias	Purchasing	Seattle	United States of America	Americas
Guy	Himuro	Purchasing	Seattle	United States of America	Americas
Karen	Colmenares	Purchasing	Seattle	United States of America	Americas
Jennifer	Whalen	Administration	Seattle	United States of America	Americas
Michael	Hartstein	Marketing	Toronto	Canada	Americas
Pat	Fay	Marketing	Toronto	Canada	Americas
Susan	Mavris	Human Resources	London	United Kingdom	Europe
John	Russell	Sales	Oxford	United Kingdom	Europe
Karen	Partners	Sales	Oxford	United Kingdom	Europe
Alberto	Errazuriz	Sales	Oxford	United Kingdom	Europe
Gerald	Cambrault	Sales	Oxford	United Kingdom	Europe
Eleni	Zlotkey	Sales	Oxford	United Kingdom	Europe
Peter	Tucker	Sales	Oxford	United Kingdom	Europe
David	Bernstein	Sales	Oxford	United Kingdom	Europe
Peter	Hall	Sales	Oxford	United Kingdom	Europe
Christopher	Olsen	Sales	Oxford	United Kingdom	Europe
Nanette	Cambrault	Sales	Oxford	United Kingdom	Europe
Oliver	Tuvault	Sales	Oxford	United Kingdom	Europe
Janette	King	Sales	Oxford	United Kingdom	Europe
Patrick	Sully	Sales	Oxford	United Kingdom	Europe
Allan	McEwen	Sales	Oxford	United Kingdom	Europe
Lindsey	Smith	Sales	Oxford	United Kingdom	Europe
Louise	Doran	Sales	Oxford	United Kingdom	Europe
Sarath	Sewall	Sales	Oxford	United Kingdom	Europe
Clara	Vishney	Sales	Oxford	United Kingdom	Europe
Danielle	Greene	Sales	Oxford	United Kingdom	Europe
Mattea	Marvins	Sales	Oxford	United Kingdom	Europe
David	Lee	Sales	Oxford	United Kingdom	Europe
Sundar	Ande	Sales	Oxford	United Kingdom	Europe
Amit	Banda	Sales	Oxford	United Kingdom	Europe
Lisa	Ozer	Sales	Oxford	United Kingdom	Europe
Harrison	Bloom	Sales	Oxford	United Kingdom	Europe
Tayler	Fox	Sales	Oxford	United Kingdom	Europe
William	Smith	Sales	Oxford	United Kingdom	Europe
Elizabeth	Bates	Sales	Oxford	United Kingdom	Europe
Sundita	Kumar	Sales	Oxford	United Kingdom	Europe
Ellen	Abel	Sales	Oxford	United Kingdom	Europe
Alyssa	Hutton	Sales	Oxford	United Kingdom	Europe
Jonathon	Taylor	Sales	Oxford	United Kingdom	Europe
Jack	Livingston	Sales	Oxford	United Kingdom	Europe
Charles	Johnson	Sales	Oxford	United Kingdom	Europe
Hermann	Baer	Public Relations	Munich	Germany	Europe
Kimberely	Grant				
*/

--○ 뷰(VIEW) 구조 확인
DESC VIEW_EMPLOYEES;
/*
이름              널?       유형           
--------------- -------- ------------ 
FIRST_NAME               VARCHAR2(20) 
LAST_NAME       NOT NULL VARCHAR2(25) 
DEPARTMENT_NAME          VARCHAR2(30) 
CITY                     VARCHAR2(30) 
COUNTRY_NAME             VARCHAR2(40) 
REGION_NAME              VARCHAR2(25) 
*/&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <category>제약조건</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/231</guid>
      <comments>https://aluck.tistory.com/231#entry231comment</comments>
      <pubDate>Fri, 11 Jul 2025 10:23:26 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 테이블 전체 컬럼 이름UPDATE</title>
      <link>https://aluck.tistory.com/230</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctspyr/btsPdyfXHwF/RbAwkka4IfeK9lH8y6R75K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctspyr/btsPdyfXHwF/RbAwkka4IfeK9lH8y6R75K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctspyr/btsPdyfXHwF/RbAwkka4IfeK9lH8y6R75K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fctspyr%2FbtsPdyfXHwF%2FRbAwkka4IfeK9lH8y6R75K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;120&quot; height=&quot;120&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752193950611&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT USER
FROM DUAL;
--==&amp;gt;&amp;gt; SCOTT

SELECT *
FROM TBL_SAWON;

-- TBL_SAWON 테이블 백업(&amp;rarr; 데이터복사 2025-07-11 09:05:10);
CREATE TABLE TBL_SAWONBACKUP
AS
SELECT *
FROM TBL_SAWON;
-- Table TBL_SAWONBACKUP이(가) 생성되었습니다.

--&amp;gt; TBL_SAWON 테이블의 데이터들만 백업을 수행
--  즉, 다른 이름의 테이블 형태로 저장해둔 상황

-- 확인
SELECT *
FROM TBL_SAWONBACKUP;
SELECT *
FROM TBL_SAWON;

--○ 상황발생
UPDATE TBL_SAWON
SET SANAME = '똘똘이';
COMMIT;
-- 모두 똘똘이가 된 상황 

SELECT *
FROM TBL_SAWON;
/*
1013	똘똘이	8502071234557	1999-10-10	2000
1001	똘똘이	0004183234567	2025-07-02	100
1002	똘똘이	0406274234567	2017-11-05	2000
1003	똘똘이	9904171234567	2011-01-03	3000
1004	똘똘이	8512161234567	1998-08-16	2000
1005	똘똘이	9302022234567	2018-07-10	7700
1006	똘똘이	7506171234567	1997-03-10	4000
1007	똘똘이	9704252234567	2007-12-10	2000
1008	똘똘이	7905082234567	1998-08-16	2000
1009	똘똘이	7012181234567	1990-10-10	3000
1010	똘똘이	7502201234567	1998-08-16	1000
1011	똘똘이	7005132234567	1998-08-16	1000
1012	똘똘이	0502204234567	2015-08-14	1000
*/

ROLLBACK;
ROLLBACK;
ROLLBACK;

-- 위와 같이 UPDATE 처리 이후에 함께 COMMIT 을 수행하였기 때문에
-- ROLLBACK 은 불가능한 상황이다.
-- 하지만, TBL_SAWONBACKUP 테이블에 데이터를 백업해 두었다. 
-- SANAME 컬럼의 내용만 추출하여 '똘똘이' 대신 넣어줄 수 있다는 것이다. 

UPDATE TBL_SAWON
SET SANAME = '김주형';
WHERE SANO = 1001;

UPDATE TBL_SAWON
SET SANAME = '이유빈';
WHERE SANO = 1002;

UPDATE TBL_SAWON
SET SANAME = '유한';
WHERE SANO = 1003;

COMMIT;

UPDATE TBL_SAWON
SET SANAME=(SELECT SANAME 
            FROM TBL_SAWONBACKUP
            WHERE SANO=TBL_SAWON.SANO
    );
 
SELECT *
FROM TBL_SAWON;
-- 원상복구 
/*
1013	김훈	8502071234557	1999-10-10	2000
1001	김주형	0004183234567	2025-07-02	100
1002	이유빈	0406274234567	2017-11-05	2000
1003	유한	9904171234567	2011-01-03	3000
1004	이상이	8512161234567	1998-08-16	2000
1005	아이유	9302022234567	2018-07-10	7700
1006	이이경	7506171234567	1997-03-10	4000
1007	미노이	9704252234567	2007-12-10	2000
1008	선우선	7905082234567	1998-08-16	2000
1009	선동열	7012181234567	1990-10-10	3000
1010	남희석	7502201234567	1998-08-16	1000
1011	선우용녀	7005132234567	1998-08-16	1000
1012	남궁선	0502204234567	2015-08-14	1000
*/

COMMIT;
-- 커밋완료&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/230</guid>
      <comments>https://aluck.tistory.com/230#entry230comment</comments>
      <pubDate>Fri, 11 Jul 2025 09:33:17 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - UPDATE 실습2</title>
      <link>https://aluck.tistory.com/229</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY0yaO/btsPcUXxxeX/TicCsFgl7TQ7ukcFtQ89F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY0yaO/btsPcUXxxeX/TicCsFgl7TQ7ukcFtQ89F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY0yaO/btsPcUXxxeX/TicCsFgl7TQ7ukcFtQ89F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY0yaO%2FbtsPcUXxxeX%2FTicCsFgl7TQ7ukcFtQ89F0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;148&quot; height=&quot;148&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752137464096&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT USER
FROM DUAL;
-- HR

--  EMPLOYEES 테이블의 직원들 SALARY를 10% 인상한다.
--  단, 부서명이 'IT'인 경우로 한정한다.
--  (UPDATE 쿼리문 실행 및 이후 결과를 확인한 후 ROLLBACK 할 것)
SELECT *
FROM TAB;

SELECT *
FROM EMPLOYEES;
--==&amp;gt; 부서명 없음~!!!
--  현재, EMPLOYEES 테이블은 부서명이 없다. &amp;gt;&amp;gt; 부서명IT는 DEPARTMENT 테이블에서 찾아라.. 

SELECT *
FROM DEPARTMENTS;
/*
EPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID LOCATION_ID
------------- ------------------------------ ---------- -----------
           10 Administration                        200        1700
           20 Marketing                             201        1800
           30 Purchasing                            114        1700
           40 Human Resources                       203        2400
           50 Shipping                              121        1500
           60 IT                                    103        1400
                            :
*/
-- 60번으로 한정한다... 

UPDATE EMPLOYEES
SET SALARY = SALARY * 1.1
WHERE DEPARTMENT_ID = 60; -- NAME 없고 ID만 있는 걸 눈으로 확인함.

-- 1) 부서명 IT 부서의 부서아이디 
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
WHERE DEPARTMENT_NAME = 'IT';
--==&amp;gt;&amp;gt; 60 

UPDATE EMPLOYEES
SET SALARY = SALARY * 1.1
WHERE DEPARTMENT_ID = 부서명 IT 부서의 부서아이디; 

UPDATE EMPLOYEES
SET SALARY = SALARY * 1.1
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                       FROM DEPARTMENTS
                       WHERE DEPARTMENT_NAME = 'IT'); 
--==&amp;gt;&amp;gt; 5개 행 이(가) 업데이트되었습니다.
SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                       FROM DEPARTMENTS
                       WHERE DEPARTMENT_NAME = 'IT'); 
/*
103	Alexander	Hunold	AHUNOLD	590.423.4567	2006-01-03	IT_PROG	9900		102	60
104	Bruce	Ernst	BERNST	590.423.4568	2007-05-21	IT_PROG	6600		103	60
105	David	Austin	DAUSTIN	590.423.4569	2005-06-25	IT_PROG	5280		103	60
106	Valli	Pataballa	VPATABAL	590.423.4560	2006-02-05	IT_PROG	5280		103	60
107	Diana	Lorentz	DLORENTZ	590.423.5567	2007-02-07	IT_PROG	4620		103	60
*/

ROLLBACK;
--○ EMPLOYEES 테이블에서 JOB_TITLE이 Sales Manager 인 사원의
--   SALARY 를 해당 직무(직종)의 최고 급여(MAX_SALARY)로 수정하는 쿼리문을 구성한다. 
--   단, 입사일이 2006년 이전(해당 년도 제외) 입사자에 한하여
--  적용할 수 있도록 처리한다.  -- MAX_SALARY 20080 
--  (UPDATE 쿼리문 실행 및 이후 결과를 확인한 후 ROLLBACK 할 것)

SELECT *
FROM JOBS; 
SELECT *
FROM EMPLOYEES;

SELECT *
FROM EMPLOYEES
WHERE JOB_ID = 'SA_MAN';
/*
145	John	Russell	JRUSSEL	011.44.1344.429268	2004-10-01	SA_MAN	14000	0.4	100	80
146	Karen	Partners	KPARTNER	011.44.1344.467268	2005-01-05	SA_MAN	13500	0.3	100	80
147	Alberto	Errazuriz	AERRAZUR	011.44.1344.429278	2005-03-10	SA_MAN	12000	0.3	100	80
148	Gerald	Cambrault	GCAMBRAU	011.44.1344.619268	2007-10-15	SA_MAN	11000	0.3	100	80
149	Eleni	Zlotkey	EZLOTKEY	011.44.1344.429018	2008-01-29	SA_MAN	10500	0.2	100	80
*/

UPDATE EMPLOYEES
SET SALARY =('Sales Manager'의 MAX_SALARY)
WHERE JOB_ID = ('Sales Manager'의 JOB_ID)
AND TO_NUMBER(TO_CHAR(HIRE_DATE,'YYYY')) &amp;lt; 2006;

-- ('Sales Manager'의 MAX_SALARY)
SELECT MAX_SALARY
FROM JOBS
WHERE JOB_TITLE = 'Sales Manager';
-- 20080

-- ('Sales Manager'의 JOB_ID)
SELECT JOB_ID
FROM JOBS
WHERE JOB_TITLE = 'Sales Manager';
--==&amp;gt;&amp;gt; SA_MAN

UPDATE EMPLOYEES
SET SALARY =(SELECT MAX_SALARY
                FROM JOBS
                WHERE JOB_TITLE = 'Sales Manager')
WHERE JOB_ID = (SELECT JOB_ID
                FROM JOBS
                WHERE JOB_TITLE = 'Sales Manager')
AND TO_NUMBER(TO_CHAR(HIRE_DATE,'YYYY')) &amp;lt; 2006;
--==&amp;gt;&amp;gt; 3개 행 이(가) 업데이트되었습니다.

SELECT *
FROM EMPLOYEES
WHERE JOB_ID = 'SA_MAN';
/*
145	John	Russell	JRUSSEL	011.44.1344.429268	2004-10-01	SA_MAN	20080	0.4	100	80
146	Karen	Partners	KPARTNER	011.44.1344.467268	2005-01-05	SA_MAN	20080	0.3	100	80
147	Alberto	Errazuriz	AERRAZUR	011.44.1344.429278	2005-03-10	SA_MAN	20080	0.3	100	80
148	Gerald	Cambrault	GCAMBRAU	011.44.1344.619268	2007-10-15	SA_MAN	11000	0.3	100	80
149	Eleni	Zlotkey	EZLOTKEY	011.44.1344.429018	2008-01-29	SA_MAN	10500	0.2	100	80
*/

ROLLBACK; 
-- 롤백 완료 

SELECT *
FROM DEPARTMENTS;

--Finance
--Executive
--Accounting

SELECT *
FROM EMPLOYEES;

--○ EMPLOYEES 테이블에서 SALARY를
--   각 부서의 이름별로 다른 인상률을 적용하여 수정할 수 있도록 한다.
-- Finance &amp;rarr; 10%
-- Executive &amp;rarr; 15%
-- Accounting &amp;rarr; 20%
-- 나머지 &amp;rarr; 0%
-- (UPDATE 쿼리문 실행 및 이후 결과를 확인한 후 ROLLBACK 할 것)

-- 부서명 Finance , Executive, Accounting 조회
-- 상황에 따라 분기하는 구문
UPDATE EMPLOYEES
SET SALARY = CASE DEPARTMENT_ID WHEN ('Finance'의 부서아이디) 일 때 --DEPARTMENT NAME 이 없기 때문에 
                                THEN SARARY * 1.1
                                WHEN('Executive'의 부서아이디)
                                THEN SARARY * 1.15
                                WHEN('Accounting'의 부서아이디)
                                THEN SARARY * 1.2
                                ELSE SARARY
            END; 

--('Finance'의 부서아이디)
SELECT DEPARTMENT_ID
        FROM DEPARTMENTS
        WHERE DEPARTMENT_NAME = 'Finance';
--==&amp;gt;&amp;gt; 100 

-- ('Executive'의 부서아이디)
SELECT DEPARTMENT_ID
        FROM DEPARTMENTS
        WHERE DEPARTMENT_NAME = 'Executive';
--==&amp;gt;&amp;gt; 90 

-- ('Accounting'의 부서아이디)
SELECT DEPARTMENT_ID
        FROM DEPARTMENTS
        WHERE DEPARTMENT_NAME = 'Accounting';
--==&amp;gt;&amp;gt; 110 

UPDATE  EMPLOYEES
SET SALARY = CASE DEPARTMENT_ID WHEN (
                                        SELECT DEPARTMENT_ID
                                        FROM DEPARTMENTS
                                        WHERE DEPARTMENT_NAME = 'Finance'
                                     )
                                THEN SALARY * 1.1
                                WHEN (
                                        SELECT DEPARTMENT_ID
                                        FROM DEPARTMENTS
                                        WHERE DEPARTMENT_NAME = 'Executive'
                                     )
                                THEN SALARY * 1.15
                                WHEN (
                                        SELECT DEPARTMENT_ID
                                        FROM DEPARTMENTS
                                        WHERE DEPARTMENT_NAME = 'Accounting'
                                     )
                                THEN SALARY * 1.2
                                ELSE SALARY
             END;
--==&amp;gt;&amp;gt; 107개 행 이(가) 업데이트되었습니다. &amp;gt;&amp;gt; 이렇게 해도 기능상 문제는 없음 

ROLLBACK; 
--==&amp;gt;&amp;gt; 롤백 완료.

-- 메모리 덜 쓰게 하려면 
UPDATE  EMPLOYEES
SET SALARY = CASE DEPARTMENT_ID WHEN (
                                        SELECT DEPARTMENT_ID
                                        FROM DEPARTMENTS
                                        WHERE DEPARTMENT_NAME = 'Finance'
                                     )
                                THEN SALARY * 1.1
                                WHEN (
                                        SELECT DEPARTMENT_ID
                                        FROM DEPARTMENTS
                                        WHERE DEPARTMENT_NAME = 'Executive'
                                     )
                                THEN SALARY * 1.15
                                WHEN (
                                        SELECT DEPARTMENT_ID
                                        FROM DEPARTMENTS
                                        WHERE DEPARTMENT_NAME = 'Accounting'
                                     )
                                THEN SALARY * 1.2
                                ELSE SALARY
             END                   
WHERE DEPARTMENT_ID 
      IN (100,90,110);
            SELECT DEPARTMENT_ID
            FROM DEPARTMENTS
            WHERE DEPARTMENT_NAME IN ('Finance', 'Executive', 'Accounting')
         );
-- (100,90,110)
WHERE DEPARTMENT_ID 
            SELECT DEPARTMENT_ID
            FROM DEPARTMENTS
            WHERE DEPARTMENT_NAME IN ('Finance', 'Executive', 'Accounting');
/*
90
100
110
*/
-- 최종쿼리문
UPDATE  EMPLOYEES
SET SALARY = CASE DEPARTMENT_ID WHEN (
                                        SELECT DEPARTMENT_ID
                                        FROM DEPARTMENTS
                                        WHERE DEPARTMENT_NAME = 'Finance'
                                     )
                                THEN SALARY * 1.1
                                WHEN (
                                        SELECT DEPARTMENT_ID
                                        FROM DEPARTMENTS
                                        WHERE DEPARTMENT_NAME = 'Executive'
                                     )
                                THEN SALARY * 1.15
                                WHEN (
                                        SELECT DEPARTMENT_ID
                                        FROM DEPARTMENTS
                                        WHERE DEPARTMENT_NAME = 'Accounting'
                                     )
                                THEN SALARY * 1.2
                                ELSE SALARY
             END                   
WHERE DEPARTMENT_ID 
      IN (
            SELECT DEPARTMENT_ID
            FROM DEPARTMENTS
            WHERE DEPARTMENT_NAME IN ('Finance', 'Executive', 'Accounting'));
--==&amp;gt;&amp;gt; 11개 행 이(가) 업데이트되었습니다.

ROLLBACK;
-- 롤백완료 




-- 『』  ◀  ★
--※ 
--○
/*
*/

-- &amp;rarr;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <category>제약조건</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/229</guid>
      <comments>https://aluck.tistory.com/229#entry229comment</comments>
      <pubDate>Thu, 10 Jul 2025 17:51:43 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - UPDATE 실습1</title>
      <link>https://aluck.tistory.com/228</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xoDoI/btsPcwh6d8w/5FTL9aYIyKT882OalOh55K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xoDoI/btsPcwh6d8w/5FTL9aYIyKT882OalOh55K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xoDoI/btsPcwh6d8w/5FTL9aYIyKT882OalOh55K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxoDoI%2FbtsPcwh6d8w%2F5FTL9aYIyKT882OalOh55K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;142&quot; height=&quot;142&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752134298679&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT USER
FROM DUAL;
--==&amp;gt;&amp;gt; SCOTT

--■■■ UPDATE ■■■-- 

--1. 테이블에서 기존 데이터를 변경하는 구문.

-- 2. 형식 및 구조
/*
UPDATE 테이블명
SET 컬럼명=변경할값[, 컬럼명=변경할값, ...]
[WHERE 조건절] --작성순서1
*/

SELECT *
FROM TBL_SAWON;

--○ TBL_SAWON 테이블에서 사원번호 1003번 사원의
--   주민번호를 [000417] -&amp;gt; 9904171234567]로 수정한다.

UPDATE TBL_SAWON
SET JUBUN='9904171234567'
WHERE SANO=1003; 
--==&amp;gt;&amp;gt; 1 행 이(가) 업데이트되었습니다.

SELECT *
FROM TBL_SAWON;
-- 1003	유한	9904171234567	2011-01-03	3000

-- 실행 후 COMMIT 또는 ROLLBACK 을 반드시 선택적으로 실행
COMMIT;
-- 커밋 완료.

DESC TBL_SAWON;
--==&amp;gt;&amp;gt; 
/*
이름       널? 유형           
-------- -- ------------ 
SANO        NUMBER(4)    
SANAME      VARCHAR2(30) 
JUBUN       CHAR(13)     
HIREDATE    DATE         
SAL         NUMBER(10)  
*/
--○ TBL_SAWON 테이블에서 1005번 사원의 입사일과 급여를
-- 각각 2018-07-10, 7700 으로 변경한다.

UPDATE TBL_SAWON
SET HIREDATE= TO_DATE('2018-07-10', 'YYYY-MM-DD')
    ,SAL = 7700
WHERE SANO=1005;
--==&amp;gt;&amp;gt; 
-- 1005	아이유	9302022234567	2018-07-10	7700

COMMIT;

-- TBL_INSA 테이블 복사(데이터복사)
CREATE TABLE TBL_INSABACKUP
AS
SELECT *
FROM TBL_INSA;
-- Table TBL_INSABACKUP이(가) 생성되었습니다.

DESC TBL_INSABACKUP;
/*
이름       널?       유형           
-------- -------- ------------ 
NUM      NOT NULL NUMBER(5)    
NAME     NOT NULL VARCHAR2(20) 
SSN      NOT NULL VARCHAR2(14) 
IBSADATE NOT NULL DATE         
CITY              VARCHAR2(10) 
TEL               VARCHAR2(15) 
BUSEO    NOT NULL VARCHAR2(15) 
JIKWI    NOT NULL VARCHAR2(15) 
BASICPAY NOT NULL NUMBER(10)   
SUDANG   NOT NULL NUMBER(10)   

*/
--○ TBL_INSABACKUP 테이블에서 직위가 과장과 부장만 수당 10% 인상
SELECT NAME, JIKWI, SUDANG, SUDANG *1.1 --&quot;10인상된 수당&quot; 
UPDATE TBL_INSABACKUP
SET SUDANG = SUDANG + SUDANG *1.1 
WHERE JIKWI IN('과장','부장');

UPDATE TBL_INSABACKUP
SET SUDANG = SUDANG *1.1 --&quot;10인상된 수당&quot; 
WHERE JIKWI IN('과장','부장');
-- 15개 행 이(가) 업데이트되었습니다.
-- 위의 행과 비교 후 커밋

COMMIT;

--○ TBL_INSABACKUP 테이블에서 전화번호가 016, 017, 018, 019 로 시작하는
--   전화번호인 경우 이를 모두 010으로 변경한다.
--   EX) 국번만 변경하는거 

DESC TBL_INSABACKUP;

SELECT *
FROM TBL_INSABACKUP;

SELECT *
FROM TBL_INSABACKUP
WHERE TEL IN (016, 017, 018, 019); -- X 
-- 에러
/*
ORA-01722: invalid number
01722. 00000 -  &quot;invalid number&quot;
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.
*/

SELECT *
FROM TBL_INSABACKUP
WHERE TEL IN ('016', '017', '018', '019'); 
-- 조회결과없음 전화번호가 016..  인 경우만 찾는거니까

UPDATE TBL_INSABACKUP
SET 전화번호 = 기존 전화번호의 앞 세자리만 '010'으로 수정하고 나머지 번호는 그대로 유지 
WHERE 전화번호 앞 3자리가 중 하나일 경우;

UPDATE TBL_INSABACKUP
SET 전화번호 = 기존 전화번호의 앞 세자리만 '010'으로 수정하고 나머지 번호는 그대로 유지 
WHERE SUBSTR(TEL, 1, 3) IN ('016~019');

UPDATE TBL_INSABACKUP
SET TEL='010' || SUBSTR(TEL,4) 
WHERE SUBSTR(TEL, 1, 3) IN ('016', '017', '018', '019'); 
-- 24개 행 이(가) 업데이트되었습니다.

COMMIT; 
커밋 완료.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>Update</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/228</guid>
      <comments>https://aluck.tistory.com/228#entry228comment</comments>
      <pubDate>Thu, 10 Jul 2025 16:58:23 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - DEFAULT 표현식 실습</title>
      <link>https://aluck.tistory.com/227</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b48ojs/btsPbYxXYjY/hFss2oDflRbGcNFAphAMT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b48ojs/btsPbYxXYjY/hFss2oDflRbGcNFAphAMT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b48ojs/btsPbYxXYjY/hFss2oDflRbGcNFAphAMT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb48ojs%2FbtsPbYxXYjY%2FhFss2oDflRbGcNFAphAMT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;116&quot; height=&quot;116&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--■■■&amp;nbsp;DEFAULT&amp;nbsp;표현식■■■-- &lt;br /&gt;--&amp;nbsp;1.&amp;nbsp;INSERT와&amp;nbsp;UPDATE&amp;nbsp;구문에서 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;사용자가&amp;nbsp;전달하는&amp;nbsp;특정&amp;nbsp;값이&amp;nbsp;아닌&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;기본적으로 설정된 값을 입력하거나 수정할 수 있도록 처리할 수 있다.&lt;br /&gt;--&amp;nbsp;2.&amp;nbsp;형식&amp;nbsp;및&amp;nbsp;구조 &lt;br /&gt;-- 컬럼명 데이터타입 DEFAULT 기본값&lt;br /&gt;--&amp;nbsp;3.&amp;nbsp;&amp;nbsp;INSERT&amp;nbsp;명령&amp;nbsp;시&amp;nbsp;해당&amp;nbsp;컬럼에&amp;nbsp;입력될&amp;nbsp;값을&amp;nbsp;할당하지&amp;nbsp;않거나 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DEFAULT 키워드를 활용하여 기본으로 설정된 값을 입력하도록 할 수 있다.&amp;nbsp;&lt;br /&gt;--&amp;nbsp;4.&amp;nbsp;DEFAULT키워드와&amp;nbsp;다른&amp;nbsp;제약(NOT&amp;nbsp;NULL&amp;nbsp;등)&amp;nbsp;표기가&amp;nbsp;함께&amp;nbsp;사용되어야&amp;nbsp;하는&amp;nbsp;경우 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DEFAULT&amp;nbsp;키워드를&amp;nbsp;먼저&amp;nbsp;표기(작성)할&amp;nbsp;것을&amp;nbsp;권장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1752044460416&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE TBL_BOARD                                   --  게시판 테이블 생성   
(   SID        NUMBER           PRIMARY KEY              -- 게시물 번호 &amp;rarr; 식별자(자동 증가)
,   NAME       VARCHAR2(30)                              -- 게시물 작성자
,   CONTENTS   VARCHAR2(2000)                             -- 게시물 내용
,   WRITEDAY   DATE             DEFAULT SYSDATE NOT NULL  -- 게시물 작성일(현재 날짜시간 자동 입력)
--== ,   WRITEDAY   DATE        NOT NULL DEFAULT SYSDATE -- 위의 케이스로 쓰는것이 좋음 
,   COMMENTS   NUMBER           DEFAULT 0       NOT NULL  -- 게시물 댓글 갯수(기본값0)
,   COUNTS     NUMBER           DEFAULT 0       NOT NULL  -- 게시물 조회수(기본값 0) 
);
--==&amp;gt;&amp;gt; Table TBL_BOARD이(가) 생성되었습니다.

--※ SID 를 자동 증가하는 값으로 운영하려면 시퀀스(SEQUENCE) 객체가 필요하다.
--   자동으로 입력되는 컬럼은 사용자가 입력해야 하는 항목에서
--   제외시킬 수 있다.

-- 시퀀스 생성
CREATE SEQUENCE SEQ_BOARD
NOCACHE;
--==&amp;gt;&amp;gt; Sequence SEQ_BOARD이(가) 생성되었습니다.

-- 날짜 형식 관련 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==&amp;gt;&amp;gt; Session이(가) 변경되었습니다.

-- 게시물 작성 
INSERT INTO TBL_BOARD(SID, NAME, CONTENTS, WRITEDAY, COMMENTS, COUNTS)
VALUES(SEQ_BOARD.NEXTVAL, '김주영', '오라클에서 DEFAULT 표현식 실습중.'
    ,  TO_DATE('2025-07-09 16:06:23', 'YYYY-MM-DD HH24:MI:SS'), 0, 0);

INSERT INTO TBL_BOARD(SID, NAME, CONTENTS, WRITEDAY, COMMENTS, COUNTS)
VALUES(SEQ_BOARD.NEXTVAL, '이동우', '앞자리로 좌석이동.', DEFAULT,DEFAULT,DEFAULT);
    
INSERT INTO TBL_BOARD(SID, NAME, CONTENTS)
VALUES(SEQ_BOARD.NEXTVAL, '이인주', '감기약 복용완료.');    
      
SELECT *
FROM TBL_BOARD;

COMMIT;    
--==&amp;gt;&amp;gt; 커밋

--○ DEFAULT 표현식 조회(확인)
SELECT *
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME ='TBL_BOARD';
/*
TBL_BOARD	SID	NUMBER			22			N	1											
TBL_BOARD	NAME	VARCHAR2			30			Y	2											CHAR_CS
TBL_BOARD	CONTENTS	VARCHAR2			2000			Y	3											CHAR_CS
TBL_BOARD	WRITEDAY	DATE			7			N	4	8	SYSDATE 									
TBL_BOARD	COMMENTS	NUMBER			22			N	5	8	0       									
TBL_BOARD	COUNTS	NUMBER			22			N	6	8	0       									
*/

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_DEFAULT
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME ='TBL_BOARD';
/*
TBL_BOARD	SID	NUMBER	
TBL_BOARD	NAME	VARCHAR2	
TBL_BOARD	CONTENTS	VARCHAR2	
TBL_BOARD	WRITEDAY	DATE	SYSDATE 
TBL_BOARD	COMMENTS	NUMBER	0       
TBL_BOARD	COUNTS	NUMBER	0       
*/

--○ 테이블 생성 이후 DEFAULT 표현식 추가 / 변경
ALTER  TABLE 테이블명
MODIFY 컬럼명 [자료형] DEFAULT 기본값; 

--○ 생성된 DEFAULT 표현식 제거(삭제)
ALTER TABLE 테이블명
MODIFY 컬럼명 [자료형] DEFAULT NULL;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <category>제약조건</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/227</guid>
      <comments>https://aluck.tistory.com/227#entry227comment</comments>
      <pubDate>Wed, 9 Jul 2025 16:30:25 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - NOT NULL 실습</title>
      <link>https://aluck.tistory.com/226</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCCRpK/btsPa1blleB/1tfwdrqYBTkC50Nuu4KOsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCCRpK/btsPa1blleB/1tfwdrqYBTkC50Nuu4KOsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCCRpK/btsPa1blleB/1tfwdrqYBTkC50Nuu4KOsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCCRpK%2FbtsPa1blleB%2F1tfwdrqYBTkC50Nuu4KOsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;146&quot; height=&quot;146&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;■■■&amp;nbsp;NOT&amp;nbsp;NULL(NN:CK:C)&amp;nbsp;■■■-- &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;1.&amp;nbsp;테이블에서&amp;nbsp;지정한&amp;nbsp;컬럼의&amp;nbsp;데이터가&amp;nbsp;NULL&amp;nbsp;인&amp;nbsp;상태를&amp;nbsp;갖지&amp;nbsp;못하도록&amp;nbsp;하는&amp;nbsp;제약조건. &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;2.&amp;nbsp;형식&amp;nbsp;및&amp;nbsp;구조 &lt;br /&gt;--&amp;nbsp;1)&amp;nbsp;컬럼&amp;nbsp;레벨의&amp;nbsp;형식 &lt;br /&gt;--&amp;nbsp;컬럼명&amp;nbsp;데이터타입&amp;nbsp;[CONSTRAINT&amp;nbsp;CONSTRAINT명]&amp;nbsp;NOT&amp;nbsp;NULL &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;2)&amp;nbsp;테이블&amp;nbsp;레벨의&amp;nbsp;형식 &lt;br /&gt;--&amp;nbsp;컬럼명&amp;nbsp;데이터타입, &lt;br /&gt;--&amp;nbsp;컬럼명&amp;nbsp;데이터타입, &lt;br /&gt;--&amp;nbsp;CONSTRAINT&amp;nbsp;CONSTRAINT명&amp;nbsp;CHECK(컬럼명&amp;nbsp;IS&amp;nbsp;NOT&amp;nbsp;NULL) &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;3.&amp;nbsp;기존에&amp;nbsp;생성되어&amp;nbsp;있는&amp;nbsp;테이블에&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;제약조건을&amp;nbsp;추가할&amp;nbsp;경우 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ADD&amp;nbsp;보다&amp;nbsp;MODIFY&amp;nbsp;절이&amp;nbsp;더&amp;nbsp;많이&amp;nbsp;사용된다. &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;ALTER&amp;nbsp;TABLE&amp;nbsp;테이블명 &lt;br /&gt;--&amp;nbsp;MODIFY&amp;nbsp;컬럼명&amp;nbsp;데이터타입&amp;nbsp;NOT&amp;nbsp;NULL; &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;4.&amp;nbsp;기존&amp;nbsp;테이블에&amp;nbsp;데이터가&amp;nbsp;이미&amp;nbsp;들어있지&amp;nbsp;않은&amp;nbsp;컬럼(&amp;rarr;&amp;nbsp;NULL인&amp;nbsp;상태)을 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOT NULL 제약조건을 갖게끔 수정하는 경우에는 에러가 발생한다.&lt;/p&gt;
&lt;pre id=&quot;code_1752044353576&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--○ NOT NULL 지정실습(1) 컬럼 레벨의 형식)
CREATE TABLE TBL_TEST11
(   COL1     NUMBER(5)       PRIMARY KEY
,   COL2    VARCHAR2(30)    NOT NULL
);
--==&amp;gt; Table TBL_TEST11이(가) 생성되었습니다.

-- 데이터 입력 
INSERT INTO TBL_TEST11(COL1, COL2) VALUES(1, 'TEST');
INSERT INTO TBL_TEST11(COL1, COL2) VALUES(2, 'ABCD');
INSERT INTO TBL_TEST11(COL1, COL2) VALUES(3, 'NULL');
INSERT INTO TBL_TEST11(COL1, COL2) VALUES(3, NULL);     --&amp;gt;&amp;gt; 에러
INSERT INTO TBL_TEST11(COL1, COL2) VALUES(4);     --&amp;gt;&amp;gt; 에러

SELECT *
FROM TBL_TEST11;
/*
1 TEST
2 ABCD
3 NULL    -- 문자타입
*/

COMMIT;

-- 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST11';
/*
HR SYS_C007037 TBL_TEST11 C COL2     &quot;COL2&quot; IS NOT NULL
HR SYS_C007038 TBL_TEST11 P COL1
*/

--○ NOT NULL 지정실습(2) 테이블 레벨의 형식)
-- 테이블 생성 
CREATE TABLE TBL_TEST12
(   COL1     NUMBER(5)       
,   COL2    VARCHAR2(30)    
,   CONSTRAINT TEST12_COL1_PK PRIMARY KEY(COL1)
,   CONSTRAINT TEST12_COL1_CK CHECK(COL2 IS NOT NULL)
);
--==&amp;gt; Table TBL_TEST12이(가) 생성되었습니다.

-- 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST12';WHERE TABLE_NAME = 'TBL_TEST12';
/*
HR TEST12_COL1_CK TBL_TEST12 C COL2 COL2 IS NOT NULL
HR TEST12_COL1_PK TBL_TEST12 P COL1
*/ 

--○ NOT NULL 지정실습(3) 테이블 생성 이후 제약조건 추가)
-- 테이블 생성 
CREATE TABLE TBL_TEST13
(   COL1    NUMBER(5)       
,   COL2    VARCHAR2(30)    
);
--==&amp;gt; Table TBL_TEST13이(가) 생성되었습니다.

-- 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST13';
--==&amp;gt;&amp;gt; 조회 결과 없음 

-- 제약조건 추가
ALTER TABLE TBL_TEST13
ADD( CONSTRAINT TEST13_COL1_PK PRIMARY KEY(COL1)
    , CONSTRAINT TEST13_COL2_CK CHECK(COL2 IS NOT NULL)
);
--==&amp;gt;&amp;gt; Table TBL_TEST13이(가) 변경되었습니다.

-- CONSTCHECK는 직접 만들어서 사용한 것임. 

-- 제약조건 추가 이후 다시확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST13';
/*
HR TEST13_COL1_PK TBL_TEST13 P COL1
HR TEST13_COL2_CK TBL_TEST13 C COL2 COL2 IS NOT NULL
*/

-- NOT NULL 제약조건만 추가하는 경우
--  다음과 같은 형태로 처리하는 것도 가능하다.
-- 테이블 생성 
CREATE TABLE TBL_TEST14
(   COL1    NUMBER(5)       
,   COL2    VARCHAR2(30)   
,   CONSTRAINT TEST14_COL1_PK PRIMARY KEY(COL1)
);
--==&amp;gt;&amp;gt; Table TBL_TEST14이(가) 생성되었습니다.

ALTER TABLE TBL_TEST14
MODIFY COL2 NOT NULL; 
--==&amp;gt;&amp;gt; Table TBL_TEST14이(가) 변경되었습니다.

-- 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST14';
--==&amp;gt;&amp;gt; 
/*
HR TEST14_COL1_PK TBL_TEST14 P COL1
HR SYS_C007044 TBL_TEST14 C COL2 &quot;COL2&quot; IS NOT NULL
*/
-- ★★ 잘 정리해서 기억해 줘야 함. 

--※ 컬럼 레벨에서 NOT NULL 제약조건을 지정한 테이블
DESC TBL_TEST11;
/*
이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)    
COL2 NOT NULL VARCHAR2(30) 
*/
--==&amp;gt;&amp;gt; DESC 명령을 통해 COL2 컬럼이 NOT NULL 인 상태가 확인되지 않는 상황.

--※ 테이블 레벨에서 NOT NULL 제약조건을 지정한 테이블
DESC TBL_TEST12;
/*
이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)    
COL2          VARCHAR2(30)
*/

--※ 테이블 생성 이후 ADD를 통해 NOT NULL 제약조건을 지정한 테이블
DESC TBL_TEST13;
/*
이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)    
COL2          VARCHAR2(30
*/
--&amp;gt; --==&amp;gt;&amp;gt; DESC 명령을 통해 COL2 컬럼이 NOT NULL 인 상태가 확인되지 않는 상황.

--※ 테이블 생성 이후 ADD를 통해 NOT NULL 제약조건을 지정한 테이블
DESC TBL_TEST14;
/*
이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)    
COL2 NOT NULL VARCHAR2(30) 
*/
--==&amp;gt;&amp;gt; DESC 명령을 통해 COL2 컬럼이 NOT NULL 인 상태가 확인되는 상황.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <category>제약조건</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/226</guid>
      <comments>https://aluck.tistory.com/226#entry226comment</comments>
      <pubDate>Wed, 9 Jul 2025 15:59:48 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - FOREIGN KEY  설정 실습</title>
      <link>https://aluck.tistory.com/225</link>
      <description>&lt;pre id=&quot;code_1752041690882&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- ■■■ FOREIGN KEY ■■■--

--1. 참조 키 또는 외래 키(FK)는
--   두 테이블의 데이터 간 연결을 설정하고
--   강제 적용시키는데 사용되는 열이다.
--   한 테이블의 기본 키 값이 있는 열을
--   다른 테이블에 추가하면 테이블 간 연결을 설정할 수 있다.
--   이 때, 두 번째 테이블에 추가되는 열이 외래 키가 된다.

--2. 부모 테이블(참조받는 컬럼이 포함된 테이블)이 먼저 생성된 후
--   자식 테이블(참조하는 컬럼이 포함된 테이블)이 생성되어야 한다.
--   이 때, 자식 테이블에 FOREIGN KEY 제약조건이 설정된다.

--3. 형식 및 구조
--   1) 컬럼 레벨의 형식
--   컬럼명 데이터타입[CONSTRAINT CONSTRAINT명]
--                   REFERENCES 참조테이블명(참조컬럼명)
--                   [ON DELETE CASCADE | ON DELETE SET NULL]

--   2) 테이블 레벨의 형식
--   컬럼명 데이터타입,
--   컬럼명 데이터타입,
--   CONSTRAINT CONSTRAINT명 FOREIGN KEY(컬럼명)
--              REFERENCES 참조테이블명(참조컬럼명)
--              [ON DELETE CASCADE | ON DELETE SET NULL] -- 함부로 쓰면 안됨. 

--※ FOREIGN KEY 제약조건을 설정하는 실습을 진행하기 위해서는
--   독립적인 하나의 테이블을 생성하여 처리하는 것이 아니라
--   부모 테이블 생성 작업을 먼저 수행해야 한다.
--   그리고 이 때, 부모 테이블에는 반드시 PK 또는 UK 제약조건이
--   설정된 컬럼이 존재해야 한다. 

-- 부모 테이블 생성
-- 테이블명 : TBL_JOBS
CREATE TABLE TBL_JOBS
(   JIKWI_ID NUMBER(5)
,   JIKWI_NAME VARCHAR2(30)
,   CONSTRAINT JOBS_ID_PK PRIMARY KEY(JIKWI_ID)
);
--==&amp;gt;&amp;gt; Table TBL_JOBS이(가) 생성되었습니다.

--  생성된 부모 테이블에 데이터 입력
--데이터 입력 
INSERT INTO TBL_JOBS(JIKWI_ID,JIKWI_NAME) VALUES(1, '사원');
INSERT INTO TBL_JOBS(JIKWI_ID,JIKWI_NAME) VALUES(2, '대리');
INSERT INTO TBL_JOBS(JIKWI_ID,JIKWI_NAME) VALUES(3, '과장');
INSERT INTO TBL_JOBS(JIKWI_ID,JIKWI_NAME) VALUES(4, '부장');

SELECT *
FROM TBL_JOBS;
/*
1	사원
2	대리
3	과장
4	부장
*/

COMMIT;


--○ FK 지정 실습(1) 컬럼 레벨의 형식)

CREATE TABLE TBL_EMP1
(   SID NUMBER(5)       PRIMARY KEY
,   NAME VARCHAR2(30)
,   JIKWI_ID NUMBER REFERENCES TBL_JOBS(JIKWI_ID)
);

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_EMP1';
--==&amp;gt;&amp;gt;
/*HR	SYS_C007032	TBL_EMP1	P	SID		
HR	SYS_C007033	TBL_EMP1	R	JIKWI_ID		NO ACTION
*/

SELECT *
FROM TBL_EMP1;
/*
마이콜	1
도우너	2
희동이	3
고길동	4
둘리	1
철수	
*/

-- 자식 테이블에 데이터 입력 
INSERT INTO TBL_EMP1(SID,NAME, JIKWI_ID) VALUES(1, '마이콜' ,1);
INSERT INTO TBL_EMP1(SID,NAME, JIKWI_ID) VALUES(2, '도우너' ,2);
INSERT INTO TBL_EMP1(SID,NAME, JIKWI_ID) VALUES(3, '희동이' ,3);
INSERT INTO TBL_EMP1(SID,NAME, JIKWI_ID) VALUES(4, '고길동' ,4);
INSERT INTO TBL_EMP1(SID,NAME, JIKWI_ID) VALUES(5, '둘리' ,5);    --&amp;gt; 에러발생
INSERT INTO TBL_EMP1(SID,NAME, JIKWI_ID) VALUES(5, '둘리' ,1);
INSERT INTO TBL_EMP1(SID,NAME, JIKWI_ID) VALUES(6, '또치',NULL);
INSERT INTO TBL_EMP1(SID,NAME, JIKWI_ID) VALUES(7, '철수' ,NULL);

COMMIT;


--○ FK 지정 실습(2) 테이블 레벨의 형식)
CREATE TABLE TBL_EMP2
(   SID     NUMBER(5)       
,   NAME    VARCHAR2(30)
,   JIKWI_ID NUMBER(5)  
,   CONSTRAINT EMP2_SID_PK PRIMARY KEY(SID)
,   CONSTRAINT EMP2_JIKWI_ID_FK FOREIGN KEY(JIKWI_ID)
               REFERENCES TBL_JOBS(JIKWI_ID)
);
--==&amp;gt;&amp;gt; Table TBL_EMP2이(가) 생성되었습니다.

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_EMP2';
/*
HR	EMP2_SID_PK	TBL_EMP2	P	SID		
HR	EMP2_JIKWI_ID_FK	TBL_EMP2	R	JIKWI_ID		NO ACTION
*/

--○ FK 지정 실습(3) 테이블 생성 이후 제약조건 추가)
-- 테이블 생성
CREATE TABLE TBL_EMP3
(   SID     NUMBER(5)       
,   NAME    VARCHAR2(30)
,   JIKWI_ID NUMBER(5)  
);
--==&amp;gt;&amp;gt; Table TBL_EMP3이(가) 생성되었습니다.

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_EMP3';
--==&amp;gt;&amp;gt; 조회 결과 없음

-- 제약조건 추가
ALTER TABLE TBL_EMP3
ADD( CONSTRAINT EMP3_SID_PK PRIMARY KEY(SID)
    , CONSTRAINT EMP3_JIKWI_ID_FK FOREIGN KEY(JIKWI_ID)
      REFERENCES TBL_JOBS(JIKWI_ID));
-- Table TBL_EMP3이(가) 변경되었습니다.

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_EMP3';
/*
HR	EMP3_SID_PK	TBL_EMP3	P	SID		
HR	EMP3_JIKWI_ID_FK	TBL_EMP3	R	JIKWI_ID		NO ACTION
*/

-- 4. FROEIGN KEY 생성 시 주의 사항
--    - 참고하고자 하는 부모 테이블을 먼저 생성해야 한다.
--    - 참조하고자 하는 컬럼이 PRIMARY KEY 나 UNIQUE 제약조건이 있어야 한다.
--    - 테이블 간에 PRIMARY KEY 와 FOREIGN KEY 가 정의되어 있으면
--      PRIMARY KEY 제약조건이 설정된 컬럼의 데이터 삭제 시
--      FOREIGN KEY 컬럼에 그 값이 입력되어 있는 경우 삭제되지 않는다. 
--      (단, FK 설정 과정에서 [ON DELETE CASCADE]나
--      [ON DELETE SET NULL] 옵션을 사용하여 설정한 경우에는 삭제가 가능하다. )
--    - 부모 테이블을 제거하기 위해서는 자식 테이블을 먼저 제거해야 한다. 

-- 부모테이블
SELECT *
FROM TBL_JOBS;
/*
1	사원
2	대리
3	과장
4	부장
*/

SELECT *
FROM TBL_EMP1;
/*
1	마이콜	1
2	도우너	2
3	희동이	3
4	고길동	4
5	둘리  	1
6   또치     (NULL)
7	철수	    (NULL)
*/

-- 고길동 부장을 사원으로 직위 변경
UPDATE TBL_EMP1
SET JIKWI_ID=1
WHERE SID=4;
--==&amp;gt;&amp;gt; 1 행 이(가) 업데이트되었습니

-- 확인
SELECT *
FROM TBL_EMP1;
--==&amp;gt;&amp;gt; 4	고길동	1

INSERT INTO TBL_EMP1(SID,NAME, JIKWI_ID) VALUES(6, '또치',NULL);

COMMIT; 
--==&amp;gt;&amp;gt; 커밋

-- 부모테이블(TBL_JOBS)의 부장 데이터를 참조하고 있는
-- 자식 테이블(TBL_EMP1)의 데이터가 존재하지 않는 상황.

-- 이와 같은 상황에서 부모 테이블(TBL_JOBS)의
-- 부장 데이터 삭제 

SELECT *
FROM TBL_JOBS
WHERE JIKWI_ID=4;
-- 4 부장 

DELETE 
FROM TBL_JOBS
WHERE JIKWI_ID=4;
-- 1 행 이(가) 삭제되었습니다.

SELECT *
FROM TBL_JOBS; 
/*
1	사원
2	대리
3	과장
*/

COMMIT;
-- 커밋완료

SELECT *
FROM TBL_EMP1;
/*
1	마이콜	1
2	도우너	2
3	희동이	3
4	고길동	1
5	둘리	1
6	또치	  NULL
7	철수	  NULL
*/

-- 부모테이블(TBL_JOBS)의 [사원] 데이터를 참조하고 있는
-- 자식 테이블(TBL_EMP1)의 데이터 3건이 존재하는 상황.

-- 이와 같은 상황에서 부모 테이블의 
-- [사원] 데이터 삭제 

SELECT *
FROM TBL_JOBS
WHERE JIKWI_ID=1;
-- 사원

DELETE
FROM TBL_JOBS
WHERE JIKWI_ID=1;
--&amp;gt;&amp;gt; 에러발생
-- ORA-02292: integrity constraint (HR.SYS_C007033) violated - child record found 

-- 부모테이블(TBL_JOBS) 제거
DROP TABLE TBL_JOBS;
--==&amp;gt;&amp;gt; 에러
/*

1 행 이(가) 삭제되었습니다.

커밋 완료.

명령의 895 행에서 시작하는 중 오류 발생 -
DELETE
FROM TBL_JOBS
WHERE JIKWI_ID=1
오류 보고 -
ORA-02292: integrity constraint (HR.SYS_C007033) violated - child record found


명령의 902 행에서 시작하는 중 오류 발생 -
DROP TABLE TBL_JOBS
오류 보고 -
ORA-02449: unique/primary keys in table referenced by foreign keys
02449. 00000 -  &quot;unique/primary keys in table referenced by foreign keys&quot;
*Cause:    An attempt was made to drop a table with unique or
           primary keys referenced by foreign keys in another table.
*Action:   Before performing the above operations the table, drop the
           foreign key constraints in other tables. You can see what
           constraints are referencing a table by issuing the following
           command:
           SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = &quot;tabnam&quot;;
*/

--※ 참조하고 있는 자식 테이블의 레코드가 존재하는 상황임에도 불구하고
--   부모 테이블의 데이터를 자유롭게 삭제하기 위해서는
--   [ON DELETE CASCADE] 옵션 지정이 필요하다. 

-- TBL_EMP1 테이블(자식 테이블)에서 FK 제약조건을 제거한 후
-- CASCADED 옵션을 포함한 상태로 다시 FK 제약조건을 설정한다.

-- 제약 조건 확인 
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_EMP1';
/*
HR	SYS_C007032	TBL_EMP1	P	SID		
HR	SYS_C007033	TBL_EMP1	R	JIKWI_ID		NO ACTION
*/

-- R 붙어있는 제약조건만 복사
-- 제약조건 제거
-- 제약조건명 : SYS_C007033
ALTER TABLE TBL_EMP1
DROP CONSTRAINT SYS_C007033;
--==&amp;gt;&amp;gt; Table TBL_EMP1이(가) 변경되었습니다.

-- 제약조건 제거 후 다시 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_EMP1';
--==&amp;gt;&amp;gt; HR	SYS_C007032	TBL_EMP1	P	SID		

--[ON DELETE CASCADE] 옵션이 포함된 내용으로 제약조건 다시 지정 
ALTER TABLE TBL_EMP1
ADD CONSTRAINT EMP1_JIKWI_ID_FK FOREIGN KEY(JIKWI_ID)
                REFERENCES TBL_JOBS(JIKWI_ID)
                ON DELETE CASCADE;
--==&amp;gt;&amp;gt; Table TBL_EMP1이(가) 변경되었습니다.

-- 제약조건을 다시 지정한 이후 확인 
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_EMP1';
/*
HR	SYS_C007032	TBL_EMP1	P	SID		
HR	EMP1_JIKWI_ID_FK	TBL_EMP1	R	JIKWI_ID		CASCADE     -- CHECK~!!! 
*/

--  CASCADE 옵션을 지정한 후에는
--  참조받고 있는 부모 테이블의 데이터를
--  언제든지 자유롭게 삭제하는 것이 가능하다.
--  단 ... ... ... 부모 테이블의 데이터가 삭제될 경우
--  이를 참조하는 자식 테이블의 데이터도 모~~~두 함께 삭제된다.
--  CHECK~!!! 

-- 부모테이블
SELECT *
FROM TBL_JOBS;
-- 사원, 대리, 과장

-- 자식 테이블
SELECT *
FROM TBL_EMP1;
/*
1	마이콜	1
2	도우너	2
3	희동이	3
4	고길동	1
5	둘리  	1
7	철수	   NULL
6	또치	   NULL
*/

-- TBL_JOBS(부모 테이블)의 사원 데이터 삭제
DELETE
FROM TBL_JOBS
WHERE JIKWI_ID=1;
-- 1 행 이(가) 삭제되었습니다.

SELECT *
FROM TBL_JOBS;
-- 대리, 과장

-- 자식 테이블
SELECT *
FROM TBL_EMP
/*
2	도우너	2
3	희동이	3
7	철수	
6	또치	
*/ -- 사원이 모두 삭제 됨 ..&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <category>제약조건</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/225</guid>
      <comments>https://aluck.tistory.com/225#entry225comment</comments>
      <pubDate>Wed, 9 Jul 2025 15:24:20 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - PRIMARY KEY 설정 실습</title>
      <link>https://aluck.tistory.com/224</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lXGZm/btsPaKfJhaM/9yObP2MpmJ1ACx51YgFs71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lXGZm/btsPaKfJhaM/9yObP2MpmJ1ACx51YgFs71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXGZm/btsPaKfJhaM/9yObP2MpmJ1ACx51YgFs71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXGZm%2FbtsPaKfJhaM%2F9yObP2MpmJ1ACx51YgFs71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;141&quot; height=&quot;141&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;■■■&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;■■■-- &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;1.&amp;nbsp;테이블에&amp;nbsp;대한&amp;nbsp;기본&amp;nbsp;키를&amp;nbsp;생성한다. &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;2.&amp;nbsp;테이블에서&amp;nbsp;각&amp;nbsp;행을&amp;nbsp;유일하게&amp;nbsp;식별하는&amp;nbsp;컬럼(단일)&amp;nbsp;또는&amp;nbsp;컬럼의&amp;nbsp;집합(복합)이다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;기본&amp;nbsp;키는&amp;nbsp;테이블&amp;nbsp;당&amp;nbsp;최대&amp;nbsp;하나만&amp;nbsp;존재한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;그러나&amp;nbsp;반드시&amp;nbsp;하나의&amp;nbsp;컬럼만으로만&amp;nbsp;구성되는&amp;nbsp;것은&amp;nbsp;아니다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL&amp;nbsp;일&amp;nbsp;수&amp;nbsp;없고,&amp;nbsp;이미&amp;nbsp;테이블에&amp;nbsp;존재하고&amp;nbsp;있는&amp;nbsp;데이터를 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;다시&amp;nbsp;입력하거나&amp;nbsp;수정할&amp;nbsp;수&amp;nbsp;없도록&amp;nbsp;처리된다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UNIQUE&amp;nbsp;INDEX&amp;nbsp;가&amp;nbsp;자동으로&amp;nbsp;생성된다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EX)&amp;nbsp;책의&amp;nbsp;부록&amp;nbsp;뒤에있는&amp;nbsp;찾기&amp;nbsp;=&amp;nbsp;인덱스&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;빠른&amp;nbsp;검색을&amp;nbsp;위함&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(오라클이&amp;nbsp;자체적으로&amp;nbsp;만든다.) &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;3.&amp;nbsp;형식&amp;nbsp;및&amp;nbsp;구조 &lt;br /&gt;--&amp;nbsp;1)&amp;nbsp;컬럼&amp;nbsp;레벨의&amp;nbsp;형식 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;컬럼명&amp;nbsp;데이터&amp;nbsp;타입[CONSTRAINT&amp;nbsp;CONSTRAINT명&amp;nbsp;PRIMARY&amp;nbsp;KEY(컬럼명[,&amp;nbsp;...])] &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;&amp;nbsp;2)&amp;nbsp;테이블&amp;nbsp;레벨의&amp;nbsp;형식&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;문법적인&amp;nbsp;풀택스트를&amp;nbsp;이해하고&amp;nbsp;당분간&amp;nbsp;이걸&amp;nbsp;먼저&amp;nbsp;써라..&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;컬럼명&amp;nbsp;데이터타입, &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;컬럼명&amp;nbsp;데이터타입, &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CONSTRAINT&amp;nbsp;CONSTRAINT명&amp;nbsp;PRIMARY&amp;nbsp;KEY(컬럼명[,&amp;nbsp;...]) &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;&amp;nbsp;4.&amp;nbsp;CONSTRAINT&amp;nbsp;추가시&amp;nbsp;CONSTRAINT&amp;nbsp;명을&amp;nbsp;생략하면 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;오라클&amp;nbsp;서버가&amp;nbsp;자동적으로&amp;nbsp;CONSTRAINT&amp;nbsp;명을&amp;nbsp;부여하게&amp;nbsp;된다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;일반적으로&amp;nbsp;CONSTRAINT&amp;nbsp;명은&amp;nbsp;『테이블명_컬럼명_CONSTRAINT약어』 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;형식으로&amp;nbsp;기술한다.&lt;/p&gt;
&lt;pre id=&quot;code_1752030061291&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--○ PK 지정 실습(① 컬럼 레벨의 형식)
-- 테이블 생성
CREATE TABLE TBL_TEST1
(   COL1 NUMBER(5)  PRIMARY KEY
,   COL2 VARCHAR2(30)
);
--==&amp;gt;&amp;gt; 테이블 생성

-- 데이터 입력
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(1, 'TEST');
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(2, 'ABCD');
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(3, NULL); -- 아래줄과 같은 거
INSERT INTO TBL_TEST1(COL1) VALUES(4);
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(2, 'ABCD');    --&amp;gt; 에러 발생 PRIMARY KEY
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(2, 'KKKK');    --&amp;gt; 에러 발생
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(5, 'ABCD');
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(NULL, NULL);   --&amp;gt; 에러 발생 PK는 NOTNULL이므로 오류
INSERT INTO TBL_TEST1(COL1, COL2) VALUES(NULL, 'STUDY');--&amp;gt; 에러 발생
INSERT INTO TBL_TEST1(COL2) VALUES('STUDY');            --&amp;gt; 에러 발생

COMMIT;
--==&amp;gt;&amp;gt; 커밋 완료.

SELECT *
FROM TBL_TEST1;
--==&amp;gt;&amp;gt;
/*
1	TEST
2	ABCD
3	(null)
4	(null)
5	ABCD
*/

DESC TBL_TEST1;
--==&amp;gt;&amp;gt;
/*
이름   널?       유형           
---- -------- ------------ 
COL1 NOT NULL NUMBER(5)    &amp;rarr; PK 제약 확인 불가 
COL2          VARCHAR2(30) 
*/
-- DESC 로는 PK는 확인 불가

--○ 제약조건 확인
SELECT *
FROM USER_CONSTRAINTS;
-- 데이터 딕셔너리 뷰 
/*
HR	REGION_ID_NN	C	REGIONS	&quot;REGION_ID&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	REG_ID_PK	P	REGIONS					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	REG_ID_PK		
HR	COUNTRY_ID_NN	C	COUNTRIES	&quot;COUNTRY_ID&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	COUNTRY_C_ID_PK	P	COUNTRIES					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	COUNTRY_C_ID_PK		
HR	COUNTR_REG_FK	R	COUNTRIES		HR	REG_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	LOC_CITY_NN	C	LOCATIONS	&quot;CITY&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	LOC_ID_PK	P	LOCATIONS					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	LOC_ID_PK		
HR	LOC_C_ID_FK	R	LOCATIONS		HR	COUNTRY_C_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	DEPT_NAME_NN	C	DEPARTMENTS	&quot;DEPARTMENT_NAME&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	DEPT_ID_PK	P	DEPARTMENTS					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	DEPT_ID_PK		
HR	DEPT_LOC_FK	R	DEPARTMENTS		HR	LOC_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JOB_TITLE_NN	C	JOBS	&quot;JOB_TITLE&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JOB_ID_PK	P	JOBS					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	JOB_ID_PK		
HR	EMP_LAST_NAME_NN	C	EMPLOYEES	&quot;LAST_NAME&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_EMAIL_NN	C	EMPLOYEES	&quot;EMAIL&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_HIRE_DATE_NN	C	EMPLOYEES	&quot;HIRE_DATE&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_JOB_NN	C	EMPLOYEES	&quot;JOB_ID&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_SALARY_MIN	C	EMPLOYEES	salary &amp;gt; 0				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_EMAIL_UK	U	EMPLOYEES					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	EMP_EMAIL_UK		
HR	EMP_EMP_ID_PK	P	EMPLOYEES					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	EMP_EMP_ID_PK		
HR	EMP_DEPT_FK	R	EMPLOYEES		HR	DEPT_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_JOB_FK	R	EMPLOYEES		HR	JOB_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	EMP_MANAGER_FK	R	EMPLOYEES		HR	EMP_EMP_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	DEPT_MGR_FK	R	DEPARTMENTS		HR	EMP_EMP_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_EMPLOYEE_NN	C	JOB_HISTORY	&quot;EMPLOYEE_ID&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_START_DATE_NN	C	JOB_HISTORY	&quot;START_DATE&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_END_DATE_NN	C	JOB_HISTORY	&quot;END_DATE&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_JOB_NN	C	JOB_HISTORY	&quot;JOB_ID&quot; IS NOT NULL				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_DATE_INTERVAL	C	JOB_HISTORY	end_date &amp;gt; start_date				ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_EMP_ID_ST_DATE_PK	P	JOB_HISTORY					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29	HR	JHIST_EMP_ID_ST_DATE_PK		
HR	JHIST_JOB_FK	R	JOB_HISTORY		HR	JOB_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_EMP_FK	R	JOB_HISTORY		HR	EMP_EMP_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	JHIST_DEPT_FK	R	JOB_HISTORY		HR	DEPT_ID_PK	NO ACTION	ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	USER NAME			2014-05-29				
HR	SYS_C004102	O	EMP_DETAILS_VIEW					ENABLED	NOT DEFERRABLE	IMMEDIATE	NOT VALIDATED	GENERATED NAME			2014-05-29				
HR	SYS_C007013	P	TBL_TEST1					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	GENERATED NAME			2025-07-09	HR	SYS_C007013		
*/

SELECT *
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='TBL_TEST1';
--==&amp;gt;&amp;gt;
/*
HR	SYS_C007013	    P	TBL_TEST1					ENABLED	NOT DEFERRABLE	IMMEDIATE	VALIDATED	GENERATED NAME			2025-07-09	HR	SYS_C007013		
    제약조건이름  타입   테이블명
*/

--○ 제약조건이 지정된 컬럼 확인(조회)
SELECT * 
FROM USER_CONS_COLUMNS;
--==&amp;gt;&amp;gt;
/*
HR	REGION_ID_NN	REGIONS	REGION_ID	
HR	REG_ID_PK	REGIONS	REGION_ID	1
HR	COUNTRY_ID_NN	COUNTRIES	COUNTRY_ID	
HR	COUNTRY_C_ID_PK	COUNTRIES	COUNTRY_ID	1
HR	COUNTR_REG_FK	COUNTRIES	REGION_ID	1
HR	LOC_ID_PK	LOCATIONS	LOCATION_ID	1
HR	LOC_CITY_NN	LOCATIONS	CITY	
HR	LOC_C_ID_FK	LOCATIONS	COUNTRY_ID	1
HR	DEPT_ID_PK	DEPARTMENTS	DEPARTMENT_ID	1
HR	DEPT_NAME_NN	DEPARTMENTS	DEPARTMENT_NAME	
HR	DEPT_MGR_FK	DEPARTMENTS	MANAGER_ID	1
HR	DEPT_LOC_FK	DEPARTMENTS	LOCATION_ID	1
HR	JOB_ID_PK	JOBS	JOB_ID	1
HR	JOB_TITLE_NN	JOBS	JOB_TITLE	
HR	EMP_EMP_ID_PK	EMPLOYEES	EMPLOYEE_ID	1
HR	EMP_LAST_NAME_NN	EMPLOYEES	LAST_NAME	
HR	EMP_EMAIL_NN	EMPLOYEES	EMAIL	
HR	EMP_EMAIL_UK	EMPLOYEES	EMAIL	1
HR	EMP_HIRE_DATE_NN	EMPLOYEES	HIRE_DATE	
HR	EMP_JOB_NN	EMPLOYEES	JOB_ID	
HR	EMP_JOB_FK	EMPLOYEES	JOB_ID	1
HR	EMP_SALARY_MIN	EMPLOYEES	SALARY	
HR	EMP_MANAGER_FK	EMPLOYEES	MANAGER_ID	1
HR	EMP_DEPT_FK	EMPLOYEES	DEPARTMENT_ID	1
HR	JHIST_EMPLOYEE_NN	JOB_HISTORY	EMPLOYEE_ID	
HR	JHIST_EMP_ID_ST_DATE_PK	JOB_HISTORY	EMPLOYEE_ID	1
HR	JHIST_EMP_FK	JOB_HISTORY	EMPLOYEE_ID	1
HR	JHIST_START_DATE_NN	JOB_HISTORY	START_DATE	
HR	JHIST_DATE_INTERVAL	JOB_HISTORY	START_DATE	
HR	JHIST_EMP_ID_ST_DATE_PK	JOB_HISTORY	START_DATE	2
HR	JHIST_END_DATE_NN	JOB_HISTORY	END_DATE	
HR	JHIST_DATE_INTERVAL	JOB_HISTORY	END_DATE	
HR	JHIST_JOB_NN	JOB_HISTORY	JOB_ID	
HR	JHIST_JOB_FK	JOB_HISTORY	JOB_ID	1
HR	JHIST_DEPT_FK	JOB_HISTORY	DEPARTMENT_ID	1
HR	SYS_C007013	TBL_TEST1	COL1	1
*/

SELECT * 
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME='TBL_TEST1'; 
--==&amp;gt;&amp;gt;
/*
HR	SYS_C007013	TBL_TEST1	COL1	1
*/

--○ 제약조건이 설정된 소유주, 제약명, 테이블명, 제약종류, 컬럼명 항목 조회 
SELECT 소유주, 제약명, 테이블명, 제약종류, 컬럼명
FROM USER_CONSTRANITS UC, USER_CONS_COLUMNS UCC 
WHERE UC.CONSTRAINT_NAME = UCC.USER_CONSTRANITS.NAME;

SELECT UC.OWNER, UC.CONSTRAINT_NAME, UC.TABLE_NAME 
    ,UC.CONSTRAINT_TYPE, UCC.COLUMN_NAME 
FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC
WHERE UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME;

SELECT UC.OWNER, UC.CONSTRAINT_NAME, UC.TABLE_NAME 
    ,UC.CONSTRAINT_TYPE, UCC.COLUMN_NAME 
FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC
WHERE UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME
  AND UC.TABLE_NAME = 'TBL_TEST1';
--==&amp;gt;&amp;gt;
/*
HR	SYS_C007013	TBL_TEST1	COL1	1
*/

--○ PK 지정 실습(② 테이블 레벨의 형식)
-- 테이블 생성
CREATE TABLE TBL_TEST2
(   COL1 NUMBER(5)  
,   COL2 VARCHAR2(30)
,   CONSTRAINT TEST_COL1_PK PRIMARY KEY(COL1)
);
--==&amp;gt;&amp;gt; Table TBL_TEST2이(가) 생성되었습니다.
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(1, 'TEST');
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(2, 'ABCD');
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(3, NULL);
INSERT INTO TBL_TEST2(COL1) VALUES(4);
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(2, 'ABCD');    --&amp;gt; 에러발생
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(2, 'TTTT');    --&amp;gt; 에러발생
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(5, 'ABCD');
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(5, NULL);      --&amp;gt; 에러발생
INSERT INTO TBL_TEST2(COL1, COL2) VALUES(NULL, 'STUDY'); --&amp;gt; 에러발생
INSERT INTO TBL_TEST2(COL2) VALUES('STUDY');--&amp;gt; 에러발생

COMMIT;
--&amp;gt;&amp;gt; 커밋완료

SELECT *
FROM  TBL_TEST2;
--==&amp;gt;&amp;gt;
/*
1	TEST
2	ABCD
3	(null)
4	(null)	
5	ABCD
*/

--○ 제약조건이 설정된 소유주, 제약명, 테이블명, 제약종류, 컬럼명 항목 조회 
--○ USER_CONSTRAINTS 와 USER_CONS_COLUMNS 를 대상으로
--&amp;nbsp;&amp;nbsp; 제약조건이 설정된 내용에 대해서
--&amp;nbsp;&amp;nbsp; 소유주, 제약조건명, 테이블명, 제약조건종류, 컬럼명 항목을 조회한다.

SELECT UC.OWNER &quot;소유주&quot;, UC.CONSTRAINT_NAME, UC.TABLE_NAME 
    ,UC.CONSTRAINT_TYPE, UCC.COLUMN_NAME 
FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC
WHERE UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME
  AND UC.TABLE_NAME = 'TBL_TEST2';
--==&amp;gt;&amp;gt;
/*
HR	TEST_COL1_PK	TBL_TEST2	P	COL1
*/

--○ PK 지정 실습(③ 다중 컬럼 PK 지정 &amp;rarr; 복합 프라이머리 키)
-- 테이블 생성
CREATE TABLE TBL_TEST3
(   COL1 NUMBER(5)  
,   COL2 VARCHAR2(30)
,   CONSTRAINT TEST3_COL1_COL2_PK PRIMARY KEY(COL1, COL2)
);
--==&amp;gt;&amp;gt; Table TBL_TEST3이(가) 생성되었습니다.

--(X) CHECK~!!! 
/*
CREATE TABLE TBL_TEST3
(   COL1 NUMBER(5)  
,   COL2 VARCHAR2(30)
,   CONSTRAINT TEST3_COL1_COL2_PK PRIMARY KEY(COL1)
    CONSTRAINT TEST3_COL1_COL2_PK PRIMARY KEY(COL2)
);
*/
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(1, 'TEST');
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(2, 'ABCD');
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(3, NULL);      --&amp;gt; 에러발생
INSERT INTO TBL_TEST3(COL1) VALUES(4);                  --&amp;gt; 에러발생
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(2, 'ABCD');    --&amp;gt; 에러발생 2번째에서 입력한 데이터임
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(3, 'ABCD');
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(1, 'ABCD');
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(2, 'KKKK');    -- 2번만 겹친거지 뒤에게 다르니까 데이터들어감 
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(4, 'ABCD'); 
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(NULL, NULL);    --&amp;gt; 에러발생
INSERT INTO TBL_TEST3(COL1, COL2) VALUES(NULL, 'STUDY'); --&amp;gt; 에러발생
INSERT INTO TBL_TEST3(COL2) VALUES('STUDY');             --&amp;gt; 에러발생

COMMIT;

SELECT *
FROM TBL_TEST3;
--==&amp;gt;&amp;gt;
/*
1	ABCD
1	TEST
2	ABCD
2	KKKK
3	ABCD
4	ABCD
*/

--○ PK 지정 실습(④ 테이블 생성 이후 제약조건 추가 &amp;rarr; PK지정)
-- 테이블 생성
CREATE TABLE TBL_TEST4
(   COL1 NUMBER(5)  
,   COL2 VARCHAR2(30)
);
--==&amp;gt;&amp;gt; Table TBL_TEST4이(가) 생성되었습니다.

--※ 이미 만들어져 있는 테이블에
--   부여하려는 제약조건을 위반한 데이터가 포함되어 있을 경우
--   해당 테이블에 제약조건을 추가하는 것은 불가능하다. 
-- EX) 1 '홍길동' 1 '고길동'  -- 이미 위반한 것에 제약조건 추가불가

-- 제약조건 추가
ALTER TABLE TBL_TEST4 
ADD CONSTRAINT TEST4_COL1_PK PRIMARY KEY(COL1);
-- Table TBL_TEST4이(가) 변경되었습니다.


SELECT UC.OWNER &quot;소유주&quot;, UC.CONSTRAINT_NAME, UC.TABLE_NAME 
    ,UC.CONSTRAINT_TYPE, UCC.COLUMN_NAME 
FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UCC
WHERE UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME
  AND UC.TABLE_NAME = 'TBL_TEST2';

--※ 제약조건 확인 전용 뷰(VIEW) 생성 99코드
-- 뷰명 : VIEW_CONSTCHECK
CREATE OR REPLACE VIEW VIEW_CONSTCHECK
AS
SELECT UC.OWNER &quot;OWNER&quot;
    , UC.CONSTRAINT_NAME &quot;CONSTRAINT_NAME&quot;
    , UC.TABLE_NAME &quot;TABLE_NAME&quot;
    , UC.CONSTRAINT_TYPE &quot;CONSTRAINT_TYPE&quot;
    , UCC.COLUMN_NAME &quot;COLUMN_NAME&quot;
    , UC.SEARCH_CONDITION &quot;SEARCH_CONDITION&quot;
    , UC.DELETE_RULE &quot;DELETE_RULE&quot;
FROM USER_CONSTRAINTS UC JOIN USER_CONS_COLUMNS UCC 
ON UC.CONSTRAINT_NAME = UCC.CONSTRAINT_NAME; -- 이름이 같은걸로 결합하겠다.
--==&amp;gt;&amp;gt;View VIEW_CONSTCHECK이(가) 생성되었습니다.

--○ 생성된 뷰를 통한 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME = 'TBL_TEST4';
--==&amp;gt;&amp;gt;
/*
HR	TEST4_COL1_PK	TBL_TEST4	P	COL1		
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;■■■UNIQUE(UK:U)&amp;nbsp;■■■-- &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;1.&amp;nbsp;테이블에서&amp;nbsp;지정한&amp;nbsp;컬럼의&amp;nbsp;데이터가&amp;nbsp;중복되지&amp;nbsp;않고 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;테이블&amp;nbsp;내에서&amp;nbsp;유일할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;설정하는&amp;nbsp;제약조건. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;와&amp;nbsp;유사한&amp;nbsp;제약조건이지만,&amp;nbsp;NULL&amp;nbsp;을&amp;nbsp;허용한다는&amp;nbsp;차이가&amp;nbsp;있다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;내부적으로&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;와&amp;nbsp;마찬가지로&amp;nbsp;UNIQUE&amp;nbsp;INDEX&amp;nbsp;가&amp;nbsp;자동&amp;nbsp;생성된다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;하나의&amp;nbsp;테이블&amp;nbsp;내에서&amp;nbsp;UNIQUE&amp;nbsp;제약조건은&amp;nbsp;여러&amp;nbsp;번&amp;nbsp;설정하는&amp;nbsp;것이&amp;nbsp;가능하다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;즉,&amp;nbsp;하나의&amp;nbsp;테이블에&amp;nbsp;UNIQUE&amp;nbsp;제약조건을&amp;nbsp;여러&amp;nbsp;개&amp;nbsp;만드는&amp;nbsp;것이&amp;nbsp;가능하다. &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;2.&amp;nbsp;형식&amp;nbsp;및&amp;nbsp;구조 &lt;br /&gt;--&amp;nbsp;1)&amp;nbsp;컬럼&amp;nbsp;레벨의&amp;nbsp;형식 &lt;br /&gt;--&amp;nbsp;컬럼명&amp;nbsp;데이터타입[CONSTRAINT&amp;nbsp;CONSTRAINT명]&amp;nbsp;UNIQUE &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;2)&amp;nbsp;테이블&amp;nbsp;레벨의&amp;nbsp;형식 &lt;br /&gt;--&amp;nbsp;컬럼명&amp;nbsp;데이터타입, &lt;br /&gt;--&amp;nbsp;컬럼명&amp;nbsp;데이터타입, &lt;br /&gt;--&amp;nbsp;CONSTRAINT&amp;nbsp;CONSTRAINT명]&amp;nbsp;UNIQUE(컬럼명[,&amp;nbsp;...])&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1752030126668&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--○ UK 지정 실습(① 컬럼 레벨의 형식)
-- 테이블 생성
CREATE TABLE TBL_TEST5
(   COL1 NUMBER(5)      PRIMARY KEY
,   COL2 VARCHAR2(30)   UNIQUE
);
--==&amp;gt;&amp;gt;Table TBL_TEST5이(가) 생성되었습니다.

--제약조건 조회
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST5';
--==&amp;gt;&amp;gt;
/*
HR	SYS_C007017	TBL_TEST5	P	COL1
HR	SYS_C007018	TBL_TEST5	U	COL2
*/
--데이터 입력 
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(1, 'TEST');
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(2, 'ABCD');
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(3, NULL);
INSERT INTO TBL_TEST5(COL1) VALUES(4); 
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(5, 'ABCD');    --&amp;gt; 에러발생
INSERT INTO TBL_TEST5(COL1, COL2) VALUES(5, NULL);

COMMIT;

SELECT * 
FROM TBL_TEST5;
--==&amp;gt;&amp;gt;
/*
1	TEST
2	ABCD
3	(null)
4	(null)		
5	(null)	
*/

--○ UK 지정 실습(② 컬럼 레벨의 형식)
-- 테이블 생성
CREATE TABLE TBL_TEST6
(   COL1 NUMBER(5)      
,   COL2 VARCHAR2(30)   
,   CONSTRAINT TEST6_COL1_PK PRIMARY KEY (COL1)
,   CONSTRAINT TEST6_COL2_UK UNIQUE(COL2)
);
--==&amp;gt;&amp;gt; Table TBL_TEST6이(가) 생성되었습니다.

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST6';
--==&amp;gt;&amp;gt;
/*
HR	TEST6_COL1_PK	TBL_TEST6	P	COL1		
HR	TEST6_COL2_UK	TBL_TEST6	U	COL2		
*/

--○ UK 지정 실습(③ 테이블 생성 이후 제약조건 추가)
-- 테이블 생성
CREATE TABLE TBL_TEST7
(   COL1 NUMBER(5)      
,   COL2 VARCHAR2(30)   
);
--==&amp;gt;&amp;gt; Table TBL_TEST7이(가) 생성되었습니다.

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST7';
--==&amp;gt;&amp;gt; 조회 결과 없음

-- 제약조건 추가
ALTER TABLE TBL_TEST7
ADD ( CONSTRAINT TEST7_COL1_PK PRIMARY KEY(COL1)
    , CONSTRAINT TEST7_COL2_UK UNIQUE(COL2) );
--==&amp;gt;&amp;gt; Table TBL_TEST7이(가) 변경되었습니다.

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST7';
--==&amp;gt;&amp;gt;
/*
HR	TEST7_COL1_PK	TBL_TEST7	P	COL1		
HR	TEST7_COL2_UK	TBL_TEST7	U	COL2		
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;■■■&amp;nbsp;CHECK(CK:C)&amp;nbsp;■■■&amp;nbsp;-- &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;1.&amp;nbsp;컬럼에서&amp;nbsp;허용&amp;nbsp;가능한&amp;nbsp;데이터의&amp;nbsp;범위나&amp;nbsp;조건을&amp;nbsp;지정하기&amp;nbsp;위한&amp;nbsp;제약조건, &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;컬럼에&amp;nbsp;입력되는&amp;nbsp;데이터를&amp;nbsp;검사하여&amp;nbsp;조건에&amp;nbsp;맞는&amp;nbsp;데이터만&amp;nbsp;입력될&amp;nbsp;수&amp;nbsp;있도록 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;처리하며,&amp;nbsp;수정되는&amp;nbsp;데이터&amp;nbsp;또한&amp;nbsp;검사하여&amp;nbsp;조건에&amp;nbsp;맞는&amp;nbsp;데이터로&amp;nbsp;수정되는&amp;nbsp;것만 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;허용하는&amp;nbsp;기능을&amp;nbsp;수행하게&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;&amp;nbsp;2.&amp;nbsp;형식&amp;nbsp;및&amp;nbsp;구조 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;1)&amp;nbsp;컬럼&amp;nbsp;레벨의&amp;nbsp;형식 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;컬럼명&amp;nbsp;데이터타입[CONSTRAINT&amp;nbsp;CONSTRAINT명]&amp;nbsp;CHECK(컬럼&amp;nbsp;조건) &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;&amp;nbsp;2)&amp;nbsp;테이블&amp;nbsp;레벨의&amp;nbsp;형식 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;컬럼명&amp;nbsp;데이터타입, &lt;br /&gt;--&amp;nbsp;&amp;nbsp;컬럼명&amp;nbsp;데이터타입, &lt;br /&gt;--&amp;nbsp;&amp;nbsp;CONSTRAINT&amp;nbsp;CONSTRAINT명&amp;nbsp;CHECK(컬럼&amp;nbsp;조건) &lt;br /&gt;&lt;br /&gt;--※&amp;nbsp;NUMBER(38)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;까지..&amp;nbsp;경은&amp;nbsp;0이&amp;nbsp;20개인데..&amp;nbsp;38이면&amp;nbsp;크지.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;CHAR(2000)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;까지... &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;VARCHAR2(4000)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;까지... &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;NCHAR(1000)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;까지... &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;NVARCHAR2(2000)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;까지...&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;&amp;nbsp;CHECK~!!!&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;COL1&amp;nbsp;NUMBER&amp;nbsp;&amp;rarr;&amp;nbsp;NUMBER(38)&amp;nbsp;--&amp;nbsp;길이&amp;nbsp;명시&amp;nbsp;안하면&amp;nbsp;NUMBER&amp;nbsp;의&amp;nbsp;최대값을&amp;nbsp;쓰겠다는&amp;nbsp;의미 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;COL2&amp;nbsp;CHAR&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;CHAR(1)&amp;nbsp;--&amp;nbsp;위와&amp;nbsp;달리&amp;nbsp;명시&amp;nbsp;안하면&amp;nbsp;1BYTE만큼의&amp;nbsp;길이를&amp;nbsp;쓰겠다는&amp;nbsp;뜻&lt;/p&gt;
&lt;pre id=&quot;code_1752030151907&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--○ CK 지정 실습(1) 컬럼 레벨의 형식) 
CREATE TABLE TBL_TEST8
(   COL1 NUMBER(5)      PRIMARY KEY    
,   COL2 VARCHAR2(30)    
,   COL3 NUMBER(3)      CHECK(COL3 BETWEEN 0 AND 100)
);
--==&amp;gt;&amp;gt; Table TBL_TEST8이(가) 생성되었습니다.

--데이터 입력 
INSERT INTO TBL_TEST8(COL1, COL2, COL3) VALUES(1, '민주', 100);
INSERT INTO TBL_TEST8(COL1, COL2, COL3) VALUES(2, '채원', 101);   --&amp;gt;&amp;gt; 에러발생
-- 이름이 있는 형태로 제약조건을 형성하는 것이 좋음. 
INSERT INTO TBL_TEST8(COL1, COL2, COL3) VALUES(3, '은정', 80); 
INSERT INTO TBL_TEST8(COL1, COL2, COL3) VALUES(4, '승원', -10);   --&amp;gt;&amp;gt; 에러발생

COMMIT;

SELECT *
FROM TBL_TEST8;
--==&amp;gt;&amp;gt; 
/*
1	민주	100
3	은정	80
*/

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST8';
--==&amp;gt;&amp;gt; 
/*
HR	SYS_C007023	TBL_TEST8	C	COL3	COL3 BETWEEN 0 AND 100	
HR	SYS_C007024	TBL_TEST8	P	COL1	
*/

--○ CK 지정실습(2)테이블 레벨의 형식) 
CREATE TABLE TBL_TEST9
(   COL1 NUMBER(5)          
,   COL2 VARCHAR2(30)    
,   COL3 NUMBER(3)     
, CONSTRAINT TEST9_COL1_PK PRIMARY KEY(COL1)
, CONSTRAINT TEST9_COL3_CK CHECK(COL3 BETWEEN 0 AND 100) 
);


--데이터 입력 
INSERT INTO TBL_TEST9(COL1, COL2, COL3) VALUES(1, '민주', 100);
INSERT INTO TBL_TEST9(COL1, COL2, COL3) VALUES(2, '채원', 101);   --&amp;gt;&amp;gt; 에러발생
-- 이름이 있는 형태로 제약조건을 형성하는 것이 좋음. 
INSERT INTO TBL_TEST9(COL1, COL2, COL3) VALUES(3, '은정', 80); 
INSERT INTO TBL_TEST9(COL1, COL2, COL3) VALUES(4, '승원', -10);   --&amp;gt;&amp;gt; 에러발생

COMMIT;

SELECT *
FROM TBL_TEST9;
--==&amp;gt;&amp;gt; 
/*
1	민주	100
2	채원	101
3	은정	80
4	승원	-10
*/

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST9';

--○ CK 지정실습(3)테이블 레벨의 형식) 
CREATE TABLE TBL_TEST10
(   COL1 NUMBER(5)          
,   COL2 VARCHAR2(30)    
,   COL3 NUMBER(3)    
);
--==&amp;gt;&amp;gt; Table TBL_TEST10이(가) 생성되었습니다.

ROLLBACK; 

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST10';
--==&amp;gt;&amp;gt; 조회 결과 없음

-- 이미 생성되어 있는 기존 테이블에 제약조건 추가 
ALTER TABLE TBL_TEST10
ADD ( CONSTRAINT TEST10_COL1_PK PRIMARY KEY(COL1)
    , CONSTRAINT TEST10_COL3_CK CHECK(COL3 BETWEEN 0 AND 100) );
--==&amp;gt;&amp;gt; Table TBL_TEST10이(가) 변경되었습니다.

--○ 제약조건 확인
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME='TBL_TEST10';
--==&amp;gt;&amp;gt; 
/*
HR	TEST10_COL1_PK	TBL_TEST10	P	COL1		
HR	TEST10_COL3_CK	TBL_TEST10	C	COL3	COL3 BETWEEN 0 AND 100	
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--○&amp;nbsp;실습을&amp;nbsp;위한&amp;nbsp;추가&amp;nbsp;테이블&amp;nbsp;생성 &lt;br /&gt;--&amp;nbsp;테이블명&amp;nbsp;:&amp;nbsp;TBL_TESTMEMBER &lt;/p&gt;
&lt;pre id=&quot;code_1752032404958&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE TBL_TESTMEMBER
(   SID NUMBER(5)
,   NAME VARCHAR2(30)
,   SSN CHAR(14)        -- 입력 형태 &amp;rarr; 'YYNNDD-NNNNNNN'
,   TEL VARCHAR2(40)
);
--==&amp;gt;&amp;gt; Table TBL_TESTMEMBER이(가) 생성되었습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-- 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;&amp;nbsp;TBL_TESTMEMBER&amp;nbsp;테이블의&amp;nbsp;SSN(주민등록번호)&amp;nbsp;컬럼에서 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;데이터&amp;nbsp;입력&amp;nbsp;및&amp;nbsp;수정&amp;nbsp;시&amp;nbsp;성별이&amp;nbsp;유효한&amp;nbsp;데이터만&amp;nbsp;처리될&amp;nbsp;수&amp;nbsp;있도록 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;체크&amp;nbsp;제약조건을&amp;nbsp;추가할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;한다.&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;성별이&amp;nbsp;유효한&amp;nbsp;데이터&amp;nbsp;&amp;rarr;&amp;nbsp;특정&amp;nbsp;자리&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4&amp;nbsp;허용 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;또한,&amp;nbsp;SID&amp;nbsp;컬럼에는&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;제약조건&amp;nbsp;설정할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;한다.&lt;/p&gt;
&lt;pre id=&quot;code_1752032454880&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 데이터 입력
INSERT INTO TBL_TESTMEMBER(SID, NAME, SSN, TEL) 
VALUES(3, '고길동', '920709-1234567', '010-1212-3434');

INSERT INTO TBL_TESTMEMBER(SID, NAME, SSN, TEL) 
VALUES(4, '또치', '950812-2234567', '010-4545-6767');

INSERT INTO TBL_TESTMEMBER(SID, NAME, SSN, TEL) 
VALUES(5, '도우너', '030202-3234567', '010-7878-9999');

INSERT INTO TBL_TESTMEMBER(SID, NAME, SSN, TEL) 
VALUES(6, '희동이', '050709-4234567', '010-2323-4545');

INSERT INTO TBL_TESTMEMBER(SID, NAME, SSN, TEL) 
VALUES(5, '마이콜', '751212-5234567', '010-2580-2580');
/*
ORA-02290: check constraint (HR.TESTMEMBER_SSN_CK) violated
*/

COMMIT; 

SELECT *
FROM TBL_TESTMEMBER;
/*
3	고길동	920709-1234567	010-1212-3434
4	또치	950812-2234567	010-4545-6767
6	희동이	050709-4234567	010-2323-4545
5	도우너	030202-3234567	010-7878-9999
*/
    
SELECT *
FROM VIEW_CONSTCHECK
WHERE TABLE_NAME= 'TBL_TESTMEMBER';
--==&amp;gt;&amp;gt;
/*
HR	TESTMEMBER_SID_PK	TBL_TESTMEMBER	P	SID		
HR	TESTMEMBER_SSN_CK	TBL_TESTMEMBER	C	SSN	SUBSTR(SSN,8,1) IN ('1','2','3','4')	
*/&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <category>제약조건</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/224</guid>
      <comments>https://aluck.tistory.com/224#entry224comment</comments>
      <pubDate>Wed, 9 Jul 2025 12:49:31 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 정규화 과정</title>
      <link>https://aluck.tistory.com/223</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drjOkx/btsO9Yytuhx/0eMjwrRyeA1xI9wWKKT3E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drjOkx/btsO9Yytuhx/0eMjwrRyeA1xI9wWKKT3E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drjOkx/btsO9Yytuhx/0eMjwrRyeA1xI9wWKKT3E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrjOkx%2FbtsO9Yytuhx%2F0eMjwrRyeA1xI9wWKKT3E0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;175&quot; height=&quot;175&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751960361193&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--○ 정규화란? 
--   한 마디로 데이터베이스 서버의 메모리 낭비를 막기 위해
--   어떤 하나의 테이블을... 식별자를 가지는 여러 개의 테이블로
--   나누는 과정을 말한다. 


--○ 제 1 정규화
--&amp;gt;  어떤 하나의 테이블에 반복되어 나오는 컬럼 값들이 존재한다면
--   갑들이 반복되어 나오는 컬럼을 분리하여
--   새로운 테이블을 만들어 준다. 
--   아래와 같이 나누어준 형태가 제 1 정규화

--&amp;gt;  제 1 정규화를 수행하는 과정에서 분리된 테이블은
--   반드시 부모 테이블과 자식 테이블의 관계를 갖게 된다. 

--&amp;gt;  제 1 정규화를 수행하는 과정에서 
--   부모 테이블의 PRIMARY KEY 는
--   항상 자식 테이블의 FOREIGN KEY 로 전이된다.
--   부모 테이블 &amp;rarr; 참조받는 컬럼 &amp;rarr; PRIMARY KEY(제약조건)
--   그것이 바로 회사아이디 
--   자식 테이블 &amp;rarr; 참조하는 컬럼 &amp;rarr; FOREIGN KEY(제약조건)

--&amp;gt;  참조받는 컬럼이 갖는 특징(부모 테이블)
--   - 반드시 고유한 값(데이터)이 들어와야 한다.
--   - 즉, 중복된 값(데이터)이 없어야 한다.
--   - NULL 이어서는 안된다.(비어있어서는 안된다.)
--     즉, NOT NULL 이어야 한다. 

--&amp;gt;  참조하는 컬럼이 갖는 특징(자식 테이블)
--   - 부모 테이블의 참조받는 컬럼이 갖는 데이터들 중 
--     하나인 데이터를 참조해야 한다. 
--   EX) 채원이 회사코드가 50이면 어느회사다니는지 찾을 수 없음

--   PRIMARY KEY - 고유한 값 
--   제약조건(단, 이렇게 해야해 라는 강제사항) 

-- ** 테이블을 나누고 중복되는 테이블 제거 그리고 식별자 생성 
-- 테이블명 : 회사 &amp;rarr; 부모테이블
/*

--※ 테이블이 분할(분리)되기 이전 상태로 조회

SELECT A.거래처회사명, A.회사주소, A. 회사전화
,   B.거래처직원명,  B.직급,  B.이메일, B.휴대폰
FROM 회사 A, 직원 B
WHERE A.회사아이디= B.회사아이디;
--&amp;gt; 원래의 상태로 조회하는데 이상 없음~!!!

--※ 하나의 테이블에 존재하는 PRIMARYKEY의 최대 갯수는 1개이다.
--   하지만,PRIMARY KEY 를 이루는(구성하는) 컬럼의 갯수는
--   복수(다수, 여러개)인 것이 가능하다.
--   컬럼 1개로만(단일 컬럼) 구성된 PRIMARY KEY를
--   Single PRIMARY KEY 라고 부른다.
--   (&amp;rarr; 단일 프라이머리 키)
--   두 개 이상의 컬럼으로 구성된 PRIMARY KEY를
--   Composite Primary key 라고 부른다.
--   (&amp;rarr; 복합 프라이머리 키)

--○ 제 2 정규화
--&amp;gt; 제 1정규화를 마친 결과물에서 PRIMARY KEY가 SINGLE COLUMN 이라면
--&amp;nbsp;&amp;nbsp;제 2 정규화는 수행하지 않는다.
--  하지만, PRIMARY KEY 가 COMPOSITE COLUMN 이라면
--  반드시 제 2 정규화를 수행해야 한다.

--&amp;gt; 식별자가 아닌 컬럼은 식별자 전체 컬럼에 대해 의존적이어야 하는데
--&amp;nbsp;&amp;nbsp;식별자 전체 컬럼이 아닌 일부 식별자 컬럼에 대해서만 의존적이라면
--&amp;nbsp;이를 분리하여 새로운 테이블을 생성해 준다. &amp;gt;&amp;gt; 이것이 제 2정규화 

--○ 제 3 정규화
--&amp;gt;  식별자가 아닌 컬럼이 식별자가 아닌 컬럼에 의존적인 상황이라면
--   이를 분리하여 새로운 테이블을 생성해 주어야 한다. 

--※ 관계(Relation)의 종류 

-- 1 : 1 (=일대일)
--&amp;gt; 물리적으로 존재할 수 있는 관계이긴 하지만
--  피할 수 있으면 가급적이면 피해야 할 관계.

-- 1 : 다(many) (=일대다) 
--&amp;gt; 제 1 정규화를 마친 결과물에서 대표적으로 나타나는 바람직한 관계.
--&amp;nbsp;&amp;nbsp;관계형 데이터베이스를 활용하는 과정에서 추구해야 하는 관계.

--&amp;nbsp;다(many) : 다(many) (=다대다)
--&amp;gt; 논리적인 모델링에서는 존재할 수 있지만
--&amp;nbsp;&amp;nbsp;실제 물리적인 모델링에서는 존재할 수 없는 관계.

--○ 제 4 정규화
--&amp;gt; 위에서 확인한 내용과 같이 『다:다』 관계를 『1:다』 관계로 깨뜨리는 과정이
--  제 4 정규화의 수행과정이다.
--  &amp;rarr; 일반적으로 파생 테이블 생성 
--      &amp;rarr; 『다:다』 관계를 『1:다』 관계로 깨뜨리는 역할을 수행하게 된다.

-- 정규화의 방향 &amp;rarr;
-- 역정규화(비정규화)의 방향 &amp;larr; 

--○ 역정규화(비정규화, 반정규화) 
/*
A 의 경우 &amp;rarr; 역정규화를 수행하지 않는 것이 바람직한 상황~!!!

사이즈는 10BYTE라고 가정하자

테이블명 : 부서               테이블명 : 사원
    10      10    10            10      10  10    10   10       10           10    
---------------------        ----------------------------------------    + ------
부서번호  부서명  주소        사원번호 사원명 직급 급여 입사일 부서번호       부서명
+++++++                      +++++++                        ========(F.K)    
---------------------        ----------------------------------------    + ------
        10개 행                           1,000,000개 행 
---------------------        ----------------------------------------    + ------

&amp;gt;&amp;gt; 업무 분석 상 조회 결과물 
-----------------------
부서명 사원명 직급 급여 &amp;lt;&amp;lt; 빈번하게 조회될 아이들 
-----------------------
--&amp;gt; 사원명 직급 급여가 사원테이블에 있으니 부서명만 붙이면 JOIN할 필요없잖아 &amp;gt;&amp;gt; 이게 역정규화 

-- 『부서』 테이블과 『사원』테이블을 JOIN 했을 때의 크기
-- (10*30Byte) + (1000000 * 60Byte) = 300 + 60,000,000 = 60,000,300 Byte

-- 『사원』 테이블을 역정규화 수행한 후 이 테이블만 단독으로 읽어올 때의 크기 
-- 1000000 * 70byte = 70,000,000 byte

B 의 경우 &amp;rarr; 역정규화를 수행하는 것이 바람직한 상황~!!! 

테이블명 : 부서               테이블명 : 사원
    10      10    10            10      10  10    10   10       10           10    
---------------------        ----------------------------------------    + ------
부서번호  부서명  주소        사원번호 사원명 직급 급여 입사일 부서번호       부서명
+++++++                      +++++++                        ========(F.K)    
---------------------        ----------------------------------------    + ------
    500,000개 행                           1,000,000개 행 
---------------------        ----------------------------------------    + ------

&amp;gt;&amp;gt; 업무 분석 상 조회 결과물 
-----------------------
부서명 사원명 직급 급여 &amp;lt;&amp;lt; 빈번하게 조회될 아이들 
-----------------------
--&amp;gt; 사원명 직급 급여가 사원테이블에 있으니 부서명만 붙이면 JOIN할 필요없잖아 &amp;gt;&amp;gt; 이게 역정규화 

-- 『부서』 테이블과 『사원』테이블을 JOIN 했을 때의 크기
-- (500,000 * 30Byte) + (1000000 * 60Byte) = 15000,000 + 60,000,000 = 75,000,000 Byte

-- 『사원』 테이블을 역정규화 수행한 후 이 테이블만 단독으로 읽어올 때의 크기 
-- 1000000 * 70byte = 70,000,000 byte
*/

1. 관계(relationship, relation)
    - 모든 엔트리(entry)는 단일값을 가진다.
    - 각 열(column)은 유일한 이름을 가지며 순서는 무의미하다.
    - 테이블의 모든 행(row = 튜플 = tuple)은 동일하지 않으며 순서는 무의미하다.
    
2.  속성(attribute)
    - 테이블의 열(column)을 나타낸다.
    - 자료의 이름을 가진 최소 논리적 단위 : 객체의 성질, 상태 기술
    - 일반 파일(file)의 항목(아이템 = item = 필드 = field)에 해당한다.
&amp;nbsp;&amp;nbsp;  - 엔티티(entity)의 특성과 상태를 기술
 &amp;nbsp;&amp;nbsp; - 속성(attribute)의 이름은 모두 달라야 한다.

3.  튜플 = tuple = 엔티티 = entity 
    - 테이블의 행(row)
    - 연관된 몇 개의 속성(attribute)으로 구성
    - 개념 정보 단위
    - 일반 파일(file)의 레코드(record)에 해당한다.
    - 튜플 변수(tuple variable)
     튜플 변수(tuple variable)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 튜플(tuple)을 가리키는 변수, 모든 튜플 집합을 도메인으로 하는 변수
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
4. 도메인(domain)
&amp;nbsp;&amp;nbsp; - 각 속성(attribute)이 가질 수 있도록 허용된 값들의 집합
&amp;nbsp;&amp;nbsp; - 속성 명과 도메인 명이 반드시 동일할 필요는 없음.
&amp;nbsp;&amp;nbsp; - 모든 릴레이션에서 모든 속성들의 도메인은 원자적(atomic)이어야 함.
&amp;nbsp;&amp;nbsp; - 원자적 도메인
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 도메인의 원소가 더 이상 나누어질 수 없는 단일체일 때를 나타냄.

5. 릴레이션(relation)
    - 파일 시스템에서 파일(file)과 같은 개념
    - 중복된 튜플(tuple = entity = 엔티티)을 포함하지 않는다.
      &amp;rarr; 모두 상이함(튜플의 유일성)
    - 릴레이션 = 튜플(엔티티 = entity)의 집합. 따라서 튜플의 순서는 무의미하다.
&amp;nbsp;&amp;nbsp;  - 속성(attribute) 간에는 순서가 없다.
    
    --■■■ 무결성(Integrity) ■■■--
/*
1. 무결성에는 개체 무결성(Entity Integrity)
             참조 무결성(Relation Integrity)
             도메일 무결성(Domain Integrity)이 있다.

2. 개체 무결성(Entity integrity)
&amp;nbsp;&amp;nbsp; 개체 무결성은 릴레이션에서 저장되는 튜플(tuple)의
&amp;nbsp;&amp;nbsp; 유일성을 보장하기 위한 제약조건이다.
&amp;nbsp;&amp;nbsp; (EX : SMITH의 사원정보 튜플(레코드, 행)은 하나여야 함.)
&amp;nbsp;&amp;nbsp; 
3. 참조 무결성(Relational Integrity)
&amp;nbsp;&amp;nbsp; 참조 무결성은 릴레이션 간의 데이터 일관성을
&amp;nbsp;&amp;nbsp; 보장하기 위한 제약조건이다.
&amp;nbsp;&amp;nbsp; (EX : 가영 사원의 부서번호 60 &amp;rarr; 그러나, DEPT 테이블에 그 부서번호가 없다.)

4. 도메인 무결성(Domain Integrity)
&amp;nbsp;&amp;nbsp; 도메인 무결성은 허용 가능한 값의 범위를
&amp;nbsp;&amp;nbsp; 지정하기 위한 제약조건이다.
&amp;nbsp;&amp;nbsp; (컬럼에 대한 데이터 타입.)
&amp;nbsp;&amp;nbsp; (EX : HIREDATE에 DATE 타입이 아닌 1234 NUMBER 타입이 들어가 있으면 안 된다.)
&amp;nbsp;&amp;nbsp; (DATE 타입이 아닌 데이트는 INSERT 되지 않도록 막아야 한다.)
&amp;nbsp;&amp;nbsp; (또한, DATE 타입이라 할지라도 13월, 57일 이런 형식의 데이터도 막아야 한다.

5. 제약조건의 종류
    -PRIMARY KEY(PK:P) &amp;rarr;  부모 테이블의 참조받는 컬럼 &amp;rarr; 기본키, 식별자
     해당 컬럼의 값은 반드시 존재해야 하며, 유일해야 한다.
     (UNIQUE 와 NOT NULL 이 결합된 형태) 
     
      (REFERENCE : 참조) 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- FOREIGN KEY(FK:F:R) &amp;rarr; 외래키, 외부키, 참조키
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;해당 컬럼의 값은 참조되는 테이블의 컬럼 데이터들 중 하나와
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;일치하거나 NULL 을 가진다.

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- UNIQUE(UK:U)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;테이블 내에서 해당 컬럼의 값은 항상 유일해야 한다.

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- NOT NULL(NN:CK:C)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;해당 컬럼은 NULL 을 포함할 수 없다.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- CHECK(CK:C)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;해당 컬럼에 저장 가능한 데이터의 범위나 조건을 지정한다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>관계</category>
      <category>도메인</category>
      <category>릴레이션</category>
      <category>무결성</category>
      <category>속성</category>
      <category>오라클</category>
      <category>제약조건</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/223</guid>
      <comments>https://aluck.tistory.com/223#entry223comment</comments>
      <pubDate>Tue, 8 Jul 2025 16:39:49 +0900</pubDate>
    </item>
    <item>
      <title>Oracle- INTERSECT, MINUS(교집합/ 차집합)</title>
      <link>https://aluck.tistory.com/222</link>
      <description>&lt;pre id=&quot;code_1751959814456&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT JECODE, JUSU
FROM TBL_JUMUNBACKUP
INTERSECT
SELECT JECODE, JUSU
FROM TBL_JUMUN;
--==&amp;gt;&amp;gt; 
/*
빼빼로	20
새우깡	10
쿠크다스	10
포카칩	20
허니버터칩	10
홈런볼	10
*/

SELECT JECODE, JUSU
FROM TBL_JUMUNBACKUP
MINUS
SELECT JECODE, JUSU
FROM TBL_JUMUN;
--==&amp;gt;&amp;gt; 교집합을 뺀 나머지
/*
새우깡	    50
썬칩	    20
초코파이	20
초코파이	30
쿠크다스	20
포카칩	    30
홈런볼	    20
홈런볼	    30
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제&amp;nbsp; &lt;br /&gt;--○&amp;nbsp;TBL_JUMUNBACKUP&amp;nbsp;테이블과&amp;nbsp;TBL_JUMUN&amp;nbsp;테이블에서 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;제품코드와&amp;nbsp;주문량의&amp;nbsp;값이&amp;nbsp;똑같은&amp;nbsp;행의&amp;nbsp;데이터를 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;주문번호,&amp;nbsp;제품코드,&amp;nbsp;주문량,&amp;nbsp;주문일자&amp;nbsp;항목으로&amp;nbsp;조회한다.&lt;/p&gt;
&lt;pre id=&quot;code_1751959842223&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;답 1
SELECT T2.JUNO &quot;주문번호&quot;, T1.JECODE &quot;제품코드&quot;, T1.JUSU &quot;주문수량&quot;, T2.JUDAY &quot;주문일자&quot;
FROM
(
    SELECT JECODE, JUSU
    FROM TBL_JUMUNBACKUP
    INTERSECT
    SELECT JECODE, JUSU
    FROM TBL_JUMUN
) T1
JOIN
(
    SELECT JECODE, JUSU, JUNO, JUDAY
    FROM TBL_JUMUNBACKUP
    UNION ALL
    SELECT JECODE, JUSU, JUNO, JUDAY
    FROM TBL_JUMUN
) T2
ON T1.JECODE = T2.JECODE
   AND
  T1.JUSU = T2.JUSU;
--==&amp;gt;&amp;gt;
/*
1	    포카칩	20	2001-12-22
2	    쿠크다스	10	2001-12-25
7	    새우깡	10	2002-01-15
10	    허니버터칩	10	2002-02-07
12	    빼빼로	20	2002-02-10
15	    포카칩	20	2002-02-17
16	    홈런볼	10	2002-02-19
938765	홈런볼	10	2025-07-04
938767	포카칩	20	2025-07-04
938768	허니버터칩	10	2025-07-04
938769	빼빼로	20	2025-07-04
938770	홈런볼	10	2025-07-04
938771	새우깡	10	2025-07-04
938776	쿠크다스	10	2025-07-04
*/&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1751959881743&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;답2
-- ★★★ 꼭 알아두세요. 
SELECT T.*
FROM
(
    SELECT JECODE, JUSU, JUNO, JUDAY
    FROM TBL_JUMUNBACKUP
    UNION ALL
    SELECT JECODE, JUSU, JUNO, JUDAY
    FROM TBL_JUMUN
) T
WHERE CONCAT(T.JECODE,T.JUSU) 
IN(SELECT CONCAT(JECODE, JUSU)
    FROM TBL_JUMUNBACKUP
    INTERSECT
    SELECT CONCAT(JECODE, JUSU)
    FROM TBL_JUMUN); 
-- 특정컬럼을 연결 후 단일데이터 구성시 문자열 결합시켜 붙여버리면 원하는 데이터만 추출됨.    
/*
포카칩	20	1	2001-12-22
쿠크다스	10	2	2001-12-25
새우깡	10	7	2002-01-15
허니버터칩	10	10	2002-02-07
빼빼로	20	12	2002-02-10
포카칩	20	15	2002-02-17
홈런볼	10	16	2002-02-19
홈런볼	10	938765	2025-07-04
포카칩	20	938767	2025-07-04
허니버터칩	10	938768	2025-07-04
빼빼로	20	938769	2025-07-04
홈런볼	10	938770	2025-07-04
새우깡	10	938771	2025-07-04
쿠크다스	10	938776	2025-07-04
*/&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1751959902910&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- CHECK~!!! NATURAL 
SELECT DEPTNO, DNAME, ENAME, SAL 
FROM EMP NATURAL JOIN DEPT;
-- 최대한 자연스럽게 결과를 만들어봐. NATURAL 

-- CHECK~!!!USING문 
SELECT DEPTNO, DNAME, ENAME, SAL
FROM EMP E JOIN DEPT D
USING(DEPTNO); 
-- DEPTNO를 활용해서 결합시켜줘&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/222</guid>
      <comments>https://aluck.tistory.com/222#entry222comment</comments>
      <pubDate>Tue, 8 Jul 2025 16:31:52 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - UNION / UNION ALL</title>
      <link>https://aluck.tistory.com/221</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsTU5H/btsO8AMf5R7/B6CYeQcZgwL2KnFljDHgnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsTU5H/btsO8AMf5R7/B6CYeQcZgwL2KnFljDHgnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsTU5H/btsO8AMf5R7/B6CYeQcZgwL2KnFljDHgnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsTU5H%2FbtsO8AMf5R7%2FB6CYeQcZgwL2KnFljDHgnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;133&quot; height=&quot;133&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2001년도&amp;nbsp;부터&amp;nbsp;과자&amp;nbsp;쇼핑몰&amp;nbsp;운영&amp;nbsp;중... &lt;br /&gt;--&amp;nbsp;&amp;nbsp;TBL_JUMUN&amp;nbsp;테이블이&amp;nbsp;매우&amp;nbsp;무거워진&amp;nbsp;상황 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;어플리케이션과의&amp;nbsp;연동으로&amp;nbsp;인해&amp;nbsp;주문&amp;nbsp;내역을 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;다른&amp;nbsp;테이블에&amp;nbsp;저장될&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;다시&amp;nbsp;구성하는&amp;nbsp;것은&amp;nbsp;힘든&amp;nbsp;상황&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;기존의&amp;nbsp;모든&amp;nbsp;데이터를&amp;nbsp;덮어놓고&amp;nbsp;지우는&amp;nbsp;것도&amp;nbsp;불가능한&amp;nbsp;상황&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;결과적으로...&amp;nbsp;현재까지&amp;nbsp;누적된&amp;nbsp;주문&amp;nbsp;데이터&amp;nbsp;중 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;금일&amp;nbsp;발생한&amp;nbsp;주문내역을&amp;nbsp;제외하고 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;나머지를&amp;nbsp;다른&amp;nbsp;테이블로&amp;nbsp;데이터&amp;nbsp;이관을&amp;nbsp;수행할&amp;nbsp;계획 &lt;br /&gt;&lt;br /&gt;--○TBL_JUMUN&amp;nbsp;테이블에서&amp;nbsp;금일&amp;nbsp;발생한&amp;nbsp;주문&amp;nbsp;내역을&amp;nbsp;제외하고 &lt;br /&gt;--&amp;nbsp;나머지&amp;nbsp;데이터&amp;nbsp;조회&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751958823413&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM TBL_JUMUN
WHERE 금일 주문이 아닌 것;

SELECT *
FROM TBL_JUMUN
WHERE TO_CHAR(SYSDATE,'YYYY-MM-DD') != TO_CHAR(JUDAY, 'YYYY-MM-DD');
/*
1	포카칩	20	2001-12-22 09:10:20
2	쿠크다스	10	2001-12-25 10:10:20
3	홈런볼	30	2001-12-27 10:10:20
4	썬칩	20	2001-12-28 10:10:20
5	새우깡	50	2002-01-11 10:10:20
6	쿠크다스	20	2002-01-12 10:10:20
7	새우깡	10	2002-01-15 10:10:20
8	홈런볼	20	2002-01-19 10:10:20
9	포카칩	30	2002-01-22 10:10:20
10	허니버터칩	10	2002-02-07 10:10:20
11	포카칩	30	2002-02-09 10:10:20
12	빼빼로	20	2002-02-10 10:10:20
13	초코파이	30	2002-02-13 10:10:20
14	초코파이	20	2002-02-15 10:10:20
15	포카칩	20	2002-02-17 10:10:20
16	홈런볼	10	2002-02-19 10:10:20
17	홈런볼	30	2002-02-20 10:10:20
*/&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1751958850477&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--○ 위의 조회 결과로 TBL_JUMUNBACKUP 테이블 생성 
CREATE TABLE TBL_JUMUNBACKUP
AS
SELECT *
FROM TBL_JUMUN
WHERE TO_CHAR(SYSDATE,'YYYY-MM-DD') != TO_CHAR(JUDAY, 'YYYY-MM-DD');
--==&amp;gt;&amp;gt; Table TBL_JUMUNBACKUP이(가) 생성되었습니다.

SELECT *
FROM TBL_JUMUNBACKUP; 
/*
1	포카칩	20	2001-12-22 09:10:20
2	쿠크다스	10	2001-12-25 10:10:20
3	홈런볼	30	2001-12-27 10:10:20
4	썬칩	20	2001-12-28 10:10:20
5	새우깡	50	2002-01-11 10:10:20
6	쿠크다스	20	2002-01-12 10:10:20
7	새우깡	10	2002-01-15 10:10:20
8	홈런볼	20	2002-01-19 10:10:20
9	포카칩	30	2002-01-22 10:10:20
10	허니버터칩	10	2002-02-07 10:10:20
11	포카칩	30	2002-02-09 10:10:20
12	빼빼로	20	2002-02-10 10:10:20
13	초코파이	30	2002-02-13 10:10:20
14	초코파이	20	2002-02-15 10:10:20
15	포카칩	20	2002-02-17 10:10:20
16	홈런볼	10	2002-02-19 10:10:20
17	홈런볼	30	2002-02-20 10:10:20
*/
--&amp;gt; TBL_JUMUN 테이블의 데이터들 중
--  금일 주문내역 이외의 데이터는 모두 TBL_JUMUNBACKUP 테이블에 백업을 마친 상태

--○TBL_JUMUN 테이블의 데이터들 중
-- 백업을 마친 금일 주문내역 이외에 데이터는 모두 삭제

DELETE
FROM TBL_JUMUN
WHERE TO_CHAR(SYSDATE,'YYYY-MM-DD') != TO_CHAR(JUDAY, 'YYYY-MM-DD');
--==&amp;gt;&amp;gt; 17개 행 이(가) 삭제되었습니다.&amp;rarr; 938764 건의 데이터가 삭제~!!!

-- 여기까지 수행하면
-- 아직 제품 발송이 완료되지 않은 금일 주문 데이터를 제외하고
-- 이전의 모든 주문 데이터들이 삭제된 상황으로
-- 테이블의 행(레코드)의 갯수가 줄어들어 매우 가벼워진 상황

--○ 확인
SELECT *
FROM TBL_JUMUN;
/*
938765	홈런볼	10	2025-07-04 16:09:35
938766	꼬북칩	20	2025-07-04 16:11:08
938767	포카칩	20	2025-07-04 16:11:43
938768	허니버터칩	10	2025-07-04 16:12:19
938769	빼빼로	20	2025-07-04 16:12:55
938770	홈런볼	10	2025-07-04 16:13:29
938771	새우깡	10	2025-07-04 16:14:08
938772	맛동산	20	2025-07-04 16:14:35
938773	감자깡	20	2025-07-04 16:15:02
938774	오감자	10	2025-07-04 16:15:21
938775	썬칩	40	2025-07-04 16:15:54
938776	쿠크다스	10	2025-07-04 16:16:23
938777	눈을감자	20	2025-07-04 16:16:44
*/

-- 커밋
COMMIT;
--==&amp;gt;&amp;gt; 커밋 완료.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;그런데,&amp;nbsp;지금까지&amp;nbsp;주문받은&amp;nbsp;내역에&amp;nbsp;대한&amp;nbsp;정보를 &lt;br /&gt;--&amp;nbsp;제품별&amp;nbsp;총&amp;nbsp;주문량으로&amp;nbsp;나타내야&amp;nbsp;할&amp;nbsp;상황이&amp;nbsp;발생하게&amp;nbsp;되었다. &lt;br /&gt;--&amp;nbsp;이&amp;nbsp;경우,TBL_JUMUNBACKUP&amp;nbsp;테이블의&amp;nbsp;레코드(행)와 &lt;br /&gt;--&amp;nbsp;TBL_JUMUN&amp;nbsp;테이블의&amp;nbsp;레코드(행)를&amp;nbsp;합쳐서 &lt;br /&gt;--&amp;nbsp;하나의&amp;nbsp;테이블을&amp;nbsp;조회하는&amp;nbsp;것과&amp;nbsp;같은&amp;nbsp;결과를&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;쿼리문을&amp;nbsp;구성해야&amp;nbsp;한다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;컬럼과&amp;nbsp;컬럼의&amp;nbsp;관계를&amp;nbsp;고러하여&amp;nbsp;테이블을&amp;nbsp;결합하고자&amp;nbsp;하는&amp;nbsp;경우&amp;nbsp;JOIN&amp;nbsp;을&amp;nbsp;사용하지만 &lt;br /&gt;--&amp;nbsp;레코드(행)와&amp;nbsp;레코드(행)를&amp;nbsp;결합하고자&amp;nbsp;하는&amp;nbsp;경우&amp;nbsp;UNION&amp;nbsp;/&amp;nbsp;UNION&amp;nbsp;ALL&amp;nbsp;을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;※&amp;nbsp;UNION은&amp;nbsp;항상&amp;nbsp;결과물의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;컬럼을&amp;nbsp;기준으로 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;오름차순&amp;nbsp;정렬을&amp;nbsp;수행한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;반면,&amp;nbsp;UNION&amp;nbsp;ALL&amp;nbsp;은&amp;nbsp;결합된&amp;nbsp;순서대로(쿼리문&amp;nbsp;구성대로)&amp;nbsp;조회한&amp;nbsp;결과를&amp;nbsp;반환한다.(정렬&amp;nbsp;없음) &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;이로&amp;nbsp;인해&amp;nbsp;UNION&amp;nbsp;의&amp;nbsp;부하가&amp;nbsp;더&amp;nbsp;크다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;또한,&amp;nbsp;UNION은&amp;nbsp;결과물에서&amp;nbsp;중복된&amp;nbsp;행이&amp;nbsp;존재할&amp;nbsp;경우 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;중복을&amp;nbsp;제거하고&amp;nbsp;1개&amp;nbsp;행만&amp;nbsp;조회된&amp;nbsp;결과를&amp;nbsp;반환하게&amp;nbsp;된다.&amp;nbsp; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-- 문제&lt;br /&gt;--○&amp;nbsp;지금까지&amp;nbsp;주문받은&amp;nbsp;모든&amp;nbsp;데이터를&amp;nbsp;활용하여 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;제품별&amp;nbsp;총&amp;nbsp;주문량을&amp;nbsp;조회하는&amp;nbsp;쿼리문을&amp;nbsp;구성한다.&amp;nbsp; &lt;br /&gt;/* &lt;br /&gt;------------------------------------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;제품코드&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;총주문량 &lt;br /&gt;------------------------------------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;홈런볼&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XXX &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;꼬북칩&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XX &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: &lt;br /&gt;------------------------------------- &lt;br /&gt;*/&lt;/p&gt;
&lt;pre id=&quot;code_1751958909965&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT T.JECODE &quot;제품코드&quot;, SUM(T.JUSU) &quot;총주문량&quot;
FROM
(
SELECT JECODE, JUSU
FROM TBL_JUMUNBACKUP
UNION ALL -- 같은 제품 코드가 많으므로 
SELECT JECODE, JUSU
FROM TBL_JUMUN
)T
GROUP BY JECODE;

/*
썬칩	60
초코파이	50
꼬북칩	20
쿠크다스	40
새우깡	70
맛동산	20
포카칩	120
오감자	10
눈을감자	20
홈런볼	110
허니버터칩	20
빼빼로	40
감자깡	20
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/221</guid>
      <comments>https://aluck.tistory.com/221#entry221comment</comments>
      <pubDate>Tue, 8 Jul 2025 16:15:24 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - TABLE JOIN</title>
      <link>https://aluck.tistory.com/220</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nDZBm/btsO8nlQjlm/kFTX9rKymrYaNJkLyQLk1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nDZBm/btsO8nlQjlm/kFTX9rKymrYaNJkLyQLk1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nDZBm/btsO8nlQjlm/kFTX9rKymrYaNJkLyQLk1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnDZBm%2FbtsO8nlQjlm%2FkFTX9rKymrYaNJkLyQLk1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;125&quot; height=&quot;125&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제1. &lt;br /&gt;--○&amp;nbsp;EMP&amp;nbsp;테이블과&amp;nbsp;DEPT&amp;nbsp;테이블을&amp;nbsp;대상으로&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;직종이&amp;nbsp;MANAGER&amp;nbsp;와&amp;nbsp;CLERK&amp;nbsp;인&amp;nbsp;사원들만 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;부서번호,&amp;nbsp;부서명,&amp;nbsp;사원명,&amp;nbsp;직종명,&amp;nbsp;급여&amp;nbsp;항목을&amp;nbsp;조회한다.&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;-------&amp;nbsp;&amp;nbsp;&amp;nbsp;-----&amp;nbsp;&amp;nbsp;-----&amp;nbsp;&amp;nbsp;&amp;nbsp;-----&amp;nbsp;&amp;nbsp;&amp;nbsp;--- &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;E,&amp;nbsp;D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;E &lt;br /&gt;--&amp;nbsp;연결고리가&amp;nbsp;되는&amp;nbsp;컬럼을&amp;nbsp;찾아야&amp;nbsp;한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751941593885&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT D.DEPTNO, DNAME, ENAME, JOB, SAL 
FROM EMP E, DEPT D 
WHERE E.DEPTNO = D.DEPTNO;
--&amp;gt; 두 테이블 간 중복되는 컬럼에 대한 소속 테이블을 명시하는 경우
--  부서(DEPT), 사원(EMP) 중 어떤 테이블을 지정해도
--  쿼리문 수행에 대한 결과 반환에는 문제가 없다. (차이도 없다.)

--※ 하지만...
--   두 테이블 간 중복되는 컬럼에 대한 소속 테이블을 명시하는 경우
--   부모 테이블의 컬럼을 참조할 수 있도록 해야 한다. 연결고리는 DEPTNO
--   부모는 DEPT 테이블 20번 부서에 EMP 테이블20번 부서 사원들이 여러명 존재한다. 

SELECT *
FROM EMP; -- 자식테이블
SELECT *
FROM DEPT; -- 부모테이블 

--※ 부모 자식 테이블 관계를 명확히 정리할 수 있도록 한다. ★★
--        관계컬럼(DEPTNO)
-- EMP --------------------- DEPT

SELECT D.DEPTNO, DNAME, ENAME, JOB, SAL 
FROM EMP E RIGHT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

SELECT E.DEPTNO, DNAME, ENAME, JOB, SAL 
FROM EMP E RIGHT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
-- 자식걸 가져다 쓰면 부서번호가 안나오는 문제가 있음 
-- (NULL)	OPERATIONS	(NULL)... 		

SELECT D.DEPTNO, D.DNAME, E.ENAME, E.JOB, E.SAL 
FROM EMP E, DEPT D 
WHERE E.DEPTNO = D.DEPTNO;
--&amp;gt; 두 테이블 간 중복된 컬럼이 아니더라도... 소속 테이블을 명시할 수 있기를 권장함.
-- 어떤 테이블인지 명명해주지 않으면 모든 테이블을 다 뒤져야 하므로 테이블명을 명명해야함.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--○&amp;nbsp;세&amp;nbsp;개&amp;nbsp;이상의&amp;nbsp;테이블&amp;nbsp;조인(JOIN,&amp;nbsp;결합) &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;형식1(SQL&amp;nbsp;1992&amp;nbsp;CODE) &lt;br /&gt;SELECT&amp;nbsp;테이블명1.컬럼명,&amp;nbsp;테이블명2.컬럼명,&amp;nbsp;테이블명3.컬럼명 &lt;br /&gt;FROM&amp;nbsp;테이블명1,&amp;nbsp;테이블명2,&amp;nbsp;테이블명3 &lt;br /&gt;WHERE&amp;nbsp;테이블명1.컬럼명1&amp;nbsp;=&amp;nbsp;테이블명2.컬럼명1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;AND&amp;nbsp;테이블명2.컬럼명2&amp;nbsp;=&amp;nbsp;테이블명3.컬럼명2; &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;형식2(SQL&amp;nbsp;1999&amp;nbsp;CODE) &lt;br /&gt;SELECT&amp;nbsp;테이블명1.컬럼명,&amp;nbsp;테이블명2.컬럼명,&amp;nbsp;테이블명3.컬럼명 &lt;br /&gt;FROM&amp;nbsp;테이블명1&amp;nbsp;JOIN&amp;nbsp;테이블명2 &lt;br /&gt;ON&amp;nbsp;테이블명1.컬럼명1&amp;nbsp;=&amp;nbsp;테이블명2.컬럼명1&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JOIN&amp;nbsp;테이블명3 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ON&amp;nbsp;테이블명2.컬럼명2&amp;nbsp;=&amp;nbsp;테이블명3.컬럼명2;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--문제 &lt;br /&gt;--○&amp;nbsp;EMPLOYEES,&amp;nbsp;DEPARTMENTS,&amp;nbsp;JOBS,&amp;nbsp;LOCATIONS,&amp;nbsp;COUNTRIES,&amp;nbsp;REGIONS&amp;nbsp;테이블을&amp;nbsp;대상으로 &lt;br /&gt;--&amp;nbsp;직원들의&amp;nbsp;데이터를&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;조회할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;쿼리문을&amp;nbsp;구성한다. &lt;br /&gt;--&amp;nbsp;FIRST_NAME,&amp;nbsp;LAST_NAME,&amp;nbsp;JOB_TITLE,&amp;nbsp;DEPARTMENT_NAME,&amp;nbsp;CITY,&amp;nbsp;COUNTRY_NAME,&amp;nbsp;REGION_NAME &lt;br /&gt;--&amp;nbsp;92,&amp;nbsp;99&amp;nbsp;코드로&amp;nbsp;해결&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751958170900&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 최종쿼리문
SELECT E.FIRST_NAME, E.LAST_NAME, J.JOB_TITLE, D.DEPARTMENT_NAME, L.CITY, C.COUNTRY_NAME, R.REGION_NAME    
FROM EMPLOYEES E, DEPARTMENTS D, JOBS J, LOCATIONS L, COUNTRIES C,REGIONS R 
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID(+)
    AND E.JOB_ID = J.JOB_ID
    AND D.LOCATION_ID = L.LOCATION_ID(+)
    AND L.COUNTRY_ID = C.COUNTRY_ID(+)
    AND C.REGION_ID = R.REGION_ID(+);
-- 107개 

-- 99번
SELECT E.FIRST_NAME, E.LAST_NAME, J.JOB_TITLE, D.DEPARTMENT_NAME, L.CITY, C.COUNTRY_NAME, R.REGION_NAME
    FROM EMPLOYEES E LEFT JOIN JOBS J
ON E.JOB_ID = J.JOB_ID
LEFT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
LEFT JOIN LOCATIONS L
ON D.LOCATION_ID = L.LOCATION_ID
LEFT JOIN COUNTRIES C
ON L.COUNTRY_ID = C.COUNTRY_ID
LEFT JOIN REGIONS R
ON C.REGION_ID = R.REGION_ID;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>Oracle</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/220</guid>
      <comments>https://aluck.tistory.com/220#entry220comment</comments>
      <pubDate>Tue, 8 Jul 2025 16:04:39 +0900</pubDate>
    </item>
    <item>
      <title>Oracle -GROUPING, HAVING, EXTRACT,MAX, SEQUENCE ,INDENTITY</title>
      <link>https://aluck.tistory.com/219</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제1.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;위에서&amp;nbsp;조회한&amp;nbsp;내용을&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;조회될&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;쿼리문을&amp;nbsp;구성한다. &lt;br /&gt;/* &lt;br /&gt;부서번호&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;급여합 &lt;br /&gt;----------&amp;nbsp;---------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8750 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10875 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9400 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;인턴&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8000 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;모든부서&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;37025 &lt;br /&gt;--------------------- &lt;br /&gt;*/&lt;/p&gt;
&lt;pre id=&quot;code_1751589104693&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT CASE GROUPING(DEPTNO) WHEN 0 THEN NVL(TO_CHAR(DEPTNO), '인턴')
            ELSE '모든부서' -- 문자타입
            END &quot;부서번호&quot;
            ,  SUM(SAL)
FROM TBL_EMP
GROUP BY ROLLUP(DEPTNO);
/*
10	8750
20	10875
30	9400
인턴	8000
모든부서	37025
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제2 &lt;br /&gt;--○TBL_SAWON&amp;nbsp;테이블을&amp;nbsp;대상으로&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;조회될&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;쿼리문을&amp;nbsp;구성한다. &lt;br /&gt;/* &lt;br /&gt;------------------- &lt;br /&gt;&amp;nbsp;성별&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;급여합 &lt;br /&gt;----------------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;남&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XXX &lt;br /&gt;&amp;nbsp;&amp;nbsp;여&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XXXX &lt;br /&gt;모든사원&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XXXXX &lt;br /&gt;------------------ &lt;br /&gt;*/&lt;/p&gt;
&lt;pre id=&quot;code_1751589143324&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT CASE GROUPING(T.성별) WHEN 0 THEN T.성별
        ELSE '모든사원' 
        END &quot;성별&quot;
    , SUM(T.급여) &quot;급여합&quot;   
FROM
(
    SELECT CASE WHEN SUBSTR(JUBUN,7,1) IN ('1','3') THEN '남'
                WHEN SUBSTR(JUBUN,7,1) IN ('2','4') THEN '여'
                ELSE '성별판별불가'
            END &quot;성별&quot;
         ,SAL &quot;급여&quot;
    FROM TBL_SAWON
)T
GROUP BY ROLLUP(T.성별);
/*
남	15100
여	11000
모든사원	26100
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제3 &lt;br /&gt;--○TBL_SAWON&amp;nbsp;테이블을&amp;nbsp;대상으로&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;연령대별&amp;nbsp;인원수&amp;nbsp;형태로&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;조회될&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;쿼리문을&amp;nbsp;구성한다. &lt;br /&gt;/* &lt;br /&gt;---------------- &lt;br /&gt;연령대&amp;nbsp;&amp;nbsp;&amp;nbsp;인원수 &lt;br /&gt;-------------- &lt;br /&gt;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X &lt;br /&gt;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X &lt;br /&gt;30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X &lt;br /&gt;50&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X &lt;br /&gt;전체&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XX &lt;br /&gt;--------------&lt;/p&gt;
&lt;pre id=&quot;code_1751591336012&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT CASE GROUPING(Q.연령대) WHEN 0 THEN TO_CHAR(Q.연령대)
            ELSE '전체'
       END &quot;연령대&quot;
     , COUNT(Q.연령대) &quot;인원수&quot;
FROM
(
    SELECT CASE WHEN T.나이 &amp;gt;=50 AND T.나이&amp;lt;60 THEN 50
                WHEN T.나이 &amp;gt;=40 THEN 40
                WHEN T.나이 &amp;gt;=30 THEN 30
                WHEN T.나이 &amp;gt;=20 THEN 20
                WHEN T.나이 &amp;gt;=10 THEN 10
                ELSE 0
            END &quot;연령대&quot;
    FROM
    (
        SELECT CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1','2')
                 THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899)    
                 WHEN SUBSTR(JUBUN, 7, 1) IN ('3','4')
                 THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) +1999) 
                 ELSE -1
                END &quot;나이&quot;
        FROM TBL_SAWON
    ) T
) Q
GROUP BY ROLLUP(Q.연령대);
/*
연령대  인원수
------- ----------
20       5
30       1
40       3
50       4
전체     13
*/

방법2)
SELECT CASE GROUPING(T.연령대) WHEN 0 THEN TO_CHAR(T.연령대)
        ELSE '전체'
        END &quot;연령대&quot;
        ,COUNT (T.연령대) &quot;인원수&quot; 
FROM
(
    SELECT TRUNC(CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1','2')
             THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899)    
             WHEN SUBSTR(JUBUN, 7, 1) IN ('3','4')
             THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) +1999) 
             ELSE -1
            END , -1) &quot;연령대&quot; 
    FROM TBL_SAWON
)T
GROUP BY ROLLUP(T.연령대);
/*
연령대  인원수
------- ----------
20       5
30       1
40       3
50       4
전체     13
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제4.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--○TBL_EMP&amp;nbsp;테이블을&amp;nbsp;대상으로&amp;nbsp;입사년도별&amp;nbsp;인원수를&amp;nbsp;조회한다. &lt;br /&gt;/* &lt;br /&gt;----------------------------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;입사년도&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;인원수 &lt;br /&gt;----------------------------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1980&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1981&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1982&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1987&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2025&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;전체&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;19&amp;nbsp;&amp;nbsp; &lt;br /&gt;----------------------------- &lt;br /&gt;*/&lt;/p&gt;
&lt;pre id=&quot;code_1751936454684&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT TO_CHAR(HIREDATE, 'YYYY') &quot;입사년도&quot;
     , COUNT(*) &quot;인원수&quot;
FROM TBL_EMP
GROUP BY TO_CHAR(HIREDATE, 'YYYY')
ORDER BY 1;
/*
1980	1
1981	10
1982	1
1987	2
2025	5
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751936495892&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- ■■■ HAVING ■■■ --

--○ EMP 테이블에서 부서번호가 20, 30인 부서를 대상으로
-- 부서의 총 급여가 10000 보다 적을 경우만 부서별 총 급여를 조회한다. 
-- FWG HSO

SELECT DEPTNO, SUM(SAL)
FROM EMP
WHERE DEPTNO IN(20,30)
GROUP BY DEPTNO;
/*
30	9400
20	10875
*/

SELECT DEPTNO, SUM(SAL)
FROM EMP
WHERE DEPTNO IN(20,30)
    AND SUM(SAL) &amp;lt; 10000
GROUP BY DEPTNO; 
--==&amp;gt;&amp;gt; 에러발생
/*
ORA-00934: group function is not allowed here
00934. 00000 -  &quot;group function is not allowed here&quot;
*Cause:    
*Action:
736행, 9열에서 오류 발생
*/

SELECT DEPTNO, SUM(SAL)
FROM EMP
WHERE DEPTNO IN(20,30)
GROUP BY DEPTNO 
-- 그룹에 대한 조건은 해빙절에 위치
HAVING SUM(SAL) &amp;lt; 10000;  --파싱순서체크 
--==&amp;gt;&amp;gt; 30	9400

-- CHECK~!!! 
SELECT DEPTNO, SUM(SAL)
FROM EMP
GROUP BY DEPTNO 
-- 그룹에 대한 조건은 해빙절에 위치 (그룹조건이 아닌 것은 쓰지 않는 것이 좋음) 
HAVING SUM(SAL) &amp;lt; 10000 -- 
    AND DEPTNO IN(20,30);  --파싱순서체크 
--==&amp;gt;&amp;gt; 30	9400

-- ※ 그룹 함수는 2 LEVEL 까지 중첩해서 사용할 수 있다. 
--    이마저도 MS-SQL 은 불가능하다. 

SELECT ... MAX(SUM(SAL)) &quot;결과확인&quot; -- ...에 추가로 무엇을 한다는 안된다는 뜻임 
FROM EMP
GROUP BY DEPTNO;

-- ※ RANK()
--    DENSE_RANK()
--    &amp;rarr; ORACLE 9i 부터 적용 ... MS-SQL 2005 부터 적용...

--※ 위와 같이 하위 버전에서 RANK() 나 DENSE_RANK() 를 사용할 수 없기 때문에
--   이를 대체하여 연산을 수행할 수 있는 방법을 강구해야 한다.

-- 예를 들어, 급여의 순위를 구해야 하는 상황이라면...
-- 해당 사원의 급여보다 더 큰 급여 값이 몇 개인지 확인한 후 
-- 그 확인한 숫자에 +1을 추가 연산해주면 그것이 곧 등수가 된다. 

SELECT ENAME, SAL
FROM EMP;

--  SMITH 사원의 급여 등수
SELECT COUNT(*) + 1 &quot;SMITH급여등수&quot;
FROM EMP
WHERE SAL &amp;gt; 800;    -- SMITH의 급여 

SELECT ENAME &quot;사원명&quot;, SAL &quot;급여&quot;, 1 &quot;급여등수&quot;
FROM EMP;

-- ※ 상관 서브 쿼리(서브 상관 쿼리) 
--    메인 쿼리에 있는 테이블의 컬럼이 
--    서브 쿼리의 조건절(WHERE절, HAVING절)에 사용되는 경우
--    우리는 이 쿼리문을 상관 서브쿼리(서브 상관 쿼리)라고 부른다. 

(1) &quot;급여등수&quot;

SELECT ENAME &quot;사원명&quot;, SAL &quot;급여&quot;, (SELECT COUNT(*) + 1 &quot;SMITH급여등수&quot;
FROM EMP
WHERE SAL &amp;gt; 800;
FROM EMP;

SELECT ENAME &quot;사원명&quot;, SAL &quot;급여&quot;, (SELECT COUNT(*) + 1
                                   FROM EMP
                                   WHERE SAL &amp;gt; 800) &quot;급여등수&quot; 
FROM EMP;

SELECT ENAME &quot;사원명&quot;, SAL &quot;급여&quot;, (SELECT COUNT(*) + 1
                                   FROM EMP E2
                                   WHERE E2.SAL &amp;gt; E1.SAL) &quot;급여등수&quot; -- E2급여셀 &amp;gt; 스미스부터~ 의 급여 
FROM EMP E1
ORDER BY 3;
/*                              
KING	5000	1
FORD	3000	2
SCOTT	3000	2
JONES	2975	4
BLAKE	2850	5
CLARK	2450	6
ALLEN	1600	7
TURNER	1500	8
MILLER	1300	9
WARD	1250	10
MARTIN	1250	10
ADAMS	1100	12
JAMES	950	13
SMITH	800	14
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제5 &lt;br /&gt;--○&amp;nbsp;EMP&amp;nbsp;테이블을&amp;nbsp;대상으로 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;사원명,&amp;nbsp;급여,&amp;nbsp;부서번호,&amp;nbsp;부서내급여등수,&amp;nbsp;전체급여등수&amp;nbsp;항목을&amp;nbsp;조회한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;단,&amp;nbsp;RANK()&amp;nbsp;함수를&amp;nbsp;사용하지&amp;nbsp;않고,&amp;nbsp;서브&amp;nbsp;상관&amp;nbsp;쿼리를&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751936529884&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT COUNT(*) + 1
FROM EMP E2
WHERE SAL &amp;gt; 5000
      AND DEPTNO = 10;
--위 수식을 짤라서 (100) 자리에 넣어주고 최종 쿼리문 완성       
SELECT ENAME &quot;사원명&quot;, SAL &quot;급여&quot;, DEPTNO &quot;부서번호&quot; 
        ,(SELECT COUNT(*) + 1
            FROM EMP E2
            WHERE E2.SAL &amp;gt; E1.SAL
                  AND E2.DEPTNO = E1.DEPTNO) &quot;부서내급여등수&quot;
        ,(SELECT COUNT(*) + 1
         FROM EMP E2
         WHERE E2.SAL &amp;gt; E1.SAL) &quot;전체급여등수&quot;
FROM EMP E1
ORDER BY E1.DEPTNO, E1.SAL DESC;
/*
KING	5000	10	1	1
CLARK	2450	10	2	6
MILLER	1300	10	3	9
SCOTT	3000	20	1	2
FORD	3000	20	1	2
JONES	2975	20	3	4
ADAMS	1100	20	4	12
SMITH	800	20	5	14
BLAKE	2850	30	1	5
ALLEN	1600	30	2	7
TURNER	1500	30	3	8
MARTIN	1250	30	4	10
WARD	1250	30	4	10
JAMES	950	30	6	13
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제6 &lt;br /&gt;--○&amp;nbsp;EMP&amp;nbsp;테이블을&amp;nbsp;대상으로&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;조회될&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;쿼리문을&amp;nbsp;구성한다. &lt;br /&gt;/* &lt;br /&gt;---------------------------------------------------------------------------------------------------------------------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;사원명&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;부서번호&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;입사일&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;급여&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;부서내입사별급여누적(&amp;rarr;&amp;nbsp;부서&amp;nbsp;내에서&amp;nbsp;입사일자별로&amp;nbsp;급여가&amp;nbsp;누적된&amp;nbsp;상황&amp;nbsp;확인) &lt;br /&gt;---------------------------------------------------------------------------------------------------------------------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CLRAK&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1981-06-09&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2450&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2450 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;KING&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1981-11-17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7450 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MILLER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1982-01-23&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1300&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8750&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SMITH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1980-12-17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;800&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;800&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JONES&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1981-04-02&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2975&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3775 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: &lt;br /&gt;-----------------------------------------------------------------------------------------------------------------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;*/&lt;/p&gt;
&lt;pre id=&quot;code_1751938447605&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT ENAME &quot;사원명&quot;, DEPTNO&quot;부서번호&quot;,HIREDATE &quot;입사일&quot;, SAL&quot;급여&quot;
    ,(SELECT SUM(E2.SAL)
        FROM EMP E2
        WHERE E2.DEPTNO = E1.DEPTNO -- 같은 부서이면서라는 조건 
         AND E2.HIREDATE &amp;lt;=E1.HIREDATE) &quot;부서내입사별급여누적&quot;
FROM EMP E1  
ORDER BY 3,2;
--==&amp;gt;&amp;gt; 
/*
CLARK	10	81/06/09	    2450	2450
KING	10	81/11/17	5000	7450
MILLER	10	82/01/23	    1300	8750
SMITH	20	80/12/17	    800	800
JONES	20	81/04/02	    2975	3775
FORD	20	81/12/03	    3000	6775
SCOTT	20	87/07/13	    3000	    10875
ADAMS	20	87/07/13	    1100	    10875
ALLEN	30	81/02/20	    1600	1600
WARD	30	81/02/22	    1250	2850
BLAKE	30	81/05/01    	2850	5700
TURNER	30	81/09/08    	1500	7200
MARTIN	30	81/09/28	    1250	8450
JAMES	30	81/12/03	    950	9400
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제7 &lt;br /&gt;--○&amp;nbsp;TBL_EMP&amp;nbsp;테이블에서&amp;nbsp;입사한&amp;nbsp;사원의&amp;nbsp;수가&amp;nbsp;제일&amp;nbsp;많았을&amp;nbsp;때의 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;입사년월과&amp;nbsp;인원수를&amp;nbsp;조회할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;쿼리문을&amp;nbsp;구성한다.&amp;nbsp; &lt;br /&gt;/* &lt;br /&gt;------------------------ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;입사년월&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;인원수 &lt;br /&gt;------------------------ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2025-07&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5 &lt;br /&gt;------------------------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;*/&lt;/p&gt;
&lt;pre id=&quot;code_1751939056749&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT MAX(COUNT(*))
FROM TBL_EMP
GROUP BY TO_CHAR(HIREDATE, 'YYYY-MM');
--==&amp;gt;&amp;gt; 5 -- 인원수 가장 많은 걸 알려줘 

SELECT TO_CHAR(HIREDATE, 'YYYY-MM') &quot;입사년월&quot;
     , COUNT(*) &quot;인원수&quot;
FROM TBL_EMP
GROUP BY TO_CHAR(HIREDATE, 'YYYY-MM')
HAVING COUNT(*) = (SELECT MAX(COUNT(*))
                FROM TBL_EMP
                GROUP BY TO_CHAR(HIREDATE, 'YYYY-MM')); 
--==&amp;gt;&amp;gt; 2025-07	5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;※&amp;nbsp;게시판의&amp;nbsp;게시물&amp;nbsp;번호를 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;SEQUENCE&amp;nbsp;나&amp;nbsp;INDENTITY&amp;nbsp;를&amp;nbsp;사용하게&amp;nbsp;되며&amp;nbsp;(EX&amp;nbsp;:&amp;nbsp;번호표&amp;nbsp;발행&amp;nbsp;모듈) &lt;br /&gt;--&amp;nbsp;&amp;nbsp;특정&amp;nbsp;게시물을&amp;nbsp;삭제했을&amp;nbsp;경우,&amp;nbsp;삭제한&amp;nbsp;게시물의&amp;nbsp;자리에 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;다음&amp;nbsp;번호를&amp;nbsp;가진&amp;nbsp;게시물이&amp;nbsp;등록되는&amp;nbsp;상황이&amp;nbsp;발생하게&amp;nbsp;된다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;이는,&amp;nbsp;보안&amp;nbsp;측면에서나&amp;nbsp;...&amp;nbsp;미관상&amp;nbsp;...&amp;nbsp;바람직하지&amp;nbsp;않은&amp;nbsp;상황일&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문에 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;ROW_NUMBER() 의 사용을 고려해 볼 수 있다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;관리의&amp;nbsp;목적으로&amp;nbsp;사용할&amp;nbsp;때는&amp;nbsp;SEQUENCE&amp;nbsp;나&amp;nbsp;INDENTITY를&amp;nbsp;사용하지만 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;단순히&amp;nbsp;게시물을&amp;nbsp;목록화하여&amp;nbsp;사용자에게&amp;nbsp;리스트&amp;nbsp;형식으로&amp;nbsp;보여줄&amp;nbsp;때는 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;사용하지&amp;nbsp;않는&amp;nbsp;것이&amp;nbsp;좋다.&amp;nbsp; &lt;br /&gt;--&amp;nbsp;EX)&amp;nbsp;싸이월드&amp;nbsp;쪽지&amp;nbsp;NO.&amp;nbsp;79885414&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;게시물의&amp;nbsp;관리번호&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751939716461&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UPDATE TBL_AAA 
SET GRADE='A'
WHERE NO=6;
--==&amp;gt;&amp;gt; 1 행 이(가) 업데이트되었습니다.
-- 식별자를 갖고 있는것이 관리측면에서 좋음. 

--○ SEQUENCE 생성(시퀀스, 주문번호)
--   &amp;rarr; 사전적인 의미 : 1.(일련의) 연속적인 사건들 2.(사건,행동 등의) 순서 
-- SEQUENCE생성시 리모컨 형태 - 은행에서 번호표 뽑을때마다
CREATE SEQUENCE SEQ_BOARD -- 시퀀스 기본 생성 구문(MYSQL의 INDENTITY와 동일한 개념)
START WITH 1              -- 시작값
INCREMENT BY 1            -- 증가값 (얼마씩 증가해 나갈래?)
NOMAXVALUE                -- 최대값 제한 없음 
NOCACHE;                  -- 캐시 사용 안함(없음) -- 번호표를 미리 많이 뽑아놓은것=그것이 캐시
--==&amp;gt;&amp;gt; Sequence SEQ_BOARD이(가) 생성되었습니다. 
-- 시퀀스는 생성 후 수정 불가함. 

--○ 테이블 생성 
-- 테이블명 : TBL_BOARD
CREATE TABLE TBL_BOARD                  --  TBL_BOARD이름의 테이블 생성 &amp;rarr; 게시판
(   NO          NUMBER                  -- 게시물 번호     X
,   TITLE       VARCHAR2(50)            -- 게시물 제목     O
,   CONTENTS    VARCHAR2(2000)          -- 게시물 내용     O
,   NAME        VARCHAR2(20)            -- 게시물 작성자   △
,   PW          VARCHAR2(20)            -- 게시물 패스워드 △
,   CREATED     DATE DEFAULT SYSDATE    -- 게시물 작성일   X -- 제약조건의 일종 
);
--==&amp;gt;&amp;gt; Table TBL_BOARD이(가) 생성되었습니다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/219</guid>
      <comments>https://aluck.tistory.com/219#entry219comment</comments>
      <pubDate>Tue, 8 Jul 2025 10:58:46 +0900</pubDate>
    </item>
    <item>
      <title>Oracle -CASE WHEN THEN ELSE END 서브쿼리 , 인라인뷰</title>
      <link>https://aluck.tistory.com/218</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJPQb3/btsO18OwFNg/l3eNtOSXYa2BcdQz8filg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJPQb3/btsO18OwFNg/l3eNtOSXYa2BcdQz8filg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJPQb3/btsO18OwFNg/l3eNtOSXYa2BcdQz8filg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJPQb3%2FbtsO18OwFNg%2Fl3eNtOSXYa2BcdQz8filg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;117&quot; height=&quot;117&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜형식&lt;/p&gt;
&lt;pre id=&quot;code_1751438392116&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT USER
FROM DUAL;

--○ CASE WHEN THEN ELSE END 구문 활용
SELECT CASE WHEN 5&amp;lt;2 THEN '5&amp;lt;2'
            WHEN 5&amp;gt;2 THEN '5&amp;gt;2'
            ELSE '5와 2는 비교불가'    
       END &quot;결과확인&quot; 
FROM DUAL;
--==&amp;gt;&amp;gt; 5&amp;gt;2

SELECT CASE WHEN 5&amp;lt;2 OR 3&amp;gt;1 THEN '구석만세' -- F T &amp;gt;&amp;gt; 결과는 T
            WHEN 5&amp;gt;2 OR 2=3 THEN '주혁만세' 
            ELSE '유진만세'
       END &quot;결과확인&quot; 
FROM DUAL;
--==&amp;gt;&amp;gt;구석만세
/*
SELECT CASE WHEN F OR T THEN '구석만세' -- F T &amp;gt;&amp;gt; 결과는 T
            WHEN T OR 2=3 THEN '주혁만세' 
            ELSE '유진만세'
       END &quot;결과확인&quot; 
FROM DUAL;
*/

SELECT CASE WHEN 3&amp;lt;1 AND 5&amp;lt;2 OR 3&amp;gt;1 AND 2=2 THEN '구석만세'
            WHEN 5&amp;lt;2 AND 2=2 THEN '주혁만세'
        END &quot;결과확인&quot;
FROM DUAL;
--==&amp;gt;&amp;gt;구석만세

/*
SELECT CASE WHEN T THEN '구석만세'
            WHEN 5&amp;lt;2 AND 2=2 THEN '주혁만세'
        END &quot;결과확인&quot;
FROM DUAL;
*/

SELECT CASE WHEN 3&amp;lt;1 AND (5&amp;lt;2 OR 3&amp;gt;1) AND 2=2 THEN '구석만세'
            WHEN 5&amp;lt;2 AND 2=2 THEN '주혁만세'
            ELSE '유진만세'
        END &quot;결과확인&quot;
FROM DUAL;
--==&amp;gt;&amp;gt;유진만세

/*
SELECT CASE WHEN F AND T THEN '구석만세' -- F T &amp;gt;&amp;gt; F
            WHEN F ANDT THEN '주혁만세'
            ELSE '유진만세'
       END &quot;결과확인&quot;
FROM DUAL;
*/

SELECT SYSDATE
FROM DUAL;

--※ 날짜형식 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--==&amp;gt;&amp;gt;Session이(가) 변경되었습니다.

SELECT *
FROM TBL_SAWON;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 -&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--○&amp;nbsp;TBL_SAWON&amp;nbsp;테이블을&amp;nbsp;활용하여&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;항목을&amp;nbsp;조회한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;『사원번호,&amp;nbsp;사원명,&amp;nbsp;주민번호,&amp;nbsp;성별,&amp;nbsp;현재나이,&amp;nbsp;입사일 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;,&amp;nbsp;정년퇴직일,&amp;nbsp;근무일수,&amp;nbsp;남은일수,&amp;nbsp;급여,&amp;nbsp;보너스』 &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;단,&amp;nbsp;현재나이는&amp;nbsp;만나이&amp;nbsp;계산법이&amp;nbsp;아닌&amp;nbsp;기존의&amp;nbsp;한국&amp;nbsp;나이&amp;nbsp;계산법에&amp;nbsp;따라&amp;nbsp;연산을&amp;nbsp;수행한다. &lt;br /&gt;--&amp;nbsp;또한&amp;nbsp;정년퇴직일은&amp;nbsp;해당&amp;nbsp;직원의&amp;nbsp;나이가&amp;nbsp;한국&amp;nbsp;나이로&amp;nbsp;65세가&amp;nbsp;되는&amp;nbsp;해(연도)의&amp;nbsp; &lt;br /&gt;--&amp;nbsp;그&amp;nbsp;직원의&amp;nbsp;입사&amp;nbsp;월,&amp;nbsp;일로&amp;nbsp;연산을&amp;nbsp;수행한다.&amp;nbsp; &lt;br /&gt;--&amp;nbsp;그리고&amp;nbsp;보너스는&amp;nbsp;근무일수에&amp;nbsp;따라&amp;nbsp;책정하며 &lt;br /&gt;--&amp;nbsp;근무일수가&amp;nbsp;5000일&amp;nbsp;이상&amp;nbsp;6000일&amp;nbsp;미만&amp;nbsp;근무한&amp;nbsp;사원은&amp;nbsp;그&amp;nbsp;사원의&amp;nbsp;급여&amp;nbsp;기준&amp;nbsp;30%&amp;nbsp;지급 &lt;br /&gt;--&amp;nbsp;근무일수가&amp;nbsp;6000일&amp;nbsp;이상인&amp;nbsp;사원은&amp;nbsp;해당&amp;nbsp;사원의&amp;nbsp;급여&amp;nbsp;기준&amp;nbsp;50%&amp;nbsp;지급을&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;처리한다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;TBL_SAWON&amp;nbsp;테이블에&amp;nbsp;존재하는&amp;nbsp;사원의&amp;nbsp; &lt;br /&gt;--&amp;nbsp;입사일(HIREDATE)&amp;nbsp;컬럼에서&amp;nbsp;월,&amp;nbsp;일만&amp;nbsp;조회하기&lt;/p&gt;
&lt;pre id=&quot;code_1751441299935&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT T.사원번호 , T.사원명 , T.주민번호 , T.성별, T. 현재나이, T.입사일
    , TO_CHAR(ADD_MONTHS(SYSDATE, (65 - T.현재나이) *12),'YYYY') || '-' || TO_CHAR(T.입사일, 'MM-DD') &quot;정년퇴직일&quot; -- 문자타입인 상태임. 
    , TRUNC(SYSDATE- T.입사일) &quot;근무일수&quot;     
    , TRUNC(TO_DATE(TO_CHAR(ADD_MONTHS(SYSDATE, (65 - T.현재나이) *12),'YYYY') || '-' || TO_CHAR(T.입사일, 'MM-DD'), 'YYYY-MM-DD') - SYSDATE) &quot;남은일수&quot;        
    , CASE WHEN TRUNC(SYSDATE - T.입사일) &amp;gt;= 6000 THEN T.급여*0.5
           WHEN TRUNC(SYSDATE - T.입사일) &amp;gt;= 5000 THEN T.급여*0.3
           ELSE 0
     END &quot;보너스&quot;     
FROM 
(
    SELECT SANO&quot;사원번호&quot;, SANAME&quot;사원명&quot;,  JUBUN&quot;주민번호&quot;
        -- 성별
    ,   CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '3') THEN '남자' -- 문자타입
             WHEN SUBSTR(JUBUN, 7, 1) IN ('2', '4') THEN '여자' -- 문자타입
             ELSE '성별확인불가' -- 문자타입
        END &quot;성별&quot;
    -- 현재나이 = 현재년도 - 태어난년도 + 1(1900년대 생 1 2 / 2000년대 생 3 4) --분기구성필요
    ,   CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1','2')
             THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899)    
             WHEN SUBSTR(JUBUN, 7, 1) IN ('3','4')
             THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) +1999) 
             ELSE -1  -- 조건문상은 항상 같은 데이터타입을 가져야 함으로 나이확인불가는 불가 
        END &quot;현재나이&quot;
        --입사일
        ,HIREDATE &quot;입사일&quot; 
        --급여
        ,SAL &quot;급여&quot;
    FROM TBL_SAWON
) T;
--==&amp;gt;&amp;gt; 
/*
1013	김훈	8502071234557	남자	41	1999-10-10	2049-10-10	9397	8865	1000
1001	김주형	0004183234567	남자	26	2011-01-03	2064-01-03	5294	14063	900
1002	이유빈	0406274234567	여자	22	2017-11-05	2068-11-05	2796	15831	0
1003	유한	0004173234567	남자	26	2011-01-03	2064-01-03	5294	14063	900
1004	이상이	8512161234567	남자	41	1998-08-16	2049-08-16	9817	8810	1000
1005	아이유	9302022234567	여자	33	2010-07-13	2057-07-13	5468	11698	900
1006	이이경	7506171234567	남자	51	1997-03-10	2039-03-10	10341	4998	2000
1007	미노이	9704252234567	여자	29	2007-12-10	2061-12-10	6414	13309	1000
1008	선우선	7905082234567	여자	47	1998-08-16	2043-08-16	9817	6618	1000
1009	선동열	7012181234567	남자	56	1990-10-10	2034-10-10	12684	3386	1500
1010	남희석	7502201234567	남자	51	1998-08-16	2039-08-16	9817	5157	500
1011	선우용녀	7005132234567	여자	56	1998-08-16	2034-08-16	9817	3331	500
1012	남궁선	0502204234567	여자	21	2015-08-14	2069-08-14	3610	16113	0
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--※&amp;nbsp;상기&amp;nbsp;내용에서... &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;특정&amp;nbsp;근무일수의&amp;nbsp;사원을&amp;nbsp;확인해야&amp;nbsp;한다거나... &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;특정&amp;nbsp;보너스&amp;nbsp;금액을&amp;nbsp;받는&amp;nbsp;사원을&amp;nbsp;확인해야&amp;nbsp;할&amp;nbsp;경우가&amp;nbsp;생겼다거나&amp;nbsp;...&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;이와&amp;nbsp;같은&amp;nbsp;경우... &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;해당&amp;nbsp;쿼리문을&amp;nbsp;다시&amp;nbsp;구성해야&amp;nbsp;하는&amp;nbsp;번거로움을&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있도록 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;뷰(VIEW)를&amp;nbsp;만들어&amp;nbsp;저장해&amp;nbsp;둘&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;뷰는&amp;nbsp;간편하게&amp;nbsp;만들었다가&amp;nbsp;간편하게&amp;nbsp;지울&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;것&amp;nbsp;(테이블을&amp;nbsp;기반으로해서&amp;nbsp;얻어낼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;것)&amp;nbsp; &lt;/p&gt;
&lt;pre id=&quot;code_1751441437414&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE VIEW VIEW_TEST
AS 
SELECT EMPNO, ENAME, JOB, SAL*12+NVL(COMM,0) &quot;YEARPAY&quot;
FROM TBL_EMP;
--==&amp;gt;&amp;gt; View VIEW_TEST이(가) 생성되었습니다.

--○ 뷰(VIEW) 조회
SELECT *
FROM VIEW_TEST;
--==&amp;gt;&amp;gt; 
/*
7369	SMITH	CLERK	9600
7499	ALLEN	SALESMAN	19500
7521	WARD	SALESMAN	15500
7566	JONES	MANAGER	35700
7654	MARTIN	SALESMAN	16400
7698	BLAKE	MANAGER	34200
7782	CLARK	MANAGER	29400
7788	SCOTT	ANALYST	36000
7839	KING	PRESIDENT	60000
7844	TURNER	SALESMAN	18000
7876	ADAMS	CLERK	13200
7900	JAMES	CLERK	11400
7902	FORD	ANALYST	36000
7934	MILLER	CLERK	15600
*/

--○뷰 생성 이후 대상 테이블에 데이터 추가 
INSERT INTO TBL_EMP(EMPNO, ENAME, JOB, HIREDATE, SAL, COMM, DEPTNO)
VALUES(9000, '김주영', 'SALESMAN', SYSDATE, 5000, 500, 20);

SELECT *
FROM TBL_EMP;
--&amp;gt;&amp;gt;
/*
..
9000	김주영	SALESMAN		25/07/02	5000	500	20
*/

-- 커밋
COMMIT;

--○ 해당 뷰 다시 조회
SELECT *
FROM VIEW_TEST;
/*
7369	SMITH	CLERK	9600
7499	ALLEN	SALESMAN	19500
7521	WARD	SALESMAN	15500
7566	JONES	MANAGER	35700
7654	MARTIN	SALESMAN	16400
7698	BLAKE	MANAGER	34200
7782	CLARK	MANAGER	29400
7788	SCOTT	ANALYST	36000
7839	KING	PRESIDENT	60000
7844	TURNER	SALESMAN	18000
7876	ADAMS	CLERK	13200
7900	JAMES	CLERK	11400
7902	FORD	ANALYST	36000
7934	MILLER	CLERK	15600
9000	김주영	SALESMAN	60500
*/

CREATE VIEW VIEW_TEST
AS 
SELECT EMPNO, ENAME, JOB, SAL*12+NVL(COMM,0) &quot;YEARPAY&quot;, DEPTNO
FROM TBL_EMP;
--==&amp;gt;&amp;gt; 에러발생 
/*
오류 보고 -
ORA-00955: name is already used by an existing object
00955. 00000 -  &quot;name is already used by an existing object&quot;
*Cause:    
*Action:
*/

CREATE OR REPLACE VIEW VIEW_TEST
AS 
SELECT EMPNO, ENAME, JOB, SAL*12+NVL(COMM,0) &quot;YEARPAY&quot;, DEPTNO
FROM TBL_EMP;
--==&amp;gt;&amp;gt; View VIEW_TEST이(가) 생성되었습니다.

SELECT *
FROM VIEW_TEST;

-- 최종쿼리문 재 복사
CREATE OR REPLACE VIEW VIEW_SAWON
AS
SELECT T.사원번호 , T.사원명 , T.주민번호 , T.성별, T. 현재나이, T.입사일, T.급여
    , TO_CHAR(ADD_MONTHS(SYSDATE, (65 - T.현재나이) *12),'YYYY') || '-' || TO_CHAR(T.입사일, 'MM-DD') &quot;정년퇴직일&quot; -- 문자타입인 상태임. 
    , TRUNC(SYSDATE- T.입사일) &quot;근무일수&quot;     
    , TRUNC(TO_DATE(TO_CHAR(ADD_MONTHS(SYSDATE, (65 - T.현재나이) *12),'YYYY') || '-' || TO_CHAR(T.입사일, 'MM-DD'), 'YYYY-MM-DD') - SYSDATE) &quot;남은일수&quot;        
    , CASE WHEN TRUNC(SYSDATE - T.입사일) &amp;gt;= 6000 THEN T.급여*0.5
           WHEN TRUNC(SYSDATE - T.입사일) &amp;gt;= 5000 THEN T.급여*0.3
           ELSE 0
     END &quot;보너스&quot;     
FROM 
(
    SELECT SANO&quot;사원번호&quot;, SANAME&quot;사원명&quot;,  JUBUN&quot;주민번호&quot;
        -- 성별
    ,   CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '3') THEN '남자' -- 문자타입
             WHEN SUBSTR(JUBUN, 7, 1) IN ('2', '4') THEN '여자' -- 문자타입
             ELSE '성별확인불가' -- 문자타입
        END &quot;성별&quot;
    -- 현재나이 = 현재년도 - 태어난년도 + 1(1900년대 생 1 2 / 2000년대 생 3 4) --분기구성필요
    ,   CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1','2')
             THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899)    
             WHEN SUBSTR(JUBUN, 7, 1) IN ('3','4')
             THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) +1999) 
             ELSE -1  -- 조건문상은 항상 같은 데이터타입을 가져야 함으로 나이확인불가는 불가 
        END &quot;현재나이&quot;
        --입사일
        ,HIREDATE &quot;입사일&quot; 
        --급여
        ,SAL &quot;급여&quot;
    FROM TBL_SAWON
) T;
--==&amp;gt;&amp;gt; View VIEW_SAWON이(가) 생성되었습니다.

SELECT *
FROM VIEW_SAWON;
--==&amp;gt;&amp;gt;
/*
1013	김훈	    8502071234557	남자	41	99/10/10	2049-10-10	9397	8865	1000
1001	김주형	0004183234567	남자	26	11/01/03	2064-01-03	5294	    14063	900
1002	이유빈	0406274234567	여자	22	17/11/05	2068-11-05	2796	    15831	0
1003	유한  	0004173234567	남자	26	11/01/03	2064-01-03	5294	    14063	900
1004	이상이	8512161234567	남자	41	98/08/16	2049-08-16	9817	8810    	1000
1005	아이유	9302022234567	여자	33	10/07/13	2057-07-13	5468	11698	900
1006	이이경	7506171234567	남자	51	97/03/10	2039-03-10	10341	4998	2000
1007	미노이	9704252234567	여자	29	07/12/10	2061-12-10	6414	13309	1000
1008	선우선	7905082234567	여자	47	98/08/16	2043-08-16	9817	6618	1000
1009	선동열	7012181234567	남자	56	90/10/10	2034-10-10	12684	3386	1500
1010	남희석	7502201234567	남자	51	98/08/16	2039-08-16	9817	5157	500
1011	선우용녀	7005132234567	여자	56	98/08/16	2034-08-16	9817	3331	500
1012	남궁선	0502204234567	여자	21	15/08/14	2069-08-14	3610	    16113	0
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;서브쿼리를&amp;nbsp;활용하여&amp;nbsp;TBL_SAWON&amp;nbsp;테이블을&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;조회할&amp;nbsp;수&amp;nbsp;있도록 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;쿼리문을&amp;nbsp;구성한다. &lt;br /&gt;/* &lt;br /&gt;------------------------------------------------ &lt;br /&gt;&amp;nbsp;&amp;nbsp;사원명&amp;nbsp;&amp;nbsp;|&amp;nbsp;성별&amp;nbsp;&amp;nbsp;|&amp;nbsp;현재나이&amp;nbsp;|&amp;nbsp;&amp;nbsp;급여&amp;nbsp;&amp;nbsp;|&amp;nbsp;나이보너스 &lt;br /&gt;------------------------------------------------ &lt;br /&gt;*/ &lt;br /&gt;- &lt;br /&gt;--&amp;nbsp;단,&amp;nbsp;나이보너스는&amp;nbsp;현재&amp;nbsp;나이가&amp;nbsp;40세&amp;nbsp;이상이면&amp;nbsp;급여의&amp;nbsp;70% &lt;br /&gt;--&amp;nbsp;30세&amp;nbsp;이상&amp;nbsp;40세&amp;nbsp;미만이면&amp;nbsp;급여의&amp;nbsp;50% &lt;br /&gt;--&amp;nbsp;20세&amp;nbsp;이상&amp;nbsp;30세&amp;nbsp;미만이면&amp;nbsp;급여의30%로&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;또한,&amp;nbsp;완성된&amp;nbsp;조회&amp;nbsp;구문을&amp;nbsp;기반으로&amp;nbsp; &lt;br /&gt;--&amp;nbsp;VIEW&amp;nbsp;_SAWON2&amp;nbsp;라는&amp;nbsp;이름의&amp;nbsp;뷰(VIEW)를&amp;nbsp;생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1751441512799&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE OR REPLACE VIEW VIEW_SAWON2
AS
SELECT T.*
    ,   CASE WHEN T.현재나이 &amp;gt;=40 THEN T.급여 *0.7
             WHEN T.현재나이 &amp;gt;=30 THEN T.급여 *0.5
             WHEN T.현재나이 &amp;gt;=20 THEN T.급여 *0.3
             ELSE 0
        END &quot;나이보너스&quot;
FROM 
(
    SELECT SANAME &quot;사원명&quot;
     ,   CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '3') THEN '남성'
              WHEN SUBSTR(JUBUN, 7, 1) IN ('2', '4') THEN '여성' 
              ELSE '성별확인불가'
         END &quot;성별&quot;
         --현재나이 
    ,   CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1','2')
                 THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899) -- 1900년대생
                 WHEN SUBSTR(JUBUN, 7, 1) IN ('3','4')
                 THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) +1999) -- 2000년대생
                 ELSE 0  -- 한국나이로 표현했으므로 0세는 없으니  
            END &quot;현재나이&quot; 
     ,      SAL &quot;급여&quot;
    FROM TBL_SAWON
) T;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--○&amp;nbsp;RANK()&amp;nbsp;&amp;rarr;&amp;nbsp;등수(순위)를&amp;nbsp;반환하는&amp;nbsp;함수&amp;nbsp; &lt;/p&gt;
&lt;pre id=&quot;code_1751441573167&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, DEPTNO&quot;부서번호&quot;, SAL &quot;급여&quot;
    , RANK() OVER(ORDER BY SAL DESC) &quot;전체급여등수&quot; --급여기준 내림차순 정렬해서 등급을 매겨라
FROM EMP;
--==&amp;gt;&amp;gt;
/*
7839	KING	10	5000	1
7902	FORD	20	3000	2
7788	SCOTT	20	3000	2
7566	JONES	20	2975	4
7698	BLAKE	30	2850	5
7782	CLARK	10	2450	6
7499	ALLEN	30	1600	7
7844	TURNER	30	1500	8
7934	MILLER	10	1300	9
7521	WARD	30	1250	10
7654	MARTIN	30	1250	10
7876	ADAMS	20	1100	12
7900	JAMES	30	950	13
7369	SMITH	20	800	14
*/

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, DEPTNO&quot;부서번호&quot;, SAL &quot;급여&quot;
    , RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) &quot;부서내급여등수&quot; 
    -- 부서번호기준 파티션을 나누고 급여가 높은수준에서 낮은수준으로 정렬해서 등수부여해라  
FROM EMP;
--==&amp;gt;&amp;gt;
/*
7839	KING	10	5000	    1
7782	    CLARK	10	2450	    2
7934	MILLER	10	1300	    3
7788	SCOTT	20	3000    	1
7902    	FORD	20	3000	    1
7566	JONES	20	2975	    3
7876	ADAMS	20	1100	    4
7369	SMITH	20	800	    5
7698	BLAKE	30	2850	1
7499	ALLEN	30	1600	2
7844	TURNER	30	1500	3
7654	MARTIN	30	1250	4
7521    	WARD	30	1250	4
7900	    JAMES	30	950	6
*/

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, DEPTNO&quot;부서번호&quot;, SAL &quot;급여&quot;
    , RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) &quot;부서내급여등수&quot; 
    -- 부서번호기준 파티션을 나누고 급여가 높은수준에서 낮은수준으로 정렬해서 등수부여해라  
    ,RANK() OVER(ORDER BY SAL DESC) &quot;전체급여등수&quot;
FROM EMP;
--==&amp;gt;&amp;gt;
/*
7839	KING	10	5000	1	1
7902	FORD	20	3000    	1	2
7788	SCOTT	20	3000	1	2
7566	JONES	20	2975	3	4
7698	BLAKE	30	2850	1	5
7782	CLARK	10	2450	2	6
7499	ALLEN	30	1600	2	7
7844	TURNER	30	1500	3	8
7934	MILLER	10	1300	3	9
7521	WARD	30	1250	4	10
7654	MARTIN	30	1250	4	10
7876	ADAMS	20	1100	4	12
7900	JAMES	30	950	6	13
7369	SMITH	20	800	5	14
*/

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, DEPTNO&quot;부서번호&quot;, SAL &quot;급여&quot;
    , RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) &quot;부서내급여등수&quot; 
    -- 부서번호기준 파티션을 나누고 급여가 높은수준에서 낮은수준으로 정렬해서 등수부여해라  
    ,RANK() OVER(ORDER BY SAL DESC) &quot;전체급여등수&quot;
FROM EMP
ORDER BY 3, 4 DESC; -- 부서번호, 급여로 정렬해라 
--==&amp;gt;&amp;gt;
/*
7839	KING	10	5000	1	1
7782	CLARK	10	2450	2	6
7934	MILLER	10	1300	3	9
7902	FORD	20	    3000	    1	2
7788	SCOTT	20	3000	    1	2
7566	JONES	20	2975	    3	4
7876	ADAMS	20	1100	4	12
7369	SMITH	20	800	5	14
7698	BLAKE	30	2850	1	5
7499	ALLEN	30	1600	2	7
7844	TURNER	30	1500	3	8
7654	MARTIN	30	1250	4	10
7521	WARD	30	1250	4	10
7900	JAMES	30	950	6	13
*/

--○ DENSE_RANK() &amp;rarr; 서열을 반환하는 함수 
SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, DEPTNO&quot;부서번호&quot;, SAL &quot;급여&quot;
    , DENSE_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) &quot;부서내급여등수&quot; 
    -- 부서번호기준 파티션을 나누고 급여가 높은수준에서 낮은수준으로 정렬해서 등수부여해라  
    ,DENSE_RANK() OVER(ORDER BY SAL DESC) &quot;전체급여등수&quot;
FROM EMP
ORDER BY 3, 4 DESC;

/*
7839	KING	10	5000	1	1
7782	CLARK	10	2450	2	5
7934	MILLER	10	1300	3	8
7902	FORD	20	    3000	1	2
7788	SCOTT	20	3000	1	2
7566	JONES	20	2975	2	3
7876	ADAMS	20	1100	3	10
7369	SMITH	20	800	4	12
7698	BLAKE	30	2850	1	4
7499	ALLEN	30	1600	2	6
7844	TURNER	30	1500	3	7
7654	MARTIN	30	1250	4	9
7521	WARD	30	1250    	4	9
7900	JAMES	30	950	    5	11
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제&amp;nbsp; &lt;br /&gt;--○&amp;nbsp;EMP&amp;nbsp;테이블의&amp;nbsp;사원&amp;nbsp;데이터를&amp;nbsp;대상으로 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;사원명,&amp;nbsp;부서번호,&amp;nbsp;연봉,&amp;nbsp;부서내연봉순위,&amp;nbsp;전체연봉순위&amp;nbsp;항목을&amp;nbsp;조회하는&amp;nbsp;쿼리문을&amp;nbsp;구성한다.&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;부서번호기준&amp;nbsp;파티션을&amp;nbsp;나누고&amp;nbsp;급여가&amp;nbsp;높은수준에서&amp;nbsp;낮은수준으로&amp;nbsp;정렬해서&amp;nbsp;등수부여해라&amp;nbsp;&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;nbsp;연봉&amp;nbsp;&amp;nbsp;/&amp;nbsp;미션&amp;nbsp;1년에&amp;nbsp;한&amp;nbsp;번&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751441601654&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT T.*
, RANK() OVER(PARTITION BY T.부서번호 ORDER BY T.연봉 DESC) &quot;부서내연봉순위&quot;  
, RANK() OVER(ORDER BY T.연봉 DESC) &quot;전체연봉순위&quot;  
FROM
(
SELECT ENAME &quot;사원명&quot;, DEPTNO&quot;부서번호&quot;
     , SAL*12+NVL(COMM,0) &quot;연봉&quot;
     FROM EMP
) T 
ORDER BY 2, 3 DESC;
--==&amp;gt;&amp;gt; 서브쿼리 활용
/*
KING	10	60000	1	1
CLARK	10	29400	2	6
MILLER	10	15600	3	10
FORD	20	36000	1	2
SCOTT	20	36000	1	2
JONES	20	35700	3	4
ADAMS	20	13200	4	12
SMITH	20	9600	5	14
BLAKE	30	34200	1	5
ALLEN	30	19500	2	7
TURNER	30	18000	3	8
MARTIN	30	16400	4	9
WARD	30	15500	5	11
JAMES	30	11400	6	13
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제2&amp;nbsp; &lt;br /&gt;--○&amp;nbsp;EMP&amp;nbsp;테이블의&amp;nbsp;전체연봉순위가&amp;nbsp;1등&amp;nbsp;부터&amp;nbsp;5등까지만... &lt;br /&gt;--&amp;nbsp;&amp;nbsp;사원명,&amp;nbsp;부서번호,&amp;nbsp;연봉,&amp;nbsp;전체연봉순위&amp;nbsp;항목으로&amp;nbsp;조회한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751441633854&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--※ 위의 내용은 RANK() OVER() 함수를 WHERE 조건절에서 사용한 경우이며
--   이 함수는 WHERE 조건절에서 사용할 수 없기 때문에 발생하는 에러이다.
--   이 경우, 우리는 INLINE VIEW를 활용하여 문제를 해결해야 한다. 
SELECT T.*
FROM
(
    SELECT ENAME &quot;사원명&quot;, EMPNO &quot;부서번호&quot; , SAL*12+NVL(COMM, 0) &quot;연봉&quot;
        , RANK() OVER(ORDER BY SAL*12+NVL(COMM,0) DESC) &quot;전체연봉순위&quot;    
    FROM EMP
)T
WHERE T.전체연봉순위 &amp;lt;= 5; 

SELECT *
FROM EMP;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;문제3 &lt;br /&gt;--○&amp;nbsp;EMP&amp;nbsp;테이블에서&amp;nbsp;각&amp;nbsp;부서별로&amp;nbsp;연봉&amp;nbsp;서열이&amp;nbsp;1위부터&amp;nbsp;2위&amp;nbsp;까지만&amp;nbsp;조회한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;사원번호,&amp;nbsp;사원명,&amp;nbsp;부서번호,&amp;nbsp;연봉,&amp;nbsp;부서내연봉서열,&amp;nbsp;전체연봉서열&lt;/p&gt;
&lt;pre id=&quot;code_1751444281513&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT T.*
FROM
(
    SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, DEPTNO&quot;부서번호&quot;, SAL*12+NVL(COMM,0)&quot;연봉&quot;
          ,DENSE_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL*12+NVL(COMM,0) DESC) &quot;부서내연봉서열&quot;
          ,DENSE_RANK() OVER(ORDER BY SAL*12+NVL(COMM,0) DESC) &quot;전체연봉서열&quot;
    FROM EMP
)T
WHERE T.부서내연봉서열 &amp;lt;=2;
--==&amp;gt;&amp;gt;
/*
7839	KING	10	60000	1	1
7782	CLARK	10	29400	2	5
7902	FORD	20	36000	1	2
7788	SCOTT	20	36000	1	2
7566	JONES	20	35700	2	3
7698	BLAKE	30	34200	1	4
7499	ALLEN	30	19500	2	6
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;nbsp;분석&amp;nbsp;함수 &lt;br /&gt;--&amp;nbsp;-&amp;nbsp;집계&amp;nbsp;함수 &lt;br /&gt;--&amp;nbsp;-&amp;nbsp;그룹&amp;nbsp;함수&amp;nbsp;--&amp;nbsp;GROUP&amp;nbsp;BY&amp;nbsp;사용함수&amp;nbsp; &lt;br /&gt;--&amp;nbsp;-&amp;nbsp;윈도우&amp;nbsp;함수&amp;nbsp;--&amp;nbsp;OVER사용함수 &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;SUM()&amp;nbsp;합,&amp;nbsp;AVG()&amp;nbsp;평균,&amp;nbsp;COUNT()&amp;nbsp;카운트,&amp;nbsp;MAX()&amp;nbsp;최대값,&amp;nbsp;MIN()&amp;nbsp;최소값 &lt;br /&gt;--&amp;nbsp;,VARIANCE()&amp;nbsp;분산,&amp;nbsp;STDDEV()&amp;nbsp;표준편차 &lt;br /&gt;--&amp;nbsp;&amp;rarr;&amp;nbsp;다중&amp;nbsp;행을&amp;nbsp;대상으로&amp;nbsp;처리한&amp;nbsp;단일&amp;nbsp;결과&amp;nbsp;반환&amp;nbsp; &lt;br /&gt;--&amp;nbsp;&amp;rarr;&amp;nbsp;처리해야&amp;nbsp;할(다중&amp;nbsp;행의)&amp;nbsp;데이터들&amp;nbsp;중&amp;nbsp;NULL이&amp;nbsp;포함되어&amp;nbsp;있다면 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;이&amp;nbsp;NULL은&amp;nbsp;제외(빼고)하고&amp;nbsp;연산을&amp;nbsp;수행&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;SUM()&amp;nbsp; &lt;br /&gt;--&amp;nbsp;EMP&amp;nbsp;테이블을&amp;nbsp;대상으로&amp;nbsp;전체&amp;nbsp;사원들의&amp;nbsp;급여&amp;nbsp;총&amp;nbsp;합을&amp;nbsp;조회한다.&lt;/p&gt;
&lt;pre id=&quot;code_1751444324504&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- MAX() 최대값 / MIN() 최소값
SELECT MAX(SAL) &quot;COL1&quot;
    , MIN(SAL)  &quot;COL2&quot;
FROM EMP; 
--==&amp;gt;&amp;gt;5000	800

-- ※ 주의
SELECT ENAME, SAL
FROM EMP;
/*
SMITH	800
ALLEN	1600
WARD	1250
JONES	2975
MARTIN	1250
BLAKE	2850
CLARK	2450
SCOTT	3000
KING	5000
TURNER	1500
ADAMS	1100
JAMES	950
FORD	3000
MILLER	1300
*/

SELECT ENAME, SUM(SAL) &quot;결과확인&quot;
FROM EMP;
--==&amp;gt;&amp;gt; 에러 발생
/*
ORA-00937: not a single-group group function
00937. 00000 -  &quot;not a single-group group function&quot;
*Cause:    
*Action:
1,096행, 8열에서 오류 발생
*/

SELECT DEPTNO, SUM(SAL) &quot;결과확인&quot;
FROM EMP;
--==&amp;gt;&amp;gt; 에러 발생
/*
ORA-00937: not a single-group group function
00937. 00000 -  &quot;not a single-group group function&quot;
*Cause:    
*Action:
1,107행, 8열에서 오류 발생
*/

SELECT DEPTNO, SUM(SAL) &quot;결과확인&quot; -- 3
FROM EMP -- 1
GROUP BY DEPTNO; -- 파싱순서 2
/*
30	9400
20	10875
10	8750
*/

SELECT DEPTNO, SUM(SAL) &quot;결과확인&quot; -- 여기에서의 SUM은 그룹함수임.. 
FROM EMP 
GROUP BY DEPTNO
ORDER BY DEPTNO;
/*
10	8750
20	10875
30	9400
*/

SELECT DEPTNO &quot;부서번호&quot;, SUM(SAL) &quot;급여합&quot; 
FROM EMP 
GROUP BY DEPTNO
ORDER BY DEPTNO;
--==&amp;gt;&amp;gt;
-- ★★★★★★★★★★★★ 블럭잡아서 F5 누르면 스크립트로 출력됨. 
/*
 부서번호        급여합
---------- ----------
        10       8750
        20      10875
        30       9400
*/

SELECT DEPTNO &quot;부서번호&quot;, SUM(SAL) &quot;급여합&quot; 
FROM EMP 
GROUP BY ROLLUP(DEPTNO);
--==&amp;gt;&amp;gt;
/*
10	    8750    -- 10번 부서의 급여합
20	    10875
30	    9400
(NULL)  29025   -- 전체급여합 
*/

SELECT *
FROM TBL_EMP;

SELECT *
FROM TBL_EMP
WHERE EMPNO=9000;

DELETE
FROM TBL_EMP
WHERE EMPNO=9000;
--==&amp;gt;&amp;gt; 1 행 이(가) 삭제되었습니다.
--==&amp;gt;&amp;gt; 
/*
7369	SMITH	CLERK	7902	1980-12-17	800		20
7499	ALLEN	SALESMAN	7698	1981-02-20	1600	300	30
7521	WARD	SALESMAN	7698	1981-02-22	1250	500	30
7566	JONES	MANAGER	7839	1981-04-02	2975		20
7654	MARTIN	SALESMAN	7698	1981-09-28	1250	1400	30
7698	BLAKE	MANAGER	7839	1981-05-01	2850		30
7782	CLARK	MANAGER	7839	1981-06-09	2450		10
7788	SCOTT	ANALYST	7566	1987-07-13	3000		20
7839	KING	PRESIDENT		1981-11-17	5000		10
7844	TURNER	SALESMAN	7698	1981-09-08	1500	0	30
7876	ADAMS	CLERK	7788	1987-07-13	1100		20
7900	JAMES	CLERK	7698	1981-12-03	950		30
7902	FORD	ANALYST	7566	1981-12-03	3000		20
7934	MILLER	CLERK	7782	1982-01-23	1300		10
*/

--○커밋
COMMIT;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/218</guid>
      <comments>https://aluck.tistory.com/218#entry218comment</comments>
      <pubDate>Wed, 2 Jul 2025 17:54:42 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 날짜연산(TO_DATE, ADD_MONTHS, MONTHS_BETWEEN, NEXT_DAY, LAST_DAY)</title>
      <link>https://aluck.tistory.com/217</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFPMD9/btsO098sNNo/DcbfbXwhKsTavTTFMHA5Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFPMD9/btsO098sNNo/DcbfbXwhKsTavTTFMHA5Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFPMD9/btsO098sNNo/DcbfbXwhKsTavTTFMHA5Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFPMD9%2FbtsO098sNNo%2FDcbfbXwhKsTavTTFMHA5Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;256&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751354725409&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--※ 날짜 관련 세션 설정
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==&amp;gt;&amp;gt; Session이(가) 변경되었습니다.

SELECT SYSDATE
FROM DUAL;
--==&amp;gt;&amp;gt; 2025-07-01 12:08:24

--※ 날짜 연산의 기본단위는 DAY(일수)이다~!!! CHECK~!!! 
SELECT SYSDATE &quot;COL1&quot;   -- 2025-07-01 12:10:31 &amp;rarr; 현재
    , SYSDATE + 1 &quot;COL2&quot;    -- 2025-07-02 12:10:31&amp;rarr;  1일 후
    , SYSDATE - 2 &quot;COL3&quot;    -- 2025-06-29 12:10:31&amp;rarr;  2일 전
    , SYSDATE + 3 &quot;COL4&quot;    -- 2025-07-04 12:10:31&amp;rarr;  3일 후
FROM DUAL;  

--○ 시간 단위 연산
SELECT SYSDATE &quot;COL1&quot;       -- 2025-07-01 12:12:29  &amp;rarr; 현재
    , SYSDATE + 1/24 &quot;COL2&quot; -- 2025-07-01 13:12:29  &amp;rarr; 1시간 후
    , SYSDATE - 2/24 &quot;COL3&quot; -- 2025-07-01 10:12:29  &amp;rarr; 2시간 전 
FROM DUAL;

--○ 현재 시간과... 현재 시간 기준 1일 2시간 3분 4초 후를 조회하는 쿼리문을 구성한다.
/*
----------------------------------------------
    현재시간             |       연산후시간
----------------------------------------------
2025-07-01 12:14:10      |  2025-07-02 14:17:14
----------------------------------------------
*/

--방법 1.
SELECT SYSDATE &quot;현재시간&quot;
        , SYSDATE +1 + 2/24 + (3/(24*60)) + (4/(24*60*60))  &quot;연산 후 시간&quot;
-- 1시간 60분 초 1440초
FROM DUAL;
--==&amp;gt;&amp;gt;
/*
2025-07-01 12:26:04	
2025-07-02 14:29:08
*/

--방법 2.
SELECT SYSDATE &quot;현재시간&quot;
        , SYSDATE + ((24*60*60) + (2*60*60) + (3*60) + 4) / (24*60*60) &quot;연산 후 시간&quot;
-- 1시간 60분 초 1440초
FROM DUAL;
--==&amp;gt;&amp;gt; 모두 초로 환산해서 날로 
/*
2025-07-01 12:27:44	
2025-07-02 14:30:48
*/

--○ 날짜 - 날짜 = 일수
--   EX) (2025-11-04) - (2025-07-01)
--          수료일         현재일

--※ 데이터 타입의 변환
SELECT TO_DATE('2025-07-01', 'YYYY-MM-DD')  -- 날짜 타입의 변환
FROM DUAL;
--==&amp;gt;&amp;gt; 2025-07-01 00:00:00

SELECT TO_DATE('2025-07-32', 'YYYY-MM-DD')  -- 날짜 타입의 변환
FROM DUAL;
--==&amp;gt;&amp;gt; 에러 발생 
/*
ORA-01847: day of month must be between 1 and last day of month
01847. 00000 -  &quot;day of month must be between 1 and last day of month&quot;
*Cause:    
*Action:
*/

--○ TO_DATE() 함수를 통해 문자 타입을 날짜 타입으로 변환을 수행하는 과정에서
--   내부적으로 해당 날짜에 대한 유효성 검사가 이루어진다~!!! 

--○ ADD_MONTHS() 개월 수를 더해주는 함수
SELECT SYSDATE &quot;COL1&quot;
       , ADD_MONTHS(SYSDATE, 2) &quot;COL2&quot;
       , ADD_MONTHS(SYSDATE, 3) &quot;COL3&quot;
FROM DUAL;
--==&amp;gt;&amp;gt;
/*
2025-07-01 12:35:00	현재
2025-09-01 12:35:00	2개월 후
2025-10-01 12:35:00  3개월 후
*/

SELECT SYSDATE &quot;COL1&quot;
       , ADD_MONTHS(SYSDATE, 2) &quot;COL2&quot;
       , ADD_MONTHS(SYSDATE, 3) &quot;COL3&quot;
       , ADD_MONTHS(SYSDATE, -2) &quot;COL4&quot;
       , ADD_MONTHS(SYSDATE, -3) &quot;COL5&quot;
FROM DUAL;
/*
2025-07-01 12:36:18	
2025-09-01 12:36:18	
2025-10-01 12:36:18	
2025-05-01 12:36:18	
2025-04-01 12:36:18
*/
-- 개월 수를 더하고 빼기

-- 날짜 관련 세션 설정 변경 
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
-- Session이(가) 변경되었습니다.

--○ MONTHS_BETWEEN()_
-- 첫 번째 인자값에서 두 번째 인자값을 뺀 개월 수를 반환
-- 2002 한일 월드컵 개막일 : 2002년 5월 31일

SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('2002-05-31', 'YYYY-MM-DD'))
FROM DUAL;
--==&amp;gt;&amp;gt; 277.049277553763440860215053763440860215
--&amp;gt; 개월 수의 차이를 반환하는 함수 
--※ 결과값으로 반환되년 값의 부호가 [-] (음수)로 반환되었을 경우에는
--   첫 번재 인자값에 해당하는 날짜보다
--   두 번째 인자값에 해당하는 날짜가 [미래]라는 의미를 확인할 수 있다. /양수면 과거, 음수면 미래/ 

SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('2025-11-04', 'YYYY-MM-DD'))
FROM DUAL;
--==&amp;gt;&amp;gt; -4.07971102150537634408602150537634408602

--○ NEXT_DAY()
--   첫 번째 인자값을 기준 날짜로 돌아오는 가장 빠른 요일 반환
SELECT NEXT_DAY(SYSDATE, '토') &quot;COL1&quot;
      ,NEXT_DAY(SYSDATE, '수') &quot;COL2&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 2025-07-05	2025-07-02

--○ 추가 확인을 위한 세션 설정 변경
ALTER SESSION SET NLS_DATE_LANGUAGE = 'ENGLISH';
--==&amp;gt;&amp;gt; Session이(가) 변경되었습니다.

--○ 설정 변경 이후 위의 쿼리문을 그대로 다시 실행
SELECT NEXT_DAY(SYSDATE, '토') &quot;COL1&quot;
      ,NEXT_DAY(SYSDATE, '수') &quot;COL2&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 에러 발생 
/*
ORA-01846: not a valid day of the week
01846. 00000 -  &quot;not a valid day of the week&quot;
*Cause:    
*Action:
*/

SELECT NEXT_DAY(SYSDATE, 'SUN') &quot;COL1&quot;
      ,NEXT_DAY(SYSDATE, 'SAT') &quot;COL2&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 2025-07-06	2025-07-05

--○ 추가 확인을 위한 세션 설정 변경
ALTER SESSION SET NLS_DATE_LANGUAGE = 'KOREAN';
--==&amp;gt;&amp;gt; Session이(가) 변경되었습니다.

--○ LAST_DAY()
--   해당 날짜가 포함되어 있는 그 달의 마지막 날을 반환한다.

SELECT LAST_DAY(SYSDATE) &quot;결과확인&quot; 
FROM DUAL;
--==&amp;gt;&amp;gt; 2025-07-31

SELECT LAST_DAY(TO_DATE('2025-02-10', 'YYYY-MM-DD')) &quot;결과확인&quot; 
FROM DUAL;
--==&amp;gt;&amp;gt; 2025-02-28

--○ 오늘부로 ... OO이가 ... 군대에 또 끌려(?)간다.
--   복무기간은 22개월로 한다. 

-- 1. 전역 일자를 구한다. (1년 10개월) 

-- 2. 하루 꼬박꼬박 3끼 식사를 해야 한다고 가정하면
--    규석이가 몇 끼를 먹어야 집에 보내줄까 ... 

SELECT ADD_MONTHS(SYSDATE, 22) &quot;전역일자&quot; 
FROM DUAL; 
--==&amp;gt;&amp;gt; 27/05/01

-- 2. 하루 꼬박꼬박 3끼 식사를 해야 한다고 가정하면
--    규석이가 몇 끼를 먹어야 집에 보내줄까 ... 
-- 복무기간 * 3
-- ----------
-- (전역일자 - 현재일자)

-- (전역일자 - 현재일자) *3

SELECT (ADD_MONTHS(SYSDATE, 22)  -SYSDATE)*3
FROM DUAL;
--==&amp;gt;&amp;gt; 2007

--○ 현재 날짜 및 시간을 기준으로 ...
--   수료일(2025-11-05 18:00:00) 까지 남은 기간을 ...
--   다음과 같은 형태로 조회할 수 있도록 쿼리문을 구성한다.

SELECT SYSDATE &quot;현재시각&quot;
,TO_DATE('2025-11-05 18:00:00') AS &quot;수료일&quot;
,TRUNC(TO_DATE('2025-11-05 18:00:00')- SYSDATE) AS 일
,TRUNC(MOD(TO_DATE('2025-11-05 18:00:00')- SYSDATE,1)*24) AS 시간
,TRUNC(MOD(TO_DATE('2025-11-05 18:00:00')- SYSDATE,1/24)*24*60) AS 분
--,TRUNC(MOD(TO_DATE('2025-11-05 18:00:00')- SYSDATE,1/(24*60)*24*60*60) AS 초
FROM DUAL;

/*
--------------------------------------------------------------------------------
현재시각                | 수료일               |   일   |   시간  |   분   |   초
--------------------------------------------------------------------------------
2025-07-01 14:31:27     | 2025-11-05 18:00:00   |   130  |    3    |    27  |   33
--------------------------------------------------------------------------------
*/

-- 날짜 및 시간 관련 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; -- MM은 월이랑 겹쳐서 MI 

-- 1일 2시간 3분 4초를 ... [초]로 환산하면 ...
SELECT (1일) + (2시간) + (3분) + (4초)
FROM DUAL;

--1일 전체 초  1*24*60*60
--2시간 2*60분*60초 
SELECT (1*24*60*60) + (2*60*60) + (3*60) + (4)
FROM DUAL;
--==&amp;gt;&amp;gt; 93784

--[93784초] 를 ... 다시 [일, 시간, 분, 초] 로 환산하면 ...
SELECT TRUNC(TRUNC(TRUNC(93784/60)/60)/24)  &quot;일&quot;
      ,MOD(TRUNC(TRUNC(93784/60)/60), 24) &quot;시간&quot;  -- 짜투리만 시간으로 갖고있어야 함. 
      ,MOD(TRUNC(93784/60), 60) &quot;분&quot;
      ,MOD(93784, 60) &quot;초&quot; -- 60으로 묶이는 애들은 분으로 편입되니 나머지는 초가 되지. 
FROM DUAL; 
--==&amp;gt;&amp;gt;
/*
    일   시간    분     초
----- ------ ----- ------
    1	   2	     3	    4
*/

-- 수료일까지 남은 기간 확인(날짜 기준) &amp;rarr; 단위 : 일수
SELECT 수료일자 - 현재일자
FROM DUAL;

SELECT TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') &quot;수료일자&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 2025-11-05 18:00:00

SELECT TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE
FROM DUAL;
--==&amp;gt;&amp;gt; 127.095277777777777777777777777777777778 

-- 수료일까지 남은 기간 확인(날짜 기준) &amp;rarr; 단위 : 초
SELECT (수료일까지남은일수) * (24*60*60)
FROM DUAL;
--&amp;gt; 수료일까지 남은 전체 초 

SELECT (TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)
FROM DUAL;
--==&amp;gt;&amp;gt; 10980867

SELECT TRUNC(TRUNC(TRUNC((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)/60)/60)/24)  &quot;일&quot;
      ,MOD(TRUNC(TRUNC((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)/60)/60), 24) &quot;시간&quot;  -- 짜투리만 시간으로 갖고있어야 함. 
      ,MOD(TRUNC((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)/60), 60) &quot;분&quot;
      ,MOD((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60), 60) &quot;초&quot; -- 60으로 묶이는 애들은 분으로 편입되니 나머지는 초가 되지. 
FROM DUAL;
--==&amp;gt;&amp;gt; (TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)

SELECT TRUNC(TRUNC(TRUNC((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)/60)/60)/24)  &quot;일&quot;
      ,MOD(TRUNC(TRUNC((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)/60)/60), 24) &quot;시간&quot;  -- 짜투리만 시간으로 갖고있어야 함. 
      ,MOD(TRUNC((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)/60), 60) &quot;분&quot;
      ,MOD((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60), 60) &quot;초&quot; -- 60으로 묶이는 애들은 분으로 편입되니 나머지는 초가 되지. 
FROM DUAL;
--==&amp;gt;&amp;gt; 127	2	12	10.99999999999999999999999999999996

SELECT SYSDATE &quot;현재시각&quot;
      ,TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') &quot;수료일&quot;
      ,TRUNC(TRUNC(TRUNC((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)/60)/60)/24)  &quot;일&quot;
      ,MOD(TRUNC(TRUNC((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)/60)/60), 24) &quot;시간&quot;  -- 짜투리만 시간으로 갖고있어야 함. 
      ,MOD(TRUNC((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60)/60), 60) &quot;분&quot;
      ,TRUNC(MOD((TO_DATE('2025-11-05 18:00:00', 'YYYY-MM-DD HH24:MI:SS') - SYSDATE) * (24*60*60), 60)) &quot;초&quot; -- 60으로 묶이는 애들은 분으로 편입되니 나머지는 초가 되지. 
FROM DUAL;
--==&amp;gt;&amp;gt; 
/*
현재시각             수료일                일   시간    분     초
-----------------   ----------------- --------------------------
2025-07-01 15:49:49	2025-11-05 18:00:00	 127	    2	  10	      11
*/

--※날짜 데이터를 대상으로 반올림, 절삭을 수행할 수 있다. 

--○날짜 반올림 
SELECT SYSDATE &quot;COL1&quot;                   --  2025-07-01  &amp;rarr;   기본 현재 날짜
      ,ROUND(SYSDATE, 'YEAR') &quot;COL2&quot;    --  2026-01-01  &amp;rarr;   년도까지 유효한 데이터(상반기, 하반기 기준)
      ,ROUND(SYSDATE, 'MONTH') &quot;COL3&quot;   --  2025-07-01  &amp;rarr;   월까지 유효한 데이터(15일 기준)
      ,ROUND(SYSDATE, 'DD') &quot;COL4&quot;      --  2025-07-02  &amp;rarr;   날짜까지 유효한 데이터(정오 기준) 
      ,ROUND(SYSDATE, 'DAY') &quot;COL5&quot;     --  2025-06-29  &amp;rarr;   날짜까지 유효한 데이터(수요일 기준)
FROM DUAL;

--○날짜 절삭
SELECT SYSDATE &quot;COL1&quot;                    --  2025-07-01  &amp;rarr;   기본 현재 날짜
    ,TRUNC(SYSDATE, 'YEAR') &quot;COL2&quot;       --  2025-01-01  &amp;rarr;   년도까지 유효한 데이터
    ,TRUNC(SYSDATE, 'MONTH') &quot;COL3&quot;      --  2025-07-01  &amp;rarr;   월까지 유효한 데이터
    ,TRUNC(SYSDATE, 'DD') &quot;COL4&quot;         --  2025-07-01  &amp;rarr;   날짜까지 유효한 데이터
    ,TRUNC(SYSDATE, 'DAY') &quot;COL5&quot;        --  2025-06-29  &amp;rarr;   날짜까지 유효한 데이터 &amp;rarr; 지난주 일요일   
FROM DUAL;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/217</guid>
      <comments>https://aluck.tistory.com/217#entry217comment</comments>
      <pubDate>Tue, 1 Jul 2025 16:25:35 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 숫자관련함수(ROUND, TRUNC, MOD, POWER, SQRT, LOG, SIGN, ASCII, CHR )</title>
      <link>https://aluck.tistory.com/216</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbgsYA/btsO2WGJqeQ/TnUA1pB4B0MBhVlQwu5Y7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbgsYA/btsO2WGJqeQ/TnUA1pB4B0MBhVlQwu5Y7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbgsYA/btsO2WGJqeQ/TnUA1pB4B0MBhVlQwu5Y7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbgsYA%2FbtsO2WGJqeQ%2FTnUA1pB4B0MBhVlQwu5Y7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;164&quot; height=&quot;164&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751351107478&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--○ ROUND() 반올림을 처리해 주는 함수 
SELECT 48.678 &quot;COL1&quot;    -- 48.678
      ,ROUND(48.678, 2) &quot;COL2&quot; -- 48.68 소수점 이하 둘째자리까지 표현 -&amp;gt;셋째 자리에서 반올림 
      ,ROUND(48.672, 2) &quot;COL3&quot; -- 48.67
      ,ROUND(48.674, 1) &quot;COL4&quot; -- 48.7
      ,ROUND(48.674, 0) &quot;COL5&quot; -- - 49 정수형태로 표현해라 
      ,ROUND(48.674) &quot;COL6&quot;    -- 49 두 번째 파라미터 값이 0일 경우 생략 가능 정수형태로 표현해라 
      ,ROUND(48.674, -1) &quot;COL7&quot; -- 50 -- 10의 자리까지 표현해라
      ,ROUND(48.674, -2) &quot;COL8&quot; -- 0            -- 100의 자리까지 표현해라 
      ,ROUND(48.674, -3) &quot;COL9&quot; -- 0 
      
FROM DUAL;

--○ TRUNC() 절삭을 처리해 주는 함수 
SELECT 48.678 &quot;COL1&quot;    -- 48.678
      ,TRUNC(48.678, 2) &quot;COL2&quot; -- 48.67 소수점 이하 둘째자리까지 표현 -&amp;gt;셋째 자리에서 반올림 
      ,TRUNC(48.672, 2) &quot;COL3&quot; -- 48.67
      ,TRUNC(48.674, 1) &quot;COL4&quot; -- 48.6
      ,TRUNC(48.674, 0) &quot;COL5&quot; -- - 48 정수형태로 표현해라 
      ,TRUNC(48.674) &quot;COL6&quot;    -- 48  두 번째 파라미터 값이 0일 경우 생략 가능 정수형태로 표현해라 
      ,TRUNC(48.674, -1) &quot;COL7&quot; -- 40 -- 10의 자리까지 표현해라
      ,TRUNC(48.674, -2) &quot;COL8&quot; -- 0            -- 100의 자리까지 표현해라 
      ,TRUNC(48.674, -3) &quot;COL9&quot; -- 0   
FROM DUAL;

--○ MOD() 나머지를 반환하는 함수 &amp;rarr;  [%]
SELECT MOD(5,2) &quot;결과확인&quot;
FROM DUAL;
--&amp;gt; 5를 2로 나눈 나머지 결과값 반환
--==&amp;gt;&amp;gt; 1

--○ POWER() 제곱의 결과를 반환하는 함수
SELECT POWER(5,3) &quot;결과확인&quot;
FROM DUAL;
--&amp;gt; 5의 3제곱(5의 3승)을 결과값 반환
--==&amp;gt;&amp;gt; 125

--○ SQRT() 루트 결과값을 반환하는 함수
SELECT SQRT(2) &quot;결과확인&quot;
FROM DUAL;
--&amp;gt;&amp;gt; 루트 2에 대한 결과값을 반환
--==&amp;gt;&amp;gt; 1.41421356237309504880168872420969807857

--○LOG() 로그 함수
SELECT LOG(10, 100) &quot;COL1&quot;
    , LOG(10, 20) &quot;COL2&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 2	    1.30102999566398119521373889472449302677
--※ 오라클은 상용로그만 지원하는 반면, MS-SQL은 상용로그와 자연로그 모두 지원한다. 

-- 삼각함수
SELECT SIN(1), COS(1), TAN(1)
FROM DUAL;
/*
0.8414709848078965066525023216302989996233	
0.5403023058681397174009366074429766037354	
1.55740772465490223050697480745836017308
*/
--&amp;gt; 싸인, 코싸인, 탄젠트 결과값을 반환한다. 

--○삼각함수의 역함수(범위 : -1 ~1)
SELECT ASIN(0.5), ACOS(0.5), ATAN(0.5)
FROM DUAL;
--==&amp;gt;&amp;gt;
/*
0.52359877559829887307710723054658381405	
1.04719755119659774615421446109316762805	
0.4636476090008061162142562314612144020295
*/

--○ SIGN() 서명, 부호, 특징
-- 연산 결과값이 양수이면 1, 0이면 0, 음수이면 -1을 반환한다. 
SELECT SIGN(5-2) &quot;COL1&quot;
        ,SIGN(5-5) &quot;COL2&quot;
        ,SIGN(2-5) &quot;COL3&quot;
FROM DUAL;        
--==&amp;gt;&amp;gt; 1	0	-1 
-- 매출이나 수지와 관련하여 적자 및 흑자의 개념을 표현할 때 주로 사용한다. 

--○ ASCII(), CHR() 서로 대응하는 개념의 함수 
SELECT ASCII('A') &quot;COL1&quot;
    ,CHR(65) &quot;COL2&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 65	A
-- ASCII()  : 매개변수로 넘겨받은 문자의 아스키코드 값을 반환한다.
-- CHR()    : 매개변수로 넘겨받은 숫자를 아스키코드 값으로 취하는 문자를 반환한다.&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/216</guid>
      <comments>https://aluck.tistory.com/216#entry216comment</comments>
      <pubDate>Tue, 1 Jul 2025 15:25:22 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 문자열 처리함수(LENGTH , INSTR, REVERSE, LPAD , RPAD, LTRIM, RTRIM, TRANSLATE, REPLACE)</title>
      <link>https://aluck.tistory.com/215</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cv4H04/btsO0FZAbtc/WGi3TOk0rvJSzXz4y9OjU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cv4H04/btsO0FZAbtc/WGi3TOk0rvJSzXz4y9OjU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cv4H04/btsO0FZAbtc/WGi3TOk0rvJSzXz4y9OjU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcv4H04%2FbtsO0FZAbtc%2FWGi3TOk0rvJSzXz4y9OjU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;123&quot; height=&quot;123&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751350731159&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT USER
FROM DUAL;

--○ TBL_SAWON 테이블에서 여직원들만
--   사원번호, 사원명, 주민번호, 급여 항목을 조회한다.
--   단, SUBSTR() 함수를 활용하여 처리할 수 있도록 하며,
--   급여 기준 내림차순 정렬을 수행할 수 있도록 한다. 

SELECT *
FROM TBL_SAWON;

SELECT 사원번호, 사원명, 주민번호, 급여
FROM TBL_SAWON
WHERE 성별이 여성
ORDER BY 급여 기준 내림차순;  

SELECT SANO, SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE JUBUN 7번째자리 1개가 2
      JUBUN 7번째자리 1개가 4
ORDER BY SAL DESC;

SELECT SANO, SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SUBSTR(JUBUN, 7, 1) = '2' -- JUBUN이 VARCHAR타입이므로 
   OR SUBSTR(JUBUN, 7, 1) = '4' 
-- WHERE SUBSTR(JUBUN, 7, 1) IN ('2', '4')
ORDER BY SAL DESC;  
--==&amp;gt;&amp;gt;
/*
1005	아이유	9302022234567	3000
1002	이유빈	0406274234567	2000
1007	미노이	9704252234567	2000
1008	선우선	7905082234567	2000
1011	선우용녀	7005132234567	1000
1012	남궁선	0502204234567	1000
*/

--○ LENGTH() / LENGTHB()
SELECT ENAME &quot;COL1&quot;
        , LENGTH(ENAME) &quot;COL2&quot;
        , LENGTHB(ENAME) &quot;COL3&quot;
FROM TBL_EMP;
--&amp;gt; LENGTH() 는 글자 수를 반환, LENGTHB() 는 바이트 수를 반환 
--==&amp;gt;&amp;gt;
/*

SMITH	5	5
ALLEN	5	5
WARD	4	4
JONES	5	5
MARTIN	6	6
BLAKE	5	5
CLARK	5	5
SCOTT	5	5
KING	4	4
TURNER	6	6
ADAMS	5	5
JAMES	5	5
FORD	4	4
MILLER	6	6
*/

SELECT '김주형' &quot;COL1&quot;
    , LENGTH('김주형') &quot;COL2&quot;
    , LENGTHB('김주형') &quot;COL3&quot;
FROM DUAL; 
--==&amp;gt;&amp;gt;김주형	3	9

--○ 확인
SELECT *
FROM NLS_DATABASE_PARAMETERS;
--==&amp;gt;&amp;gt;
/*
NLS_LANGUAGE	AMERICAN
NLS_TERRITORY	AMERICA
NLS_CURRENCY	$
NLS_ISO_CURRENCY	AMERICA
NLS_NUMERIC_CHARACTERS	.,
NLS_CHARACTERSET	AL32UTF8
NLS_CALENDAR	GREGORIAN
NLS_DATE_FORMAT	DD-MON-RR
NLS_DATE_LANGUAGE	AMERICAN
NLS_SORT	BINARY
NLS_TIME_FORMAT	HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT	DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT	HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT	DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY	$
NLS_COMP	BINARY
NLS_LENGTH_SEMANTICS	BYTE
NLS_NCHAR_CONV_EXCP	FALSE
NLS_NCHAR_CHARACTERSET	AL16UTF16
NLS_RDBMS_VERSION	11.2.0.2.0
*/

--※ 한글 데이터를 처리할 경우 바이트 기반으로 처리해야만 하는 상황이라면
--   항상 인코딩 방식을 잘 체크하고 사용해야 한다.

--○ INSTR()
SELECT 'ORACEL ORAHOME BIORA' &quot;COL1&quot;
        ,INSTR('ORACEL ORAHOME BIORA', 'ORA', 1, 1) &quot;COL2&quot;
        ,INSTR('ORACEL ORAHOME BIORA', 'ORA', 1, 2) &quot;COL3&quot; -- 2번째 등장하는 ORA를 찾은 것(위치는 8번째)
        ,INSTR('ORACEL ORAHOME BIORA', 'ORA', 2, 1) &quot;COL4&quot; -- RA부터 찾은 후 2번째 ORA 찾은 것
        ,INSTR('ORACEL ORAHOME BIORA', 'ORA', 2) &quot;COL5&quot;
        ,INSTR('ORACEL ORAHOME BIORA', 'ORA', 2, 2) &quot;COL6&quot;
FROM DUAL;
--&amp;gt; 첫 번째 파라미터 값에 해당하는 문자열에서 ...(대상 문자열)- 타겟
--  두 번째 파라미터 값을 통해 넘겨준 문자열이 등장하는 위치를 찾아라~!!!
--  세 번째 파라미터 값은 찾기 시작하는(즉, 스캔을 시작하는) 위치
--  네 번째 파라미터 값은 몇 번째 등장하는 값을 찾을 것인지에 대한 설정 (1은 생략 가능)
--==&amp;gt;&amp;gt; ORACEL ORAHOME BIORA	1	8	8	8	18

SELECT '나의오라클 집으로오라 합니다' &quot;COL1&quot;
      ,INSTR('나의오라클 집으로오라 합니다', '오라', 1) &quot;COL2&quot;     -- 3
      ,INSTR('나의오라클 집으로오라 합니다', '오라', 2) &quot;COL3&quot;     -- 3
      ,INSTR('나의오라클 집으로오라 합니다', '오라', 10) &quot;COL4&quot;    -- 10 
      ,INSTR('나의오라클 집으로오라 합니다', '오라', 11) &quot;COL5&quot;    -- 0 라부터 찾기 시작
FROM DUAL;
--&amp;gt; 네 번째파라미터(마지막 파라미터)를 생략한 형태로 사용~!!! &amp;rarr; 1 이 생략된 것 
--==&amp;gt;&amp;gt; 나의오라클 집으로오라 합니다	3	3	10	0

--○ REVERSE()
SELECT 'ORACLE' &quot;COL1&quot;
        ,REVERSE('ORACLE') &quot;COL1&quot;
FROM DUAL;      
--&amp;gt; 대상 문자열(매개변수)을 거꾸로 반환한다.(&amp;rarr; 한글 깨짐 유의)
==--&amp;gt;&amp;gt; ORACLE	ELCARO 

--○ 실습 테이블 생성
--테이블명 : TBL_FILES
CREATE TABLE TBL_FILES
(   FILENO  NUMBER(3)
,   FILENAME    VARCHAR2(100)
);     
--==&amp;gt;&amp;gt;Table TBL_FILES이(가) 생성되었습니다.

--○ 데이터 입력
INSERT INTO TBL_FILES VALUES(1, 'C:\AAA\BBB\CCC\SALES.DOC');
INSERT INTO TBL_FILES VALUES(2, 'C:\AAA\PANMAE.XLSX');
INSERT INTO TBL_FILES VALUES(3, 'D:\RESEARCH.PPT');
INSERT INTO TBL_FILES VALUES(4, 'C:\DOCUMENTS\STUDY.HWP');
INSERT INTO TBL_FILES VALUES(5, 'C:\DOCUMENTS\TEMP\SIST\TEST.PNG');
INSERT INTO TBL_FILES VALUES(6, 'D:\SHARE\F\EXAMPLE.JPG');
INSERT INTO TBL_FILES VALUES(7, 'C:\USER\CLASSF\PROJECT\20250701\ORACLE.PDF');
INSERT INTO TBL_FILES VALUES(8, 'C:\ORACLESTUDY\20250701_01_SCOTT.SQL');

-- 커밋 
COMMIT;
--==&amp;gt;&amp;gt; 커밋완료

-- ,INSTR('ORACEL ORAHOME BIORA', 'ORA', 1, 1) &quot;COL2&quot;
 
--==&amp;gt;&amp;gt;
/*
1	C:\AAA\BBB\CCC\SALES.DOC
2	C:\AAA\PANMAE.XLSX
3	D:\RESEARCH.PPT
4	C:\DOCUMENTS\STUDY.HWP
5	C:\DOCUMENTS\TEMP\SIST\TEST.PNG
6	D:\SHARE\F\EXAMPLE.JPG
7	C:\USER\CLASSF\PROJECT\20250701\ORACLE.PDF
8	C:\ORACLESTUDY\20250701_01_SCOTT.SQL
*/


/*
파일번호 파일명
---------------------------------------------
1	SALES.DOC
2	PANMAE.XLSX
3	RESEARCH.PPT
4	STUDY.HWP
5	TEST.PNG
6	EXAMPLE.JPG
7	ORACLE.PDF
8	20250701_01_SCOTT.SQL
*/

--○ TBL_FILES 테이블을 대상으로
--   위와 같이 조회될 수 있도록 쿼리문을 구성한다.
--   (&amp;rarr; 파일명.확장자)

/*SELECT FILENO &quot;파일번호&quot;
    , SUBSTR(FILENAME, 16, 9) FILENAME &quot;경로포함파일명&quot;
FROM TBL_FILES
WHERE FILENO=1;
*/
--==&amp;gt;&amp;gt; 
/*
1	C:\AAA\BBB\CCC\     SALES.DOC
2	C:\AAA\PANMAE.X     LSX
3	D:\RESEARCH.PPT
4	C:\DOCUMENTS\ST     UDY.HWP
5	C:\DOCUMENTS\T      EMP\SIST\TEST.PNG
6	D:\SHARE\F\EXAM     PLE.JPG
7	C:\USER\CLASSF\     PROJECT\20250701\ORACLE.PDF
8	C:\ORACLESTUDY\     20250701_01_SCOTT.SQL
*/

-- 역슬러시 갯수가 다 다름. 그러나 거꾸로 접근해보면 최초 역슬러시가 만나는 위치끊어내면 뒷부분만 얻어내는것이 가능. 

SELECT FILENO &quot;파일번호&quot;, FILENAME &quot;경로포함파일명&quot;
    ,REVERSE(FILENAME) &quot;거꾸로거꾸로거꾸로거꾸로경로포함파일명&quot;
FROM TBL_FILES;
--==&amp;gt;&amp;gt; 에러발생 
/*
ORA-00972: identifier is too long
00972. 00000 -  &quot;identifier is too long&quot;
*Cause:    An identifier with more than 128 bytes was specified,
           or a password identifier longer than 30 bytes was specified.
*Action:   Specify at most 128 bytes for identifiers,
           and at most 30 bytes for password identifiers.
205행, 1열에서 오류 발생
*/
--&amp;gt; 부여한 별칭(ALIAS)이 너무 길어서 발생하는 에러 

SELECT FILENO &quot;파일번호&quot;, FILENAME &quot;경로포함파일명&quot;
    ,REVERSE(FILENAME) &quot;거꾸로경로포함파일명&quot;
FROM TBL_FILES;
--==&amp;gt;&amp;gt;
/*
C:\AAA\BBB\CCC\SALES.DOC	                    COD.SELAS\CCC\BBB\AAA\:C
C:\AAA\PANMAE.XLSX	                        XSLX.EAMNAP\AAA\:C
D:\RESEARCH.PPT	                            TPP.HCRAESER\:D
C:\DOCUMENTS\STUDY.HWP	                    PWH.YDUTS\STNEMUCOD\:C
C:\DOCUMENTS\TEMP\SIST\TEST.PNG	            GNP.TSET\TSIS\PMET\STNEMUCOD\:C
D:\SHARE\F\EXAMPLE.JPG	                    GPJ.ELPMAXE\F\ERAHS\:D
C:\USER\CLASSF\PROJECT\20250701\ORACLE.PDF	FDP.ELCARO\10705202\TCEJORP\FSSALC\RESU\:C
C:\ORACLESTUDY\20250701_01_SCOTT.SQL	        LQS.TTOCS_10_10705202\YDUTSELCARO\:C
*/

-- 최초 등장한 '\'의 위치 직전까지 추출한 예상 결과
/*
COD.SELAS           \CCC\BBB\AAA\:C           10 - 1 &amp;rarr; 9
XSLX.EAMNAP         \AAA\:C                   12 - 1  
TPP.HCRAESER        \:D
PWH.YDUTS           \STNEMUCOD\:C
GNP.TSET            \TSIS\PMET\STNEMUCOD\:C
GPJ.ELPMAXE         \F\ERAHS\:D
FDP.ELCARO          \10705202\TCEJORP\FSSALC\RESU\:C
*/

-- 최초 '\' 가 등장하는 위치 

SELECT INSTR(REVERSE(FILENAME), '\', 1) &quot;확인&quot;        -- 마지막 매개변수 1 생략
FROM TBL_FILES;
--==&amp;gt;&amp;gt;
/*
10
12
13
10
9
12
11
22
*/

/*
SELECT FILENO &quot;파일번호&quot;, FILENAME &quot;경로포함파일명&quot;
    , SUBSTR(REVERSE(FILENAME), 1, &quot;최초'\'가 등장한 위치 -1) &quot;거꾸로파일명&quot;
FROM TBL_FILES;*/

SELECT FILENO &quot;파일번호&quot;, FILENAME &quot;경로포함파일명&quot;
    , SUBSTR(REVERSE(FILENAME), 1, INSTR(REVERSE(FILENAME), '\', 1) -1) &quot;거꾸로파일명&quot;
FROM TBL_FILES;

SELECT FILENO &quot;파일번호&quot;
    , REVERSE(SUBSTR(REVERSE(FILENAME), 1, INSTR(REVERSE(FILENAME), '\', 1) -1)) &quot;파일명&quot;
FROM TBL_FILES;
/*
1	SALES.DOC
2	PANMAE.XLSX
3	RESEARCH.PPT
4	STUDY.HWP
5	TEST.PNG
6	EXAMPLE.JPG
7	ORACLE.PDF
8	20250701_01_SCOTT.SQL
*/

SELECT FILENO &quot;파일번호&quot;
    , SUBSTR(FILENAME, INSTR(FILENAME, '\' , -1) +1)
FROM TBL_FILES;

--○ LPAD()
--&amp;gt; Byte 공간을 확보하여 왼쪽부터 문자로 채우는 기능을 가진 함수

SELECT 'ORACEL' &quot;COL1&quot;
    ,LPAD('ORACEL', 10, '*') &quot;COL2&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; ORACEL	****ORACEL 
--&amp;gt; 1) 10Byte 공간을 확보한다.             &amp;rarr; 두 번째 파라미터 값에 의해 ... 
--&amp;gt; 2번째 파라미터를 먼저봐라 
--&amp;gt; 2) 확보한 공간에 'ORACEL'문자열을 담는다. &amp;rarr; 첫 번째 파라미터 값에 의해 ... 
--  3) 남아있는 Byte 공간(4Byte)을 왼쪽부터 세 번째 파라미터 채운다.
--  4) 이렇게 구성된 최종 결과값을 반환한다. 

--○ RPAD()
--&amp;gt; Byte 공간을 확보하여 오른쪽부터 문자로 채우는 기능을 가진 함수
SELECT 'ORACEL' &quot;COL1&quot;
    ,RPAD('ORACEL', 10, '*') &quot;COL2&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; ORACEL	ORACEL****
--&amp;gt; 1) 10Byte 공간을 확보한다.             &amp;rarr; 두 번째 파라미터 값에 의해 ... 
--&amp;gt; 2) 확보한 공간에 'ORACEL'문자열을 담는다. &amp;rarr; 첫 번째 파라미터 값에 의해 ... 
--  3) 남아있는 Byte 공간(4Byte)을 오른쪽부터 세 번째 파라미터 채운다.
--  4) 이렇게 구성된 최종 결과값을 반환한다. 

--○ LTRIM() / 손톱깍이 
SELECT 'ORAORAORACLEORACLE' &quot;COL1&quot;  -- 오라 오라 오라클 오라클
        , LTRIM('ORAORAORACLEORACLE', 'ORA') &quot;COL2&quot;
        , LTRIM('AAAORAORACLEORACLE', 'ORA') &quot;COL3&quot;
        , LTRIM('ORAoRAORACLEORACLE', 'ORA') &quot;COL4&quot;
        , LTRIM('ORA RAORACLEORACLE', 'ORA') &quot;COL5&quot; -- 4번째 공백문자 
        , LTRIM('                             ORARAORACLEORACLE', ' ') &quot;COL6&quot; 
        , LTRIM('                             ORARAORACLEORACLE') &quot;COL7&quot; -- 왼쪽 공백 제거 함수로 활용(두 번째 파라미터 생략) 
FROM DUAL;
--==&amp;gt;&amp;gt; 
/*
ORAORAORACLEORACLE	
CLEORACLE	
CLEORACLE	
oRAORACLEORACLE	 
RAORACLEORACLE
ORARAORACLEORACLE	
ORARAORACLEORACLE
*/
--&amp;gt; 첫 번째 파라미터 값에 해당하는 문자열을 대상으로
--  왼쪽부터 연속적으로 두 번째 파라미터 값에서 지정한 문자와 같은 문자가 등장할 경우
--  이를 제거하고 남은 결과값을 반환하게 된다.
--  단, 완성형으로 처리되지 않는다. // 손톱 깍다가 중간부분을 파낼 수 없다. 
--  'AAAORAORAORACLEORACLE' -&amp;gt; 이렇게 해도 A 짜르고 A 짜르고 한글자씩 짜르므로 AAA도 짤림 

--○ RTRIM()
SELECT 'ORAORAORACLEORACLE' &quot;COL1&quot;  -- 오라 오라 오라클 오라클
        , RTRIM('ORAORAORACLEORACLE', 'ORA') &quot;COL2&quot;
        , RTRIM('AAAORAORACLEORACLE', 'ORA') &quot;COL3&quot;
        , RTRIM('ORAoRAORACLEORACLE', 'ORA') &quot;COL4&quot;
        , RTRIM('ORA RAORACLEORACLE', 'ORA') &quot;COL5&quot; -- 4번째 공백문자 
        , RTRIM('ORARAORACLEORACLE                                       ', ' ') &quot;COL6&quot; 
        , RTRIM('ORARAORACLEORACLE                           ') &quot;COL7&quot; -- 오른쪽 공백 제거 함수로 활용(두 번째 파라미터 생략) 
FROM DUAL;
/*
ORAORAORACLEORACLE	
ORAORAORACLEORACLE	
AAAORAORACLEORACLE	
ORAoRAORACLEORACLE	
ORA RAORACLEORACLE	
ORARAORACLEORACLE	
ORARAORACLEORACLE
*/

--&amp;gt; 첫 번째 파라미터 값에 해당하는 문자열을 대상으로
--  오른쪽부터 연속적으로 두 번째 파라미터 값에서 지정한 문자와 같은 문자가 등장할 경우
--  이를 제거하고 남은 결과값을 반환하게 된다.
--  단, 완성형으로 처리되지 않는다. // 손톱 깍다가 중간부분을 파낼 수 없다. 

SELECT LTRIM('김김김유유유이이조최박송유', '김유이조최') &quot;결과확인&quot;
       FROM DUAL;
--==&amp;gt;&amp;gt; 박송유

--○ TRANSLATE() 
--&amp;gt; 1 : 1 로 바꾸는 과정을 수행한다.
SELECT TRANSLATE('MY ORACLE SERVE'
                , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                , 'abcdefghijklmnopqrstuvwxyz') &quot;결과확인&quot;
FROM DUAL; 
--==&amp;gt;&amp;gt; my oracle serve

SELECT TRANSLATE('010-4567-5689'
                , '0123456789'
                , '공일이삼사오육칠팔구') &quot;결과확인&quot;
FROM DUAL; 
--==&amp;gt;&amp;gt; 공일공-사오육칠-오육팔구

--○ REPLACE()
SELECT REPLACE('MY ORACLE ORAHOME ARO', 'ORA', '오라') &quot;결과확인&quot;
FROM DUAL; 
--==&amp;gt;&amp;gt; MY 오라CLE 오라HOME ARO&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/215</guid>
      <comments>https://aluck.tistory.com/215#entry215comment</comments>
      <pubDate>Tue, 1 Jul 2025 15:18:55 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - COMMIT / ROLLBACK / UPDATE / DELETE</title>
      <link>https://aluck.tistory.com/213</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xyOCv/btsOXUcI84Z/UXpYhONb9hlechzJDHJSK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xyOCv/btsOXUcI84Z/UXpYhONb9hlechzJDHJSK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xyOCv/btsOXUcI84Z/UXpYhONb9hlechzJDHJSK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxyOCv%2FbtsOXUcI84Z%2FUXpYhONb9hlechzJDHJSK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;136&quot; height=&quot;136&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751275325862&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--■■■ COMMIT / ROLLBACK ■■■--

SELECT *
FROM TBL_DEPT;
--==&amp;gt;&amp;gt;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
*/

--○ 데이터 입력
INSERT INTO TBL_DEPT VALUES (50, '개발부' ,'서울');
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다.

--○ 확인
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH    	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/
--&amp;gt; 50	개발부	    서울
-- 이 데이터는 TBL_DEPT 테이블이 저장되어 있는
-- 하드디스크상에 물리적으로 적용되어 저장된 것이 아니라
-- 메모리(RAM)상에 입력된 것이다.  

-- 롤백
ROLLBACK;
--==&amp;gt;&amp;gt;롤백 완료.

--○ 롤백 이후 다시 확인
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
*/
--&amp;gt; 50	개발부	    서울
--  에 대한 데이터가 소실되었음을 확인(존재하지 않음)

--○ 데이터 입력
INSERT INTO TBL_DEPT VALUES (50, '개발부' ,'서울');
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다.

--○ 확인
SELECT *
FROM TBL_DEPT;

/*
10	ACCOUNTING	NEW YORK
20	RESEARCH    	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/

--&amp;gt; 메모리 상에 입력된 이 데이터를 실제 하드디스크상에 물리적으로 저장하기 위해서는
--  COMMIT 을 수행해야 한다.

--○ 커밋
COMMIT;
--==&amp;gt;&amp;gt; 커밋 완료.


/*
10	ACCOUNTING	NEW YORK
20	RESEARCH    	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/

-- 롤백
ROLLBACK;
--==&amp;gt;&amp;gt; 롤백완료

--○ 롤백 이후 다시 확인
SELECT *
FROM TBL_DEPT;


/*
10	ACCOUNTING	NEW YORK
20	RESEARCH    	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/
--&amp;gt; 롤백(ROLLBACK)을 수행했음에도 불구하고
--  50	개발부	    서울
--  해당 데이터는 소실되지 않았음을 확인 

--※ COMMIT 을 실행한 이후로 DML구문(INSERT, UPDATE, DELETE 등)을 통해
--   변경된 데이터만 취소할 수 있는 것일 뿐
--   DML 명령을 사용한 후 COMMIT 하고나서
--   ROLLBACK 을 실행해 봐야.. 이전 상태로 되돌릴 수 없다.(아무 소용이 없다.)

--○ 데이터 수정(TBL_DEPT) -- SET 부터가 아니라 조건절부터 
UPDATE TBL_DEPT 
SET DNAME='연구부', LOC='경기'
WHERE DEPTNO=50
--==&amp;gt;&amp;gt;1 행 이(가) 업데이트되었습니다.

SELECT *
FROM TBL_DEPT;

--○ 롤백
ROLLBACK;

--○ 롤백 이후 다시 확인
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	개발부	서울
*/
--&amp;gt; 수정(UPDATE)을 수행하기 이전 상태로 복원되었음을 확인~!!!

--○ 데이터 삭제
SELECT *
FROM TBL_DEPT
WHERE DEPTNO=50;
--==&amp;gt;&amp;gt; 50	개발부	서울

DELETE TBL_DEPT
WHERE DEPTNO=50;
--==&amp;gt;&amp;gt; 1 행 이(가) 삭제되었습니다.

--○ 확인
SELECT *
FROM TBL_DEPT;
--==&amp;gt;&amp;gt; 50번 부서 삭제됨.

--○ 롤백
ROLLBACK;
--==&amp;gt;&amp;gt; 롤백 완료.

--○ 롤백 이후 다시 확인
SELECT *
FROM TBL_DEPT;
--==&amp;gt;&amp;gt;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON
50	개발부	서울
*/

--&amp;gt; 삭제(DELETE) 구문을 수행하기 전에 롤백되었음을 확인 
/*
DML 구문 구성
구성된 DML 구문 실행;
COMMIT; 

INSERT.. / UPDATE/ DELETE
COMMIT; &amp;gt;&amp;gt;  이렇게 하면 복구 불가능함. 
이렇게 하면 안됨. 
*/ 
--------------------------------------------------------------------------------
--■■■ 정렬(ORDER BY) 절 ■■■--

SELECT ENAME &quot;사원명&quot;, DEPTNO &quot;부서번호&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
       , SAL*12+NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP;
--==&amp;gt;&amp;gt;
/*
SMITH	20	CLERK	800	9600
ALLEN	30	SALESMAN	1600	19500
WARD	30	SALESMAN	1250	15500
JONES	20	MANAGER	2975	35700
MARTIN	30	SALESMAN	1250	16400
BLAKE	30	MANAGER	2850	34200
CLARK	10	MANAGER	2450	29400
SCOTT	20	ANALYST	3000	36000
KING	10	PRESIDENT	5000	60000
TURNER	30	SALESMAN	1500	18000
ADAMS	20	CLERK	1100	13200
JAMES	30	CLERK	950	11400
FORD	20	ANALYST	3000	36000
MILLER	10	CLERK	1300	15600
*/

SELECT ENAME &quot;사원명&quot;, DEPTNO &quot;부서번호&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
       , SAL*12+NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP
ORDER BY DEPTNO ASC;        -- DEPTNO &amp;rarr; 부서번호 기준 정렬 
                            -- ASC    &amp;rarr; 오름차순 정렬 
                            
--==&amp;gt;&amp;gt;
/*
CLARK	10	MANAGER	2450	29400
KING	10	PRESIDENT	5000	60000
MILLER	10	CLERK	1300	15600
JONES	20	MANAGER	2975	35700
FORD	20	ANALYST	3000	36000
ADAMS	20	CLERK	1100	13200
SMITH	20	CLERK	800	9600
SCOTT	20	ANALYST	3000	36000
WARD	30	SALESMAN	1250	15500
TURNER	30	SALESMAN	1500	18000
ALLEN	30	SALESMAN	1600	19500
JAMES	30	CLERK	950	11400
BLAKE	30	MANAGER	2850	34200
MARTIN	30	SALESMAN	1250	16400
*/

SELECT ENAME &quot;사원명&quot;, DEPTNO &quot;부서번호&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
       , SAL*12+NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP
ORDER BY DEPTNO;  -- DEPTNO &amp;rarr; 부서번호 기준 정렬 
                  -- ASC &amp;rarr; 오름차순 정렬 &amp;rarr; 생략 가능    ~!!!
/*
CLARK	10	MANAGER	2450	29400
KING	10	PRESIDENT	5000	60000
MILLER	10	CLERK	1300	15600
JONES	20	MANAGER	2975	35700
FORD	20	ANALYST	3000	36000
ADAMS	20	CLERK	1100	13200
SMITH	20	CLERK	800	9600
SCOTT	20	ANALYST	3000	36000
WARD	30	SALESMAN	1250	15500
TURNER	30	SALESMAN	1500	18000
ALLEN	30	SALESMAN	1600	19500
JAMES	30	CLERK	950	11400
BLAKE	30	MANAGER	2850	34200
MARTIN	30	SALESMAN	1250	16400
*/

SELECT ENAME &quot;사원명&quot;, DEPTNO &quot;부서번호&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
       , SAL*12+NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP
ORDER BY DEPTNO DESC;  -- DEPTNO &amp;rarr; 부서번호 기준 정렬 
                       -- DESC   &amp;rarr; 내림차순 정렬 &amp;rarr; 생략 불가    ~!!!                  
--==&amp;gt;&amp;gt;
/*
BLAKE	30	MANAGER	2850	34200
TURNER	30	SALESMAN	1500	18000
ALLEN	30	SALESMAN	1600	19500
MARTIN	30	SALESMAN	1250	16400
WARD	30	SALESMAN	1250	15500
JAMES	30	CLERK	950	11400
SCOTT	20	ANALYST	3000	36000
JONES	20	MANAGER	2975	35700
SMITH	20	CLERK	800	9600
ADAMS	20	CLERK	1100	13200
FORD	20	ANALYST	3000	36000
KING	10	PRESIDENT	5000	60000
MILLER	10	CLERK	1300	15600
CLARK	10	MANAGER	2450	29400
*/

SELECT ENAME &quot;사원명&quot;, DEPTNO &quot;부서번호&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
       , SAL*12+NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP
ORDER BY SAL DESC;     -- SAL    &amp;rarr; 급여 기준 정렬 
                       -- DESC   &amp;rarr; 내림차순 정렬    
--==&amp;gt;&amp;gt;
/*
KING	10	PRESIDENT	5000	60000
FORD	20	ANALYST	3000	36000
SCOTT	20	ANALYST	3000	36000
JONES	20	MANAGER	2975	35700
BLAKE	30	MANAGER	2850	34200
CLARK	10	MANAGER	2450	29400
ALLEN	30	SALESMAN	1600	19500
TURNER	30	SALESMAN	1500	18000
MILLER	10	CLERK	1300	15600
WARD	30	SALESMAN	1250	15500
MARTIN	30	SALESMAN	1250	16400
ADAMS	20	CLERK	1100	13200
JAMES	30	CLERK	950	11400
SMITH	20	CLERK	800	9600
*/

SELECT ENAME &quot;사원명&quot;, DEPTNO &quot;부서번호&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
       , SAL*12+NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP
ORDER BY 연봉 DESC;    
-- FWG HSO ORDER BY는 SELECT가 한 일을 알고 있으므로 정렬 가능 
--==&amp;gt;&amp;gt;
/*
KING	10	PRESIDENT	5000	60000
FORD	20	ANALYST	3000	36000
SCOTT	20	ANALYST	3000	36000
JONES	20	MANAGER	2975	35700
BLAKE	30	MANAGER	2850	34200
CLARK	10	MANAGER	2450	29400
ALLEN	30	SALESMAN	1600	19500
TURNER	30	SALESMAN	1500	18000
MARTIN	30	SALESMAN	1250	16400
MILLER	10	CLERK	1300	15600
WARD	30	SALESMAN	1250	15500
ADAMS	20	CLERK	1100	13200
JAMES	30	CLERK	950	11400
SMITH	20	CLERK	800	9600
*/
--&amp;gt;&amp;gt; ORDER BY 절보다 SELECT 절이 먼저 처리되기 때문에
--   테이블의 컬럼명 대시 SELECT 절에서 부여한 ALIAS(별칭)을
--   ORDER BY 절에서 사용해도 문제가 발생하지 않는다.(가능하다.) 

SELECT ENAME &quot;사원명&quot;, DEPTNO &quot;부서 번호&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
       , SAL*12+NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP
ORDER BY 부서 번호 DESC;                     
--==&amp;gt;&amp;gt; 에러발생 
/*
ORA-00933: SQL command not properly ended
00933. 00000 -  &quot;SQL command not properly ended&quot;
*Cause:    
*Action:
1,532행, 121열에서 오류 발생
*/

SELECT ENAME &quot;사원명&quot;, DEPTNO &quot;부서번호&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
       , SAL*12+NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP
ORDER BY 부서번호 DESC;         
--==&amp;gt;&amp;gt;
/*
BLAKE	30	MANAGER	2850	34200
TURNER	30	SALESMAN	1500	18000
ALLEN	30	SALESMAN	1600	19500
MARTIN	30	SALESMAN	1250	16400
WARD	30	SALESMAN	1250	15500
JAMES	30	CLERK	950	11400
SCOTT	20	ANALYST	3000	36000
JONES	20	MANAGER	2975	35700
SMITH	20	CLERK	800	9600
ADAMS	20	CLERK	1100	13200
FORD	20	ANALYST	3000	36000
KING	10	PRESIDENT	5000	60000
MILLER	10	CLERK	1300	15600
CLARK	10	MANAGER	2450	29400
*/

SELECT *
FROM TBL_EMP;

SELECT ENAME &quot;사원명&quot;, DEPTNO &quot;부서 번호&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
       , SAL*12+NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP
ORDER BY 2;     --DEPTNO ASC; -- 두번째 컬럼으로 정렬한다는 의미
-- 부서번호를 기준으로 해서 정렬한 것이다.
-- 오라클은 1,2 로부터 숫자를 세기 시작한다. 
--==&amp;gt;&amp;gt;
/*
CLARK	10	MANAGER	2450	29400
KING	10	PRESIDENT	5000	60000
MILLER	10	CLERK	1300	15600
JONES	20	MANAGER	2975	35700
FORD	20	ANALYST	3000	36000
ADAMS	20	CLERK	1100	13200
SMITH	20	CLERK	800	9600
SCOTT	20	ANALYST	3000	36000
WARD	30	SALESMAN	1250	15500
TURNER	30	SALESMAN	1500	18000
ALLEN	30	SALESMAN	1600	19500
JAMES	30	CLERK	950	11400
BLAKE	30	MANAGER	2850	34200
MARTIN	30	SALESMAN	1250	16400
*/

--&amp;gt; TBL_EMP 테이블이 갖고있는 테이블의 고유한 컬럼 순서가 아니라
--  SELECT 절에서 처리되는 과정에서 두 번째 컬럼(즉, DEPTNO)을 기준으로
--  정렬이 되는 것을 확인
--  컬럼 인덱스는 0부터 아니고, 1부터
--  ASC 생략된 상태 오름차순 &amp;rarr; 정렬되는 것을 확인

SELECT ENAME, DEPTNO, JOB, SAL 
FROM TBL_EMP
ORDER BY 2, 4; -- DEPTNO 기준 1차 정렬, SAL 기준 2차 정렬... ASC 
--==&amp;gt;&amp;gt;
/*
MILLER	10	CLERK	1300
CLARK	10	MANAGER	2450
KING	10	PRESIDENT	5000
SMITH	20	CLERK	800
ADAMS	20	CLERK	1100
JONES	20	MANAGER	2975
SCOTT	20	ANALYST	3000
FORD	20	ANALYST	3000
JAMES	30	CLERK	950
MARTIN	30	SALESMAN	1250
WARD	30	SALESMAN	1250
TURNER	30	SALESMAN	1500
ALLEN	30	SALESMAN	1600
BLAKE	30	MANAGER	2850
*/

SELECT ENAME, DEPTNO, JOB, SAL 
FROM TBL_EMP
ORDER BY 2, 3, 4 DESC;
--&amp;gt; 1) DEPTNO(부서번호) 기준 오름차순 정렬
--  2) JOB(직종명) 기준 오름차순 정렬
--  3) SAL(급여) 기준 내림차순 정렬 
--  같은 직종인 1634 1635 를 보면 내림차순 정렬 잘 되어 있음 
--==&amp;gt;&amp;gt;
/*
MILLER	10	CLERK	1300
CLARK	10	MANAGER	2450
KING	10	PRESIDENT	5000
SCOTT	20	ANALYST	3000
FORD	20	ANALYST	3000
ADAMS	20	CLERK	1100
SMITH	20	CLERK	800
JONES	20	MANAGER	2975
JAMES	30	CLERK	950
BLAKE	30	MANAGER	2850
ALLEN	30	SALESMAN	1600
TURNER	30	SALESMAN	1500
MARTIN	30	SALESMAN	1250
WARD	30	SALESMAN	1250
*/&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/213</guid>
      <comments>https://aluck.tistory.com/213#entry213comment</comments>
      <pubDate>Mon, 30 Jun 2025 18:22:30 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 기초실습</title>
      <link>https://aluck.tistory.com/212</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE2kPS/btsOWiyA5SQ/CzJ5C4gUZGQQy88Ly6kWX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE2kPS/btsOWiyA5SQ/CzJ5C4gUZGQQy88Ly6kWX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE2kPS/btsOWiyA5SQ/CzJ5C4gUZGQQy88Ly6kWX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE2kPS%2FbtsOWiyA5SQ%2FCzJ5C4gUZGQQy88Ly6kWX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;131&quot; height=&quot;131&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751254730007&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT USER
FROM DUAL;
--==&amp;gt;&amp;gt; SCOTT

--○ NVL2()
--&amp;gt; 첫 번째 파라미터 값이 NULL 이 아닌 경우, 두 번째 파라미터 값을 반환하고,
-- 첫 번째 파라미터 값이 NULL 인 경우, 세 번째 파라미터 값을 반환한다.

SELECT NVL2(NULL, '청기올려', '백기올려')&quot;결과확인&quot;
FROM DUAL;
--==&amp;gt;&amp;gt;백기올려

SELECT NVL2(20, '청기올려', '백기올려')&quot;결과확인&quot;
FROM DUAL;
--==&amp;gt;&amp;gt;청기올려

SELECT ENAME, COMM, NVL2(COMM, '청기올려','백기올려') &quot;결과확인&quot;
FROM TBL_EMP;
--==&amp;gt;&amp;gt;
/*
SMITH		백기올려
ALLEN	300	청기올려
WARD	500	청기올려
JONES		백기올려
MARTIN	1400	청기올려
BLAKE		백기올려
CLARK		백기올려
SCOTT		백기올려
KING		백기올려
TURNER	0	청기올려
ADAMS		백기올려
JAMES		백기올려
FORD		백기올려
MILLER		백기올려
*/

--○ TBL_EMP 테이블에서 모든 사원들의
--   사원명, 사원번호, 급여, 커미션, 연봉 항목을 조회한다.
--   단, 급여(SAL)는 매월 지급한다.
--   또한, 수당(COMM)은 매년 지급한다. 

SELECT ENAME &quot;사원명&quot;, EMPNO &quot;사원번호&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
        , NVL2(COMM, SAL * 12 + COMM, SAL*12) &quot;연봉&quot; -- 널인지 아닌지 확인하는 건 커미션 
FROM TBL_EMP;

--==&amp;gt;&amp;gt; 
/*
SMITH	7369	800		9600
ALLEN	7499	1600	300	19500
WARD	7521	1250	500	15500
JONES	7566	2975		35700
MARTIN	7654	1250	1400	16400
BLAKE	7698	2850		34200
CLARK	7782	2450		29400
SCOTT	7788	3000		36000
KING	7839	5000		60000
TURNER	7844	1500	0	18000
ADAMS	7876	1100		13200
JAMES	7900	950		11400
FORD	7902	3000		36000
MILLER	7934	1300		15600
*/

--○ COALESCE()
--&amp;gt; 맨 앞에 있는 매개변수부터 차례로 NULL 인지 아닌지 확인하여
--  NULL 이 아닐 경우 적용(반환, 처리)하고,
--  NULL 인 경우에는 그 다음 매개변수 값으로 적용(반환, 처리)한다.
--  NVL() 이나 NVL2() 와 비교하여...
--  모~~ 든 경우의 수를 고려할 수 있는 특징을 갖고 있다.

SELECT NULL &quot;기본확인&quot;
    , COALESCE(NULL, NULL, NULL, 10) &quot;결과확인&quot; -- 차례로 확인후 널이아니네를 반환하는거 
    , COALESCE(NULL, NULL, NULL, NULL, NULL, NULL, NULL, 150) &quot;결과확인2&quot;
    , COALESCE(NULL, NULL, NULL, NULL, 10, NULL, NULL, NULL, NULL, NULL, 150) &quot;결과확인3&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 10	150	10

--○ 실습 환경 조성을 위한 데이터 추가 입력
INSERT INTO TBL_EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, DEPTNO)
VALUES(8000, '이동건', 'SALESMAN', 7839, SYSDATE, 10);

INSERT INTO TBL_EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, COMM, DEPTNO)
VALUES(8001, '김주형', 'SALESMAN', 7839, SYSDATE, 100, 10);

--○확인
SELECT *
FROM TBL_EMP;
--==&amp;gt;&amp;gt; 
/*

8000	이동건	SALESMAN	7839	25/06/30			10 -- 급여, 커미션 O
8001	김주형	SALESMAN	7839	25/06/30		100	10 -- 커미션 100
*/

--○ 커밋
COMMIT;
--==&amp;gt;&amp;gt; 커밋 완료.

--○ TBL_EMP 테이블에서 모든 사원들의
--   사원명, 사원번호, 급여, 커미션, 연봉 항목을 조회한다.
--   단, 급여(SAL)는 매월 지급한다.
--   또한, 수당(COMM)은 매년 지급한다. 

SELECT ENAME &quot;사원명&quot;, EMPNO &quot;사원번호&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
      , SAL * 12 + NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP;

SELECT ENAME &quot;사원명&quot;, EMPNO &quot;사원번호&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
    , COALESCE((SAL * 12 + COMM), (SAL*12), COMM, 0) &quot;연봉&quot; 
    -- 급여+커미션 조건1(기본수식) / 급여*12 조건2(커미션없는 사람), 
    -- 커미션만 있는사람(조건3), 아무것도 없는사람(조건4=NULL)
FROM TBL_EMP;

/*
SMITH	7369	800		9600
ALLEN	7499	1600	300	19500
WARD	7521	1250	500	15500
JONES	7566	2975		35700
MARTIN	7654	1250	1400	16400
BLAKE	7698	2850		34200
CLARK	7782	2450		29400
SCOTT	7788	3000		36000
KING	7839	5000		60000
TURNER	7844	1500	0	18000
ADAMS	7876	1100		13200
JAMES	7900	950		11400
FORD	7902	3000		36000
MILLER	7934	1300		15600
이동건	8000			0
김주형	8001		100	100
*/
--------------------------------------------------------------------------------
--==&amp;gt;&amp;gt;
--○

--※ 날짜와 시간에 대한 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==&amp;gt;&amp;gt; Session이(가) 변경되었습니다.

SELECT *
FROM TBL_EMP;

DESC TBL_EMP;

SELECT SYSDATE
FROM DUAL;
--==&amp;gt;&amp;gt; 25/06/30
--==&amp;gt;&amp;gt; 2025-06-30 09:49:42

--○ 현재 날짜 및 시간을 반환하는 함수
SELECT SYSDATE, CURRENT_DATE, LOCALTIMESTAMP
FROM DUAL;
--==&amp;gt;
/*
2025-06-30 10:02:49	
2025-06-30 10:02:49	
25/06/30 10:02:49.000000000
*/

--※ 날짜와 시간에 대한 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--==&amp;gt;Session이(가) 변경되었습니다.

-- 변경 이후 다시 조회
SELECT SYSDATE, CURRENT_DATE, LOCALTIMESTAMP
FROM DUAL; 
--==&amp;gt;
/*
2025-06-30	
2025-06-30	
25/06/30 10:04:55.000000000
*/

--○ 컬럼과 컬럼의 연결(결합)
--   문자 타앱과 문자 타입의 연결
--   [+] 연산자를 통한 결합 수행은 불가능~!!! [||]
SELECT 1 + 1
FROM DUAL;
--==&amp;gt; 2

/*SELECT '김주형', '이동건'
FORM DAUL;*/

SELECT '김주형' + '이동건'
FORM DAUL;
--==&amp;gt; 에러 발생 
/*
ORA-00923: FROM keyword not found where expected
00923. 00000 -  &quot;FROM keyword not found where expected&quot;
*Cause:    
*Action:
184행, 30열에서 오류 발생
*/

SELECT &quot;김주형&quot;||&quot;이동건&quot;
FORM DAUL;

SELECT ENAME, JOB
FROM TBL_EMP;
--==&amp;gt;
/*
SMITH	CLERK
ALLEN	SALESMAN
WARD	SALESMAN
JONES	MANAGER
MARTIN	SALESMAN
BLAKE	MANAGER
CLARK	MANAGER
SCOTT	ANALYST
KING	PRESIDENT
TURNER	SALESMAN
ADAMS	CLERK
JAMES	CLERK
FORD	ANALYST
MILLER	CLERK
이동건	SALESMAN
김주형	SALESMAN
*/

SELECT ENAME || JOB &quot;결과확인&quot;
FROM TBL_EMP;

--==&amp;gt;&amp;gt;
/*
SMITHCLERK
ALLENSALESMAN
WARDSALESMAN
JONESMANAGER
MARTINSALESMAN
BLAKEMANAGER
CLARKMANAGER
SCOTTANALYST
KINGPRESIDENT
TURNERSALESMAN
ADAMSCLERK
JAMESCLERK
FORDANALYST
MILLERCLERK
이동건SALESMAN
김주형SALESMAN
*/

DESC TBL_EMP;
--==&amp;gt;&amp;gt;
/*
이름       널? 유형           
-------- -- ------------ 
EMPNO       NUMBER(4)       -- 숫자 타입
ENAME       VARCHAR2(10)    -- 문자 타입
JOB         VARCHAR2(9)  
MGR         NUMBER(4)    
HIREDATE    DATE         
SAL         NUMBER(7,2)  
COMM        NUMBER(7,2)  
DEPTNO      NUMBER(2)    
*/

SELECT EMPNO || ENAME &quot;결과확인&quot;
FROM TBL_EMP;
--==&amp;gt;&amp;gt;
/*
7369SMITH
7499ALLEN
7521WARD
7566JONES
7654MARTIN
7698BLAKE
7782CLARK
7788SCOTT
7839KING
7844TURNER
7876ADAMS
7900JAMES
7902FORD
7934MILLER
8000이동건
8001김주형
*/
--     문자타입   날짜타입  문자타입   숫자타입  문자타입
--     ---------  -------   -------   ---  ------------
SELECT '규석이는', SYSDATE, '에 연봉', 500, '억을 원한다.'
FROM DUAL;
--==&amp;gt;&amp;gt;규석이는	2025-06-30	에 연봉	500	억을 원한다.

--     문자타입   날짜타입  문자타입   숫자타입  문자타입
--     ---------  -------   -------   ---  ------------
SELECT '규석이는'|| SYSDATE || '에 연봉' || 500 || '억을 원한다.' &quot;결과확인&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 규석이는2025-06-30에 연봉500억을 원한다.

--※ 오라클에서는 문자 타입의 형태로 타입을 변환하는 별도의 과정 없이
--   위에서 처리한 내용처럼 [||] 만 삽입해주면 간단히 컬럼과 컬럼을
--   (서로 다른 종류의 데이터) 결합하는 것이 가능하다.
--   이와 비교하여 MS-SQL에서는 모든 데이터를 문자타입으로 CONVERT 해야 한다.

SELECT *
FROM TBL_EMP;

-- 실습 진행 전에 이동건 사원과 김주형 사원 제거
SELECT *
FROM TBL_EMP
WHERE EMPNO=8000 OR EMPNO=8001;
--==&amp;gt;&amp;gt;
/*
8000	이동건	SALESMAN	7839	2025-06-30			10
8001	김주형	SALESMAN	7839	2025-06-30		100	10
*/

DELETE
FROM TBL_EMP
WHERE EMPNO=8000 OR EMPNO=8001;
/*
2개 행 이(가) 삭제되었습니다.
*/

SELECT *
FROM TBL_EMP;
--==&amp;gt;&amp;gt; 원하는 데이터가 제데로 제거되었음을 확인

--커밋
COMMIT;
--==&amp;gt;&amp;gt;커밋 완료.

--○ TBL_EMP 테이블의 데이터를 활용하여
--   모든 직원들의 데이터에 대해
--   다음과 같은 결과를 얻을 수 있도록 쿼리문을 구성한다.

--  SMITH 의 현재 연봉은 9600인데, 희망 연봉은 19200이다.
--  ALLEN 의 현재 연봉은 19500인데, 희망 연봉은 39000이다. 

-- 현재연봉은 앞에 수식으로 얻어낸 결과 

DESC TBL_EMP;

-- 방식1
SELECT ENAME || '의 현재 연봉은' || NVL(SAL * 12 + COMM, SAL *12) -- 커미션이 NULL도 있으므로 
    ||  '인데 희망 연봉은' || NVL(SAL * 12 + COMM, SAL *12) *2 || '이다.'
FROM TBL_EMP;
--==&amp;gt;&amp;gt;
/*
SMITH의 현재 연봉은9600인데 희망 연봉은19200이다.
ALLEN의 현재 연봉은19500인데 희망 연봉은39000이다.
WARD의 현재 연봉은15500인데 희망 연봉은31000이다.
JONES의 현재 연봉은35700인데 희망 연봉은71400이다.
MARTIN의 현재 연봉은16400인데 희망 연봉은32800이다.
BLAKE의 현재 연봉은34200인데 희망 연봉은68400이다.
CLARK의 현재 연봉은29400인데 희망 연봉은58800이다.
SCOTT의 현재 연봉은36000인데 희망 연봉은72000이다.
KING의 현재 연봉은60000인데 희망 연봉은120000이다.
TURNER의 현재 연봉은18000인데 희망 연봉은36000이다.
ADAMS의 현재 연봉은13200인데 희망 연봉은26400이다.
JAMES의 현재 연봉은11400인데 희망 연봉은22800이다.
FORD의 현재 연봉은36000인데 희망 연봉은72000이다.
MILLER의 현재 연봉은15600인데 희망 연봉은31200이다.
*/

-- 방식 2
SELECT ENAME || '의 현재 연봉은' || NVL2(COMM, SAL * 12 + COMM, SAL*12)
 ||  '인데 희망 연봉은' || NVL2(COMM, SAL * 12 + COMM, SAL*12)*2 || '이다'
FROM TBL_EMP;

-- 방식 3 
SELECT ENAME || '의 현재 연봉은' || COALESCE(SAL * 12 + COMM, SAL *12, COMM, 0) -- 커미션이 NULL도 있으므로 
    ||  '인데 희망 연봉은' || COALESCE(SAL * 12 + COMM, SAL *12, COMM, 0) *2 || '이다.'
FROM TBL_EMP;
--==&amp;gt;&amp;gt;
/*
SMITH의 현재 연봉은9600인데 희망 연봉은19200이다.
ALLEN의 현재 연봉은19500인데 희망 연봉은39000이다.
WARD의 현재 연봉은15500인데 희망 연봉은31000이다.
JONES의 현재 연봉은35700인데 희망 연봉은71400이다.
MARTIN의 현재 연봉은16400인데 희망 연봉은32800이다.
BLAKE의 현재 연봉은34200인데 희망 연봉은68400이다.
CLARK의 현재 연봉은29400인데 희망 연봉은58800이다.
SCOTT의 현재 연봉은36000인데 희망 연봉은72000이다.
KING의 현재 연봉은60000인데 희망 연봉은120000이다.
TURNER의 현재 연봉은18000인데 희망 연봉은36000이다.
ADAMS의 현재 연봉은13200인데 희망 연봉은26400이다.
JAMES의 현재 연봉은11400인데 희망 연봉은22800이다.
FORD의 현재 연봉은36000인데 희망 연봉은72000이다.
MILLER의 현재 연봉은15600인데 희망 연봉은31200이다.
*/

SELECT *
FROM TBL_EMP;

-- SMITH's 입사일은 1980-12-17 이다. 그리고 급여는 800 이다.
-- ALLEN's 입사일은 1982-02-20 이다. 그리고 급여는 1600 이다.
-- DATE sal

DESC TBL_EMP;

SELECT ENAME || '''s 입사일은 ' || HIREDATE  
|| ' 이다. 그리고 급여는 ' || SAL || ' 이다.'
FROM TBL_EMP;

--※ 문자열을 나타내는 홑따옴표 사이에서(시작과 끝)
--   홑따옴표 두 개가 홑따옴표 하나(어서프스토피)를 의미한다. 
--   홑따옴표['] 하나는 문자열의 시작을 나타내고
--   홑따옴표[''] 두개는 문자열 영역 안에서 어퍼스트로피를 나타내며
--   다시 등장하는 홑따옴표['] 하나가 문자열 영역의 종료를 의미하게 되는 것이다.
--==&amp;gt;&amp;gt;
/*
SMITH's 입사일은 1980-12-17 이다. 그리고 급여는 800 이다
ALLEN's 입사일은 1981-02-20 이다. 그리고 급여는 1600 이다
WARD's 입사일은 1981-02-22 이다. 그리고 급여는 1250 이다
JONES's 입사일은 1981-04-02 이다. 그리고 급여는 2975 이다
MARTIN's 입사일은 1981-09-28 이다. 그리고 급여는 1250 이다
BLAKE's 입사일은 1981-05-01 이다. 그리고 급여는 2850 이다
CLARK's 입사일은 1981-06-09 이다. 그리고 급여는 2450 이다
SCOTT's 입사일은 1987-07-13 이다. 그리고 급여는 3000 이다
KING's 입사일은 1981-11-17 이다. 그리고 급여는 5000 이다
TURNER's 입사일은 1981-09-08 이다. 그리고 급여는 1500 이다
ADAMS's 입사일은 1987-07-13 이다. 그리고 급여는 1100 이다
JAMES's 입사일은 1981-12-03 이다. 그리고 급여는 950 이다
FORD's 입사일은 1981-12-03 이다. 그리고 급여는 3000 이다
MILLER's 입사일은 1982-01-23 이다. 그리고 급여는 1300 이다
*/

--○ UPPER(), LOWER(), INITCAP()
SELECT 'oRaCLe' &quot;1&quot;, UPPER('oRaCLe') &quot;2&quot;, LOWER('oRaCLe') &quot;3&quot;
, INITCAP('oRaCLe') &quot;4&quot;
FROM DUAL;
--==&amp;gt;&amp;gt;oRaCLe	ORACLE	oracle	Oracle
--&amp;gt; UPPER() 는 모두 대문자로 변환하여 반환
--  LOWER()는 모두 소문자로 변환하여 반환
--  INITCAP()은 첫 글자만 대문자로 하고 나머지는 모두 소문자로 변환하여 반환 

SELECT *
FROM TBL_EMP
WHERE JOB = 'saleman';
--==&amp;gt;&amp;gt; 조회결과없음

--※ 실습 환경 구성을 위한 추가 데이터 입력
INSERT INTO TBL_EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8000, '최규석', 'saLesMAN', 7698 , SYSDATE, 2000 , 200, 30);

INSERT INTO TBL_EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8001, '조경진', 'SaLesMan', 7698 , SYSDATE, 2000 , 200, 30);

INSERT INTO TBL_EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8002, '이채원', 'salesman', 7698 , SYSDATE, 2000 , 200, 30);

INSERT INTO TBL_EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8003, '이유빈', 'SALESMan', 7698 , SYSDATE, 2000 , 200, 30);
--==&amp;gt;&amp;gt; 1 행이(가) 삽입되었습니다. * 4

--○ 확인
SELECT *
FROM TBL_EMP;
--==&amp;gt;&amp;gt;
/*
7369	SMITH	CLERK	7902	1980-12-17	800		20
7499	ALLEN	SALESMAN	7698	1981-02-20	1600	300	30
7521	WARD	SALESMAN	7698	1981-02-22	1250	500	30
7566	JONES	MANAGER	7839	1981-04-02	2975		20
7654	MARTIN	SALESMAN	7698	1981-09-28	1250	1400	30
7698	BLAKE	MANAGER	7839	1981-05-01	2850		30
7782	CLARK	MANAGER	7839	1981-06-09	2450		10
7788	SCOTT	ANALYST	7566	1987-07-13	3000		20
7839	KING	PRESIDENT		1981-11-17	5000		10
7844	TURNER	SALESMAN	7698	1981-09-08	1500	0	30
7876	ADAMS	CLERK	7788	1987-07-13	1100		20
7900	JAMES	CLERK	7698	1981-12-03	950		30
7902	FORD	ANALYST	7566	1981-12-03	3000		20
7934	MILLER	CLERK	7782	1982-01-23	1300		10
8000	최규석	saLesMAN	7698	2025-06-30	2000	200	30
8001	조경진	SaLesMan	7698	2025-06-30	2000	200	30
8002	이채원	salesman	7698	2025-06-30	2000	200	30
8003	이유빈	SALESMan	7698	2025-06-30	2000	200	30
*/

--○ 커밋
COMMIT;
--==&amp;gt;&amp;gt; 커밋 완료.

--○TBL_EMP 테이블에서 대소문자 구분없이 세일즈맨 직종인 사원의
--  사원번호, 사원명, 직종, 입사일, 부서번호 항목을 조회한다.
--  (※ 세일즈맨 : SALESMAN, saLesMAN , SaLesMan, salesman , SALESMan) 

INSERT INTO TBL_EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(8001, '조경진', 'SaLesMan', 7698 , SYSDATE, 2000 , 200, 30);


SELECT *
FROM TBL_EMP;

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot; , DEPTNO &quot;부서번호&quot;
FROM TBL_EMP
WHERE JOB = 세일즈맨 ;
-- SALESMAN, saLesMAN , SaLesMan, salesman , SALESMan

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot; , DEPTNO &quot;부서번호&quot;
FROM TBL_EMP
WHERE JOB = 'SALESMAN' OR JOB = 'saLesMAN' OR JOB = 'SaLesMan' OR JOB = 'salesman' OR JOB = 'SALESMan';

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot; , DEPTNO &quot;부서번호&quot;
FROM TBL_EMP
WHERE JOB IN('SALESMAN', 'saLesMAN','SaLesMan','salesman','SALESMan');
/*
7499	ALLEN	SALESMAN	1981-02-20	30
7521	WARD	SALESMAN	1981-02-22	30
7654	MARTIN	SALESMAN	1981-09-28	30
7844	TURNER	SALESMAN	1981-09-08	30
8000	최규석	saLesMAN	2025-06-30	30
8001	조경진	SaLesMan	2025-06-30	30
8002	이채원	salesman	2025-06-30	30
8003	이유빈	SALESMan	2025-06-30	30
*/

-- 관찰
SELECT JOB &quot;직종&quot;, UPPER(JOB) &quot;직종확인1&quot;, LOWER(JOB) &quot;직종확인2&quot;
, INITCAP(JOB) &quot;직종확인3&quot;
FROM TBL_EMP;

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot; , DEPTNO &quot;부서번호&quot;
FROM TBL_EMP
WHERE UPPER(JOB) = 'SALESMAN';
--==&amp;gt;&amp;gt;
/*
7499	ALLEN	SALESMAN	1981-02-20	30
7521	WARD	SALESMAN	1981-02-22	30
7654	MARTIN	SALESMAN	1981-09-28	30
7844	TURNER	SALESMAN	1981-09-08	30
8000	최규석	saLesMAN	2025-06-30	30
8001	조경진	SaLesMan	2025-06-30	30
8002	이채원	salesman	2025-06-30	30
8003	이유빈	SALESMan	2025-06-30	30
*/

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot; , DEPTNO &quot;부서번호&quot;
FROM TBL_EMP
WHERE LOWER(JOB) = 'salesman';
/*
7499	ALLEN	SALESMAN	1981-02-20	30
7521	WARD	SALESMAN	1981-02-22	30
7654	MARTIN	SALESMAN	1981-09-28	30
7844	TURNER	SALESMAN	1981-09-08	30
8000	최규석	saLesMAN	2025-06-30	30
8001	조경진	SaLesMan	2025-06-30	30
8002	이채원	salesman	2025-06-30	30
8003	이유빈	SALESMan	2025-06-30	30
*/

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot; , DEPTNO &quot;부서번호&quot;
FROM TBL_EMP
WHERE INITCAP(JOB) = 'Salesman';
/*
7499	ALLEN	SALESMAN	1981-02-20	30
7521	WARD	SALESMAN	1981-02-22	30
7654	MARTIN	SALESMAN	1981-09-28	30
7844	TURNER	SALESMAN	1981-09-08	30
8000	최규석	saLesMAN	2025-06-30	30
8001	조경진	SaLesMan	2025-06-30	30
8002	이채원	salesman	2025-06-30	30
8003	이유빈	SALESMan	2025-06-30	30
*/

--○ TBL_EMP 테이블에서 입사일이 1981년 9월 28일 입사한 직원읜
-- 사원명, 직종명, 입사일 항목을 조회한다.

SELECT 사원명, 직종명, 입사일
FROM TBL_EMP
WHERE 입사일이 1981년 9월 28일;

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot;
FROM TBL_EMP
WHERE HIREDATE ='1981-09-28';
-- 날짜타입 - 문자타입이라 잘못됐으나 오라클이 자동변환해준것으로 믿으면 안됨 
--==&amp;gt; MARTIN	SALESMAN	1981-09-28 

DESC TBL_EMP;
--==&amp;gt;&amp;gt;
/*
이름       널? 유형           
-------- -- ------------ 
EMPNO       NUMBER(4)    
ENAME       VARCHAR2(10) 
JOB         VARCHAR2(9)  
MGR         NUMBER(4)    
HIREDATE    DATE         
SAL         NUMBER(7,2)  
COMM        NUMBER(7,2)  
DEPTNO      NUMBER(2) 
*/

--○ TO_DATE()
SELECT 2025-06-30 &quot;COL1&quot;
      ,'2025-06-30' &quot;COL2&quot;
      ,TO_DATE('2025-06-30' ,'YYYY-MM-DD') &quot;COL3&quot;
FROM DUAL;
--==&amp;gt; 1989	2025-06-30	2025-06-30

SELECT TO_DATE('2025-06-31', 'YYYY-MM-DD') &quot;RESULT&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 에러발생 
/*
ORA-01839: date not valid for month specified
01839. 00000 -  &quot;date not valid for month specified&quot;
*Cause:    
*Action:
*/

SELECT TO_DATE('2025-13-05', 'YYYY-MM-DD') &quot;RESULT&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 에러발생 
/*
ORA-01843: not a valid month
01843. 00000 -  &quot;not a valid month&quot;
*Cause:    
*Action:
*/

SELECT TO_DATE('2025-02-29', 'YYYY-MM-DD') &quot;RESULT&quot;
FROM DUAL;
/*
ORA-01839: date not valid for month specified
01839. 00000 -  &quot;date not valid for month specified&quot;
*Cause:    
*Action:
*/

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot;
FROM TBL_EMP
WHERE HIREDATE = TO_DATE('1981-09-28','YYYY-MM-DD');
--==&amp;gt; MARTIN	SALESMAN	1981-09-28 

--○ TBL_EMP 테이블에서 입사일이 1981년 9월 28일 이후(해당일 포함)
--   입사한 직원의 사원명, 직종명, 입사일 항목을 조회한다.

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot;
FROM TBL_EMP
WHERE 입사일이 1981년 9월 28일 이후(해당일 포함); 

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot;
FROM TBL_EMP
WHERE HIREDATE이 입사일이 1981년 9월 28일 이후(해당일 포함); 

--※ 오라클에서는 날짜 데이터의 크기 비교가 가능하다.
--   오라클에서 날짜 데이터에 대한 크기 비교 시
--   과거보다 미래를 더 큰 값으로 간주하여 처리한다.

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot;
FROM TBL_EMP
WHERE HIREDATE &amp;gt;= TO_DATE('1981-09-28','YYYY-MM-DD');
--==&amp;gt;&amp;gt;
/*
MARTIN	SALESMAN	1981-09-28
SCOTT	ANALYST	1987-07-13
KING	PRESIDENT	1981-11-17
ADAMS	CLERK	1987-07-13
JAMES	CLERK	1981-12-03
FORD	ANALYST	1981-12-03
MILLER	CLERK	1982-01-23
최규석	saLesMAN	2025-06-30
조경진	SaLesMan	2025-06-30
이채원	salesman	2025-06-30
이유빈	SALESMan	2025-06-30
*/

--○ TBL_EMP 테이블에서 입사일이 1981년 4월 2일 부터
--   1981년 9월 28일 사이에 입사한 직원들의
--   입사한 직원의 사원번호 사원명, 직종명, 입사일 항목을 조회한다.(해당일 포함)

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot; 
FROM TBL_EMP
WHERE 입사일이 1981년 4월 2일 부터  
--1981년 9월 28일 사이;


SELECT EMPNO &quot;사원번호&quot; ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot; 
FROM TBL_EMP
WHERE 입사일이 1981년 4월 2일 &amp;lt;= 입사일 &amp;lt;= 1981년 9월 28일;

SELECT EMPNO &quot;사원번호&quot; ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, HIREDATE &quot;입사일&quot; 
FROM TBL_EMP
WHERE   입사일 &amp;gt;=1981년 4월 2일  
        입사일&amp;lt;= 1981년 9월 28일;

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, HIREDATE &quot;입사일&quot; 
FROM TBL_EMP
WHERE HIREDATE &amp;gt;= TO_DATE('1981-04-02','YYYY-MM-DD')
    AND   HIREDATE &amp;lt;= TO_DATE('1981-09-28','YYYY-MM-DD');
/*
7566	JONES	MANAGER	1981-04-02
7654	MARTIN	SALESMAN	1981-09-28
7698	BLAKE	MANAGER	1981-05-01
7782	CLARK	MANAGER	1981-06-09
7844	TURNER	SALESMAN	1981-09-08
*/
--○ BETWEEN A) AND B)

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, HIREDATE &quot;입사일&quot; 
FROM TBL_EMP
WHERE HIREDATE BETWEEN TO_DATE('1981-04-02','YYYY-MM-DD')
               AND TO_DATE('1981-09-28','YYYY-MM-DD');

/*
7566	JONES	MANAGER	1981-04-02
7654	MARTIN	SALESMAN	1981-09-28
7698	BLAKE	MANAGER	1981-05-01
7782	CLARK	MANAGER	1981-06-09
7844	TURNER	SALESMAN	1981-09-08
*/
--○ BETWEEN A) AND B) 숫자를 대상으로 적용
SELECT EMPNO , ENAME , JOB, SAL
FROM TBL_EMP
WHERE SAL BETWEEN 1600 AND 3000;
/*
7499	ALLEN	SALESMAN	1600
7566	JONES	MANAGER	2975
7698	BLAKE	MANAGER	2850
7782	CLARK	MANAGER	2450
7788	SCOTT	ANALYST	3000
7902	FORD	ANALYST	3000
8000	최규석	saLesMAN	2000
8001	조경진	SaLesMan	2000
8002	이채원	salesman	2000
8003	이유빈	SALESMan	2000
*/

--○ BETWEEN A) AND B) 문자를 대상으로 적용
SELECT EMPNO , ENAME , JOB, SAL
FROM TBL_EMP
WHERE ENAME BETWEEN 'C' AND 'S';

--A       AND     B
--●--------------●

--==&amp;gt;&amp;gt; 
/*
7566	JONES	MANAGER	2975
7654	MARTIN	SALESMAN	1250
7782	CLARK	MANAGER	2450
7839	KING	PRESIDENT	5000
7900	JAMES	CLERK	950
7902	FORD	ANALYST	3000
7934	MILLER	CLERK	1300
*/

--※ BETWEEN A) AND B) 는 날짜형, 숫자형, 문자형 데이터 무두를 대상으로 사용할 수 있다.
--   단, 문자형일 경우 아스키코드 순서를 따르기 때문에(사전식 배열)
--   대문자가 앞쪽에 위치하고, 소문자가 뒤쪽에 위치하며
--   BETWEEN A) AND B)는 쿼리문이 수행되는 시점에서
--   오라클 내부적으로 부등호 연산자의 형태로 바뀌어 처리된다. 
--   사원명 s가 있다면 s는 나옴. 

SELECT EMPNO , ENAME , JOB, SAL
FROM TBL_EMP
WHERE ENAME BETWEEN 'C' AND 's';
/*
7369	SMITH	CLERK	800
7521	WARD	SALESMAN	1250
7566	JONES	MANAGER	2975
7654	MARTIN	SALESMAN	1250
7782	CLARK	MANAGER	2450
7788	SCOTT	ANALYST	3000
7839	KING	PRESIDENT	5000
7844	TURNER	SALESMAN	1500
7900	JAMES	CLERK	950
7902	FORD	ANALYST	3000
7934	MILLER	CLERK	1300
*/

--○ ASCII()
SELECT ASCII('A') &quot;RESULT1&quot;, ASCII('B') &quot;RESULT2&quot;
      ,ASCII('a') &quot;RESULT3&quot;, ASCII('b') &quot;RESULT4&quot;
FROM DUAL;       
--==&amp;gt;&amp;gt;65	66	97	98
--○
--※

SELECT *
FROM TBL_EMP
WHERE EMPNO BETWEEN 8000 AND 8003;
/*
8000	최규석	saLesMAN	7698	2025-06-30	2000	200	30
8001	조경진	SaLesMan	7698	2025-06-30	2000	200	30
8002	이채원	salesman	7698	2025-06-30	2000	200	30
8003	이유빈	SALESMan	7698	2025-06-30	2000	200	30
*/

DELETE 
FROM TBL_EMP
WHERE EMPNO BETWEEN 8000 AND 8003;
--==&amp;gt;&amp;gt; 4개 행 이(가) 삭제되었습니다.

COMMIT;
--==&amp;gt;&amp;gt; 커밋 완료. 

--○ TBL_EMP 테이블에서 직종이 SALESMAN 과 CLERK 인 사원의
--   사원번호, 사원명, 직종명, 급여 항목을 조회한다.

SELECT EMPNO &quot;사원번호&quot; ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
FROM TBL_EMP
WHERE 직종이 SALESMAN 과 CLERK 인 사원 ;

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
FROM TBL_EMP
WHERE JOB = 'SALESMAN'
OR   JOB='CLERK' ; --이거나 
         
SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
FROM TBL_EMP
WHERE JOB IN('SALESMAN', 'CLERK');            
/*
7369	SMITH	CLERK	800
7499	ALLEN	SALESMAN	1600
7521	WARD	SALESMAN	1250
7654	MARTIN	SALESMAN	1250
7844	TURNER	SALESMAN	1500
7876	ADAMS	CLERK	1100
7900	JAMES	CLERK	950
7934	MILLER	CLERK	1300
*/

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB &quot;직종&quot;, SAL &quot;급여&quot;
FROM TBL_EMP
WHERE JOB = ANY('SALESMAN', 'CLERK');     -- cf.[=ALL]
/*
7369	SMITH	CLERK	800
7499	ALLEN	SALESMAN	1600
7521	WARD	SALESMAN	1250
7654	MARTIN	SALESMAN	1250
7844	TURNER	SALESMAN	1500
7876	ADAMS	CLERK	1100
7900	JAMES	CLERK	950
7934	MILLER	CLERK	1300
*/

--※ 위의 3가지 유형의 쿼리문은 모두 같은 결과를 반환한다.
--   하지만, 맨 위의 쿼리문이 가장 빠르게 처리된다.
--   물론, 메모리에 대한 내용이 아니라 CPU 에 대한 내용이므로
--   이 부분까지 감안하여 쿼리문의 내용을 구분하여 구성하는 일은 많지 않다. 
--   &amp;rarr; [IN] 과 [=ANY] 는 같은 연산자 효과를 가진다.
--      모두 내부적으로는 [OR] 구조로 변경되어 연산 처리된다.

--------------------------------------------------------------------------------
--※ 추가 실습 환경 구성을 위한 테이블 생성
-- 테이블명 : TBL_SAWON
CREATE TABLE TBL_SAWON
(   SANO      NUMBER(4)
,   SANAME    VARCHAR2(30)
,   JUBUN     CHAR(13)
,   HIREDATE  DATE      DEFAULT SYSDATE
,   SAL       NUMBER(10)
);

--==&amp;gt;&amp;gt;Table TBL_SAWON이(가) 생성되었습니다.

SELECT *
FROM TBL_SAWON; 

DESC TBL_SAWON;
--==&amp;gt;&amp;gt;
/*
이름       널? 유형           
-------- -- ------------ 
SANO        NUMBER(4)    
SANAME      VARCHAR2(30) 
JUBUN       CHAR(13)     
HIREDATE    DATE         
SAL         NUMBER(10)
*/

--○ 데이터 입력
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1001, '김주형', '0004183234567', TO_DATE('2011-01-03', 'YYYY-MM-DD'), 3000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1002, '이유빈', '0406274234567', TO_DATE('2017-11-05', 'YYYY-MM-DD'), 2000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1003, '유한', '0004173234567', TO_DATE('2011-01-03', 'YYYY-MM-DD'), 3000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1004, '이상이', '8512161234567', TO_DATE('1998-08-16', 'YYYY-MM-DD'), 2000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1005, '아이유', '9302022234567', TO_DATE('2010-07-13', 'YYYY-MM-DD'), 3000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1006, '이이경', '7506171234567', TO_DATE('1997-03-10', 'YYYY-MM-DD'), 4000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1007, '미노이', '9704252234567', TO_DATE('2007-12-10', 'YYYY-MM-DD'), 2000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1008, '선우선', '7905082234567', TO_DATE('1998-08-16', 'YYYY-MM-DD'), 2000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1009, '선동열', '7012181234567', TO_DATE('1990-10-10', 'YYYY-MM-DD'), 3000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1010, '남희석', '7502201234567', TO_DATE('1998-08-16', 'YYYY-MM-DD'), 1000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1011, '선우용녀', '7005132234567', TO_DATE('1998-08-16', 'YYYY-MM-DD'), 1000); 

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1012, '남궁선', '0502204234567', TO_DATE('2015-08-14', 'YYYY-MM-DD'), 1000); 
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다. * 12 

--○확인
SELECT *
FROM TBL_SAWON;
--==&amp;gt;&amp;gt; 
/*
1001	김주형	0004183234567	2011-01-03	3000
1002	이유빈	0406274234567	2017-11-05	2000
1003	유한	    0004173234567	2011-01-03	3000
1004	이상이	8512161234567	1998-08-16	2000
1005	아이유	9302022234567	2010-07-13	3000
1006	이이경	7506171234567	1997-03-10	4000
1007	미노이	9704252234567	2007-12-10	2000
1008	선우선	7905082234567	1998-08-16	2000
1009	선동열	7012181234567	1990-10-10	3000
1010	남희석	7502201234567	1998-08-16	1000
1011	선우용녀	7005132234567	1998-08-16	1000
1012	남궁선	0502204234567	2015-08-14	1000
*/

--○ 커밋
COMMIT;
--==&amp;gt;&amp;gt; 커밋 완료.

--○ TBL_SAWON 테이블에서 김주형 사원의 정보를 모두 조회한다.
SELECT *
FROM TBL_SAWON 
WHERE SANAME= '김주형';
--==&amp;gt;&amp;gt; 1001	김주형	0004183234567	11/01/03	3000

SELECT *
FROM TBL_SAWON 
WHERE SANAME LIKE '김주형';
--==&amp;gt;&amp;gt; 1001	김주형	0004183234567	11/01/03	3000

--※ LIKE : 동사 &amp;rarr; 좋아하다.
--          부사 &amp;rarr; ~와 같이, ~ 처럼  CHECK~!! 
            
--※ WILD CARD(CHARACTER) &amp;rarr; [%]
--   [LIKE] 와 함께 사용되는 [%]는 모든 글자를 의미한다.
--   [LIKE] 와 함께 사용되는 [_]는 아무 글자 한 개를 의미한다.

--○ TBL_SAWON 테이블에서 성씨가 [김] 씨인 사원의
--   사원명, 주민번호, 급여 항목을 조회한다.

SELECT 사원명, 주민번호, 급여
FROM TBL_SAWON
WHERE 성씨가 [김] 씨;

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME = '김';
--==&amp;gt;&amp;gt; 조회 결과 없음.

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '김__';
--==&amp;gt;&amp;gt; 김주형	0004183234567	3000 

--○ 데이터 추가 입력 
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1013, '김훈', '8502071234557', TO_DATE('1999-10-10', 'YYYY-MM-DD'), 2000); 
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다.

SELECT * 
FROM TBL_SAWON;
/*
1013	김훈	8502071234557	99/10/10	2000
1001	김주형	0004183234567	11/01/03	3000
1002	이유빈	0406274234567	17/11/05	2000
1003	유한	0004173234567	11/01/03	3000
1004	이상이	8512161234567	98/08/16	2000
1005	아이유	9302022234567	10/07/13	3000
1006	이이경	7506171234567	97/03/10	4000
1007	미노이	9704252234567	07/12/10	2000
1008	선우선	7905082234567	98/08/16	2000
1009	선동열	7012181234567	90/10/10	3000
1010	남희석	7502201234567	98/08/16	1000
1011	선우용녀	7005132234567	98/08/16	1000
1012	남궁선	0502204234567	15/08/14	1000
*/

--커밋
COMMIT;
--==&amp;gt;&amp;gt; 커밋 완료.

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE'김__';
--==&amp;gt;&amp;gt; 김주형	0004183234567	3000

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE'김_';
--==&amp;gt;&amp;gt; 김훈	8502071234557	2000

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE'김%';
--==&amp;gt;&amp;gt;
/*
김훈	8502071234557	2000
김주형	0004183234567	3000
*/

--○ TBL_SAWON 테이블에서 이름의 마지막 글자가 [이]로
--   끝나는 사원의  사원명, 주민번호 ,입사일, 급여 항목을 조회한다. 

SELECT *
FROM TBL_SAWON;

SELECT 사원명, 주민번호 ,입사일, 급여
FROM TBL_SAWON
WHERE 이름의 마지막 글자가 [이];

SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE'__이';
--==&amp;gt;&amp;gt;
/*
이상이	8512161234567	98/08/16	2000
미노이	9704252234567	07/12/10	2000
*/

SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이';
--==&amp;gt;&amp;gt;
/*
이상이	8512161234567	98/08/16	2000
미노이	9704252234567	07/12/10	2000
*/

--○ TBL_SAWON 테이블에서 이름의 두 번째 글자가 [이]인 사원의
--  사원명, 주민번호 ,입사일, 급여 항목을 조회한다. 

SELECT *
FROM TBL_SAWON;

SELECT 사원명, 주민번호 ,입사일, 급여
FROM TBL_SAWON
WHERE 이름의 두 번째 글자가 [이];

SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '_이';
--==&amp;gt;&amp;gt; 조회 결과 없음 

SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '_이%';
--==&amp;gt;&amp;gt;
/*
아이유	9302022234567	10/07/13	3000
이이경	7506171234567	97/03/10	4000
*/

--○ TBL_SAWON 테이블에서 이름의 [이]라는 글자가
--   하나라도 포함되어 있으면 그 사원의
--   사원명, 주민번호, 입사일, 급여 항목을 조회한다.

SELECT *
FROM TBL_SAWON;

SELECT 사원명, 주민번호, 입사일, 급여
FROM TBL_SAWON
WHERE 이름의 [이]라는 글자가 하나라도 포함;

SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이%';
--==&amp;gt;&amp;gt;
/*
이유빈	0406274234567	17/11/05	2000
이상이	8512161234567	98/08/16	2000
아이유	9302022234567	10/07/13	3000
이이경	7506171234567	97/03/10	4000
미노이	9704252234567	07/12/10	2000
*/

--○ TBL_SAWON 테이블에서 이름의 [이]라는 글자가
--   연속으로 두 번 포함되어 있으면 그 사원의
--   사원명, 주민번호, 입사일, 급여 항목을 조회한다.

SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이이%';
--==&amp;gt;&amp;gt; 이이경	7506171234567	97/03/10	4000

--○ TBL_SAWON 테이블에서 이름의 [이]라는 글자가
--   연속적이지 않더라도 두 번 포함되어 있으면 그 사원의
--   사원명, 주민번호, 입사일, 급여 항목을 조회한다.
SELECT SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이%이%';
--==&amp;gt;&amp;gt;
/*
이상이	8512161234567	98/08/16	2000
이이경	7506171234567	97/03/10	4000
*/

--○ TBL_SAWON 테이블에서 성씨가 [선]씨인 사원의
--○ TBL_SAWON 테이블에서 성씨가 [남]씨인 사원의
--   사원명, 주민번호, 입사일, 급여 항목을 조회한다. &amp;gt;&amp;gt; 이건 안됨. 

--※ 테이터베이스 설계 시 성과 이름을 분리해서 처리해야 함.
--   업무 계획이 있다면(지금 당장은 아니더라도...)
--   테이블에서 성 컬럼과 이름 컬럼을 분리하여 구성해야 한다. 

--○ TBL_SAWON 테이블에서 남자직원들의 사원명, 주민번호, 급여 항목을 조회한다.
SELECT 사원명, 주민번호, 급여
FROM TBL_SAWON;
WHERE 남자직원들; 

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON;
WHERE 성별이 남성; 

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON;
WHERE 주민번호7번째 자리1개가 1; 
      주민번호7번째 자리1개가 3;


SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE JUBUN LIKE '______1%' 
   OR JUBUN LIKE '______3%';      -- 앞 자리 확인되면 뒷자리 확인은 필요없으므로 
--==&amp;gt;&amp;gt;
/*
김훈	    8502071234557	2000
김주형	0004183234567	3000
유한  	0004173234567	3000
이상이	8512161234567	2000
이이경	7506171234567	4000
선동열	7012181234567	3000
남희석	7502201234567	1000
*/

--○ 실습 테이블 생성
-- 테이블명 : TBL_WATCH
CREATE TABLE TBL_WATCH
(   WATCH_NAME VARCHAR2(20)
,   BIGO    VARCHAR2(100)
);

-- 컴마를 앞에 찍는 습관을 들여야 함. 

--○ 데이터 입력
INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
VALUES('금시계','순금 99.99% 함유된 최고급 시계');
INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
VALUES('은시계','고객 만족도 99.99점을 획득한 시계');
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다.

--○확인
SELECT *
FROM TBL_WATCH;

/*
금시계	순금 99.99% 함유된 최고급 시계
은시계	고객 만족도 99.99점을 획득한 시계
*/

--○ 커밋 
COMMIT;
--==&amp;gt;&amp;gt; 커밋 완료.

--○ TBL_WATCH 테이블의 BIGO(비고) 컬럼에
--   [99.99%] 라는 글자가 들어있는 행(레코드)을 조회한다.

-- WHERE SANAME LIKE '이%';

SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '99.99%';
--==&amp;gt;&amp;gt; 조회 결과 없음. 

SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99%';
--==&amp;gt;&amp;gt;
/*
은시계	고객 만족도 99.99점을 획득한 시계
금시계	순금 99.99% 함유된 최고급 시계
*/

SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99%%';
--==&amp;gt;&amp;gt;
/*
은시계	고객 만족도 99.99점을 획득한 시계
금시계	순금 99.99% 함유된 최고급 시계
*/


SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99\%%' ESCAPE '\';
--==&amp;gt;&amp;gt;
/*
금시계	순금 99.99% 함유된 최고급 시계
*/

SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99$%%' ESCAPE '$';
--==&amp;gt;&amp;gt;
/*
금시계	순금 99.99% 함유된 최고급 시계
*/
--※ ESCAPE 로 정한 문자의 다음 한 글자는 와일드카드에서 탈출시키도록 처리하는 구문
--   [ESCAPE '\']
--   일반적으로 키워드 아닌, 연산자 아닌, 사용 빈도가 낮은 특수문자(특수기호)를 사용

--------------------------------------------------------------------------------&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/212</guid>
      <comments>https://aluck.tistory.com/212#entry212comment</comments>
      <pubDate>Mon, 30 Jun 2025 12:38:54 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 기초실습</title>
      <link>https://aluck.tistory.com/210</link>
      <description>&lt;pre id=&quot;code_1751185049160&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- 접속된 사용자 조회
SELECT USER
FROM DUAL;
--==&amp;gt;&amp;gt; SCOTT

--○ 테이블생성
-- 테이블명 : DEPT
CREATE TABLE DEPT
( DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY
, DNAME VARCHAR2(14)
, LOC VARCHAR2(13) 
) ;
--==&amp;gt;&amp;gt; Table DEPT이(가) 생성되었습니다.

--○ 테이블생성
-- 테이블명 : EMP
CREATE TABLE EMP
( EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY
, ENAME VARCHAR2(10)
, JOB VARCHAR2(9)
, MGR NUMBER(4)
, HIREDATE DATE
, SAL NUMBER(7,2)
, COMM NUMBER(7,2)
, DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT
);
--==&amp;gt;&amp;gt; Table EMP이(가) 생성되었습니다.

--○ 데이터 입력(DEPT)
INSERT INTO DEPT VALUES	(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES	(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES	(40,'OPERATIONS','BOSTON');
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다. * 4

--○ 데이터 입력(EMP)
INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-7-1987','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-7-1987','dd-mm-yyyy'),1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다. * 14

--○ 테이블생성
-- 테이블명: BONUS
CREATE TABLE BONUS
( ENAME VARCHAR2(10)
, JOB VARCHAR2(9)
, SAL NUMBER
, COMM NUMBER
) ;
--==&amp;gt;&amp;gt; Table BONUS이(가) 생성되었습니다.

--○ 테이블생성
-- 테이블명: SALGRADE
CREATE TABLE SALGRADE
( GRADE NUMBER
, LOSAL NUMBER
, HISAL NUMBER 
);
--==&amp;gt;&amp;gt; Table SALGRADE이(가) 생성되었습니다.

--○데이터 입력(SALGRADE)
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다. *5

-- 커밋
COMMIT;
--==&amp;gt;&amp;gt; 커밋 완료.

--○ 현재 SCOTT 오라클 계정 사용자가 소유하고 있는 테이블 조회
SELECT *
FROM TAB;
--==&amp;gt;&amp;gt;
/*
BONUS	    TABLE	
DEPT	    TABLE	
EMP	        TABLE	
SALGRADE	    TABLE	
*/

--○어떤 테이블스페이스에 저장되어 있는지 조회
SELECT TABLE_NAME, TABLESPACE_NAME
FROM USER_TABLES;
--==&amp;gt;&amp;gt;
/*
DEPT	    USERS
EMP	        USERS
BONUS	    USERS
SALGRADE	    USERS
*/

--○ 테이블 생성
-- 테이블명 : TBL_EXAMPLE1
CREATE TABLE TBL_EXAMPLE1
(   NO    NUMBER
,   NAME VARCHAR(10)   
,   ADDR VARCHAR(20)
);
--==&amp;gt;&amp;gt; Table TBL_EXAMPLE1이(가) 생성되었습니다.

--○테이블 생성
-- 테이블명 : TBL_EXAMPLE2
CREATE TABLE TBL_EXAMPLE2
(   NO NUMBER
,   NAME VARCHAR(10)
,   ADDR VARCHAR(20)
) TABLESPACE TBS_EDUA;
--==&amp;gt;&amp;gt; Table TBL_EXAMPLE2이(가) 생성되었습니다.

--○TBL_EXAMPLE1 과 TBL_EXAMPLE2 테이블이
--  어떤 테이블스페이스에 저장되어 있는지 조회 
SELECT TABLE_NAME, TABLESPACE_NAME
FROM USER_TABLES;
--==&amp;gt;&amp;gt;
/*
DEPT	USERS
EMP	USERS
BONUS	USERS
SALGRADE	USERS
TBL_EXAMPLE1	USERS
TBL_EXAMPLE2	TBS_EDUA
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;--&amp;nbsp;■■■&amp;nbsp;관계형&amp;nbsp;데이터베이스&amp;nbsp;■■■--&lt;/b&gt; &lt;br /&gt;--&amp;nbsp;RDB&amp;nbsp;/&amp;nbsp;각각의&amp;nbsp;표,&amp;nbsp;테이블로&amp;nbsp;형상화시키기..&amp;nbsp; &lt;br /&gt;--&amp;nbsp;데이터를&amp;nbsp;테이블&amp;nbsp;형태로&amp;nbsp;저장시켜&amp;nbsp;놓은&amp;nbsp;것. &lt;br /&gt;-- 그리고 이들 각 테이블든 간의 관계를 설정하는 것.&lt;br /&gt;/*======================================= &lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;★&amp;nbsp;SELECT&amp;nbsp;문의&amp;nbsp;처리(PARSING)&amp;nbsp;순서&amp;nbsp;★&lt;/b&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&amp;nbsp;컬럼명&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;5) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FROM&amp;nbsp;테이블명&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WHERE&amp;nbsp;조건절&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;2) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GROUP&amp;nbsp;BY&amp;nbsp;절&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;3) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HAVING&amp;nbsp;절&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;4) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;절&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;6)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751185216041&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--○ 현재 접속된 오라클 사용자(SCOTT) 소유의
--   테이블(TABLE), 뷰(VIEW) 목록을 조회

SELECT *
FROM TAB;
--==&amp;gt;&amp;gt;
/*
BONUS	        TABLE	&amp;rarr;  보너스 데이터 테이블
DEPT	        TABLE	&amp;rarr;  DEPARTMENT(부서) 데이터 테이블
EMP	            TABLE	&amp;rarr;  EMPLOYEES(사원) 데이터 테이블
SALGRADE	        TABLE	&amp;rarr;  SAL(급여) GRADE(등급) 데이터 테이블
TBL_EXAMPLE1	    TABLE	
TBL_EXAMPLE2	    TABLE	
*/

--○ 각 테이블의 데이터 조회 
SELECT *
FROM BONUS;
--==&amp;gt;&amp;gt; 데이터 존재하지 않음(테이블의 구조만 확인 가능)

SELECT *
FROM DEPT;
--==&amp;gt;&amp;gt;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	    DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
*/

SELECT *
FROM EMP;
--==&amp;gt;&amp;gt;
/*
7369	SMITH	CLERK	    7902	    80/12/17    	800		20
7499	ALLEN	SALESMAN	    7698	81/02/20	    1600	300	30
7521	    WARD	SALESMAN	    7698	81/02/22	    1250	500	30
7566	JONES	MANAGER	    7839	81/04/02    	2975		20
7654	MARTIN	SALESMAN	    7698	81/09/28	    1250	1400	30
7698	BLAKE	MANAGER	    7839	81/05/01	    2850		30
7782	    CLARK	MANAGER	    7839	81/06/09	    2450		10
7788	SCOTT	ANALYST	    7566	87/07/13	    3000		20
7839	KING	PRESIDENT		    81/11/17	5000		10
7844	TURNER	SALESMAN	    7698	81/09/08	    1500	0	30
7876	ADAMS	CLERK	    7788	87/07/13    	1100		20
7900	    JAMES	CLERK	    7698	81/12/03    	950		30
7902	    FORD	ANALYST	    7566	81/12/03    	3000		20
7934	MILLER	CLERK	    7782	    82/01/23	    1300		10
*/

SELECT *
FROM SALGRADE;
--==&amp;gt;&amp;gt;
/*
1	700	    1200    -- 1등급은 700~1200 사이 
2	1201	    1400
3	1401	    2000
4	2001	    3000
5	3001    	9999
*/

--○ DEPT 테이블에 존재하는 컬럼의 정보(구조) 조회 
DESCRIBE DEPT;
--==&amp;gt;&amp;gt;
/*
이름     널?       유형           
------ -------- ------------ 
DEPTNO NOT NULL NUMBER(2)    
DNAME           VARCHAR2(14) 
LOC             VARCHAR2(13) 

널? -- NULL 값을 허용하냐, 안하느냐의 의미 
NOT NULL - 주민번호 필수값이므로 꼭 넣어야 가입되는 구조 EX: 회원가입 
--  DEPTNO      DNAME       LOC
--  부서번호    부서명     부서위치
--  NOT NULL    NULL허용   NULL허용 
*/

DESCRIBE EMP;
DESC EMP; -- DESCRIBE = DESC
--==&amp;gt;&amp;gt;
/*
이름       널?       유형           
-------- -------- ------------ 
EMPNO    NOT NULL NUMBER(4)    
ENAME             VARCHAR2(10) 
JOB               VARCHAR2(9)  
MGR               NUMBER(4)    
HIREDATE          DATE         
SAL               NUMBER(7,2)  
COMM              NUMBER(7,2)  
DEPTNO            NUMBER(2) 

-- EMPNO        ENAME       JOB      MGR         HIREDATE       SAL        COMM    DEPTNO
-- 사원번호     사원명     직종명     관리자      입사일          급여       수당    부서번호
-- NOT NULL     NULL허용  NULL허용  NULL허용      NULL허용      NULL허용  NULL허용  NULL허용

EX)
--          80      인사부             &amp;rarr;   데이터 입력 허용
--          80               인천      &amp;rarr;   데이터 입력 허용
--                  인사부   인천      &amp;rarr;   데이터 입력 불가
*/

-- ○ 유형 입력 가능한 데이터의 범위 &amp;rarr; 데이터 타입 &amp;rarr; 자료형 

--10000000000000000

/*
1.  숫자형
    NUMBER      &amp;rarr;   -10의 38승-1  ~ 10의 38승 -- 제한없는숫자로 보통 길이제한해서씀. 
    NUMBER(2)   &amp;rarr;   -99 ~ 99
    NUMBER(3)   &amp;rarr;   -999 ~ 999
    NUMBER(4)   &amp;rarr;   -9999 ~ 9999
    NUMBER(4,1) &amp;rarr;   -999.9 ~ 999.9
    
비교) MS-SQL 서버의 정수 표현
    TINYINT     &amp;rarr;   0 ~ 255          1BYTE
    SMALLINT    &amp;rarr;   -32768~32768     2BYTE
    INT         &amp;rarr;   -21억 ~ 21억     4BYTE
    BIGINT      -&amp;gt;  -920경 ~ 920경    8BYTE
    
비교) MS-SQL 서버의 실수 표현
    FLOAT, REAL
    
비교) MS-SQL 서버의 숫자 표현
    DECIMAL, NUMERIC

비교) MS-SQL 서버의 문자표현
    CHAR, VARCHAR, NVARCHAR
    
2. ★ 문자형
    CHAR, NCHAR, VARCHAR2, NVARCHAR2
    
    CHAR        --  고정형 크기 (주민번호)
    CHAR(10)    &amp;larr;  '포도'           4byte 이지만 10byte 소모 
    CHAR(10)    &amp;larr;  '바나나'         4byte 이지만 10byte 소모  
    CHAR(10)    &amp;larr;  '몽키바나나'     10byte
    CHAR(10)    &amp;larr;  '드래곤후르츠'   10byte 를 초과하므로 입력 불가 
    
    VARCHAR2    --  가변형 크키 (이름)
    VARCHAR2(10)    &amp;larr;  '포도'          4byte소모 
    VARCHAR2(10)    &amp;larr;  '바나나'        6byte  
    VARCHAR2(10)    &amp;larr;  '몽키바나나'    10byte
    VARCHAR2(10)    &amp;larr;  '드래곤후르츠'  10byte를 초과하므로 입력 불가 
    
    NCHAR           -- 유니코드기반(글자수) 고정형크기
    NCHAR(10)       -- 10 글자 
    
    NVARCHAR2       -- 유니코드기반(글자수) 가변형크기
    NVARCHAR2(10)   -- 10 글자
    
3.  날짜형
    DATE
*/

SELECT SYSDATE
FROM DUAL;
--==&amp;gt;&amp;gt; 25/06/27 &amp;rarr; 날짜타입

SELECT LOCALTIMESTAMP
FROM DUAL;
--==&amp;gt;&amp;gt; 25/06/27 12:18:34.273000 &amp;rarr; 날짜타입

SELECT HIREDATE
FROM EMP;
--==&amp;gt;&amp;gt;
/*
80/12/17
81/02/20
81/02/22
81/04/02
81/09/28
81/05/01
81/06/09
87/07/13
81/11/17
81/09/08
87/07/13
81/12/03
81/12/03
82/01/23
*/

SELECT '안녕하세요'
FROM DUAL;
--==&amp;gt;&amp;gt; 안녕하세요                    &amp;rarr; 문자 타입

SELECT 10 + 20.4
FROM DUAL;
--==&amp;gt;&amp;gt; 30.4                         &amp;rarr; 숫자 타입

--○ EMP 테이블에서 사원번호, 사원명, 급여, 커미션 항목만 조회
-- 1. 먼저 전체 테이블을 본다.
SELECT *
FROM EMP;

-- 2. 한글로 써 놓고 컬럼명으로 치환한다.
SELECT 사원번호, 사원명, 급여, 커미션
FROM EMP;

SELECT EMPNO, ENAME, SAL, COMM
FROM EMP;
--==&amp;gt;&amp;gt;
/*
SMITH	800	7369	
ALLEN	1600	7499	300
WARD	1250	7521	500
JONES	2975	7566	
MARTIN	1250	7654	1400
BLAKE	2850	7698	
CLARK	2450	7782	
SCOTT	3000	7788	
KING	5000	7839	
TURNER	1500	7844	0
ADAMS	1100	7876	
JAMES	950	7900	
FORD	3000	7902	
MILLER	1300	7934	
*/

--○EMP 테이블에서 부서번호가 20번인 직원들의 정보 중
-- 사원번호, 사원명, 직종명, 급여, 부서번호 조회 
SELECT 사원번호, 사원명, 직종명, 급여, 부서번호
FROM EMP
WHERE 부서번호가 20;

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 20;

--==&amp;gt;&amp;gt;
/*
ORA-00936: missing expression
00936. 00000 -  &quot;missing expression&quot;
*Cause:    
*Action:
400행, 14열에서 오류 발생

오라클은 관계연산이 먼저 만들어짐. = 
*/

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO
FROM EMP
WHERE DEPTNO=20;     
--==&amp;gt;&amp;gt;
/*
7369	    SMITH	CLERK	800	    20
7566	    JONES	MANAGER	2975	    20
7788	    SCOTT	ANALYST	3000	    20
7876	    ADAMS	CLERK	1100	    20
7902        	FORD	ANALYST	3000	    20
*/

DESC EMP;
--==&amp;gt;&amp;gt;
/*
이름       널?       유형           
-------- -------- ------------ 
EMPNO    NOT NULL NUMBER(4)    
ENAME             VARCHAR2(10) 
JOB               VARCHAR2(9)  
MGR               NUMBER(4)    
HIREDATE          DATE         
SAL               NUMBER(7,2)  
COMM              NUMBER(7,2)  
DEPTNO            NUMBER(2)     ◀◀◀ 
*/

--※ 테이블을 조회하는 과정에서 각 컬럼(항목)에 별칭(ALIAS/엘리아스)을 부여할 수 있다. 
SELECT EMPNO AS &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB 직종, SAL 급여, DEPTNO &quot;부서 번호&quot;
FROM EMP
WHERE DEPTNO = '20';   -- 오라클에서 자동형변환해서 결과는 나오지만 틀린것

--※ 테이블을 조회하는 과정에서 별칭(ALIAS/엘리아스)의 기본 구문은
--   [AS &quot;별칭이름&quot;]의 형태로 작성되며,
--   이 때, [AS]는 생략이 가능하다.
--   또한, [&quot;&quot;]도 생략이 가능하다.
--   하지만,[&quot;&quot;]를 생략하게 되면 별칭 이름에 공백은 사용할 수 없다.
--   공백은 해당 컬럼에 대한 기술의 종결을 의미하므로
--   이름 내부에 공백을 사용할 경우 [&quot;&quot;]를 사용하여
--   별칭을 부여할 수 있도록 처리해야 한다. 

--○ EMP 테이블에서 부서번호가 20번과 30번 직원들의 데이터를 
--   사원번호, 사원명, 직종명, 급여, 부서번호 항목으로 조회한다.
--   단, 별칭(ALIAS)을 사용한다.

SELECT *
FROM EMP;

SELECT 사원번호, 사원명, 직종명, 급여, 부서번호
FROM EMP
WHERE 부서번호가 20번과 30번;

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB 직종, SAL 급여, DEPTNO &quot;부서 번호&quot;
FROM EMP
WHERE DEPTNO가 20번과 30번;

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB 직종, SAL 급여, DEPTNO &quot;부서 번호&quot;
FROM EMP
WHERE DEPTNO=20 || DEPTNO=30; -- 자바에서 논리AND &amp;amp;&amp;amp; 논리OR || 
--==&amp;gt;&amp;gt;
/*
ORA-00933: SQL command not properly ended
00933. 00000 -  &quot;SQL command not properly ended&quot;
*Cause:    
*Action:
468행, 102열에서 오류 발생
*/

-- AND &amp;rarr; AND  / OR &amp;rarr; OR
SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB 직종, SAL 급여, DEPTNO &quot;부서 번호&quot;
FROM EMP
WHERE DEPTNO=20 OR DEPTNO=30; 
--==&amp;gt;&amp;gt;
/*
7369	SMITH	CLERK	800	20
7499	ALLEN	SALESMAN	1600	30
7521	WARD	SALESMAN	1250	30
7566	JONES	MANAGER	2975	20
7654	MARTIN	SALESMAN	1250	30
7698	BLAKE	MANAGER	2850	30
7788	SCOTT	ANALYST	3000	20
7844	TURNER	SALESMAN	1500	30
7876	ADAMS	CLERK	1100	20
7900	JAMES	CLERK	950	30
7902	FORD	ANALYST	3000	20
*/

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB 직종, SAL 급여, DEPTNO &quot;부서 번호&quot;
FROM EMP
WHERE DEPTNO IN (20,30); 
--&amp;gt; IN 연산자를 활용하여 이와 같이 처리할 수 있으며
--  앞서 OR로 처리한 구문과 같은 결과를 반환하게 된다.
--==&amp;gt;&amp;gt;
/*  
7369	        SMITH	CLERK	800	20
7499	        ALLEN	SALESMAN	1600	30
7521	            WARD	SALESMAN	1250	30
7566	        JONES	MANAGER	2975	20
7654	        MARTIN	SALESMAN	1250	30
7698	        BLAKE	MANAGER	2850	30
7788	        SCOTT	ANALYST	3000	20
7844	        TURNER	SALESMAN	1500	30
7876	        ADAMS	CLERK	1100	20
7900	JAMES	    CLERK	950	30
7902	FORD	    ANALYST	3000	20
*/

--○  EMP 테이블에서 직종이 CLECK인 사원들의 데이터를 모두 조회한다.
SELECT *
FROM EMP
WHERE 직종 CLECK;

SELECT *
FROM EMP
WHERE JOB = CLERK;
--==&amp;gt;
/*
ORA-00904: &quot;CLERK&quot;: invalid identifier
00904. 00000 -  &quot;%s: invalid identifier&quot;
*Cause:    
*Action:
526행, 13열에서 오류 발생
*/

-- 데이터의 값은 대소문자 구분을 한다!! 

SELECT *
FROM EMP
WHERE JOB = 'CLERK';
--==&amp;gt;
/*
7369	SMITH	CLERK	7902	80/12/17	800		20
7876	ADAMS	CLERK	7788	87/07/13	1100		20
7900	JAMES	CLERK	7698	81/12/03	950		30
7934	MILLER	CLERK	7782	82/01/23	1300		10
*/

select *
from emp
where job = 'clerk';
--==&amp;gt; 조회 결과 없음 

Select *
From EMP
Where Job = 'CLERK';
--==&amp;gt;&amp;gt; 
/*
7369	SMITH	CLERK	7902	80/12/17	800		20
7876	ADAMS	CLERK	7788	87/07/13	1100		20
7900	JAMES	CLERK	7698	81/12/03	950		30
7934	MILLER	CLERK	7782	82/01/23	1300		10
*/

--※ 오라클은 입력된 데이터(값)만큼은
--   반드시 대소문자 구분을 한다.

--○EMP 테이블에서 직종이 CLECK 인 사원들 중
--  20번 부서에 근무하는 사원들의
--  사원번호, 사원명, 직종명, 급여, 부서번호 항목을 조회한다.

SELECT 사원번호, 사원명, 직종명, 급여, 부서번호
FROM EMP;
WHERE 직종이 CLERK 부서번호가 20; 

SELECT 사원번호, 사원명, 직종명, 급여, 부서번호
FROM EMP;
WHERE JOB이 CLERK DEPTNO가 20; 

SELECT EMPNO &quot;사원번호&quot;, ENAME &quot;사원명&quot;, JOB 직종, SAL 급여, DEPTNO &quot;부서 번호&quot; 
FROM EMP
WHERE JOB ='CLERK' AND DEPTNO = 20;
--==&amp;gt;&amp;gt;
/*
7369	SMITH	CLERK	800	20
7876	ADAMS	CLERK	1100	20
*/

--○EMP 테이블에서 10번 부서에 근무하는 직원들 중
--  급여가 2500 이상인 사원들의
--  사원명, 직종명, 급여, 부서번호 항목을 조회한다.

SELECT *
FROM EMP;

SELECT 사원명, 직종명, 급여, 부서번호
FROM EMP
WHERE 부서번호가 10 급여가 2500 이상;

SELECT ENAME &quot;사원명&quot;, JOB 직종, SAL 급여, DEPTNO &quot;부서 번호&quot;
FROM EMP
WHERE DEPTNO = 10 SAL &amp;gt;=2500;

SELECT ENAME &quot;사원명&quot;, JOB 직종, SAL 급여, DEPTNO &quot;부서 번호&quot;
FROM EMP
WHERE DEPTNO = 10 AND SAL &amp;gt;=2500;
--==&amp;gt;&amp;gt;
/*
KING	PRESIDENT	5000	    10
*/

--※ 테이블 복사
--&amp;gt;  내부적으로 대상 테이블 내부에 있는 데이터의 내용만 복사하는 과정 

DESCRIBE EMP;
DESC EMP;
--==&amp;gt;&amp;gt;
/*
이름       널?       유형           
-------- -------- ------------ 
EMPNO    NOT NULL NUMBER(4)    
ENAME             VARCHAR2(10) 
JOB               VARCHAR2(9)  
MGR               NUMBER(4)    
HIREDATE          DATE         
SAL               NUMBER(7,2)  
COMM              NUMBER(7,2)  
DEPTNO            NUMBER(2)    
*/

CREATE TABLE EMPCOPY
(   EMPNO NUMBER(4)
,   ENAME VARCHAR2(10)
,   JOB             VARCHAR2(9)
,   MGR             NUMBER(4)
,   HIREDATE          DATE
,SAL               NUMBER(7,2)  
,COMM              NUMBER(7,2)  
,DEPTNO            NUMBER(2) 
);

SELECT *
FROM EMPCOPY;
--==&amp;gt;&amp;gt; 조회 결과 없음

SELECT *
FROM EMP;
--==&amp;gt;&amp;gt; 
/*
7369	SMITH	CLERK	7902	80/12/17	800		20
7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	30
7521	WARD	SALESMAN	7698	81/02/22	1250	500	30
7566	JONES	MANAGER	7839	81/04/02	2975		20
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
7698	BLAKE	MANAGER	7839	81/05/01	2850		30
7782	CLARK	MANAGER	7839	81/06/09	2450		10
7788	SCOTT	ANALYST	7566	87/07/13	3000		20
7839	KING	PRESIDENT		81/11/17	5000		10
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30
7876	ADAMS	CLERK	7788	87/07/13	1100		20
7900	JAMES	CLERK	7698	81/12/03	950		30
7902	FORD	ANALYST	7566	81/12/03	3000		20
7934	MILLER	CLERK	7782	82/01/23	1300		10
*/

--데이터 입력
INSERT INTO EMPCOPY VALUES(7369, 'SMITH', 'CLERK', 7902 ,TO_DATE('1980-12-17', 'YYYY-MM-DD'), 800, NULL,	20);
--==&amp;gt;&amp;gt; 1 행 이(가) 삽입되었습니다.

SELECT *
FROM EMPCOPY;
--==&amp;gt;&amp;gt;
/*
7369	SMITH	&quot;	CLERK&quot;	7902	80/12/17	800		20
*/
CREATE TABLE TBL_EMP
AS --따라 
SELECT *
FROM EMP; -- 테이블내용 그대로 복사 
--==&amp;gt;&amp;gt; Table TBL_EMP이(가) 생성되었습니다.

--○ 확인
SELECT *
FROM TBL_EMP;

SELECT *
FROM EMP;

DESC TBL_EMP;
--==&amp;gt;&amp;gt;
/*
이름       널? 유형           
-------- -- ------------ 
EMPNO       NUMBER(4)    
ENAME       VARCHAR2(10) 
JOB         VARCHAR2(9)  
MGR         NUMBER(4)    
HIREDATE    DATE         
SAL         NUMBER(7,2)  
COMM        NUMBER(7,2)  
DEPTNO      NUMBER(2)    
*/
-- 테이블 복사(데이터 위주)해서 새로 만들기 
-- DEPT &amp;rarr; TBL_DEPT
CREATE TABLE TBL_DEPT
AS
SELECT *
FROM DEPT;
--==&amp;gt;&amp;gt; Table TBL_DEPT이(가) 생성되었습니다.

--○복사한 테이블 확인 
SELECT * 
FROM TBL_DEPT;
SELECT *
FROM TBL_EMP;

-- 커멘트(COMMENT) - 주석
-- 테이블에 라벨링 하는 느낌. 
SELECT *
FROM USER_TAB_COMMENTS;
/* 데이터 딕셔너리 뷰 
DEPT	        TABLE	
EMP	            TABLE	
BONUS	        TABLE	
SALGRADE	        TABLE	
TBL_EXAMPLE1	    TABLE	
TBL_EXAMPLE2    	TABLE	
EMPCOPY	        TABLE	
TBL_EMP	        TABLE	
TBL_DEPT    	    TABLE	
*/

--○테이블의 커멘트 데이터 입력
COMMENT ON TABLE TBL_EMP IS '사원데이터';
--==&amp;gt;&amp;gt; Comment이(가) 생성되었습니다.

--○커멘트 데이터 입력 이후 다시 확인
SELECT *
FROM USER_TAB_COMMENTS;
--==&amp;gt;&amp;gt;
/*
TBL_DEPT        	TABLE	
TBL_EMP	        TABLE	사원데이터
EMPCOPY	        TABLE	
TBL_EXAMPLE2    	TABLE	
TBL_EXAMPLE1    	TABLE	
SALGRADE	        TABLE	
BONUS	        TABLE	
EMP	            TABLE	
DEPT	        TABLE	
*/

--○ 테이블 레벨의 커멘트 데이터 입력(TBL_DEPT &amp;rarr; 부서데이터)
COMMENT ON TABLE TBL_DEPT IS '부서데이터';
--==&amp;gt;&amp;gt; Comment이(가) 생성되었습니다.

SELECT *
FROM USER_TAB_COMMENTS;
--==&amp;gt;&amp;gt;
/*
TBL_DEPT        	TABLE	부서데이터 
TBL_EMP	        TABLE	사원데이터
EMPCOPY	        TABLE	
TBL_EXAMPLE2    	TABLE	
TBL_EXAMPLE1    	TABLE	
SALGRADE	        TABLE	
BONUS	        TABLE	
EMP	            TABLE	
DEPT	        TABLE	
*/

--○ 컬럼 레벨의 커멘트 데이터 확인
SELECT *
FROM USER_COL_COMMENTS;
--==&amp;gt;&amp;gt;
/*
TBL_EXAMPLE2	ADDR	
TBL_EXAMPLE1	NAME	
EMPCOPY	HIREDATE	
BONUS	JOB	
TBL_EMP	DEPTNO	
EMPCOPY	ENAME	
EMP	SAL	
TBL_EXAMPLE2	NO	
TBL_DEPT	DEPTNO	
EMPCOPY	COMM	
EMP	COMM	
EMP	JOB	
DEPT	LOC	
TBL_EXAMPLE2	NAME	
EMPCOPY	EMPNO	
DEPT	DNAME	
TBL_EMP	COMM	
BONUS	SAL	
EMP	MGR	
EMPCOPY	DEPTNO	
EMPCOPY	JOB	
SALGRADE	LOSAL	
TBL_EMP	JOB	
TBL_EMP	EMPNO	
BONUS	ENAME	
SALGRADE	HISAL	
TBL_DEPT	LOC	
TBL_EXAMPLE1	ADDR	
EMPCOPY	MGR	
EMP	HIREDATE	
DEPT	DEPTNO	
TBL_EXAMPLE1	NO	
SALGRADE	GRADE	
EMP	DEPTNO	
EMP	EMPNO	
EMPCOPY	SAL	
EMP	ENAME	
TBL_DEPT	DNAME	
TBL_EMP	HIREDATE	
TBL_EMP	ENAME	
TBL_EMP	MGR	
BONUS	COMM	
TBL_EMP	SAL	
*/

SELECT *
FROM USER_COL_COMMENTS
WHERE TABLE_NAME = 'TBL_DEPT';
--==&amp;gt;&amp;gt; 
/*
TBL_DEPT	DEPTNO	
TBL_DEPT	DNAME	부서이름
TBL_DEPT	LOC	    부서위치 
*/

--○ 테이블에 소속된(포함된) 컬럼 레벨의 커멘트 데이터 입력(설정)
COMMENT ON COLUMN  TBL_DEPT.DEPTNO IS '부서번호';
--==&amp;gt;&amp;gt; Comment이(가) 생성되었습니다.

COMMENT ON COLUMN TBL_DEPT.DNAME IS '부서이름';

COMMENT ON COLUMN TBL_DEPT.LOC IS '부서위치';

SELECT *
FROM USER_COL_COMMENTS
WHERE TABLE_NAME='TBL_DEPT';
--==&amp;gt;&amp;gt;
/*
TBL_DEPT	    DEPTNO	부서번호
TBL_DEPT	    DNAME	부서이름
TBL_DEPT	    LOC	    부서위치
*/

DESC TBL_EMP;
--==&amp;gt;&amp;gt;
/*
이름       널? 유형           
-------- -- ------------ 
EMPNO       NUMBER(4)       -- 사원번호
ENAME       VARCHAR2(10)    -- 사원명
JOB         VARCHAR2(9)     -- 직종명
MGR         NUMBER(4)       -- 관리자사원번호
HIREDATE    DATE            -- 입사일
SAL         NUMBER(7,2)     -- 급여
COMM        NUMBER(7,2)     -- 수당
DEPTNO      NUMBER(2)       -- 부서번호
*/

--○ TBL_EMP 테이블에 소속된(포함된)
--   컬럼에 대한 커멘트 데이터 입력(설정) 

COMMENT ON COLUMN  TBL_EMP.EMPNO IS '사원번호';
COMMENT ON COLUMN TBL_EMP.ENAME IS '사원명';
COMMENT ON COLUMN TBL_EMP.JOB IS '직종명';
COMMENT ON COLUMN TBL_EMP.MGR IS '관리자사원번호';
COMMENT ON COLUMN TBL_EMP.HIREDATE IS '입사일';
COMMENT ON COLUMN TBL_EMP.SAL IS '급여';
COMMENT ON COLUMN TBL_EMP.COMM IS '수당';
COMMENT ON COLUMN TBL_EMP.DEPTNO IS '부서번호';
--==&amp;gt;&amp;gt; Comment이(가) 생성되었습니다. *8

--○ 커멘트 데이터가 입력된 테이블의 컬럼 레벨의 정보 확인
SELECT *
FROM USER_COL_COMMENTS
WHERE TABLE_NAME='TBL_EMP';
--==&amp;gt;&amp;gt;
/*
TBL_EMP	EMPNO	    사원번호
TBL_EMP	ENAME	    사원명
TBL_EMP	JOB	        직종명
TBL_EMP	MGR	        관리자사원번호
TBL_EMP	HIREDATE	입사일
TBL_EMP	SAL	        급여
TBL_EMP	COMM	    수당
TBL_EMP	DEPTNO	    부서번호
*/

--■■■ 기존 테이블에 컬럼 구조 추가 및 제거 ■■■--
SELECT *
FROM TBL_EMP;

--○ TBL_EMP 테이블에 주민등록번호 데이터를 담을 수 있는 컬럼 추가 
ALTER TABLE TBL_EMP
ADD SSN CHAR(13);
--==&amp;gt;&amp;gt;  Table TBL_EMP이(가) 변경되었습니다.

--※ 맨 앞에 0이 들어올 가능성이 있는 숫자가 조합된 데이터일 경우
--   숫자로만 구성된 데이터라 할지라도 숫자형이 아닌 문자형으로
--   데이터타입을 처리해야 한다~!!!

SELECT 00012345
FROM DUAL;
--==&amp;gt;&amp;gt; 12345

SELECT '00012345'
FROM DUAL;
--==&amp;gt;&amp;gt; 00012345

DESC TBL_EMP;
--==&amp;gt;&amp;gt;
/*
이름       널? 유형           
-------- -- ------------ 
EMPNO       NUMBER(4)    
ENAME       VARCHAR2(10) 
JOB         VARCHAR2(9)  
MGR         NUMBER(4)    
HIREDATE    DATE         
SAL         NUMBER(7,2)  
COMM        NUMBER(7,2)  
DEPTNO      NUMBER(2)    
SSN         CHAR(13)     ◀◀◀◀
*/

SELECT *
FROM TBL_EMP;
--==&amp;gt;&amp;gt;SSN 컬럼이 정상적으로 추가된 상황임을 확인

SELECT EMPNO, ENAME, SSN, JOB, HIREDATE, SAL, COMM, DEPTNO 
FROM TBL_EMP;

--&amp;gt; 테이블 내에서 컬럼의 순서는 구조적으로 의미 없음~!!! 

--○ TBL_EMP 테이블에서 추가한 SSN(주민등록번호) 컬럼 제거
ALTER TABLE TBL_EMP
DROP COLUMN SSN;
--==&amp;gt;&amp;gt; Table TBL_EMP이(가) 변경되었습니다.

--○ 확인
DESC TBL_EMP;
--==&amp;gt;&amp;gt;
/*
이름       널? 유형           
-------- -- ------------ 
EMPNO       NUMBER(4)    
ENAME       VARCHAR2(10) 
JOB         VARCHAR2(9)  
MGR         NUMBER(4)    
HIREDATE    DATE         
SAL         NUMBER(7,2)  
COMM        NUMBER(7,2)  
DEPTNO      NUMBER(2)    
*/

SELECT *
FROM TBL_EMP;
--==&amp;gt;&amp;gt;
/*
7369	SMITH	CLERK	7902	80/12/17	800		20
7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	30
7521	WARD	SALESMAN	7698	81/02/22	1250	500	30
7566	JONES	MANAGER	7839	81/04/02	2975		20
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
7698	BLAKE	MANAGER	7839	81/05/01	2850		30
7782	CLARK	MANAGER	7839	81/06/09	2450		10
7788	SCOTT	ANALYST	7566	87/07/13	3000		20
7839	KING	PRESIDENT		81/11/17	5000		10
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30
7876	ADAMS	CLERK	7788	87/07/13	1100		20
7900	JAMES	CLERK	7698	81/12/03	950		30
7902	FORD	ANALYST	7566	81/12/03	3000		20
7934	MILLER	CLERK	7782	82/01/23	1300		10
*/
--&amp;gt; SSN(주민등록번호) 컬럼이 정상적으로 제거되었음을 확인~!!!
-- 구조적 제거 DROP 데이터 삭제 DELETE 

SELECT *
FROM TBL_EMP
WHERE EMPNO=7369;

DELETE
FROM TBL_EMP
WHERE EMPNO=7369;
--==&amp;gt;&amp;gt; 1 행 이(가) 삭제되었습니다.

DELETE TBL_EMP      --  당분간 권장하지 않음 
WHERE EMPNO=7369; 

--○ 확인
SELECT *
FROM TBL_EMP;
--==&amp;gt;&amp;gt;
/*
7499	ALLEN	SALESMAN	7698	81/02/20	1600	300	30
7521	WARD	SALESMAN	7698	81/02/22	1250	500	30
7566	JONES	MANAGER	7839	81/04/02	2975		20
7654	MARTIN	SALESMAN	7698	81/09/28	1250	1400	30
7698	BLAKE	MANAGER	7839	81/05/01	2850		30
7782	CLARK	MANAGER	7839	81/06/09	2450		10
7788	SCOTT	ANALYST	7566	87/07/13	3000		20
7839	KING	PRESIDENT		81/11/17	5000		10
7844	TURNER	SALESMAN	7698	81/09/08	1500	0	30
7876	ADAMS	CLERK	7788	87/07/13	1100		20
7900	JAMES	CLERK	7698	81/12/03	950		30
7902	FORD	ANALYST	7566	81/12/03	3000		20
7934	MILLER	CLERK	7782	82/01/23	1300		10
*/

SELECT *
FROM TBL_EMP;

DELETE
FROM TBL_EMP;
--==&amp;gt;&amp;gt; 13개 행 이(가) 삭제되었습니다.

--○ 확인
SELECT *
FROM TBL_EMP;
--==&amp;gt;&amp;gt;  조회결과없음
--  테이블 구조는 그대로 남아있는 상태에서
--  데이터 모두 소실(삭제)된 상황임을 확인 

--○ 테이블을 구조적으로 제거
DROP TABLE TBL_EMP;
--==&amp;gt;&amp;gt;  Table TBL_EMP이(가) 삭제되었습니다.

SELECT *
FROM TBL_EMP;
--==&amp;gt;&amp;gt; 에러 발생 
/*
ORA-00942: table or view does not exist
00942. 00000 -  &quot;table or view does not exist&quot;
*Cause:    
*Action:
1,034행, 6열에서 오류 발생
*/
--○ 테이블 다시 생성(EMP 테이블 복사)
CREATE TABLE TBL_EMP
AS
SELECT *
FROM EMP;
--==&amp;gt;&amp;gt; Table TBL_EMP이(가) 생성되었습니다.

--------------------------------------------------------------------------------
--■■■ NULL 의 처리 ■■■--
SELECT 5, 10+5,10-5,10*5, 10/5
FROM DUAL;
--==&amp;gt;&amp;gt;  5	15	5	50	2

SELECT 5 &quot;RESULT1&quot;, 10+5 &quot;RESULT2&quot;,10-5 &quot;RESULT3&quot;,10*5 &quot;RESULT4&quot;, 10/5 &quot;RESULT5&quot;
FROM DUAL;
--==&amp;gt;&amp;gt;  5	15	5	50	2

SELECT NULL, NULL+5, NULL-5, NULL*5, NULL/5, 10+NULL,10-NULL,10*NULL, 10/NULL
FROM DUAL;
--==&amp;gt;&amp;gt; (null) (null) (null) (null) (null) (null) (null) (null) (null) 

--※ 관찰 결과
--   NULL 은 상태의 값을 의미하며, 실제 존재하지 않는 값이기 때문에
--   이러한 NULL 이 연산에 포함될 경우 그 결과는 무조건 NULL이다. 

--○ TBL_EMP 테이블에서 커미션(COMM, 수당)이 NULL인 직원읜
--   사원명, 직종명, 급여, 커미션 항목을 조회한다.

SELECT *
FROM TBL_EMP;

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
FROM TBL_EMP
WHERE 커미션이 null;

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
FROM TBL_EMP
WHERE COMM = null;
--==&amp;gt;&amp;gt; 조회 결과 없음 

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
FROM TBL_EMP
WHERE COMM = (null);
--==&amp;gt;&amp;gt; 조회 결과 없음 

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
FROM TBL_EMP
WHERE COMM = 'NULL';
--==&amp;gt;&amp;gt; 에러 발생 
/*
ORA-01722: invalid number
01722. 00000 -  &quot;invalid number&quot;
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.
*/

DESC TBL_EMP;
--==&amp;gt;
/*
이름       널? 유형           
-------- -- ------------ 
EMPNO       NUMBER(4)    
ENAME       VARCHAR2(10) 
JOB         VARCHAR2(9)  
MGR         NUMBER(4)    
HIREDATE    DATE         
SAL         NUMBER(7,2)  
COMM        NUMBER(7,2)  ◀◀◀◀
DEPTNO      NUMBER(2)    
*/
--&amp;gt; COMM 컬럼은 숫자형 데이터 타입을 취하고 있음을 확인~!!!

--※ NULL 은 실제 존재하지 않는 값이기 때문에 일반적인 연산자를 활용하여 비교할 수 없다.
--   즉, 산술적인 비교 연산을 수행할 수 없다는 의미이다.
--   NULL 을 대상으로 사용할 수 없는 연산자들...
--   =, &amp;gt;=, &amp;lt;=, &amp;gt;, &amp;lt;, !=, ^=, &amp;lt;&amp;gt;        !=, ^=, &amp;lt;&amp;gt; : 같지않다는 의미 


SELECT ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
FROM TBL_EMP
WHERE COMM IS null;
--==&amp;gt;&amp;gt;
/*
SMITH	CLERK	800	
JONES	MANAGER	2975	
BLAKE	MANAGER	2850	
CLARK	MANAGER	2450	
SCOTT	ANALYST	3000	
KING	PRESIDENT	5000	
ADAMS	CLERK	1100	
JAMES	CLERK	950	
FORD	ANALYST	3000	
MILLER	CLERK	1300	
*/

--○ TBL_EMP 테이블에서 20번 부서에 근무하지 않는 직원들의
-- 사원번호, 사원명, 직종명, 부서번호 항목을 조회한다.

SELECT *
FROM TBL_EMP;

SELECT 사원번호, 사원명, 직종명, 부서번호
FROM TBL_EMP
WHERE 부서번호가 20이 아니다;

SELECT EMPNO &quot;사원번호&quot; ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, DEPTNO &quot;부서번호&quot; 
FROM TBL_EMP
WHERE 부서번호가 20이 아니다;

SELECT EMPNO &quot;사원번호&quot; ,ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, DEPTNO &quot;부서번호&quot; 
FROM TBL_EMP
WHERE DEPTNO != 20;
--==&amp;gt;&amp;gt; &amp;lt;&amp;gt; ^= 모두 같은 결과 나옴 
/*
7499	ALLEN	SALESMAN	30
7521	WARD	SALESMAN	30
7654	MARTIN	SALESMAN	30
7698	BLAKE	MANAGER	30
7782	CLARK	MANAGER	10
7839	KING	PRESIDENT	10
7844	TURNER	SALESMAN	30
7900	JAMES	CLERK	30
7934	MILLER	CLERK	10
*/

--○ TBL_EMP 테이블에서 커미션(COMM, 수당)이 NULL 이 아닌 직원들의
--   사원명, 직종명, 급여, 커미션 항목을 조회한다.

SELECT 사원명, 직종명, 급여, 커미션 
FROM TBL_EMP
WHERE 커미션이 NULL이 아니다; 

SELECT *
FROM TBL_EMP;

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
FROM TBL_EMP
WHERE 커미션이 NULL이 아니다; 

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
FROM TBL_EMP
WHERE COMM &amp;lt;&amp;gt; NULL;     -- X 

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
FROM TBL_EMP
WHERE COMM IS NOT NULL; 
--==&amp;gt;&amp;gt;
/*
ALLEN	SALESMAN	1600	300
WARD	SALESMAN	1250	500
MARTIN	SALESMAN	1250	1400
TURNER	SALESMAN	1500	0
*/

SELECT ENAME &quot;사원명&quot;, JOB &quot;직종명&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
FROM TBL_EMP
WHERE NOT COMM IS NULL; 
--==&amp;gt;&amp;gt; 위와 같은 결과를 얻는 조건절 
/*
ALLEN	SALESMAN	1600	300
WARD	SALESMAN	1250	500
MARTIN	SALESMAN	1250	1400
TURNER	SALESMAN	1500	0
*/

--○ TBL_EMP 테이블에서 모든 사원들의
--   사원명, 사원번호, 급여, 커미션, 연봉 항목을 조회한다.
--   단, 급여(SAL)는 매월 지급한다.
--   또한, 수당(COMM)은 매년 지급한다. 

SELECT 사원명, 사원번호, 급여, 커미션,연봉
FROM TBL_EMP;
-- 모든 사원을 조회하는 것이므로 WHERE 는 없음 

SELECT ENAME &quot;사원명&quot;, EMPNO &quot;사원번호&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;--
      ,SAL*12 &quot;연봉&quot;;
FROM TBL_EMP;
-- WHERE 급여는 매월SAL 지급, 수당COMM은 매년 지급; 

SELECT ENAME &quot;사원명&quot;, EMPNO &quot;사원번호&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;,
       SAL * 12 + COMM &quot;연봉&quot;;
FROM TBL_EMP;
-- WHERE 급여는 매월SAL 지급, 수당COMM은 매년 지급; 

--○ NVL()
SELECT NULL &quot;COL1&quot;, NVL(NULL, 10) &quot;COL2&quot;, NVL(5, 10) &quot;COL3&quot;
FROM DUAL;
--==&amp;gt;&amp;gt;(NULL) 	10	5
--&amp;gt; 첫 번째 파라미터 값이 NULL 이면, 두 번째 파라미터 값을 반환한다.
--  첫 번째 파라미터 값이 NULL이 아니면 그 값(첫 번째 파라미터)을 그대로 반환한다. 

SELECT COMM &quot;COL1&quot;, NVL(COMM, 0) &quot;COL2&quot;
FROM TBL_EMP
WHERE EMPNO=7566;

SELECT COMM &quot;COL1&quot;, NVL(COMM, 0) &quot;COL2&quot;
FROM TBL_EMP
WHERE EMPNO=7499;

SELECT ENAME &quot;사원명&quot;, EMPNO &quot;사원번호&quot;, SAL &quot;급여&quot;, COMM &quot;커미션&quot;
      , SAL * 12 + NVL(COMM, 0) &quot;연봉&quot;
FROM TBL_EMP;
--==&amp;gt;
/*
SMITH	7369	800		        9600
ALLEN	7499	1600    	300	    19500
WARD	7521	    1250	    500	    15500
JONES	7566	2975		        35700
MARTIN	7654	1250	    1400	    16400
BLAKE	7698	2850		        34200
CLARK	7782    	2450		        29400
SCOTT	7788	3000		        36000
KING	7839	5000		        60000
TURNER	7844	1500	0	        18000
ADAMS	7876	1100		        13200
JAMES	7900    	950		        11400
FORD	7902    	3000		        36000
MILLER	7934	1300		        15600
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>DBA</category>
      <category>dbms</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/210</guid>
      <comments>https://aluck.tistory.com/210#entry210comment</comments>
      <pubDate>Fri, 27 Jun 2025 12:00:20 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - TABLESPACE 생성, 계정 및 권한부여</title>
      <link>https://aluck.tistory.com/206</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bznYKO/btsORAMrI7I/DfqMNuGcacPrXppnRKYthK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bznYKO/btsORAMrI7I/DfqMNuGcacPrXppnRKYthK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bznYKO/btsORAMrI7I/DfqMNuGcacPrXppnRKYthK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbznYKO%2FbtsORAMrI7I%2FDfqMNuGcacPrXppnRKYthK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;115&quot; height=&quot;115&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751185349193&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;20250626_01_sys

--○현재 오라클 서버에 접속한 계정 조회 
SHOW USER;
--==&amp;gt; USER이(가) &quot;SYS&quot;입니다.
--SQLPLUS 상태일 때 사용하는 명령어

SHOW USER;

SELECT USER
FROM DUAL;
--==&amp;gt;&amp;gt; SYS

-- 1줄 주석문 처리(단일행 주석문 처리)

/*
여러줄
(다중행)
주석문
처리
*/

SELECT 1+2
FROM DUAL;
--==&amp;gt;&amp;gt; 3 

SELECT 1 + 2
FROM DUAL;
--==&amp;gt;&amp;gt; 3 
 
SeLeCt 1 + 1
from duAL;
--==&amp;gt;&amp;gt; 2

SELECT 아직은 지루한 오라클 수업
FROM DUAL;
--==&amp;gt;&amp;gt; 에러 발생 
/*
ORA-00923: FROM keyword not found where expected
00923. 00000 -  &quot;FROM keyword not found where expected&quot;
*Cause:    
*Action:
34행, 6열에서 오류 발생
*/

SELECT &quot;아직은 지루한 오라클 수업&quot;
FROM DUAL;
--==&amp;gt;&amp;gt; 에러 발생
/*
ORA-00972: identifier is too long
00972. 00000 -  &quot;identifier is too long&quot;
*Cause:    An identifier with more than 128 bytes was specified,
           or a password identifier longer than 30 bytes was specified.
*Action:   Specify at most 128 bytes for identifiers,
           and at most 30 bytes for password identifiers.
44행, 8열에서 오류 발생
*/

SELECT '강의'
FROM DUAL;
--==&amp;gt;&amp;gt;강의

SELECT 3.14 + 1.36
FROM DUAL;
--==&amp;gt;&amp;gt; 4.5

SELECT 1.2345 - 1.2344
FROM DUAL;
--==&amp;gt;&amp;gt;0.0001

SELECT 10 * 5
FROM DUAL;
--==&amp;gt;&amp;gt; 50

SELECT 10 * 5.2
FROM DUAL;
--==&amp;gt;&amp;gt; 52

SELECT 1000 / 23
FROM DUAL;
--==&amp;gt;&amp;gt; 43.47826086956521739130434782608695652174

SELECT '하나' + '둘'
FROM DUAL;
--==&amp;gt;&amp;gt; 에러발생 
/*
ORA-01722: invalid number
01722. 00000 -  &quot;invalid number&quot;
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.
*/


--○ 오라클 서버에 존재하는 사용자 계정 상태 조회
SELECT USERNAME, ACCOUNT_STATUS
FROM DBA_USERS;
--==&amp;gt;&amp;gt;
/*
SYS                 OPEN    
SYSTEM             OPEN
ANONYMOUS         OPEN
HR                 OPEN
APEX_PUBLIC_USER     LOCKED
FLOWS_FILES         LOCKED
APEX_040000         LOCKED
OUTLN             EXPIRED &amp;amp; LOCKED
DIP                 EXPIRED &amp;amp; LOCKED
ORACLE_OCM         EXPIRED &amp;amp; LOCKED
XS$NULL             EXPIRED &amp;amp; LOCKED
MDSYS             EXPIRED &amp;amp; LOCKED
CTXSYS             EXPIRED &amp;amp; LOCKED
DBSNMP             EXPIRED &amp;amp; LOCKED
XDB                 EXPIRED &amp;amp; LOCKED
APPQOSSYS         EXPIRED &amp;amp; LOCKED
*/

SELECT USERNAME, USER_ID, ACCOUNT_STATUS, PASSWORD, LOCK_DATE
FROM DBA_USERS;
--==&amp;gt;&amp;gt;
/*
SYS             0 OPEN
SYSTEM         5 OPEN
ANONYMOUS     35 OPEN
HR             43 OPEN
APEX_PUBLIC_USER 45 LOCKED 14/05/29
FLOWS_FILES     44 LOCKED 14/05/29
APEX_040000     47 LOCKED 14/05/29
OUTLN         9 EXPIRED &amp;amp; LOCKED 25/06/25
DIP             14 EXPIRED &amp;amp; LOCKED 14/05/29
ORACLE_OCM     21 EXPIRED &amp;amp; LOCKED 14/05/29
XS$NULL         2147483638 EXPIRED &amp;amp; LOCKED 14/05/29
MDSYS         42 EXPIRED &amp;amp; LOCKED 14/05/29
CTXSYS         32 EXPIRED &amp;amp; LOCKED 25/06/25
DBSNMP         29 EXPIRED &amp;amp; LOCKED 14/05/29
XDB             34 EXPIRED &amp;amp; LOCKED 14/05/29
APPQOSSYS     30 EXPIRED &amp;amp; LOCKED 14/05/29
*/

--&amp;gt; [DBA_]로 시작하는 Oracle Data Dictionary View는
--  오로지 관리자 권한으로 접속했을 때만 조회가 가능하다.
--  아직은 데이터 딕셔너리 개념을 잡지 못해도 상관없다.

--○ [hr] 사용자 계정을 잠금 상태로 설정

ALTER USER HR ACCOUNT LOCK; 
--==&amp;gt;&amp;gt; User HR이(가) 변경되었습니다.

--○ 다시 사용자 계정 상태 조회
SELECT USERNAME, ACCOUNT_STATUS
FROM DBA_USERS;
--==&amp;gt;&amp;gt;
/*
SYS                  OPEN
SYSTEM             OPEN
ANONYMOUS         OPEN
APEX_PUBLIC_USER     LOCKED
FLOWS_FILES         LOCKED
APEX_040000         LOCKED
HR                 LOCKED
OUTLN             EXPIRED &amp;amp; LOCKED
DIP                 EXPIRED &amp;amp; LOCKED
ORACLE_OCM         EXPIRED &amp;amp; LOCKED
XS$NULL             EXPIRED &amp;amp; LOCKED
MDSYS             EXPIRED &amp;amp; LOCKED
CTXSYS             EXPIRED &amp;amp; LOCKED
DBSNMP             EXPIRED &amp;amp; LOCKED
XDB                 EXPIRED &amp;amp; LOCKED
APPQOSSYS         EXPIRED &amp;amp; LOCKED
*/

--○[HR] 사용자 계정을 잠금 해제 상태로 설정
ALTER USER HR ACCOUNT UNLOCK;
--==&amp;gt;&amp;gt; User HR이(가) 변경되었습니다.

--○ 다시 사용자 계정 상태 조회
SELECT *
FROM DBA_USERS;
--==&amp;gt;&amp;gt; 
/*
SYS 0 OPEN 25/12/22 SYSTEM TEMP 14/05/29 DEFAULT SYS_GROUP 10G 11G 
SYSTEM 5 OPEN 25/12/22 SYSTEM TEMP 14/05/29 DEFAULT SYS_GROUP 10G 11G 
ANONYMOUS 35 OPEN 14/11/25 SYSAUX TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP
HR 43 OPEN 25/12/23 USERS TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
APEX_PUBLIC_USER 45 LOCKED 14/05/29 14/11/25 SYSTEM TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
FLOWS_FILES 44 LOCKED 14/05/29 14/11/25 SYSAUX TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
APEX_040000 47 LOCKED 14/05/29 14/11/25 SYSAUX TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
OUTLN 9 EXPIRED &amp;amp; LOCKED 25/06/25 25/06/25 SYSTEM TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
DIP 14 EXPIRED &amp;amp; LOCKED 14/05/29 14/05/29 SYSTEM TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
ORACLE_OCM 21 EXPIRED &amp;amp; LOCKED 14/05/29 14/05/29 SYSTEM TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
XS$NULL 2147483638 EXPIRED &amp;amp; LOCKED 14/05/29 14/05/29 SYSTEM TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
MDSYS 42 EXPIRED &amp;amp; LOCKED 14/05/29 25/06/25 SYSAUX TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
CTXSYS 32 EXPIRED &amp;amp; LOCKED 25/06/25 25/06/25 SYSAUX TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
DBSNMP 29 EXPIRED &amp;amp; LOCKED 14/05/29 14/05/29 SYSAUX TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
XDB 34 EXPIRED &amp;amp; LOCKED 14/05/29 14/05/29 SYSAUX TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
APPQOSSYS 30 EXPIRED &amp;amp; LOCKED 14/05/29 14/05/29 SYSAUX TEMP 14/05/29 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G 
*/

SELECT USERNAME, ACCOUNT_STATUS
FROM DBA_USERS;
--==&amp;gt;&amp;gt;
/*
    :   
    :
    :
    :
*/


--------------------------------------------------------------------------------

--○ TABLESPACE 생성

--※ TABLESPACE 란?
--  세그먼트(테이블, 인덱스, ...) 를 담아두는(저장해두는)
--  오라클의 논리적인 저장 구조를 의미한다. 

CREATE TABLESPACE TBS_EDUA                  -- CREATE 유형 개체명 &amp;rarr; 구조적인 생성의 의미
DATAFILE 'C:\TESTORADATA\TBS_EDUA01.DBF'     -- 물리적으로 연결되는 데이터 파일
SIZE 4M                                     -- 물리적 데이터 파일의 용량
EXTENT MANAGEMENT LOCAL                     -- 오라클 서버가 세그먼트를 알아서 관리
SEGMENT SPACE MANAGEMENT AUTO;              -- 세그먼트 공간 관리도 자동으로 오라클 서버가 ... 
--==&amp;gt;&amp;gt; TABLESPACE TBS_EDUA이(가) 생성되었습니다.

-- ※ 테이블스페이스 생성 구문을 실행하기 전에
--    물리적인 경로에 디렉터리(C:\TESTORADATA) 생성할 것 

--○ 생성된 테이블스페이스 조회
-- 테이블스페이스명: TBS_EDUA
SELECT *
FROM DBA_TABLESPACES;
--==&amp;gt;&amp;gt;
/*
SYSTEM 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING NO LOCAL SYSTEM NO MANUAL DISABLED NOT APPLY NO HOST NO
SYSAUX 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING NO LOCAL SYSTEM NO AUTO DISABLED NOT APPLY NO HOST NO
UNDOTBS1 8192 65536 1 2147483645 2147483645 65536 ONLINE UNDO LOGGING NO LOCAL SYSTEM NO MANUAL DISABLED NOGUARANTEE NO HOST NO
TEMP 8192 1048576 1048576 1 2147483645 0 1048576 ONLINE TEMPORARY NOLOGGING NO LOCAL UNIFORM NO MANUAL DISABLED NOT APPLY NO HOST NO
USERS 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING NO LOCAL SYSTEM NO AUTO DISABLED NOT APPLY NO HOST NO
TBS_EDUA 8192 65536 1 2147483645 2147483645 65536 ONLINE PERMANENT LOGGING NO LOCAL SYSTEM NO AUTO DISABLED NOT APPLY NO HOST NO
*/

--○ 물리적인 파일 이름 조회
SELECT *
FROM DBA_DATA_FILES;
--==&amp;gt;&amp;gt;
/*
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF 4 USERS 104857600 12800 AVAILABLE 4 YES 11811160064 1441792 1280 103809024 12672 ONLINE
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSAUX.DBF 2 SYSAUX 692060160 84480 AVAILABLE 2 YES 34359721984 4194302 1280 691011584 84352 ONLINE
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\UNDOTBS1.DBF 3 UNDOTBS1 398458880 48640 AVAILABLE 3 YES 524288000 64000 640 397410304 48512 ONLINE
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSTEM.DBF 1 SYSTEM 377487360 46080 AVAILABLE 1 YES 629145600 76800 1280 376438784 45952 SYSTEM
C:\TESTORADATA\TBS_EDUA01.DBF 5 TBS_EDUA 4194304 512 AVAILABLE 5 NO 0 0 0 3145728 384 ONLINE
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/206</guid>
      <comments>https://aluck.tistory.com/206#entry206comment</comments>
      <pubDate>Thu, 26 Jun 2025 15:00:29 +0900</pubDate>
    </item>
    <item>
      <title>Oracle - 오라클 접속 및 구동</title>
      <link>https://aluck.tistory.com/205</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccoYgo/btsOSCaXunu/mKv1HR91y095Hl5wz0EiV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccoYgo/btsOSCaXunu/mKv1HR91y095Hl5wz0EiV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccoYgo/btsOSCaXunu/mKv1HR91y095Hl5wz0EiV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccoYgo%2FbtsOSCaXunu%2FmKv1HR91y095Hl5wz0EiV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;153&quot; height=&quot;153&quot; data-filename=&quot;다운로드.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1751185498490&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;--■■■ 오라클 접속 및 구동 ■■■--

실행창 호출(윈도우키+r) &amp;gt; [cmd] 입력 &amp;rarr; 콘솔창 호출

(명령 프롬프트 상태에서...)

cls - 도스 명령 치면 앞단 내용 삭제됨.
※ 꼭!! 오류발생시 의사표현을 해서 실행되게끔 처리하고 넘어가야 함. 
sqlplus - 실행프로그램

-- 접속된 사용자 없이 단순히 SQL 프롬프트만 띄우도록 한 것
(sqlplus 뒤에 슬래시)

C:\&amp;gt;sqlplus/nolog 
--==&amp;gt;&amp;gt;
/*
SQL*Plus: Release 11.2.0.2.0 Production on 목 6월 26 09:28:50 2025

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

SQL&amp;gt;
*/

--※ [sqlplus]는 SQL을 수행하기 위해 ORACLE에서 제공하는 
-- 도구(툴, 유틸리티)이다.

--※  [C:\oraclexe\app\oracle\product\11.2.0\server\bin]경로에
-- 존재하는 [sqlplus.exe]
-- 오라클을 설치하는 과정에서 이미 이 경로가 환경변수 path 에
-- 등록되어 있으므로 해당 경로까지 찾아들어가지 않아도
-- [c:\sqlplus]와 같은 형식으로 명령어 사용이 가능한 상태인 것이다. 

SQL&amp;gt; dir
--==&amp;gt;&amp;gt; SP2-0042: unknown command &quot;dir&quot; - rest of line ignored.

SQL&amp;gt; cls
--==&amp;gt;&amp;gt; SP2-0042: unknown command &quot;cls&quot; - rest of line ignored.

SQL&amp;gt; ipconfig
--==&amp;gt;&amp;gt; SP2-0042: unknown command &quot;ipconfig&quot; - rest of line ignored.

--※ 이제는 일반적인 도스 명령어(윈도우 명령어)를 수행할 수 없다.
--   (사전에 약속된 명령 이외에는 수행할 수 있는 상태가 아니다.)

--○  현재 접속한 사용자 계정을 조회하는 구문  
SQL&amp;gt; show user
USER is &quot;&quot;

SQL&amp;gt; exit

C:\&amp;gt; 

as - 사장으로써, 얘의 위상으로 접속한다는 의미

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
*/

--○  현재 접속한 사용자 계정 조회 
SQL&amp;gt; show user
USER is &quot;SYS&quot;

--※  현재 우리는 sys 계정을 통해
--    오라클 최고 관리자 권한을 가진 상태에서
--    오라클 서버에 접속한 상태이다.

--○  오라클 서버 인스턴스 상태 조회(사용가능상태 여부 확인)
-- 전원의 on/off 여부 등 일반적으로 접속의 가능 여부를
-- 확인할 때 사용하는 명령    
--==&amp;gt;&amp;gt;
/*
SQL&amp;gt; select status from v$instance;

STATUS
------------------------
OPEN
*/ 
--&amp;gt; 오라클 서버가 정상적으로 구동중인(startup) 상태임을 의미.

--○  두번째로... 일반 사용자 계정인 [hr]로 연결을 시도

hr / lion | scott / tiger &amp;gt;&amp;gt; 관리자가 기본적으로 아이디,패스워드를 오픈해놓음.. 

C:\&amp;gt;sqlplus 계정/패스워드 = SQL&amp;gt; connect 계정/패스워드

오라클 권한의 묶음을 롤 이라고 함. 
sqlplus 계정/패스워드 as 운영자롤
sqlplus 계정/패스워드 as 관리자롤

밑에 애들은 관리자기 때문에 롤을 가지고 접속해야만 정상 실행 가능. 

SQL&amp;gt; connect hr/lion
/*
ERROR:
ORA-28000: the account is locked 


Warning: You are no longer connected to ORACLE.
*/
--&amp;gt;  일반 사용자 계정인 [hr]은 존재하지만 잠겨있는 상태이므로
-- 오라클 서버 접속이 불가능한 상태

--○ 접속된 사용자 계정 확인
SQL&amp;gt; show user
USER is &quot;SYS&quot;

db는 _ 형태로 네이밍이 많이 이루어짐. 
※※  db 명령문 작성시 from부터 작성하라고 할 것임. 

--○ 오라클 사용자 계정들의 상태 조회(확인)&amp;rarr; sys로 접속한 상태에서 ... 
SQL&amp;gt; set linesize 500
SQL&amp;gt; select username, account_status from dba_users;
/*
USERNAME                                                     ACCOUNT_STATUS
------------------------------------------------------------ ----------------------------------------------------------------
SYS                                                          OPEN
SYSTEM                                                       OPEN
ANONYMOUS                                                    OPEN
APEX_PUBLIC_USER                                             LOCKED
FLOWS_FILES                                                  LOCKED
APEX_040000                                                  LOCKED
OUTLN                                                        EXPIRED &amp;amp; LOCKED
DIP                                                          EXPIRED &amp;amp; LOCKED
ORACLE_OCM                                                   EXPIRED &amp;amp; LOCKED
XS$NULL                                                      EXPIRED &amp;amp; LOCKED
MDSYS                                                        EXPIRED &amp;amp; LOCKED

USERNAME                                                     ACCOUNT_STATUS
------------------------------------------------------------ ----------------------------------------------------------------
CTXSYS                                                       EXPIRED &amp;amp; LOCKED
DBSNMP                                                       EXPIRED &amp;amp; LOCKED
XDB                                                          EXPIRED &amp;amp; LOCKED
APPQOSSYS                                                    EXPIRED &amp;amp; LOCKED
HR                                                           EXPIRED &amp;amp; LOCKED

16 rows selected.
*/

수정이나 변경 발생- update /구조적인 변경- alter
--○  계정 잠금 / 해제 &amp;rarr; 현재 sys계정을 연결된 상태... 
SQL&amp;gt; alter user hr account unlock;
--==&amp;gt;&amp;gt; User altered.

--○ 다시 오라클 사용자 계정들의 상태 확인(조회)
SQL&amp;gt; select username, account_status from dba_users;
==--&amp;gt;&amp;gt;
/*
USERNAME                                                     ACCOUNT_STATUS
------------------------------------------------------------ ----------------------------------------------------------------
SYS                                                          OPEN
SYSTEM                                                       OPEN
ANONYMOUS                                                    OPEN
HR                                                           EXPIRED
APEX_PUBLIC_USER                                             LOCKED
FLOWS_FILES                                                  LOCKED
APEX_040000                                                  LOCKED
OUTLN                                                        EXPIRED &amp;amp; LOCKED
DIP                                                          EXPIRED &amp;amp; LOCKED
ORACLE_OCM                                                   EXPIRED &amp;amp; LOCKED
XS$NULL                                                      EXPIRED &amp;amp; LOCKED

USERNAME                                                     ACCOUNT_STATUS
------------------------------------------------------------ ----------------------------------------------------------------
MDSYS                                                        EXPIRED &amp;amp; LOCKED
CTXSYS                                                       EXPIRED &amp;amp; LOCKED
DBSNMP                                                       EXPIRED &amp;amp; LOCKED
XDB                                                          EXPIRED &amp;amp; LOCKED
APPQOSSYS                                                    EXPIRED &amp;amp; LOCKED

16 rows selected.
*/
--&amp;gt; 다시 조회한 결과 hr 계정의 상태는 EXPIRED 이며,
-- 잠금은 해제한 상황이지만 패스워드에 대한 유효기간이 만료된 상황으로
-- 이를 재설정해야 한다.

--○ 계정 정보 변경(패스워드 설정 변경)  sys로 접속되어 있는 상태...
SQL&amp;gt; alter user hr identified by lion;
==--&amp;gt;&amp;gt;User altered.

--○ 다시 오라클 사용자 계정들의 상태 확인(조회)
SQL&amp;gt; select username, account_status from dba_users;
--==&amp;gt;&amp;gt;
/*
USERNAME                                                     ACCOUNT_STATUS
------------------------------------------------------------ ----------------------------------------------------------------
SYS                                                          OPEN
SYSTEM                                                       OPEN
ANONYMOUS                                                    OPEN
HR                                                           OPEN
APEX_PUBLIC_USER                                             LOCKED
FLOWS_FILES                                                  LOCKED
APEX_040000                                                  LOCKED
OUTLN                                                        EXPIRED &amp;amp; LOCKED
DIP                                                          EXPIRED &amp;amp; LOCKED
ORACLE_OCM                                                   EXPIRED &amp;amp; LOCKED
XS$NULL                                                      EXPIRED &amp;amp; LOCKED

USERNAME                                                     ACCOUNT_STATUS
------------------------------------------------------------ ----------------------------------------------------------------
MDSYS                                                        EXPIRED &amp;amp; LOCKED
CTXSYS                                                       EXPIRED &amp;amp; LOCKED
DBSNMP                                                       EXPIRED &amp;amp; LOCKED
XDB                                                          EXPIRED &amp;amp; LOCKED
APPQOSSYS                                                    EXPIRED &amp;amp; LOCKED

16 rows selected.
*/

--○  계정 잠금 해제 및 유효기간 만료 상태 해제 후
-- 다시 hr 계정으로 오라클 접속 시도
SQL&amp;gt; conn hr/lion
--==&amp;gt;&amp;gt; Connected.

--○ 접속된 사용자 계정 확인
SQL&amp;gt; show user
USER is &quot;HR&quot;

--○ 현재 오라클 서버의 사용자 계정 상태에 대한 조회
SQL&amp;gt; select username, account_status from dba_users;
--==&amp;gt;&amp;gt;
/*
select username, account_status from dba_users
                                     *
ERROR at line 1:
ORA-00942: table or view does not exist
*/
--&amp;gt; [hr]이라는 일반 사용자 계정을 통해서는
-- [dba_users]에 대한 조회가 불가능한 상황임을 확인 
-- 회원이 일반 회원의 정보를 보면 안되므로 오류나는 것임. 

오라클의 주연은 테이블! 테팔 서랍광고.. 예시
테이블 스페이스(사물함 전체 구조)안에 
각각의 테이블(사물함)이 있고 그 안에 컬럼(파일철)들이 있다. 

회원 = 테이블명
이름, 전화번호, 주소 등 = 컬럼명

--○ host 명령어
SQL&amp;gt; dir
--==&amp;gt;&amp;gt; SP2-0042: unknown command &quot;dir&quot; - rest of line ignored.

SQL&amp;gt; cls
--==&amp;gt;&amp;gt; SP2-0042: unknown command &quot;cls&quot; - rest of line ignored.

SQL&amp;gt; ipconfig
--==&amp;gt;&amp;gt; SP2-0042: unknown command &quot;ipconfig&quot; - rest of line ignored.
-- 도스 명령 체계로 전환하거나
--  라인 단위에서 도스 명령어 입력이 가능하다.
-- 예를 들어 host cls, host dir, host ipconfig 등...
-- 유닉스 계열에서는 [host] 명령 뿐 아니라 [!] 도 사용이 가능하다. host=!
-- 하지만, 윈도우 계열에서는 [host]명령어만 사용이 가능하다.
-- host 상태에서 빠져나갈 때는 [exit] 명령을 입력한다.

C:\&amp;gt;sqlplus
 SQL&amp;gt;host
  C:\&amp;gt;
   C:\&amp;gt;exit 
    SQL&amp;gt;exit
     C:\&amp;gt;exit&amp;gt;&amp;gt; cmd 종료 

윈도우 관리자 계정을 오라클에 관리자권한으로 함께 부여된  sist170권한을 제거하는 방법 
내컴퓨터-shift+마오-관리-컴퓨터 관리(로컬)-로컬 사용자 및 그룹-그룹-ora_dba에서 sist170 제거

--※  Administrator(윈도우 관리자 계정)가 ORA_DBA 그룹(오라클 관리자 계정 그룹)에 포함되어 있을 경우
-- 취약한 보안 정책으로 인해 실무에서는 정말 특별한 경우가 아니고서는
-- 반드시 제외시키고 사용해야 한다.
-- &amp;rarr; ORA_DBA 그룹에서 윈도우 관리자 계정 제거~!!!

--  운영체제 ver.Pro
-- 컴퓨터 관리&amp;gt; 로컬 사용자 및 그룹

-- 운영체제 ver.Pro 이외
-- 윈도우키+r(실행창 호출) &amp;rarr; lusrmgr.msc / control userpasswords2

--※ 제거 이후 sys 의 계정 및 패스워드가 일치하지 않으면
--  오라클 서버에 접속할 수 없는 상태가 된다.

--○ hr 사용자 계정에 sysdba 권한(롤) 부여하기 &amp;rarr; sys 가... 
c:\&amp;gt;sqlplus sys/java006$ as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on 목 6월 26 12:16:28 2025

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL&amp;gt; show user
--==&amp;gt;&amp;gt;USER is &quot;SYS&quot;

SQL&amp;gt; grant sysdba to hr;
--==&amp;gt;&amp;gt; Grant succeeded.

--○  확인 &amp;rarr; hr 로 접속 &amp;rarr; [as sysdba]로 연결 
SQL&amp;gt; conn hr/lion as sysdba
--==&amp;gt;&amp;gt;Connected.

SQL&amp;gt; show user
--==&amp;gt;&amp;gt;USER is &quot;SYS&quot;

--○  sysdba 권한을 부여받기 이전까지는 불가능했던
-- 현재 오라클 서버 사용자 계정의 상태 정보 조회 
-- (sysdba 권한을 부여받은 hr 계정인 상태로...)
SQL&amp;gt; select username, account_status from dba_users;
--==&amp;gt;&amp;gt;
/*
USERNAME                                                     ACCOUNT_STATUS
------------------------------------------------------------ ----------------------------------------------------------------
SYS                                                          OPEN
SYSTEM                                                       OPEN
ANONYMOUS                                                    OPEN
HR                                                           OPEN
APEX_PUBLIC_USER                                             LOCKED
FLOWS_FILES                                                  LOCKED
APEX_040000                                                  LOCKED
OUTLN                                                        EXPIRED &amp;amp; LOCKED
DIP                                                          EXPIRED &amp;amp; LOCKED
ORACLE_OCM                                                   EXPIRED &amp;amp; LOCKED
XS$NULL                                                      EXPIRED &amp;amp; LOCKED

USERNAME                                                     ACCOUNT_STATUS
------------------------------------------------------------ ----------------------------------------------------------------
MDSYS                                                        EXPIRED &amp;amp; LOCKED
CTXSYS                                                       EXPIRED &amp;amp; LOCKED
DBSNMP                                                       EXPIRED &amp;amp; LOCKED
XDB                                                          EXPIRED &amp;amp; LOCKED
APPQOSSYS                                                    EXPIRED &amp;amp; LOCKED

16 rows selected.
*/

--○ hr 사용자 계정에 부여한 sysdba 권한 박탈 &amp;rarr; sys 가...
SQL&amp;gt; revoke sysdba from hr;
--==&amp;gt;&amp;gt; Revoke succeeded.

SQL&amp;gt; disconnect = disconn 같은 명령어
SQL&amp;gt; disconnect  
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

select username, account_status from dba_users; &amp;lt;&amp;lt; 표준화 된 정식 구문은 ; 붙여줘야 함. 
; 안 붙여도 되는 구문은 sqlplus 유틸리티에서 제공하는 구문임. 

--○ 권한 박탈 후 hr 계정을 통해 sysdba 권한으로 오라클 접근 시도 
SQL&amp;gt; conn hr/lion as sysdba
--==&amp;gt;&amp;gt;
/*
ERROR:
ORA-01031: insufficient privileges
*/

-- 접속종료
SQL&amp;gt; disconnect
SQL&amp;gt; disconn

--○ 일반 사용자 계정 hr로 다시 연결
SQL&amp;gt; conn hr/lion
--==&amp;gt;&amp;gt;Connected.
SQL&amp;gt; show user
--==&amp;gt;&amp;gt;USER is &quot;HR&quot;

--○ ※ 오라클 구동 / 중지 
startup / shutdown [immediate] 

immediate -- 빨리 꺼지게 하는 명령

--○ 일반 사용자 계정 hr로 오라클 서버 중지명령 시도
SQL&amp;gt; shutdown
--==&amp;gt;&amp;gt; ORA-01031: insufficient privileges(&amp;rarr; 권한 불충분 에러)
-- 즉, 일반 사용자 계정으로는 오라클 서버의 구동을 중지시킬 수 없다.
SQL&amp;gt; shutdown immediate
--==&amp;gt;&amp;gt; ORA-01031: insufficient privileges
-- 즉, 일반 사용자 계정어로는 오라클 서버의 구동을 중지시킬 수 없다.

SQL&amp;gt; show user
--==&amp;gt;&amp;gt;USER is &quot;SYS&quot;

SQL&amp;gt; shutdown
--==&amp;gt;&amp;gt;
/*
Database closed.
Database dismounted.
ORACLE instance shut down.
*/

--○ 오라클 구동 중지 이후 일반 사용자 hr로 오라클 서버 접속 시도 
SQL&amp;gt; conn hr/lion
--==&amp;gt;&amp;gt;
/*
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Process ID: 0
Session ID: 0 Serial number: 0

Warning: You are no longer connected to ORACLE.
*/

SQL&amp;gt; startup
--==&amp;gt;&amp;gt;
/*
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size                  2260048 bytes
Variable Size             616563632 bytes
Database Buffers          444596224 bytes
Redo Buffers                5517312 bytes
Database mounted.
Database opened.
*/

-- ※ 오라클 서버를 구동하는 명령
SQL&amp;gt; startup

-- ※ 오라클 서버를 중지하는 명령
SQL&amp;gt; shutdonw [immediate]

-- ※  오라클 서버를 구동 및 중지하는 명령은
-- [as sysdba] 또는 [as sysoper]로 연결했을 때만 가능하다. (sysoper = 관리자)

--○ hr 일반 사용자 계정에 [sysoper] 권한 부여하기 &amp;rarr; sys 가...
SQL&amp;gt; show user
USER is &quot;SYS&quot;

SQL&amp;gt; grant sysoper to hr;
--==&amp;gt;&amp;gt; Grant succeeded.

--○ 확인 &amp;rarr;  hr 계정으로 접속 &amp;rarr; sysoper 권한으로 ... 
SQL&amp;gt; conn hr/lion as sysoper
--==&amp;gt;&amp;gt; Connected.

SQL&amp;gt; show user
--==&amp;gt;&amp;gt; USER is &quot;PUBLIC&quot;
--&amp;gt; 운영자의 권한으로 접속된 상황임을 확인

--○ sysoper 의 권한을 가진 hr 계정으로 오라클 서버 중지 명령 시도
--==&amp;gt;&amp;gt;
/*
SQL&amp;gt; shutdown
Database closed.
Database dismounted.
*/

--○ sysoper 의 권한을 가진 hr 계정으로 오라클 서버 구동 명령 시도 
--==&amp;gt;&amp;gt;
SQL&amp;gt; startup
/*
ORACLE instance started.
Database mounted.
Database opened.
*/

--○  sysoper 의 권한을 가진 hr 계정으로 
-- 오라클 서버의 사용자 계정 상태 조회 
SQL&amp;gt; select username, account_status from dba_user;
--==&amp;gt;&amp;gt;
/*
select username, account_status from dba_user
                                     *
ERROR at line 1:
ORA-00942: table or view does not exist
*/

-- ■■■ 오라클 서버 연결 모드 3가지 방법 ■■■--

--  1. as sysdba
--&amp;gt;  as sysdba 연결하면 오라클 서버의 관리자로 연결되는 것이다.
--  user 명은 sys 로 확인된다.
--  오라클 서버 관리자로 연결되는 것이기 때문에
--  오라큰 서버에서 제공하는 모든 기능을 전부 활용할 수 있다.
--  오라클 서버가 startup 또는 suhtdown 되어도 연결이 가능하다.
--  &amp;rarr; 기본적인 연결은 [conn 계정/패스워드 as sysdba] 형태로 연결하게 된다.
--  &amp;rarr; 일반적인 연결은 [conn 계정 as sysdba] 형태로 연결하게 된다.  

--  2. as sysoper
--&amp;gt;  as sysoper 로 연결하면 오라클 서버의 운영자로 연결되는 것이다.
--  user 명은 PUBLIC 으로 확인된다.
--  사용자 계정 정보 테이블에 접근하는 것은 불가능하다.
--  오라클 서버의 구동 및 중지 명령 수행이 가능하다.
--  오라클 서버가 startup 또는 suhtdown 되어도 연결이 가능하다.
--  &amp;rarr; 기본적인 연결은 [conn 계정/패스워드 as sysoper] 형태로 연결하게 된다.
--  &amp;rarr; 일반적인 연결은 [conn 계정 as sysoper] 형태로 연결하게 된다.

--  3. normal
--&amp;gt;  오라클 서버에 존재하는 일반 사용자로 연결되는 것이다.
--  오라클 서버가 구동중인 상태에서만 연결이 가능하고
--  오라클 서버가 구동 중지 상태일 경우 연결이 불가능하다.
--  관리자가 부여해준 권한(또는 롤)을 통해서만 사용이 가능하다.
--  &amp;rarr; 기본적인 연결은 [conn 계정/패스워드] 형태로 연결하게 된다.
--  &amp;rarr; 일반적인 연결은 [conn 계정] 형태로 연결하게 된다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>dbms</category>
      <category>디비</category>
      <category>오라클</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/205</guid>
      <comments>https://aluck.tistory.com/205#entry205comment</comments>
      <pubDate>Thu, 26 Jun 2025 11:00:57 +0900</pubDate>
    </item>
    <item>
      <title>Oracle -  오라클 설치, 제거</title>
      <link>https://aluck.tistory.com/203</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DB.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqCojZ/btsOSS5ALRS/fLcwkkktjxXbyIh1xWL9O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqCojZ/btsOSS5ALRS/fLcwkkktjxXbyIh1xWL9O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqCojZ/btsOSS5ALRS/fLcwkkktjxXbyIh1xWL9O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqCojZ%2FbtsOSS5ALRS%2FfLcwkkktjxXbyIh1xWL9O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;114&quot; height=&quot;114&quot; data-filename=&quot;DB.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--■■■&amp;nbsp;오라클&amp;nbsp;설치&amp;nbsp;■■■-- &lt;br /&gt;/**/&amp;nbsp;다중행&amp;nbsp;블럭단위&amp;nbsp;주석 &lt;br /&gt;--&amp;nbsp;라인단위&amp;nbsp;주석 &lt;br /&gt;&lt;br /&gt;--[&lt;a href=&quot;https://www.oracle.com/]&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.oracle.com/]&lt;/a&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;&amp;nbsp;페이지&amp;nbsp;접근&amp;nbsp;%&amp;nbsp;회원가입&amp;nbsp;&amp;amp;&amp;nbsp;로그인 &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;Oracle&amp;nbsp;23ai&amp;nbsp;&amp;rarr;&amp;nbsp;최신&amp;nbsp;버전 &lt;br /&gt;--&amp;nbsp;Oracle&amp;nbsp;11g&amp;nbsp;&amp;nbsp;&amp;rarr;&amp;nbsp;우리가&amp;nbsp;설치한&amp;nbsp;버전 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &lt;br /&gt;--&amp;nbsp;eXpress&amp;nbsp;Edition &lt;br /&gt;--&amp;nbsp;&amp;rarr;&amp;nbsp; 법적으로&amp;nbsp;완전&amp;nbsp;무료&amp;nbsp;버전이다. &lt;br /&gt;-- 기업체나&amp;nbsp;교육기관&amp;nbsp;등에서&amp;nbsp;무료로&amp;nbsp;사용이&amp;nbsp;가능한&amp;nbsp;버전이며, &lt;br /&gt;-- 프로그램&amp;nbsp;개발용으로는&amp;nbsp;충분하지만, &lt;br /&gt;-- 데이터베이스&amp;nbsp;서버용으로는&amp;nbsp;다소&amp;nbsp;부족한&amp;nbsp;기능을&amp;nbsp;가진&amp;nbsp;버전이라&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- &lt;br /&gt;--&amp;nbsp;Standard&amp;nbsp;Edition,&amp;nbsp;Standard&amp;nbsp;Edition&amp;nbsp;One,&amp;nbsp;Data&amp;nbsp;Ware&amp;nbsp;House,&amp;nbsp;Enterprise&amp;nbsp;Edition &lt;br /&gt;--&amp;nbsp;&amp;rarr;&amp;nbsp; 다운로드는&amp;nbsp;가능하지만,&amp;nbsp;기업체나&amp;nbsp;교육기관&amp;nbsp;등에서&amp;nbsp;사용하게&amp;nbsp;되면 &lt;br /&gt;-- 사용&amp;nbsp;중&amp;nbsp;검열&amp;nbsp;시&amp;nbsp;정식&amp;nbsp;라이센스를&amp;nbsp;제시할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;한다. &lt;br /&gt;-- 프로그램&amp;nbsp;개발용&amp;nbsp;뿐&amp;nbsp;아니라,&amp;nbsp;데이터베이스&amp;nbsp;서버용으로도 &lt;br /&gt;-- 충분한&amp;nbsp;기능을&amp;nbsp;가지고&amp;nbsp;있는&amp;nbsp;버전들이다. &lt;br /&gt;&lt;br /&gt;--○&amp;nbsp;&amp;nbsp; 기본적으로&amp;nbsp;설치&amp;nbsp;과정은&amp;nbsp;까다롭지&amp;nbsp;않다. &lt;br /&gt;-- (11g&amp;nbsp;Express&amp;nbsp;Edition&amp;nbsp;기준) &lt;br /&gt;&lt;br /&gt;--&amp;nbsp; -&amp;nbsp;기본&amp;nbsp;설치&amp;nbsp;경로&amp;nbsp;:&amp;nbsp;[C:\oraclexe] &lt;br /&gt;-- -&amp;nbsp;SYS&amp;nbsp;계정&amp;nbsp;패스워드&amp;nbsp;설정&amp;nbsp;:&amp;nbsp;[java006$] &lt;br /&gt;-- -&amp;nbsp;Port&amp;nbsp;Number&amp;nbsp;(기본&amp;nbsp;리스너)&amp;nbsp;:&amp;nbsp;[1521]&amp;nbsp;//&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;(리스너의&amp;nbsp;개념&amp;nbsp;:&amp;nbsp;나이트&amp;nbsp;삐끼가&amp;nbsp;쌍용나이트로&amp;nbsp;데려다줌) &lt;br /&gt;-- -&amp;nbsp;Port&amp;nbsp;Number&amp;nbsp;(HTTP&amp;nbsp;리스너)&amp;nbsp;:&amp;nbsp;[8080] &lt;br /&gt;&lt;br /&gt;--&amp;nbsp;※&amp;nbsp;참고(오라클&amp;nbsp;데이터베이스의&amp;nbsp;파일&amp;nbsp;위치) &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;오라클&amp;nbsp;관련&amp;nbsp;프로그램이&amp;nbsp;설치되는&amp;nbsp;경로와 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;관리되고&amp;nbsp;유지되는&amp;nbsp;데이터&amp;nbsp;파일의&amp;nbsp;위치는 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;물리적으로&amp;nbsp;다른&amp;nbsp;경로를&amp;nbsp;선택하는&amp;nbsp;것을&amp;nbsp;권장한다. &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;즉,&amp;nbsp;오라클&amp;nbsp;관련&amp;nbsp;프로그램이&amp;nbsp;C&amp;nbsp;드라이브에&amp;nbsp;설치된다고&amp;nbsp;가정할&amp;nbsp;때 &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;데이터베이스&amp;nbsp;파일의&amp;nbsp;위치는&amp;nbsp;D&amp;nbsp;드라이브로&amp;nbsp;설정하는&amp;nbsp;것이&amp;nbsp;바람직하다는&amp;nbsp;것이다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--■■■&amp;nbsp;오라클&amp;nbsp;제거&amp;nbsp;■■■-- &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp; &lt;br /&gt;(Window&amp;nbsp;11&amp;nbsp;기준) &lt;br /&gt;설정(윈도우키+i)&amp;nbsp;&amp;gt;&amp;nbsp;앱&amp;nbsp;&amp;gt;&amp;nbsp;설치된&amp;nbsp;앱&amp;nbsp;&amp;gt; &amp;rarr;&amp;nbsp;Oracle&amp;nbsp;관련&amp;nbsp;항목&amp;nbsp;제거&amp;nbsp; &lt;br /&gt;&lt;br /&gt;(Window&amp;nbsp;10&amp;nbsp;기준) &lt;br /&gt;제어판(윈도우키+i)&amp;nbsp;&amp;gt;&amp;nbsp;프로그램&amp;nbsp;및&amp;nbsp;기능 &amp;rarr;&amp;nbsp;Oracle&amp;nbsp;관련&amp;nbsp;항목&amp;nbsp;제거&amp;nbsp; &lt;br /&gt;&lt;br /&gt;2. &lt;br /&gt;실행창&amp;nbsp;호출(윈도우키+r) &amp;gt;&amp;nbsp;[services.msc]&amp;nbsp;&amp;rarr;&amp;nbsp;서비스&amp;nbsp;창&amp;nbsp;호출&amp;nbsp; &lt;br /&gt;&lt;br /&gt;3. &lt;br /&gt;서비스&amp;nbsp;리스트의&amp;nbsp;항목을&amp;nbsp;통해&amp;nbsp;확인해&amp;nbsp;보면 &lt;br /&gt;[Oracle]&amp;nbsp;로&amp;nbsp;시작하는&amp;nbsp;서비스가&amp;nbsp;여러개&amp;nbsp;확인된다. &lt;br /&gt;즉,&amp;nbsp;Oracle&amp;nbsp;Server&amp;nbsp;는&amp;nbsp;서비스를&amp;nbsp;기반으로&amp;nbsp;동작한다는&amp;nbsp;것이다. &lt;br /&gt;위에서&amp;nbsp;언급한&amp;nbsp;것처럼&amp;nbsp;오라클&amp;nbsp;프로그램을&amp;nbsp;제거했다&amp;nbsp;하더라도 &lt;br /&gt;운영체제(OS)&amp;nbsp;상에서&amp;nbsp;오라클은&amp;nbsp;서비스로&amp;nbsp;동작하기&amp;nbsp;때문에 &lt;br /&gt;이&amp;nbsp;오라클&amp;nbsp;서비스를&amp;nbsp;제거해&amp;nbsp;주어야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;※&amp;nbsp;오라클&amp;nbsp;서비스를&amp;nbsp;제거하는&amp;nbsp;방법&amp;nbsp;(추후에&amp;nbsp;삭제할&amp;nbsp;때&amp;nbsp;처리방법) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;1)&amp;nbsp; [윈도우키+r]&amp;nbsp;입력(실행창&amp;nbsp;호출)&amp;nbsp;&amp;rarr;&amp;nbsp;[regedit]&amp;nbsp;입력(레지스트리&amp;nbsp;편집기&amp;nbsp;호출) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2) [HKEY_LOCAL_MACHINE]&amp;nbsp;&amp;gt;&amp;nbsp;[SOFTWARE]&amp;nbsp;&amp;gt;&amp;nbsp;[Oracle]&amp;nbsp;항목&amp;nbsp;삭제 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;3)&amp;nbsp; [HKEY_LOCAL_MACHINE]&amp;nbsp;&amp;gt;&amp;nbsp;[SYSTEM]&amp;nbsp;&amp;gt;&amp;nbsp;[CurrentControlSet]&amp;nbsp;&amp;gt;&amp;nbsp;[Services] &lt;br /&gt;&amp;rarr;&amp;nbsp;[Oracle]로&amp;nbsp;시작하는&amp;nbsp;모든&amp;nbsp;항목&amp;nbsp;삭제 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;4) [HKEY_LOCAL_MACHINE]&amp;nbsp;&amp;gt;&amp;nbsp;[SYSTEM]&amp;nbsp;&amp;gt;&amp;nbsp;[ControlSet001]&amp;nbsp; &lt;br /&gt;&amp;gt;&amp;nbsp;[Services]&amp;nbsp;&amp;rarr;&amp;nbsp;[Oracle]로&amp;nbsp;시작하는&amp;nbsp;모든&amp;nbsp;항목&amp;nbsp;삭제 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;5) [HKEY_LOCAL_MACHINE]&amp;nbsp;&amp;gt;&amp;nbsp;[SYSTEM]&amp;nbsp;&amp;gt;&amp;nbsp;[ControlSet002]&amp;nbsp;(존재한다면...) &lt;br /&gt;&amp;gt;&amp;nbsp;[Services]&amp;nbsp;&amp;rarr;&amp;nbsp;[Oracle]로&amp;nbsp;시작하는&amp;nbsp;모든&amp;nbsp;항목&amp;nbsp;삭제 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;6) [HKEY_LOCAL_MACHINE]&amp;nbsp;&amp;gt;&amp;nbsp;[SYSTEM]&amp;nbsp;&amp;gt;&amp;nbsp;[ControlSet003]&amp;nbsp;(존재한다면...) &lt;br /&gt;&amp;gt;&amp;nbsp;[Services]&amp;nbsp;&amp;rarr;&amp;nbsp;[Oracle]로&amp;nbsp;시작하는&amp;nbsp;모든&amp;nbsp;항목&amp;nbsp;삭제 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;※&amp;nbsp; ControlSet002&amp;nbsp;와&amp;nbsp;ControlSet003&amp;nbsp;등은&amp;nbsp;운영체제의&amp;nbsp;상태에&amp;nbsp;따라 &lt;br /&gt;존재할&amp;nbsp;수도&amp;nbsp;있고&amp;nbsp;존재하지&amp;nbsp;않을&amp;nbsp;수도&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;※ 변경된&amp;nbsp;레지스트리&amp;nbsp;정보가&amp;nbsp;적용되기&amp;nbsp;위해서는 &lt;br /&gt;반.드.시.&amp;nbsp;재부팅을&amp;nbsp;해&amp;nbsp;주어야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;4.&amp;nbsp; &lt;br /&gt;재부팅&amp;nbsp;이후&amp;nbsp;탐색기&amp;nbsp;상에서&amp;nbsp;오라클&amp;nbsp;홈과&amp;nbsp;관련된&amp;nbsp;모든&amp;nbsp;내용을&amp;nbsp;찾아 &lt;br /&gt;물리적으로&amp;nbsp;삭제한다. &lt;br /&gt;&lt;br /&gt;5.&amp;nbsp; &lt;br /&gt;또한&amp;nbsp;데이터&amp;nbsp;파일&amp;nbsp;경로&amp;nbsp;및&amp;nbsp;설치&amp;nbsp;경로의&amp;nbsp;모든&amp;nbsp;디렉터리와&amp;nbsp;파일들을&amp;nbsp; &lt;br /&gt;물리적으로&amp;nbsp;삭제할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;--==&amp;gt;&amp;gt;&amp;nbsp;여기까지&amp;nbsp;모든&amp;nbsp;과정을&amp;nbsp;수행해야&amp;nbsp;Oracle&amp;nbsp;Server&amp;nbsp;는&amp;nbsp;깨끗하게&amp;nbsp;제거된다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/203</guid>
      <comments>https://aluck.tistory.com/203#entry203comment</comments>
      <pubDate>Thu, 26 Jun 2025 00:25:16 +0900</pubDate>
    </item>
    <item>
      <title>Oracle 기초 - 데이터베이스</title>
      <link>https://aluck.tistory.com/202</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DB.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bby2cV/btsOQVQuB09/hE9l7WMTo3HCdsbpCsKTzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bby2cV/btsOQVQuB09/hE9l7WMTo3HCdsbpCsKTzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bby2cV/btsOQVQuB09/hE9l7WMTo3HCdsbpCsKTzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbby2cV%2FbtsOQVQuB09%2FhE9l7WMTo3HCdsbpCsKTzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;131&quot; height=&quot;131&quot; data-filename=&quot;DB.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;--○&amp;nbsp;데이터(Data)&lt;/b&gt; &lt;br /&gt;/* &lt;br /&gt;개인은&amp;nbsp;물론이고&amp;nbsp;기업이나&amp;nbsp;기관은&amp;nbsp;정보를&amp;nbsp;필요로한다. &lt;br /&gt;이&amp;nbsp;정보의&amp;nbsp;기본(바탕)이&amp;nbsp;되는&amp;nbsp;것이&amp;nbsp;데이터이다. &lt;br /&gt;예를&amp;nbsp;들면,&amp;nbsp;회사는&amp;nbsp;사원,&amp;nbsp;부서,&amp;nbsp;급여&amp;nbsp;등에&amp;nbsp;대한&amp;nbsp;데이터(자료)를&amp;nbsp;관리해야&amp;nbsp;하고, &lt;br /&gt;물품을&amp;nbsp;사고파는&amp;nbsp;회사일&amp;nbsp;경우&amp;nbsp;훨씬&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;데이터(자료)를&amp;nbsp;관리해야&amp;nbsp;하며, &lt;br /&gt;이러한&amp;nbsp;자료를&amp;nbsp;[데이터]라고&amp;nbsp;한다. &lt;br /&gt;*/ &lt;br /&gt;--==&amp;gt;&amp;gt;&amp;nbsp; 데이터란&amp;nbsp;현실&amp;nbsp;세계에서&amp;nbsp;관찰이나&amp;nbsp;측정을&amp;nbsp;통해&amp;nbsp;수집된 &lt;br /&gt;-- 사실(Facts)이나&amp;nbsp;값(Value),&amp;nbsp;또는&amp;nbsp;그&amp;nbsp;값들의&amp;nbsp;집합을&amp;nbsp;말한다. &lt;br /&gt;&lt;br /&gt;--○&amp;nbsp;정보(Information) &lt;br /&gt;/* &lt;br /&gt;정보란&amp;nbsp;데이터를&amp;nbsp;바타으로&amp;nbsp;구체화&amp;nbsp;한&amp;nbsp;유효한&amp;nbsp;해석(Interpretation)이나 &lt;br /&gt;데이터&amp;nbsp;상호간의&amp;nbsp;관계(Relationship)를&amp;nbsp;의사&amp;nbsp;결정에&amp;nbsp;도움이&amp;nbsp;되도록 &lt;br /&gt;가공한&amp;nbsp;것이다. &lt;br /&gt;*/ &lt;br /&gt;&lt;br /&gt;&lt;b&gt;--○&amp;nbsp;데이터베이스(Database,&amp;nbsp;DB)&lt;/b&gt; &lt;br /&gt;/* &lt;br /&gt;데이터들을&amp;nbsp;담고&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;[데이터베이스]라고&amp;nbsp;한다. &lt;br /&gt;즉,&amp;nbsp;데이터베이스라&amp;nbsp;함은&amp;nbsp;지속적으로&amp;nbsp;유지&amp;middot;관리해야&amp;nbsp;할&amp;nbsp;데이터의&amp;nbsp;집합인&amp;nbsp;것이다. &lt;br /&gt;데이터베이스는&amp;nbsp;조직화된&amp;nbsp;자료의&amp;nbsp;집합이며 &lt;br /&gt;데이터를&amp;nbsp;관리하려면&amp;nbsp;[데이터베이스&amp;nbsp;관리&amp;nbsp;시스템]이&amp;nbsp;필요하다. &lt;br /&gt;*/ &lt;br /&gt;--==&amp;gt;&amp;gt;&amp;nbsp; 데이터베이스란&amp;nbsp;여러&amp;nbsp;응용&amp;nbsp;시스템들이&amp;nbsp;공유할&amp;nbsp;수&amp;nbsp;있도록 &lt;br /&gt;-- 통합,&amp;nbsp;저장된&amp;nbsp;운영&amp;nbsp;데이터의&amp;nbsp;집합이다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;--○ 데이터베이스&amp;nbsp;관리&amp;nbsp;시스템(DataBase&amp;nbsp;Management&amp;nbsp;System(Software),&amp;nbsp;DBMS) &lt;br /&gt;--&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;rarr;&amp;nbsp;관계형&amp;nbsp;데이터베이스&amp;nbsp;관리&amp;nbsp;시스템(RDBMS) &lt;br /&gt;/* &lt;br /&gt;데이터베이스&amp;nbsp;관리&amp;nbsp;시스템은&amp;nbsp;연관성&amp;nbsp;있는&amp;nbsp;데이터들의&amp;nbsp;집합을&amp;nbsp;효율적으로&amp;nbsp;응용하기&amp;nbsp;위해&amp;nbsp;구성된 &lt;br /&gt;소프트웨어들의&amp;nbsp;집합이다.&amp;nbsp; &lt;br /&gt;즉,&amp;nbsp;데이터와&amp;nbsp;응용프로그램의&amp;nbsp;중간에서&amp;nbsp;프로그램이&amp;nbsp;요구하는대로 &lt;br /&gt;데이터를&amp;nbsp;정의하고,&amp;nbsp;읽고,&amp;nbsp;쓰고,&amp;nbsp;갱신하는&amp;nbsp;등&amp;nbsp;데이터를&amp;nbsp;조작하고 &lt;br /&gt;이들을&amp;nbsp;효율적으로&amp;nbsp;관리하는&amp;nbsp;프로그램들을&amp;nbsp;지칭한다. &lt;br /&gt;&lt;br /&gt;데이터베이스&amp;nbsp;관리&amp;nbsp;시스템은&amp;nbsp;사용자가&amp;nbsp;새로운&amp;nbsp;데이터베이스를&amp;nbsp;생성하고, &lt;br /&gt;데이터베이서의&amp;nbsp;구조를&amp;nbsp;명시할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하고,&amp;nbsp; &lt;br /&gt;사용자가&amp;nbsp;데이터를&amp;nbsp;효율적으로&amp;nbsp;질의하고&amp;nbsp;수정할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;한다. &lt;br /&gt;시스템의&amp;nbsp;고장이나&amp;nbsp;권한이&amp;nbsp;없는&amp;nbsp;사용자로부터 &lt;br /&gt;데이터를&amp;nbsp;안전하게&amp;nbsp;보호하며,&amp;nbsp;동시에&amp;nbsp;여러&amp;nbsp;사용자가&amp;nbsp;데이터베이스에 &lt;br /&gt;접근하는&amp;nbsp;것을&amp;nbsp;제어하는&amp;nbsp;소프트웨어&amp;nbsp;패키지인&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;데이터베이스&amp;nbsp;관리&amp;nbsp;시스템은&amp;nbsp;사용자나&amp;nbsp;어플리케이션&amp;nbsp;프로그램들이 &lt;br /&gt;데이터를&amp;nbsp;공유할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;하는&amp;nbsp;소프트웨어&amp;nbsp;패키지이다. &lt;br /&gt;또한,&amp;nbsp;데이터베이스&amp;nbsp;내에&amp;nbsp;자료를&amp;nbsp;생성,&amp;nbsp;변경,&amp;nbsp;조회,&amp;nbsp;저장할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;하는 &lt;br /&gt;시스템적인&amp;nbsp;방법을&amp;nbsp;제공한다. &lt;br /&gt;일반적으로는&amp;nbsp;데이터&amp;nbsp;일치,&amp;nbsp;접근,&amp;nbsp;통제,&amp;nbsp;자동롤백,&amp;nbsp;복구를&amp;nbsp;담당한다. &lt;br /&gt;*/ &lt;br /&gt;--==&amp;gt;&amp;gt;&amp;nbsp; 데이터베이스&amp;nbsp;관리&amp;nbsp;시스템(DBMS)이란 &lt;br /&gt;-- 모든&amp;nbsp;응용프로그램들이&amp;nbsp;데이터베이스를&amp;nbsp;공유할&amp;nbsp;수&amp;nbsp;있도록 &lt;br /&gt;-- 관리해주고&amp;nbsp;데이터베이스를&amp;nbsp;유지하기&amp;nbsp;위한&amp;nbsp;일련의 &lt;br /&gt;-- 소프트웨어&amp;nbsp;시스템이다.&lt;/p&gt;</description>
      <category>IT/DBMS</category>
      <category>db</category>
      <category>DBA</category>
      <category>dbms</category>
      <category>디비</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/202</guid>
      <comments>https://aluck.tistory.com/202#entry202comment</comments>
      <pubDate>Thu, 26 Jun 2025 00:23:23 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]■■■키보드 주요 특수문자 영문이름■■■</title>
      <link>https://aluck.tistory.com/201</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;■■■키보드&amp;nbsp;주요&amp;nbsp;특수문자&amp;nbsp;영문이름■■■ &lt;br /&gt;&lt;br /&gt;` &amp;gt;&amp;nbsp;Grave &lt;br /&gt;~ &amp;gt;&amp;nbsp;Tilde ★★★ &lt;br /&gt;! &amp;gt;&amp;nbsp;Exclamation&amp;nbsp;Point &lt;br /&gt;@ &amp;gt;&amp;nbsp;At&amp;nbsp;Sign&amp;nbsp;,&amp;nbsp;Commercial&amp;nbsp;Sign &lt;br /&gt;# &amp;gt;&amp;nbsp;Crosshatch,&amp;nbsp;Sharp,&amp;nbsp;Pound&amp;nbsp;Sign&amp;nbsp;★★★ &lt;br /&gt;$ &amp;gt;&amp;nbsp;Doller&amp;nbsp;Sign&amp;nbsp;★★★ &lt;br /&gt;% &amp;gt;&amp;nbsp;Percent&amp;nbsp;Sign &lt;br /&gt;^ &amp;gt;&amp;nbsp;Circumflex&amp;nbsp;★★★★★★ &lt;br /&gt;&amp;amp; &amp;gt;&amp;nbsp;Ampersand&amp;nbsp;★★★★★★(엔퍼센드) &lt;br /&gt;* &amp;gt;&amp;nbsp;Asterisk&amp;nbsp;(별)&amp;nbsp; &lt;br /&gt;( &amp;gt;&amp;nbsp;Left&amp;nbsp;Parenthesis &lt;br /&gt;) &amp;gt;&amp;nbsp;Right&amp;nbsp;Parenthesis &lt;br /&gt;() &amp;gt;&amp;nbsp;Parentheses *&amp;nbsp;복수형&amp;nbsp;-ses &lt;br /&gt;- &amp;gt;&amp;nbsp;Hyphen,&amp;nbsp;Dash,&amp;nbsp;Minus&amp;nbsp;Sign &lt;br /&gt;_ &amp;gt;&amp;nbsp;Underscore,&amp;nbsp;Underline,&amp;nbsp;Underbar ★★★★★★ &lt;br /&gt;= &amp;gt;&amp;nbsp;Equal&amp;nbsp;Sign &lt;br /&gt;+ &amp;gt;&amp;nbsp;Plus&amp;nbsp;Sign &lt;br /&gt;&amp;brvbar; &amp;gt;&amp;nbsp;Vertical&amp;nbsp;Bar ★★★★★★&amp;nbsp;*&amp;nbsp;글꼴에&amp;nbsp;영향&amp;nbsp; &lt;br /&gt;[ &amp;gt;&amp;nbsp;Left&amp;nbsp;Bracket&amp;nbsp;★★★★★★ &lt;br /&gt;] &amp;gt;&amp;nbsp;Right&amp;nbsp;Bracket&amp;nbsp;★★★★★★ &lt;br /&gt;[] &amp;gt;&amp;nbsp;Brackets &lt;br /&gt;{ &amp;gt;&amp;nbsp;Left&amp;nbsp;Brace&amp;nbsp;★★★★★★ &lt;br /&gt;} &amp;gt;&amp;nbsp;Right&amp;nbsp;Brace&amp;nbsp;★★★★★★ &lt;br /&gt;{} &amp;gt;&amp;nbsp;Brace&amp;nbsp;★★★★★★ *&amp;nbsp;복수&amp;nbsp;형태로&amp;nbsp;사용하지&amp;nbsp;않음&amp;nbsp; &lt;br /&gt;; &amp;gt;&amp;nbsp;Semicolon&amp;nbsp;★★★★★★ &lt;br /&gt;: &amp;gt;&amp;nbsp;Colon&amp;nbsp;★★★★★★ &lt;br /&gt;&quot; &amp;gt;&amp;nbsp;Quotation&amp;nbsp;Mark &lt;br /&gt;' &amp;gt;&amp;nbsp;Apostrophe&amp;nbsp; &lt;br /&gt;, &amp;gt;&amp;nbsp;Comma &lt;br /&gt;. &amp;gt;&amp;nbsp;Period,&amp;nbsp;Full&amp;nbsp;Stop,&amp;nbsp;Dot &lt;br /&gt;&amp;lt; &amp;gt;&amp;nbsp;Less&amp;nbsp;Than&amp;nbsp;Sign,&amp;nbsp;Right&amp;nbsp;Angle&amp;nbsp;Bracket&amp;nbsp;★★★★★★ &lt;br /&gt;&amp;gt; &amp;gt;&amp;nbsp;Greater&amp;nbsp;Than&amp;nbsp;Sign,&amp;nbsp;Right&amp;nbsp;Angle&amp;nbsp;Bracket&amp;nbsp;★★★★★★ &lt;br /&gt;&amp;lt;&amp;nbsp;&amp;gt; &amp;gt;&amp;nbsp;angle&amp;nbsp;Brackets&amp;nbsp;★★★★★★ &lt;br /&gt;/ &amp;gt;&amp;nbsp;Slash,&amp;nbsp;Virgule &lt;br /&gt;\ &amp;gt;&amp;nbsp;Back&amp;nbsp;Slash,&amp;nbsp;Won&amp;nbsp;Sign&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;글꼴에&amp;nbsp;영향&amp;nbsp; &lt;br /&gt;? &amp;gt;&amp;nbsp;Question&amp;nbsp;Mark &lt;br /&gt;&amp;gt;&amp;nbsp;Space,&amp;nbsp;White&amp;nbsp;Space&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/[JAVA]</category>
      <category>Java</category>
      <category>자바</category>
      <category>풀스택</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/201</guid>
      <comments>https://aluck.tistory.com/201#entry201comment</comments>
      <pubDate>Fri, 16 May 2025 15:34:41 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]표기법 정리</title>
      <link>https://aluck.tistory.com/200</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;■■■■ &amp;nbsp;표기법 정리 ■■■■&lt;br /&gt;○&amp;nbsp;파스칼&amp;nbsp;표기법(Pascal&amp;nbsp;Notation,&amp;nbsp;Pascal&amp;nbsp;Case) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;파스칼&amp;nbsp;표기법은&amp;nbsp;첫&amp;nbsp;글자를&amp;nbsp;대문자로&amp;nbsp;구성하며 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;단어가&amp;nbsp;합성될&amp;nbsp;때&amp;nbsp;마다&amp;nbsp;각&amp;nbsp;단어의&amp;nbsp;첫&amp;nbsp;글자를&amp;nbsp;대문자로 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;표기하는&amp;nbsp;방식(방법)이다. &lt;br /&gt;&lt;br /&gt;ex)&amp;nbsp;class&amp;nbsp;MainTitle&amp;nbsp; class&amp;nbsp;CircleTest class&amp;nbsp;UserStatus &lt;br /&gt;&lt;br /&gt;자바에서는&amp;nbsp;클래스의&amp;nbsp;명명&amp;nbsp;규칙인&amp;nbsp;첫&amp;nbsp;글자를&amp;nbsp;대문자로&amp;nbsp;한다는&amp;nbsp;규칙에&amp;nbsp; &lt;br /&gt;캐멀&amp;nbsp;표기법이&amp;nbsp;합쳐진&amp;nbsp;형태이다. &lt;br /&gt;&lt;br /&gt;○&amp;nbsp;언더스코어&amp;nbsp;표기법(Underscore&amp;nbsp;Notation,&amp;nbsp;Underscore&amp;nbsp;Case,&amp;nbsp;밑줄&amp;nbsp;표기법) &lt;br /&gt;주로&amp;nbsp;데이터베이스&amp;nbsp;파트나&amp;nbsp;자바스크립트&amp;nbsp;파트에서&amp;nbsp; &lt;br /&gt;지역&amp;nbsp;변수를&amp;nbsp;사용할&amp;nbsp;경우에&amp;nbsp;언더바를&amp;nbsp;사용하는&amp;nbsp; &lt;br /&gt;언더스코어&amp;nbsp;표기법을&amp;nbsp;사용하기도&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;ex)&amp;nbsp;content_name&amp;nbsp;user_data &lt;br /&gt;&lt;br /&gt;○&amp;nbsp;캐멀&amp;nbsp;표기법(Camel&amp;nbsp;Notation,&amp;nbsp;Camel&amp;nbsp;Case,&amp;nbsp;낙타&amp;nbsp;표기법)&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;캐멀&amp;nbsp;표기법은&amp;nbsp;두&amp;nbsp;단어&amp;nbsp;이상의&amp;nbsp;변수명을&amp;nbsp;표현할&amp;nbsp;때 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;단어부터&amp;nbsp;첫&amp;nbsp;글자를&amp;nbsp;대문자로&amp;nbsp;표기하는&amp;nbsp;방법이다. &lt;br /&gt;&lt;br /&gt;ex)&amp;nbsp;addData&amp;nbsp;rainbowColor&amp;nbsp;userName &lt;br /&gt;&lt;br /&gt;변수의&amp;nbsp;명명&amp;nbsp;규칙(Naming&amp;nbsp;Rule)인&amp;nbsp;첫&amp;nbsp;글자를&amp;nbsp;소문자로&amp;nbsp;한다는&amp;nbsp;규칙과 &lt;br /&gt;캐멀&amp;nbsp;표기법이&amp;nbsp;합쳐져서&amp;nbsp;네이밍이&amp;nbsp;이루어진다. &lt;br /&gt;&lt;br /&gt;캐멀&amp;nbsp;표기법은&amp;nbsp;자바에서&amp;nbsp;시작된&amp;nbsp;것으로 &lt;br /&gt;변수명&amp;nbsp;혹은&amp;nbsp;클래스명을&amp;nbsp;작성할&amp;nbsp;때 &lt;br /&gt;단어마다&amp;nbsp;단어의&amp;nbsp;첫&amp;nbsp;글자를&amp;nbsp;대문자료&amp;nbsp;표기하는&amp;nbsp;것이다. &lt;br /&gt;이&amp;nbsp;표기법은&amp;nbsp;각&amp;nbsp;단어의&amp;nbsp;첫&amp;nbsp;글자가&amp;nbsp;대문자로&amp;nbsp;표기되어 &lt;br /&gt;마치&amp;nbsp;낙타의&amp;nbsp;등처럼&amp;nbsp;보인다는&amp;nbsp;설이&amp;nbsp;있지만....&amp;nbsp;사실과는&amp;nbsp;다르다. &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;클래스&amp;nbsp;이름 &lt;br /&gt;:&amp;nbsp;맨&amp;nbsp;앞&amp;nbsp;글자를&amp;nbsp;대문자로&amp;nbsp;시작한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;두&amp;nbsp;번째로&amp;nbsp;오는&amp;nbsp;의미있는&amp;nbsp;단어의&amp;nbsp;앞&amp;nbsp;글자도&amp;nbsp;대문자이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;ex)&amp;nbsp;public&amp;nbsp;class&amp;nbsp;Myclass{}&amp;nbsp;//(o) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;claas&amp;nbsp;Myclass{}&amp;nbsp;//&amp;nbsp;(x) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;변수&amp;nbsp;이름 &lt;br /&gt;:&amp;nbsp;맨&amp;nbsp;앞&amp;nbsp;글자를&amp;nbsp;소문자로&amp;nbsp;시작한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;두&amp;nbsp;번째로&amp;nbsp;오는&amp;nbsp;의미있는&amp;nbsp;단어의&amp;nbsp;앞&amp;nbsp;글자는&amp;nbsp;대문자이다. &lt;br /&gt;&lt;br /&gt;ex)&amp;nbsp;String&amp;nbsp;myName; //(o) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;MyName;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//(x) &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;메소드&amp;nbsp;이름 &lt;br /&gt;:&amp;nbsp;맨&amp;nbsp;앞&amp;nbsp;글자를&amp;nbsp;소문자로&amp;nbsp;한다. &lt;br /&gt;두&amp;nbsp;번째로&amp;nbsp;오는&amp;nbsp;의미있는&amp;nbsp;단어의&amp;nbsp;앞&amp;nbsp;글자는&amp;nbsp;대문자이다. &lt;br /&gt;(변수&amp;nbsp;이름과&amp;nbsp;같은&amp;nbsp;방법) &lt;br /&gt;단,&amp;nbsp;메소드의&amp;nbsp;이름은&amp;nbsp;가급적&amp;nbsp;동사로&amp;nbsp;시작한다. &lt;br /&gt;&lt;br /&gt;ex)&amp;nbsp;public&amp;nbsp;String&amp;nbsp;createMyName(){}&amp;nbsp;//&amp;nbsp;(o) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;createmymame(){}&amp;nbsp;//&amp;nbsp;(x) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pulic&amp;nbsp;String&amp;nbsp;myName(){} &amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;(동사가&amp;nbsp;아니라&amp;nbsp;명사이므로&amp;nbsp;추천하지&amp;nbsp;않음) &lt;br /&gt;&lt;br /&gt;○&amp;nbsp;헝가리언&amp;nbsp;표기법(Hungarian&amp;nbsp;notation,&amp;nbsp;&amp;nbsp;Hungarian&amp;nbsp;Case) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;헝가리언&amp;nbsp;표기법은&amp;nbsp;Microsoft&amp;nbsp;사의 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;charles&amp;nbsp;Simony&amp;nbsp;라는&amp;nbsp;프로그래머에&amp;nbsp;의해&amp;nbsp;만들어졌다고&amp;nbsp;한다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(당시&amp;nbsp;헝가리에서&amp;nbsp;이민&amp;nbsp;온&amp;nbsp;개발자) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;그가&amp;nbsp;코딩할&amp;nbsp;때&amp;nbsp;습관적으로&amp;nbsp;즐겨쓰던&amp;nbsp;접두사&amp;nbsp;명명&amp;nbsp;방식이 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;빌&amp;nbsp;게이츠의&amp;nbsp;눈에&amp;nbsp;띄어&amp;nbsp;일반화된&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;변수를&amp;nbsp;표기할&amp;nbsp;때&amp;nbsp;앞에&amp;nbsp;접두어로&amp;nbsp;쉽게&amp;nbsp;알아볼&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;표기하였는데 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;자료형을&amp;nbsp;쉽게&amp;nbsp;알아볼&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;ex)&amp;nbsp;int&amp;nbsp;nNum&amp;nbsp;float&amp;nbsp;fNum &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;argument&amp;nbsp;of&amp;nbsp;string&amp;nbsp;-&amp;gt;&amp;nbsp;args &lt;br /&gt;&lt;br /&gt;Data&amp;nbsp;Type prefix&amp;nbsp; Example &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;------------------------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean b bContinue &lt;br /&gt;int n nIndex &lt;br /&gt;short n nNum &lt;br /&gt;char c cFirstInitial &lt;br /&gt;String s(str)&amp;nbsp;&amp;nbsp;sCustomerName(strCustomerName) &lt;br /&gt;&lt;br /&gt;*. 실제&amp;nbsp;자바&amp;nbsp;프로젝트에서&amp;nbsp;클래스는&amp;nbsp;파스칼&amp;nbsp;표기법으로(+&amp;nbsp;캐멀&amp;nbsp;표기법) &lt;br /&gt;변수나&amp;nbsp;메소드의&amp;nbsp;이름은&amp;nbsp;캐멀&amp;nbsp;표기법으로&amp;nbsp;사용하고, &lt;br /&gt;상수화된&amp;nbsp;변수일&amp;nbsp;경우(final)&amp;nbsp;밑줄&amp;nbsp;표기법으로&amp;nbsp;사용하며, &lt;br /&gt;간혹&amp;nbsp;오래된&amp;nbsp;프로젝트를&amp;nbsp;유지보수&amp;nbsp;하다보면 &lt;br /&gt;헝가리언&amp;nbsp;표기법으로&amp;nbsp;네이밍을&amp;nbsp;하는&amp;nbsp;개발자들도&amp;nbsp;자주&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>IT/[JAVA]</category>
      <category>Java</category>
      <category>자바</category>
      <category>풀스택</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/200</guid>
      <comments>https://aluck.tistory.com/200#entry200comment</comments>
      <pubDate>Fri, 16 May 2025 09:10:08 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]연산자 그리고 사용</title>
      <link>https://aluck.tistory.com/199</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SCE&amp;nbsp;앞의&amp;nbsp;계산식이&amp;nbsp;true면&amp;nbsp;뒷단은&amp;nbsp;계산&amp;nbsp;안해도&amp;nbsp;결과는&amp;nbsp;true &lt;br /&gt;||&amp;nbsp;빵&amp;nbsp;또는&amp;nbsp;우유&amp;nbsp;또는&amp;nbsp;커피&amp;nbsp;-&amp;nbsp;빵&amp;nbsp;주면&amp;nbsp;참.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;04-2.&amp;nbsp;자바에서&amp;nbsp;제공하는&amp;nbsp;단항&amp;nbsp;연산자들 &lt;br /&gt;++a&amp;nbsp;a를&amp;nbsp;1만큼&amp;nbsp;증감시켜라.지금&amp;nbsp;당장. &lt;br /&gt;a++&amp;nbsp;a를&amp;nbsp;1만큼&amp;nbsp;증감시켜라.다음번에. &lt;br /&gt;&lt;br /&gt;**--------------** &lt;br /&gt;int&amp;nbsp;num1&amp;nbsp;=&amp;nbsp;7; &lt;br /&gt;int&amp;nbsp;num2,&amp;nbsp;num3; &lt;br /&gt;&lt;br /&gt;num2&amp;nbsp;=&amp;nbsp;num1++; &lt;br /&gt;num3&amp;nbsp;=&amp;nbsp;num1--;&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;위&amp;nbsp;소스에서&amp;nbsp;다음에&amp;nbsp;증감하라고&amp;nbsp;선약했으니&amp;nbsp;8이&amp;nbsp;됨.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;sysout(num1,num2,num3); &lt;br /&gt;num1&amp;nbsp;=&amp;nbsp;7&amp;nbsp;num2&amp;nbsp;=&amp;nbsp;7&amp;nbsp;num3&amp;nbsp;=&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;위&amp;nbsp;소스에서&amp;nbsp;다음에&amp;nbsp;차감하라고&amp;nbsp;선약했으니&amp;nbsp;num1은&amp;nbsp;7이됨.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;04-3.&amp;nbsp;비트와&amp;nbsp;관련이&amp;nbsp;있는&amp;nbsp;연산자들 &lt;br /&gt;1.&amp;nbsp;비트단위&amp;nbsp;연산자는&amp;nbsp;연산&amp;nbsp;속도가&amp;nbsp;빠르다.&amp;nbsp; &lt;br /&gt;2.&amp;nbsp;고급개발자가&amp;nbsp;될수록&amp;nbsp;비트단위&amp;nbsp;연산자를&amp;nbsp;쓰는일이&amp;nbsp;많음. &lt;br /&gt;&lt;br /&gt;&amp;amp;&amp;nbsp;비트앤드&amp;nbsp;1&amp;nbsp;1&amp;nbsp;=&amp;nbsp;1&amp;nbsp;/&amp;nbsp;1&amp;nbsp;0&amp;nbsp;=&amp;nbsp;0 &lt;br /&gt;|&amp;nbsp;논리or &lt;br /&gt;^&amp;nbsp;(XOR)&amp;nbsp;0&amp;nbsp;0&amp;nbsp;=&amp;nbsp;0&amp;nbsp;/&amp;nbsp;1&amp;nbsp;0&amp;nbsp;=&amp;nbsp;1&amp;nbsp;(같으면&amp;nbsp;0&amp;nbsp;다르면&amp;nbsp;1) &lt;br /&gt;~&amp;nbsp;비트NOT(틸드)&amp;nbsp;비트열&amp;nbsp;반전&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;비트&amp;nbsp;쉬프트&amp;nbsp;연산자=비트열이동(가장&amp;nbsp;속도가&amp;nbsp;빠름) &lt;br /&gt;&amp;gt;&amp;gt;&amp;nbsp;비트열을&amp;nbsp;오른쪽으로&amp;nbsp;이동 &lt;br /&gt;음수일&amp;nbsp;경우&amp;nbsp;1&amp;nbsp;양수의&amp;nbsp;경우&amp;nbsp;0으로&amp;nbsp;채움&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;lt;&amp;lt;&amp;nbsp;비트열을&amp;nbsp;왼쪽으로&amp;nbsp;이동&amp;nbsp;&amp;lt;-&amp;gt;&amp;nbsp;반대는&amp;nbsp;이것임.&amp;nbsp;&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;비트열을&amp;nbsp;오른쪽&amp;nbsp;이동&amp;nbsp; &lt;br /&gt;&lt;br /&gt;EX)51&amp;nbsp;:&amp;nbsp;00110011&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;11001100 &lt;br /&gt;&lt;br /&gt;SYSOUT(2&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;1);&amp;nbsp;//&amp;nbsp;4 &lt;br /&gt;0000000&amp;nbsp;0000000&amp;nbsp;0000000&amp;nbsp;0000010&amp;nbsp;-&amp;gt;&amp;nbsp;0000000&amp;nbsp;0000000&amp;nbsp;0000000&amp;nbsp;00000100 &lt;br /&gt;&lt;br /&gt;ide&amp;nbsp;-&amp;nbsp;통합개발환경 &lt;br /&gt;C:\Program&amp;nbsp;Files\EditPlus &lt;br /&gt;&lt;br /&gt;ctrl&amp;nbsp;+&amp;nbsp;1&amp;nbsp; &lt;br /&gt;&lt;br /&gt;코드&amp;nbsp;작성시&amp;nbsp;주의사항 &lt;br /&gt;1.&amp;nbsp;지시로&amp;nbsp;복사,붙여넣기&amp;nbsp;하라고&amp;nbsp;하지&amp;nbsp;않는&amp;nbsp;이상은&amp;nbsp;절대&amp;nbsp;ctrl+c,v&amp;nbsp;**절대&amp;nbsp;안&amp;nbsp;한다.(4년차까지는&amp;nbsp;직접&amp;nbsp;작성해보겠다라는&amp;nbsp;마음으로..) &lt;br /&gt;기대감보다&amp;nbsp;성장폭이&amp;nbsp;늦음.&amp;nbsp; &lt;br /&gt;2.&amp;nbsp;새&amp;nbsp;파일&amp;nbsp;작성시&amp;nbsp;ctrl+n &lt;br /&gt;&lt;br /&gt;클래스&amp;nbsp;설계,&amp;nbsp;메소드&amp;nbsp;정의,&amp;nbsp;변수는&amp;nbsp;선언,&amp;nbsp;가져다&amp;nbsp;쓸&amp;nbsp;땐&amp;nbsp;호출한다. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;명칭 &lt;br /&gt;&quot;1&quot;&amp;nbsp;더블쿼테이션&amp;nbsp;겹따옴표 &lt;br /&gt;'1'&amp;nbsp;싱글쿼테이션&amp;nbsp;홑따옴표&amp;nbsp; &lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;1.0&amp;nbsp; &lt;br /&gt;&lt;br /&gt;콘솔창에서&amp;nbsp;복사기능이&amp;nbsp;안&amp;nbsp;될&amp;nbsp;때&amp;nbsp;:&amp;nbsp;블럭잡은상태에서&amp;nbsp;키보드를&amp;nbsp;찍거나&amp;nbsp;엔터를&amp;nbsp;치면&amp;nbsp;블럭이&amp;nbsp;사라지고&amp;nbsp;복사된&amp;nbsp;것임. &lt;br /&gt;앞에&amp;nbsp;접두어가&amp;nbsp;0이면&amp;nbsp;8진수&amp;nbsp;0x이면&amp;nbsp;16진수&amp;nbsp; &lt;br /&gt;&lt;br /&gt;에디터플러스&amp;nbsp;사용관련&amp;nbsp; &lt;br /&gt;컴파일&amp;nbsp;실행이&amp;nbsp;멈춘&amp;nbsp;경우&amp;nbsp;c+s+1&amp;nbsp;누르면&amp;nbsp;다시&amp;nbsp;컴파일이&amp;nbsp;될것임.&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/[JAVA]</category>
      <category>Java</category>
      <category>국비지원</category>
      <category>자바</category>
      <category>자바공부</category>
      <category>풀스택</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/199</guid>
      <comments>https://aluck.tistory.com/199#entry199comment</comments>
      <pubDate>Wed, 14 May 2025 23:48:45 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] 변수와 자료형</title>
      <link>https://aluck.tistory.com/198</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2장.&amp;nbsp;변수와&amp;nbsp;자료형(메모리와&amp;nbsp;관련된&amp;nbsp;이야기들..) &lt;br /&gt;변수&amp;nbsp;-&amp;nbsp;수시로&amp;nbsp;값이&amp;nbsp;변할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;수 &lt;br /&gt;보관&amp;nbsp;작성&amp;nbsp;꺼내쓰고&amp;nbsp;다시&amp;nbsp;새로운&amp;nbsp;형태를&amp;nbsp;작성하고&amp;nbsp;꺼내쓰는&amp;nbsp;반복 &lt;br /&gt;메모리&amp;nbsp;-&amp;nbsp;각각의&amp;nbsp;네모박스가&amp;nbsp;저장할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;공간&amp;nbsp;/&amp;nbsp;공간관리는&amp;nbsp;윈도우/&amp;nbsp;다만,&amp;nbsp;메모리&amp;nbsp;공간은&amp;nbsp;한정적&amp;nbsp;/&amp;nbsp;메모리는&amp;nbsp;비싸다.&amp;nbsp;&amp;nbsp; &lt;br /&gt;ex)&amp;nbsp;식당에&amp;nbsp;방문한&amp;nbsp;손님들(1번부터&amp;nbsp;순서데로&amp;nbsp;앉지&amp;nbsp;않고&amp;nbsp;테이블&amp;nbsp;점유양도&amp;nbsp;다름) &lt;br /&gt;가비지&amp;nbsp;컬렉터&amp;nbsp;-&amp;nbsp;메모리를&amp;nbsp;수시로&amp;nbsp;정리 &lt;br /&gt;&lt;br /&gt;0,1&amp;nbsp;형태로&amp;nbsp;컴퓨터에&amp;nbsp;저장 &lt;br /&gt;변수는&amp;nbsp;데이터&amp;nbsp;저장되고&amp;nbsp;관리됨&amp;nbsp; &lt;br /&gt;&lt;br /&gt;변수의&amp;nbsp;선언&amp;nbsp;int&amp;nbsp;num; &lt;br /&gt;[int]&amp;nbsp;와&amp;nbsp;같이&amp;nbsp;변수의&amp;nbsp;특성을&amp;nbsp;결정짓는&amp;nbsp;키워드를&amp;nbsp;가리켜&amp;nbsp;[[자료형=데이터타입]]&amp;nbsp;이라함. &lt;br /&gt;&lt;br /&gt;-----------------------------필기하라고&amp;nbsp;한&amp;nbsp;내용&amp;nbsp; &lt;br /&gt;*.&amp;nbsp;자료형의&amp;nbsp;종류와&amp;nbsp;구분&amp;nbsp; &lt;br /&gt;&lt;br /&gt;자료형 데이터&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;메모리&amp;nbsp;크기 표현&amp;nbsp;가능&amp;nbsp;범위 &lt;br /&gt;-------------------------------------------------- &lt;br /&gt;boolean&amp;nbsp;참과&amp;nbsp;거짓&amp;nbsp;&amp;nbsp;1바이트&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; true,&amp;nbsp;false &lt;br /&gt;-------------------------------------------------- &lt;br /&gt;char 문자&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2바이트 모든&amp;nbsp;유니코드&amp;nbsp;문자 &lt;br /&gt;-------------------------------------------------- &lt;br /&gt;byte 정수 &amp;nbsp;&amp;nbsp;&amp;nbsp;1바이트 -128&amp;nbsp;~&amp;nbsp;127&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;short 정수&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2바이트 -32768&amp;nbsp;~&amp;nbsp;32767&amp;nbsp; &lt;br /&gt;int 정수 &amp;nbsp;&amp;nbsp;&amp;nbsp;4바이트 -21억&amp;nbsp;~&amp;nbsp;21억 &lt;br /&gt;long 정수&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8바이트 -92.....&amp;nbsp;~&amp;nbsp;92...... &lt;br /&gt;-------------------------------------------------- &lt;br /&gt;float 실수&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4바이트 무한대??&amp;nbsp; &lt;br /&gt;double 실수&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;8바이트&amp;nbsp; &lt;br /&gt;&lt;br /&gt;1byte&amp;nbsp;-&amp;gt;&amp;nbsp;8bit&amp;nbsp;ㅁㅁㅁㅁㅁㅁㅁㅁ(ㅁ한칸은&amp;nbsp;1또는&amp;nbsp;0이&amp;nbsp;들어가는&amp;nbsp;공간) &lt;br /&gt;&lt;br /&gt;Ip&amp;nbsp;Address&amp;nbsp;-&amp;gt;&amp;nbsp;IPV4&amp;nbsp;-&amp;gt;&amp;nbsp;32bit&amp;nbsp;구성&amp;nbsp;&amp;nbsp;-&amp;gt;&amp;nbsp;4byte&amp;nbsp; &lt;br /&gt;128+64+32+16+8+4+2+1&amp;nbsp;=&amp;nbsp;255&amp;nbsp;/이러한&amp;nbsp;이유로&amp;nbsp;아이피&amp;nbsp;최대자리수는&amp;nbsp;255/ &lt;br /&gt;&lt;br /&gt;10진수&amp;nbsp;0&amp;nbsp;1&amp;nbsp;2&amp;nbsp;3&amp;nbsp;4&amp;nbsp;5&amp;nbsp;6&amp;nbsp;7&amp;nbsp;8&amp;nbsp;9 0&amp;nbsp;1 &lt;br /&gt;16진수&amp;nbsp;0&amp;nbsp;1&amp;nbsp;2&amp;nbsp;3&amp;nbsp;4&amp;nbsp;5&amp;nbsp;6&amp;nbsp;7&amp;nbsp;8&amp;nbsp;9&amp;nbsp;A&amp;nbsp;B&amp;nbsp;C&amp;nbsp;D&amp;nbsp;E&amp;nbsp;F &lt;br /&gt;&lt;br /&gt;자바의&amp;nbsp;키워드=예약어는&amp;nbsp;변수의&amp;nbsp;이름으로&amp;nbsp;사용&amp;nbsp;불가 &lt;br /&gt;&lt;br /&gt;정수의&amp;nbsp;표현방식&amp;nbsp; &lt;br /&gt;바이트&amp;nbsp;크기의&amp;nbsp;차이는&amp;nbsp;표현범위의&amp;nbsp;차이로&amp;nbsp;이어진다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;ex)&amp;nbsp;싸이21억뷰&amp;nbsp;멈춤&amp;nbsp;(int&amp;gt;long&amp;nbsp;데이터타입변환) &lt;br /&gt;&lt;br /&gt;부호비트&amp;nbsp;0이면&amp;nbsp;양수&amp;nbsp;1이면&amp;nbsp;음수 &lt;br /&gt;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0000000&amp;nbsp;-&amp;nbsp;0 &lt;br /&gt;부호 &lt;br /&gt;&lt;br /&gt;0000010&amp;nbsp;-&amp;gt;&amp;nbsp;2 &lt;br /&gt;1000010&amp;nbsp;-&amp;gt;&amp;nbsp;-2&amp;nbsp;x &lt;br /&gt;&lt;br /&gt;음의&amp;nbsp;정수&amp;nbsp;표현 &lt;br /&gt;&lt;br /&gt;00000101&amp;nbsp;-&amp;gt;&amp;nbsp;결과&amp;nbsp;5&amp;nbsp;(421자리의&amp;nbsp;합)&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;[[1의&amp;nbsp;보수&amp;nbsp;(1과&amp;nbsp;0을&amp;nbsp;바꾸는&amp;nbsp;비트열&amp;nbsp;반전)&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;11111010&amp;nbsp;&amp;gt;&amp;gt; &lt;br /&gt;&lt;br /&gt;11111010 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+1&amp;nbsp;이&amp;nbsp;결과물에&amp;nbsp;1을&amp;nbsp;더함&amp;nbsp;]]&amp;nbsp;------&amp;nbsp;2의&amp;nbsp;보수를&amp;nbsp;취한다.&amp;gt;&amp;gt;&amp;nbsp; &lt;br /&gt;11111011&amp;nbsp;-&amp;gt;&amp;nbsp;결과&amp;nbsp;-5&amp;nbsp; &lt;br /&gt;검산&amp;nbsp;:&amp;nbsp;5와&amp;nbsp;-5를&amp;nbsp;더해서&amp;nbsp;0이&amp;nbsp;나오는지&amp;nbsp;확인&amp;nbsp; &lt;br /&gt;(메모리탈락)&amp;nbsp; &lt;br /&gt;1&amp;nbsp;1111111&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;00000101&amp;nbsp;&amp;gt;&amp;nbsp;5 &lt;br /&gt;+&amp;nbsp;&amp;nbsp;11111011&amp;nbsp;&amp;gt;&amp;nbsp;-5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;-------------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;00000000&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;0&amp;nbsp; &lt;br /&gt;■&amp;nbsp;음의&amp;nbsp;정수&amp;nbsp;표현 &lt;br /&gt;&lt;br /&gt;byte기반&amp;nbsp;-&amp;nbsp;8bit로&amp;nbsp;표현한다는&amp;nbsp;뜻.&amp;nbsp; &lt;br /&gt;--------------------------------------------1byte&amp;nbsp;=&amp;nbsp;8bit&amp;nbsp; &lt;br /&gt;**&amp;nbsp;128&amp;nbsp;64&amp;nbsp;32&amp;nbsp;16&amp;nbsp;8&amp;nbsp;4&amp;nbsp;2&amp;nbsp;1&amp;nbsp; &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;[-10]&amp;nbsp;을&amp;nbsp;byte&amp;nbsp;기반에&amp;nbsp;비트열로&amp;nbsp;나타낸다.&amp;nbsp;11110110 &lt;br /&gt;2.&amp;nbsp;[-27]&amp;nbsp;을&amp;nbsp;byte&amp;nbsp;기반에&amp;nbsp;비트열로&amp;nbsp;나타낸다.&amp;nbsp;11100101&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;양수&amp;nbsp;27비트열&amp;nbsp;찾기&amp;nbsp;**을&amp;nbsp;통해&amp;nbsp;찾기 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;00011011&amp;nbsp;&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;양수27&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;1의&amp;nbsp;보수(비트열반전)&amp;nbsp;&amp;gt;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11100100&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+1&amp;nbsp;이&amp;nbsp;결과물에&amp;nbsp;1을&amp;nbsp;더함&amp;nbsp;]]&amp;nbsp;------&amp;nbsp;2의&amp;nbsp;보수를&amp;nbsp;취한다.&amp;gt;&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11100101&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;음수&amp;nbsp;-27 &lt;br /&gt;검산&amp;nbsp;:&amp;nbsp;27와&amp;nbsp;-27를&amp;nbsp;더해서&amp;nbsp;0이&amp;nbsp;나오는지&amp;nbsp;확인&amp;nbsp; &lt;br /&gt;3.&amp;nbsp;[-31]&amp;nbsp;을&amp;nbsp;byte&amp;nbsp;기반에&amp;nbsp;비트열로&amp;nbsp;나타낸다.&amp;nbsp;11100001 &lt;br /&gt;4.&amp;nbsp;[-13]&amp;nbsp;을&amp;nbsp;byte&amp;nbsp;기반에&amp;nbsp;비트열로&amp;nbsp;나타낸다.&amp;nbsp;11110011&amp;nbsp; &lt;br /&gt;5.&amp;nbsp;byte&amp;nbsp;기반의&amp;nbsp;[11001010]을&amp;nbsp;10진수&amp;nbsp;정수형으로&amp;nbsp;나타낸다.&amp;nbsp;-&amp;nbsp;54&amp;nbsp;/&amp;nbsp;기존&amp;nbsp;프로세스를&amp;nbsp;역순으로&amp;nbsp;접근해서&amp;nbsp;해결.&amp;nbsp; &lt;br /&gt;[a]&amp;nbsp;10진수&amp;nbsp;대상&amp;nbsp;양수&amp;nbsp;-&amp;nbsp;비트열&amp;nbsp;&amp;gt;&amp;nbsp;1의&amp;nbsp;보수(비트열&amp;nbsp;반전)&amp;nbsp;&amp;gt;&amp;nbsp;1을&amp;nbsp;더함&amp;gt;&amp;nbsp;10진수&amp;nbsp;대상&amp;nbsp;음수&amp;nbsp;..&amp;nbsp;비트열&amp;nbsp;&amp;gt;&amp;nbsp;1을&amp;nbsp;뺌&amp;nbsp;&amp;gt;&amp;nbsp;1의&amp;nbsp;보수(비트열&amp;nbsp;반전)&amp;nbsp;&amp;gt;&amp;nbsp;10진수&amp;nbsp;대상&amp;nbsp;양수&amp;nbsp;..&amp;nbsp;비트열&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;2 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11001010 &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 &lt;br /&gt;------------ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11001001 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;00110110&amp;nbsp;-&amp;nbsp;32+&amp;nbsp;16+&amp;nbsp;4&amp;nbsp;+&amp;nbsp;2&amp;nbsp;=&amp;nbsp;54&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;검산&amp;nbsp;00110110&amp;nbsp;&amp;gt;&amp;nbsp;54 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+11001010&amp;nbsp;&amp;gt;&amp;nbsp;-54 &lt;br /&gt;--------------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;00000000 &lt;br /&gt;&lt;br /&gt;[b]10진수&amp;nbsp;대상&amp;nbsp;음수&amp;nbsp;-&amp;nbsp;비트열&amp;nbsp;&amp;gt;&amp;nbsp;1의&amp;nbsp;보수(비트열&amp;nbsp;반전)&amp;nbsp;&amp;gt;&amp;nbsp;1을&amp;nbsp;더함&amp;gt;&amp;nbsp;10진수&amp;nbsp;대상&amp;nbsp;양수&amp;nbsp;..&amp;nbsp;비트열 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;11001010 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1의&amp;nbsp;보수(비트열반전)&amp;nbsp;&amp;gt;&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;00110101 &lt;br /&gt;&amp;nbsp;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;&amp;nbsp;1을&amp;nbsp;더함&amp;nbsp; &lt;br /&gt;&amp;nbsp;---------- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;00110110&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;6.&amp;nbsp;byte&amp;nbsp;기반의&amp;nbsp;[11110101]을&amp;nbsp;10진수&amp;nbsp;정수형으로&amp;nbsp;나타낸다.&amp;nbsp;-11&amp;nbsp; &lt;br /&gt;7.&amp;nbsp;byte&amp;nbsp;기반의&amp;nbsp;[10000001]을&amp;nbsp;10진수&amp;nbsp;정수형으로&amp;nbsp;나타낸다.&amp;nbsp;-127&amp;nbsp; &lt;br /&gt;8.&amp;nbsp;byte&amp;nbsp;기반의&amp;nbsp;[10101010]을&amp;nbsp;10진수&amp;nbsp;정수형으로&amp;nbsp;나타낸다.&amp;nbsp;-86&amp;nbsp;&amp;nbsp; &lt;br /&gt;9.&amp;nbsp;byte&amp;nbsp;기반의&amp;nbsp;[10000101]을&amp;nbsp;10진수&amp;nbsp;정수형으로&amp;nbsp;나타낸다.&amp;nbsp;-123&amp;nbsp; &lt;br /&gt;10.&amp;nbsp;byte&amp;nbsp;기반의&amp;nbsp;[11111111]을&amp;nbsp;10진수&amp;nbsp;정수형으로&amp;nbsp;나타낸다.&amp;nbsp;-1 &lt;br /&gt;&lt;br /&gt;02-3.&amp;nbsp;실수&amp;nbsp;표현방식의&amp;nbsp;이해 &lt;br /&gt;실수&amp;nbsp;표현의&amp;nbsp;문제점 &lt;br /&gt;0과&amp;nbsp;1사이의&amp;nbsp;실수만&amp;nbsp;해도&amp;nbsp;그&amp;nbsp;수가&amp;nbsp;무한대 &lt;br /&gt;단순히&amp;nbsp;몇&amp;nbsp;바이트&amp;nbsp;정도로&amp;nbsp;모든&amp;nbsp;실수&amp;nbsp;표현은&amp;nbsp;불간으하다. &lt;br /&gt;정밀도를&amp;nbsp;포기하고&amp;nbsp;대신&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;값의&amp;nbsp;범위를&amp;nbsp;넓혀버리자. &lt;br /&gt;참조는&amp;nbsp;역순의&amp;nbsp;과정을&amp;nbsp;거친다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;02-4.&amp;nbsp;자료형의&amp;nbsp;이해 &lt;br /&gt;정수를&amp;nbsp;표현하는데&amp;nbsp;사용되는&amp;nbsp;바이트&amp;nbsp;크기에&amp;nbsp;따라서&amp;nbsp;구분이&amp;nbsp;됨.&amp;nbsp;byte,short,&amp;nbsp;int,&amp;nbsp;long&amp;nbsp; &lt;br /&gt;작은&amp;nbsp;크기의&amp;nbsp;정수&amp;nbsp;저장에는&amp;nbsp;변환&amp;nbsp;과정을&amp;nbsp;&amp;nbsp;생략할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;-----int를&amp;nbsp;선택 &lt;br /&gt;&lt;br /&gt;int를&amp;nbsp;범용적으로&amp;nbsp;쓰는&amp;nbsp;건&amp;nbsp;pc가&amp;nbsp;32비트로&amp;nbsp;개발됐기&amp;nbsp;때문이고&amp;nbsp;사이즈&amp;nbsp;변환이&amp;nbsp;필요없는&amp;nbsp;int&amp;nbsp;형을&amp;nbsp;쓰게됨.&amp;nbsp; &lt;br /&gt;ex)&amp;nbsp;간장종지&amp;nbsp;/&amp;nbsp;세수대야 &lt;br /&gt;속도보다&amp;nbsp;저장소의&amp;nbsp;역할이&amp;nbsp;중요하다면&amp;nbsp;int를&amp;nbsp;쓸&amp;nbsp;필요가&amp;nbsp;없다.&amp;nbsp;Mp3,&amp;nbsp;동영상&amp;nbsp;파일&amp;nbsp; &lt;br /&gt;데이터&amp;nbsp;성격이&amp;nbsp;강하다면&amp;nbsp;short와&amp;nbsp;byte를&amp;nbsp;활용 &lt;br /&gt;&lt;br /&gt;자바의&amp;nbsp;2가지&amp;nbsp;실수&amp;nbsp;자료형 &lt;br /&gt;float,&amp;nbsp;double &lt;br /&gt;위&amp;nbsp;두가지&amp;nbsp;모두&amp;nbsp;충분한&amp;nbsp;표현범위를&amp;nbsp;가지나&amp;nbsp;정밀도의&amp;nbsp;차이가&amp;nbsp;있음.&amp;nbsp; &lt;br /&gt;실수&amp;nbsp;타입은&amp;nbsp;더&amp;nbsp;정밀하게&amp;nbsp;보여야&amp;nbsp;하므로&amp;nbsp;-----double&amp;nbsp;선호&amp;nbsp;ex)작은지도와&amp;nbsp;큰지도에서의&amp;nbsp;점을&amp;nbsp;찍었을&amp;nbsp;때&amp;nbsp; &lt;br /&gt;&lt;br /&gt;문자자료형&amp;nbsp;char&amp;nbsp;-&amp;nbsp;2byte &lt;br /&gt;유니코드는&amp;nbsp;전세계&amp;nbsp;문자표현하는&amp;nbsp;코드집합&amp;nbsp;/문자는&amp;nbsp;작은&amp;nbsp;따옴표로&amp;nbsp;표현한다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;참과&amp;nbsp;거짓을&amp;nbsp;표현하는&amp;nbsp;자료형&amp;nbsp;boolean&amp;nbsp;-&amp;nbsp;1byte &lt;br /&gt;true&amp;nbsp;참&amp;nbsp;false&amp;nbsp;거짓 &lt;br /&gt;&lt;br /&gt;3장.&amp;nbsp;상수와&amp;nbsp;형&amp;nbsp;변환&amp;nbsp; &lt;br /&gt;자료형을&amp;nbsp;기반으로&amp;nbsp;표현이&amp;nbsp;되는&amp;nbsp;상수 &lt;br /&gt;표현되는&amp;nbsp;데이터는&amp;nbsp;상수&amp;nbsp;아니면&amp;nbsp;변수 &lt;br /&gt;&lt;br /&gt;int&amp;nbsp;num&amp;nbsp;=&amp;nbsp;1&amp;nbsp;+&amp;nbsp;5; &lt;br /&gt;변수와&amp;nbsp;마찬가지로&amp;nbsp;상수도&amp;nbsp;메모리&amp;nbsp;공간에&amp;nbsp;저장되나&amp;nbsp;이름이&amp;nbsp;없기에&amp;nbsp;값&amp;nbsp;변경이&amp;nbsp;불가능.상수는&amp;nbsp;존재의미가&amp;nbsp;없어지면&amp;nbsp;바로&amp;nbsp;소멸된다.&amp;nbsp; &lt;br /&gt;자바는&amp;nbsp;메모리의&amp;nbsp;주소값을&amp;nbsp;직접적으로&amp;nbsp;접근하는&amp;nbsp;것을&amp;nbsp;절대로&amp;nbsp;허용하지&amp;nbsp;않는다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;----------------&amp;nbsp;=&amp;nbsp;대입연산자&amp;nbsp; &lt;br /&gt;int&amp;nbsp;num&amp;nbsp;=&amp;nbsp;10&amp;nbsp;+&amp;nbsp;20;&amp;nbsp;오른쪽을&amp;nbsp;다&amp;nbsp;처리해&amp;nbsp;놓고(10+20을&amp;nbsp;합산한&amp;nbsp;후)&amp;nbsp;왼쪽으로&amp;nbsp;대입한다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;long&amp;nbsp;num&amp;nbsp;=&amp;nbsp;2500000000;&amp;nbsp;25억이&amp;nbsp;상수상태로&amp;nbsp;넘어가면&amp;nbsp;에러,&amp;nbsp;자바는&amp;nbsp;int에&amp;nbsp;저장할&amp;nbsp;수&amp;nbsp;없으니까 &lt;br /&gt;long&amp;nbsp;num&amp;nbsp;=&amp;nbsp;2500000000L;&amp;nbsp;오류가&amp;nbsp;안나게&amp;nbsp;하려면&amp;nbsp;&amp;nbsp;접미사에&amp;nbsp;L형으로&amp;nbsp;표기해&amp;nbsp;줘야&amp;nbsp;함.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;float&amp;nbsp;num3&amp;nbsp;=&amp;nbsp;12.45;&amp;nbsp;12.45를&amp;nbsp;자바에게&amp;nbsp;상수형으로&amp;nbsp;던짐&amp;nbsp;&amp;gt;&amp;nbsp;실수형태의&amp;nbsp;상수니&amp;nbsp;double로&amp;nbsp;담는데&amp;nbsp;float&amp;nbsp;선언해놨으니까&amp;nbsp;오류남.&amp;nbsp; &lt;br /&gt;--------------&amp;nbsp;용기의&amp;nbsp;양은&amp;nbsp;들어갈&amp;nbsp;수&amp;nbsp;있으나&amp;nbsp;그냥은&amp;nbsp;못&amp;nbsp;담고&amp;nbsp;변환과정을&amp;nbsp;거치면&amp;nbsp;용기의&amp;nbsp;내용을&amp;nbsp;담는&amp;nbsp;것은&amp;nbsp;가능.&amp;nbsp; &lt;br /&gt;--------------&amp;nbsp;데이터타입은&amp;nbsp;일치해야&amp;nbsp;쓸&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp; &lt;br /&gt;float&amp;nbsp;num3&amp;nbsp;=&amp;nbsp;12.45F;&amp;nbsp;뒷단에&amp;nbsp;f형&amp;nbsp;표기해서&amp;nbsp;오류&amp;nbsp;안남.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;03-2.&amp;nbsp;자료형의&amp;nbsp;변환&amp;nbsp; &lt;br /&gt;&lt;br /&gt;----------------------------------&amp;nbsp;필기 &lt;br /&gt;★.&amp;nbsp;자동&amp;nbsp;형&amp;nbsp;변환 &lt;br /&gt;&lt;br /&gt;★.&amp;nbsp;자동&amp;nbsp;형&amp;nbsp;변환&amp;nbsp;규칙 &lt;br /&gt;byte&amp;nbsp;-&amp;gt;&amp;nbsp;short-&amp;gt;&amp;nbsp;int&amp;nbsp;-&amp;gt;&amp;nbsp;long&amp;nbsp;-&amp;gt;&amp;nbsp;float&amp;nbsp;-&amp;gt;&amp;nbsp;double&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp; &lt;br /&gt;&lt;br /&gt;4장.&amp;nbsp;연산자 &lt;br /&gt;이항&amp;nbsp;연산자들 &lt;br /&gt;---------------------&amp;nbsp;=&amp;nbsp;대입연산자는&amp;nbsp;우선순위가&amp;nbsp;가장&amp;nbsp;낮다. &lt;br /&gt;%&amp;nbsp;val&amp;nbsp;=&amp;nbsp;7%3&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;결과는&amp;nbsp;1&amp;nbsp;(나머지값을&amp;nbsp;도출) &lt;br /&gt;&lt;br /&gt;복합대입연산자 &lt;br /&gt;a&amp;nbsp;+=&amp;nbsp;b&amp;nbsp;a를&amp;nbsp;b만큼&amp;nbsp;증가시켜라 &lt;br /&gt;a&amp;nbsp;-=&amp;nbsp;b&amp;nbsp;a를&amp;nbsp;b만큼&amp;nbsp;감소시켜라&amp;nbsp; &lt;br /&gt;&lt;br /&gt;관게&amp;nbsp;연산자 &lt;br /&gt;n1&amp;nbsp;&amp;lt;=&amp;nbsp;n2&amp;nbsp;n1이&amp;nbsp;n2보다&amp;nbsp;같거나&amp;nbsp;작다.&amp;nbsp; &lt;br /&gt;n1&amp;nbsp;==&amp;nbsp;n2&amp;nbsp;n1과&amp;nbsp;n2는&amp;nbsp;같다.&amp;nbsp; &lt;br /&gt;n1&amp;nbsp;!=&amp;nbsp;n2&amp;nbsp;n1과&amp;nbsp;n2는&amp;nbsp;같지&amp;nbsp;않다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;amp;&amp;nbsp;명칭-&amp;nbsp;엔퍼센드&amp;nbsp;/&amp;nbsp;엔드&amp;nbsp;그리고&amp;nbsp; &lt;br /&gt;||&amp;nbsp;명칭-&amp;nbsp;논리or&amp;nbsp;a와&amp;nbsp;b &lt;br /&gt;! 논리부정&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/[JAVA]</category>
      <category>Java</category>
      <category>국비지원</category>
      <category>자바</category>
      <category>자바공부</category>
      <category>풀스택</category>
      <author>TMI1</author>
      <guid isPermaLink="true">https://aluck.tistory.com/198</guid>
      <comments>https://aluck.tistory.com/198#entry198comment</comments>
      <pubDate>Wed, 14 May 2025 23:46:00 +0900</pubDate>
    </item>
  </channel>
</rss>