<14:30 5교시>

■ 경로 이야기

상대 경로 : 현재 위치를 기준으로 찾아가는 링크

절대 경로 : 웹상에서 절대적인 경로

 

■문단 div에 링크 걸기

더보기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>anchor</title>
        <style>
            .card{width: 300px; border: 1px solid red; border-radius:10px}
            .card img{float:left;}
        </style>
</head>
<body>
    <div class="container">
        <h3>a(anchor)요소는 하이퍼링크, 책갈피, javascript 등을 수행할 때 사용한다</h3>
        <a href="hello.html">안녕</a>
        <!--상대경로: 현재 위치를 기준으로 찾아가는 링크-->
        <br>
        <a href="https://daum.net">daum으로 이동</a>
        <!--웹상에서의 절대 경로: https://-->
        <br>
        <a href="https://daum.net" target="_blank">새로운 탭에서 daum으로 이동</a>
        <br>
        <!--이미지에 링크 걸기-->
        <a href="#"><img src="https://picsum.photos/id/237/200/300" alt="멍멍이이미지"></a>


        <a href="hello.html">
            <!--문단 div에 링크 걸기-->
            <div class="card"> 
                <h2>happy birthday</h2>
                <p><img src="https://picsum.photos/id/237/200/100" alt="멍멍이이미지">
                                Lorem ipsum dolor sit amet consectetur adipisicing elit. 
                                Illo cumque eius quisquam maxime a. 
                                Dolorum repellat laboriosam quasi! 
                                Dolor nam iste voluptates. 
                                Quas consequuntur atque consequatur assumenda deserunt neque recusandae.
                </p>
            <!--lorem 엔터 누르면 임의의 아무말 출력됨-->
            </div>
        </a>
    </div>
</body>
</html>

 

■동일한 페이지 내에서의 이동: 책갈피 기능

더보기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>anchor2</title>
    <style>
        .container{
            width:768px;
            margin:0 auto;

        }
        .spacer{
            height: 200px;
            background-color: antiquewhite;
        }

    </style>
</head>
<body>
        <div class="container">
            <h1>동일한 페이지 내에서의 이동</h1>
            <ul>
                <li><a href="#one">one</a></li>
                <li><a href="#two">two</a></li>
                <li><a href="#three">three</a></li>
            </ul>
            <div class="spacer"></div>
            <div id="one">하나 Lorem ipsum dolor sit amet consectetur adipisicing elit. Ab excepturi sunt saepe ducimus perferendis dicta, omnis earum assumenda distinctio, doloremque iusto velit! Assumenda asperiores perferendis, eveniet ab provident quas velit.</div>
            <div class="spacer"></div>
            <div id="two">두울 Lorem ipsum dolor sit amet consectetur adipisicing elit. Quasi, dignissimos sunt beatae iste debitis, doloribus consectetur dolor nesciunt reiciendis velit laudantium possimus optio sapiente asperiores hic, voluptate non expedita odit!</div>
            <div class="spacer"></div>
            <div id="three">세엣 Lorem, ipsum dolor sit amet consectetur adipisicing elit. Architecto tenetur fugit minima! Earum minus esse molestiae debitis obcaecati dolore ducimus libero unde illum, dolorem in optio nostrum, distinctio, veritatis ea?</div>
            <div class="spacer"></div>
        </div>
</body>
</html>

 

■ anchor의 추가기능 : 동작 기능이 있는 링크

 

이를테면 여기서 와이파이로 접속해서 선생님 컴퓨터 ip 주소와 포트번호, 파일 위치를 읽으면 선생님이 만든 파일을 웹브라우저로 읽을 수 있다(이 방법대로면 내 집에서도 할수 있다 대박 신기)

 

 

 

<15:30 6교시>

주소창에 msg라고 입력된 문자열이 보내졌는데, action이 send여서 send?msg=안녕하세요 라는 문자열이 서버로 전송된거

action이 deliver여서 send?msg=안녕하세요 라는 문자열이 서버로 전송된거

전송된 name이 중요함

id는 label for 때문에 만들어졌고, id와 name이 일치해야 focus가 tab을 눌렀을 때 focus가 id와 name이 일치하는 음성이 출력된다.

reset의 기능은 처음의 상태로 되돌림.

submit 양식을 제출하겠다 = '입력한 내용'을 '엠에스지'란 이름으로 'deliver'라는 서버의 창구에 제출하겠다.

 

 

요청 경로(action과 name)와 요청 방식(method)

요청 방식

Get : 주 목적이 정보를 가지고 오는 것(ex. 검색 결과를 얻어 오는 것) -> 보안이 필요하지 않은 요청

Post : 주 목적이 정보를 보내는 것(ex.아이디나 비밀번호 정보를 DB에 추가/수정) -> 보안이 필요한 요청

 

최종 정리한거 >더보기

더보기

요청 경로(action과 name)

주소창에 msg라고 입력된 문자열이 보내졌는데, action이 send여서 send?msg=안녕하세요 라는 문자열이 서버로 전송된거고 action이 deliver여서 send?msg=안녕하세요 라는 문자열이 서버로 전송된거임.

전송된 name이 중요한데, id는 label for 때문에 만들어졌고, id와 name이 일치해야 focus가 tab을 눌렀을 때 focus가 id와 name이 일치하는 음성이 출력된다.

 

reset의 기능은 처음의 상태로 되돌림.

 

submit 양식을 제출하겠다 = '입력한 내용'을 '엠에스지'란 이름으로 'deliver'라는 서버의 창구에 제출하겠다.

 

요청 방식(method)

Get : 주 목적이 정보를 가지고 오는 것(ex. 검색 결과를 얻어 오는 것) -> 보안이 필요하지 않은 요청

Post : 주 목적이 정보를 보내는 것(ex.아이디나 비밀번호 정보를 DB에 추가/수정) -> 보안이 필요한 요청

 

 

<16:30 7 교시> 초간단 서버 만들어보기 : 복사 붙여넣기의 향연

터미널에서 new terminal을 열면 하단부에 명령 프롬프트 역할을 하는 창이 나타나고, 여기서 dir로 확인해보면 우리가 작업하던 공간인걸 알 수 있고, 여기서 cd html을 누르면 하위 폴더인 html로 들어가게 되는데, 여기서 node 패키지를 설치하고 server.js를 만들고 node server.js을 입력하면 서버가 실행된다.

우리 컴퓨터의 3000번 포트에 서버가 연결되어서 웹페이지에 직접 경로를 입력해서 진행할 수 있다.

 

 

더보기
/*  
    [ 실행 방법 ]
    
    - nodejs 설치
    https://nodejs.org/en

    - node 페키지 설치
    npm install express body-parser

    - server.js 파일 만들기
    아래의 내용을 server.js 파일에 복사 붙여 넣기 한다.

    - 서버 실행
    node  server.js

    - 인덱스 페이지 만들기
    index.html 

    - 인덱스 페이지 요청 하기
    http://localhost:3000/

*/


const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');

const app = express();
app.use(bodyParser.urlencoded({ extended: true })); // POST 폼 데이터 파싱

// GET 요청: index.html 파일 응답
app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, 'index.html')); // index.html 반환: 최상위 경로까지 요청했을 때 index.html을 반환할거야
});

// GET 방식 요청이 왔을 때: 쿼리 파라미터 추출 하는 동작을 할거야
app.get('/send', (req, res) => {
  const queryParams = req.query; // 쿼리 문자열 파라미터 추출
  console.log(queryParams); // 서버의 콘솔에 출력
  res.send('GET Parameters received: ' + JSON.stringify(queryParams)); // 클라이언트 응답
});

// POST 방식 요청이 왔을 때: 폼 데이터 처리 동작을 할거야
app.post('/send', (req, res) => {
  console.log(req.body); // POST 폼 데이터 출력
  res.send('Form received: ' + JSON.stringify(req.body));
});

//포트 번호를 어디서 시작할 건지 결정할 수 있음
app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

노랑색 : legend는 이 값들이 무슨 내용을 선택하는 건지 알려줌

분홍색 : label 된 방식이 조금 다른데, 어쨋든 위에거는 이메일, 아래꺼는 남자, 여자로 label

빨간색 : 웹페이지에서 전송하는 값의 gender가 남자 또는 여자 중 하나일 수 밖에 없는 이유는 남자 라벨과 여자 라벨이 둘이 같은 name으로 그룹지어져서 그 값에 하나 밖에 못 들어감

초록색 : 웹페이지에서 전송하는 값은 value의 값으로 표현된다. 위에서는 "여자" 부분에 "woman"을 넣으면 오른쪽 웹페이지 초록색 밑줄에 woman이라고 나온다.

 

 

<17:30 8교시>임시로 만든 서버 가지고 놀기 : 신기하고 재밌다!

 

 

8:40

8:05에 학원 도착해서 잠깐 쉬면서 딴짓하다가 공부할 준비 세팅함

9:10부터 15분간 잠깐 엎어져서 푹 잤당

 

<9:30 1교시>

코드 작성 팁과 선택자 입력 방법

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    div.aaa <!--엔터-->
    <div class="aaa"></div>

    div.aaa.bbb<!--엔터-->
    <div class="aaa bbb"></div>

    div#one<!--엔터-->
    <div id="one"></div>

    div.aaa#one<!--엔터-->
    <div class="aaa" id="one"></div>

    div#one.aaa<!--엔터-->
    <div id="one" class="aaa"></div>

    div*5<!--엔터-->
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>

    div{div입니다} <!--Ctrl+Space 눌렀다 관련창 뜨면 엔터-->
    <div>div입니다</div>

    div{div}*5<!--엔터-->
    <div>div</div>
    <div>div</div>
    <div>div</div>
    <div>div</div>
    <div>div</div>

    div{div$}*3<!--엔터-->
    <div>div1</div>
    <div>div2</div>
    <div>div3</div>

    ul>li<!--엔터-->
    <ul>
        <li></li>
    </ul>

    ul>li*3<!--엔터-->
    <ul>
        <li></li>
        <li></li>
        <li></li>
    </ul>

</body>
</html>

 

■ ul 의 활용

더보기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>step03_ul.html</title>
    <style>
      .my-ul{
        list-style-type : none;
        padding: 0;
        margin: 0;

      }
      /*.my-ul 의 자식 중에 li 선택*/
      .my-ul > li{
        display: inline;
      }
      .my-link{
        list-style-type:none;
        padding:0;
        margin:0;
    
      }


      .my-link a{
        text-decoration: none;
        color: green;
      }

      .my-link a:hover{
        text-decoration: underline;
        color: rgb(3, 61, 3)
      }
    </style>


</head>
<body>
    <h1>순서 없는 목록(Unordered list) ul 요소</h1>
    <h2>친구목록입니다</h2>
   <ul>
    <li>친구1</li>
    <li>친구2</li>
    <li>친구3</li>
    <li>친구4</li>
    <li>친구5</li>
   </ul>

   <ul class="my-ul">
    <li>친구1</li>
    <li>친구2</li>
    <li>친구3</li>
    <li>친구4</li>
    <li>친구5</li>
   </ul>
    

   <h2>바로가기 목록입니다.</h2>
   <ul class="my-link">
    <li> <a href="https://daum.net">daum</a></li>
    <li> <a href="https://naver.com">naver</a></li>
    <li>  <a href="https://gmarket.co.kr">gmarket</a></li>
   </ul>
  
  
 
</body>
</html>

 

 

부모요소 밑에는 자식요소와 자손요소가 존재할 텐데, 자식과 자손의 차이가 있다.

사람에 적용되는 것처럼 부모의 바로 밑의 자손은 자식이고, 그 자식의 자식부터는 부모의 자손이 되는 것이다.

이걸 기호로 표기할 때도 약간의 차이가 있다.

.my-ul>li

라고 쓰거나

.my-ul li

라고 쓰는데, 꺽쇠는 바로 밑의 자식에 대해서만 입력할 때 쓰고,

그냥 부모 밑의 아무 자손을 입력할 때는 스페이스로 한칸만 띄우고 자식요소를 쓰면 된다고 한다.

후자의 경우 때문에 전자를 입력할 때도 그냥 스페이스 한칸만 띄우고 하면 된다.

 

지난 시간에 배운 블럭요소와 인라인요소는 서로 상호전환이 불가능한게 아니라 디폴트값이 블럭이고 디폴트값이 인라인인 것 뿐이라는 내용을 들어 지난 시간에 작성한 글에 추가했다.

보통 anchor요소는 inline요소로 그냥 작성하면 한줄 위에 주욱 연결되어 작성되는데, 

링크를 보기 좋은 구조로 짤 때 li를 활용해서 inline의 내용들을 원하는 모양으로 만들고는 한다.

네이버 같은 홈페이지에서 여러 링크 기능들이 ul과 li로 묶여 있는 모습을 확인할 수 있다.

 

 

anchor 요소도 css 작업이 가능하다.

 

 

■ ol의 활용

더보기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>step03ol</title>
    <style>
        ol{
            list-style-type: none;
            padding:0;
            margin:0;

        }
        ol li {
            display : inline;
            padding:5px 10px;
        }
        ol li a{
            text-decoration:none;
            color:#000;
        }
        ol li:hover{
            background-color: #999;
            
        }
        ol li a:hover, ol li a:focus{
            background-color: #999;
            color: #fff;
        }/*focus는 탭을 눌렀을 때 웹페이지의 그 부분에 초점이 맞춰지는 기능*/

    </style>
</head>
<body>
    <h1>순서 있는 목록</h1>

    <h2>공부할 순서입니다</h2>
    <ol>
        <li>html</li>
        <li>css</li>
        <li>javascript</li>
    </ol>

    <h2>링크</h2>
    <ol>
        <li><a href="#">html</a></li>
        <li><a href="#">css</a></li>
        <li><a href="#">javascript</a></li>
    </ol>
    <button>버튼</button>
    <!--버튼도 포커스가 오는 이벤트가 일어났다가 포커스를 잃은 것은 blur라는 이벤트가 일어남-->
</body>
</html>

 

 

 

<10:30 2교시>

 ■ focus

웹브라우저 페이지에서 tab 키를 누르면 웹브라우저에서 focus 될 수 있는 UI들에 초점이 맞춰진다. 

이 기능은 모니터를 보며 마우스를 클릭할 수 없는 시각장애인들이 tab키와 엔터만을 눌러 자신에게 필요한 웹브라우저 탐색을 가능하게 하는 역할을 한다.(텍스트는 음성 출력을 해주고, 이미지의 경우는 이미지를 설명한 텍스트를 추가하여 이 설명을 음성으로 출력해준다고 한다)

그렇기 때문에 시각장애가 있는 경우를 고려해서라도 개발자들은 이 기능을 추가해줄 필요가 있고, 더군다나 우리나라에서는 장애인 차별 금지법이 있기도 해서 필수적으로 개발해야 하는 기능이다.

focus가 사라진 반대 상황은 blur라고 한다.

 

 

■ 컨테이너 영역 만들기

div요소로 정의한 Container class는 웹 페이지에서 전체 콘텐츠를 담을 용기를 만드는 부분이다.

경우에 따라 고정된 영역의 창을 가진 Container(ex.네이버)와 전체 창의 폭을 다 쓰는 Container(ex.기타 소규모 사이트 등)가 있다.

폭이 바뀜에 따라 레이아웃도 반응해서 크기가 바뀌는 반응형 레이아웃이 있는데 우리가 만들 목표로, PC든 모바일이든, 사용자 화면의 창의 크기에 맞게 저절로 조절되는 특징이 있다.

더보기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>step3 dl</title>
    <style>
        /*html{font-size: 10px} <-이 픽셀값이 rem으로 적용되는데, 디폴트 값은 16px임*/
        .container{
            border: 1px dotted green;
            max-width: 768px;/*가운데 정렬하기 전에 폭이 결정되어야 함*/
            /*max-가 붙으면 최대 길이상태에서 더 작아지면서 레이아웃이 반응할 수 있음*/
            margin: 0 auto; /*위아래 마진은 0, 좌우 마진은 auto로 가운데 정렬*/
        }
        dt{
            font-weight: bold;
            font-size: 1.2rem;
            color :#333;
            margin-top: 20px;
        }
        dd{
            font-size: 1rem;
            color: #555;
            margin-left: 20px;
            margin-bottom : 10px;
        }

    </style>

</head>
<body>
    <div class="container">

        <h1>정의형 목록(definition list) dl 요소</h1>
        <dl>
            <dt>제목</dt>
            <dd>자세한 내용..</dd>

            <dt>html</dt>
            <dd>Hyper Text Markup Language의 약자</dd>

            <dt>css</dt>
            <dd>Desing요소 결정</dd>

            <dt>javascript</dt>
            <dd>language적 요소 담당</dd>
        </dl>

    </div>
</body>
</html>

div는 정의되면 자식요소가 부모요소의 폭을 그대로 다 가질 뿐, 높이는 자식요소에게 필요한 만큼만 차지한다.

 

 

■ 테이블 만들기

더보기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>step3 table</title>
    <style>
        container{
            max-width: 768px;
            margin: 0 auto;
        }
        table{
            width: 100%;
            border: 2px solid;
            border-radius: 8px;
            overflow: hidden;
            box-shadow: 0 4px 8px rgba(0,0,0,0.3);/*그림자*/
            border-collapse: collapse;
            /*테두리 겹침 제거 by 선을 붕괴 default seperate*/
        }
        th{
            background-color: rgb(33, 112, 33);
            color: white;
            padding: 10px 15px;

        }
        td{
            padding: 10px 15px;
            border-bottom: 2px solid rgb(33, 112, 33);
            text-align: center;
        }
        tr:nth-child(odd){
            background-color: #90b996;
        }
        tr:nth-child(even){
            background-color: #9fd4b5;
        }

    </style>

</head>
<body>
    <div class="container">
        <h1>표(table)형식으로 정보를 출력하기</h1>
        <table>
            <tr>
                <th>번호</th>
                <th>이름</th>
                <th>주소</th>
            </tr>           
            <tr>
                <td>1</td>
                <td>나</td>
                <td>경기</td>
            </tr>
            <tr>
                <td>2</td>
                <td>너</td>
                <td>서울</td>
            </tr>
            <tr>
                <td>3</td>
                <td>우리</td>
                <td>서울</td>
            </tr>
        </table>
    </div>
</body>
</html>

<11:30 3교시>

■rem의 개념

html 요소의 font-size는 디폴트 값이 16px이다.

별도로 html에서 폰트 사이즈에 변형을 주지 않으면, 1rem=16px에 해당되며, 이 배수로서 글자의 크기 비율 등을 조절하게 된다.

만약, html에서 폰트 사이즈에 변형을 줬으면, 1rem=변형주며 정의한 값이 되고, 그것은 10px이 되어도 되고 20px이 되어도 된다. 그렇다면 rem의 배수에 맞게 글자 크기 비율이 조절된다.

 

 

■테이블 요소

테이블 요소는 우리가 사용 중인 웹페이지들에서도, 우리가 만들게 될 웹페이지들도 게시판 등 매우 다양하게 활용되고 있다.

테이블 요소에서 사용하는 단어들의 약자는 다음과 같다.

tr : table row

th: table head

td: table data

tfoot : tablefoot

tbody: table body

 

■ 테이블 스타일 적용하기

더보기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>table2</title>
    <style>
        .tb-member caption{
            text-align:left;
            font-weight: bold;
            font-size: 1.3rem;
        }

    </style>

</head>
<body>
    <div class="container">
        <table class="tb-member">

            <caption>회원 목록</caption>
            <!--caption은 표의 제목을 나타내서 
            테이블 데이터가 뭔지 알게 해줌-->
            <thead>
                <tr>
                    <th>번호</th>
                    <th>이름</th>
                    <th>주소</th>
                </tr>   
            </thead>
            <tbody>
                <tr>
                    <td>1</td>
                    <td>나</td>
                    <td>경기</td>
                </tr>
                <tr>
                    <td>2</td>
                    <td>너</td>
                    <td>서울</td>
                </tr>
                <tr>
                    <td>3</td>
                    <td>우리</td>
                    <td>서울</td>
                </tr>
            </tbody>

        </table>
        <h1>tfoot 이 있는 table</h1>
        <table border="1" class="my-table">
            <caption>GS25 현금, 카드 매출 내역</caption>
            <colgroup><!--칼럼의 폭 결정-->
                <col width="200">
                <col width="100">
                <col width="100">
            </colgroup>
            <thead>
                <tr>
                    <th>상품명</th>
                    <th>현금</th>
                    <th>카드</th>
                </tr>
            </thead>
            <!--구조적으로 tfoot이 tbody보다 위에 있는 것은 역시
            시각장애인들 배려 용으로, 
            알고 싶은 정보가 테이블 row보다 한참 밑에 있게 된다면
            그걸 다 내려가보기가 불편할 것이므로
            tfoot 같은 걸로 알고 싶은 합계 정보를 미리 정리해놔 주는거-->
            <tfoot>
                <tr>
                    <th>합계</th>
                    <td>4,300원</td>
                    <td>800원</td>
                </tr>
            </tfoot>
            <tbody>
                <tr>
                    <td>삼각김밥</td>
                    <td>800</td>
                    <td>0</td>
                </tr>
                <tr>
                    <td>도시락</td>
                    <td>3,500</td>
                    <td>0</td>
                </tr>
                <tr>
                    <td>박카스</td>
                    <td>0</td>
                    <td>800</td>
                </tr>
            </tbody>
        </table>

    </div>


</body>
</html>

 

 

border radius 요소는 표의 모서리를 둥글게 굴리는 기능을 하는데, border radius가 작을수록 뾰족하게 둥근 모서리가 되고, border radius가 클수록 뭉툭하게 둥근 모서리가 된다.

 

overflow: hidden;을 입력하면, 입력된 css 요소가 자기거보다 더 큰 사이즈의 보더 값이 정의된 요소의 사이즈가 커서 넘친 부분을 숨김으로써 표를 둥굴릴 수가 있다.

 

 

 

■ tfoot의 활용 : 주석 안의 내용이 핵심

 

 

 

■ anchor 활용

더보기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>anchor</title>
</head>
<body>
    <div class="container">
        <h3>a(anchor)요소는 하이퍼링크, 책갈피, javascript 등을 수행할 때 사용한다</h3>
        <a href="hello.html">안녕</a>
        <br>
        <a href="https://daum.net">daum으로 이동</a>
        <br>
        <a href="https://daum.net" target="_blank">새로운 탭에서 daum으로 이동</a>
        <br>
        <!--이미지에 링크 걸기-->
        <a href="#"><img src="https://picsum.photos/id/237/200/300" alt="멍멍이이미지"></a>
    </div>
</body>
</html>

 

 

<12:30 4교시>

node.js에 대해 간단히 살펴보고 각자 복습하는 시간이라 블로그 작성 마저 하는 중

■ node.js(설치 링크 바로 가기)

우리가 크롬에서 사용하던 검사 > 콘솔 창에서 입력하는 것은 실시간으로 크롬 웹페이지에서 응답하고 프로그래밍 되는데, 이런 콘솔창의 프로그래밍 기능을 활용해서 javascript 언어로 프로그램을 개발할 수 있는 node.js라는 프로그램이 있다.

node.js를 설치하면 우리가 크롬 콘솔창에서 보던 기능들을 그대로 명령프롬프트에서 node에 접속해서 사용할 수 있다.

우리도 나중에 이 node.js 환경에서 돌아가는 react를 만들 예정이라고 한다.

 

 

 

 

<오전 수업에서 다룬 것 마무리>

우리가 그동안 배운 DB에서의 데이터 입력과 조회는 앞으로 우리가 배울 웹서버 앱이 할 내용들이고, 웹페이지에서는 이 데이터들을 불러와서 유저에게 보여주는 역할을 함.

 

우리가 지금 하고 있는 html은 웹페이지에서 데이터를 불러올 틀(그릇)을 만드는 것)

 

ex) 뉴스 기사 사이트에서 DB 업데이트로 신문 기사 내용을 추가하면, 뉴스 기사 사이트에서는 원래 사용하던 UI 그대로 전달되는 내용의 DATA 값만 바뀌는 꼴

<14:30 5교시>

javascript : 웹페이지에서 나타나는 수많은 상호작용 동작과 반응들

 

■ 버킷 리스트에 버킷 리스트를 추가할 수 있는 버튼 만들기

- 변수를 사용하지 않는 방법

<body>
    <h1>나의 버킷리스트</h1>
    <ul>
        <li>번지점프</li>
        <li>스카이 다이빙</li>
        <li>책 10,000권 읽기</li>
        <li>유럽여행</li>
    </ul>
    <button >버킷 추가</button>
    <p>죽기 전에 한번은 해봐야겠지? <br> 근데 자신은 없네 ㅠㅠ</p> 

    <script>//javascript 영역
        /*prompt("버킷리스트에 추가할 내용을 입력하세요");*/
        //이 위치면 페이지 로딩 시점에 동작이 일어남.

        document.querySelector("button").addEventListener("click", function(){
            //prompt("버킷리스트에 추가할 내용을 입력하세요"); 
            //버튼이 클릭되는 이벤트가 일어나는 시점에 동작이 일어나게 됨

            //1. 새로운 li 요소를 만들어서(document.creatElement해야 함)
            let box = document.createElement("li"); //함수의 리턴값 
            //-> 이 줄의 함수는 그 값을 리턴했는데 이값을 어느 공간에 임시 보관하고 2,3에서도 쓴다
            //변수를 선언한다
            //2. li 요소안에 입력한 문자열을 출력하고
            box.innerText= prompt("버킷리스트에 추가할 내용을 입력하세요");
            //3. li 요소를 ul의 자식 요소로 추가하기
            //(이미 있는 요소에 추가하기는 document.querySelector)
            document.querySelector("ul").append(box);
        });

    </script>

</body>
</html>

- 변수를 사용하는 방법

더보기

<body>
    <script>//javascript 영역
        document.querySelector("button").addEventListener("click", function(){
            let input = prompt("버킷리스트에 추가할 내용을 입력하세요"); 
            //버튼이 클릭되는 이벤트가 일어나는 시점에 동작이 일어나게 됨

            //1. 새로운 li 요소를 만들어서(document.creatElement해야 함)
            let box = document.createElement("li"); //함수의 리턴값 
            //-> 이 줄의 함수는 그 값을 리턴했는데 이값을 어느 공간에 임시 보관하고 2,3에서도 쓴다
            //변수를 선언한다
            //2. li 요소안에 입력한 문자열을 출력하고
            box.innerText= input;
            //3. li 요소를 ul의 자식 요소로 추가하기//(이미 있는 요소에 추가하기는 document.querySelector)
            document.querySelector("ul").append(box);
        });

    </script>

</body>
</html>

 

<15:30 6교시> 블록요소와 인라인요소

대차게 졸았다. 어쨋든 졸면서 필기한거랑 블로그에 있는거 보면서 채워 넣어본다.

■ 블록요소(Block Element)

 페이지에서 새로운 줄부터 시작하여 기본적으로 전체 너비를 차지하는 덩어리진 영역들로, 한 줄에 하나씩 배치되며, 다음 요소는 블록 요소 아래에 배치되고, 부모 요소의 하위 요소로 포함시킬 때는 부모 요소의 가로 너비 영역을 모두 사용하려는 성질이 있기 때문에 가로 크기를 지정하지 않으면 기본적으로 부모요소의 너비를 가득 채운다.

영역을 차지하는 녀석들이기 때문에 기본적으로 width, height, margin, padding 등의 스타일 속성을 지정할 수 있다.

사용되는 태그 : <div>, <p>, <h1>~<h6>, <ul>, <ol>, <li>, <table>, <form>, <header>, <footer>, <section>, <article> 등

 

■ 인라인요소(Inline Element)

 현재 입력 중인 줄에 함께 배치되며, 새로운 줄을 차지하지 않고 기존의 인라인 요소와 나란히 배치되며, 입력된 만큼의 영역너비만 차지하고, 기본적으로 줄을 넘어서는 크기를 차지하지 않는다.

사용되는 태그 : <span>, <a>, <img>, <strong>, <em>, <label>, <input>, <button> 등

기본적으로 width, height, margin, padding 같은 스타일 속성이 적용되지 않지만, 특정 조건에서는 인라인요소임에도 일부 스타일 속성을 적용할 수도 있다.

예외) margin, padding 의 경우는 수평 방향으로만 제한적으로 적용 가능

예외) <img> 태그에서 예외를 적용할 수 있는 경우

더보기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Step02_InlineBlockElement.html</title>
</head>
<body>
    <h1 style="color:blue;">인라인 요소이지만 width 와 height 를 지정할수 있는 요소</h1>
    <div>
        하나
        <img src="https://picsum.photos/100" style="width:50px;height:50px;">
        <img src="https://picsum.photos/100">
        <img src="https://picsum.photos/100" style="width:80px;height:80px;">
        두울
        세엣
    </div>
</body>
</html>

 

+11/29 추가)

블럭요소와 인라인요소는 서로 상호전환이 불가능한게 아니라 디폴트값이 블럭이고 디폴트값이 인라인인 것 뿐이다.

 

 

 

 

<16:30 7교시>

■ 영역과 CLASS

CLASS라는 속성은 동일 요소를 같은 그룹으로 묶고 싶을 때 사용하게 된다. 그렇게되면 CLASS 그룹에만 적용할 CSS를 따로 정할 수 있기 때문이다. 

 

CLASS 속성은 <aaaa class="groupname" > 으로 표현되고, 이 CLASS에 관련된 VALUE를 찾을 때는

.XXXXX로 표현하고, '클래스 속성의 VALUE가 XXXXX인걸 쓰겠다'는 의미이다.

 

 

바깥 영역 안에 DIV가 여럿 있고 그 각각 안에 또 DIV가 들어가고 그 아래에 또 DIV가 들어가고... 

 

 

■ CSS, JAVASCRIPT, HTML마다 속성을 설명하는 방식

CSS와 같은 경우는 케밥 케이스(kebob case)로 속성을 설명할 때 -꼬챙이를 끼워 넣어 설명한다.

border-bottom-width처럼 쓴다.

 

border_bottom_width와 같은 경우는 _언더바를 끼워넣어 스네이크 케이스(snake case)라고 한다.

(참고로 이거 그대로 정의된 속성은 없다고 하셨던 거 같다. 설명의 편의를 위해 그냥 같은 단어를 쓰신거라구..)

 

borderBottomWidth같이 낙타의 등처럼 소문자와 대문자가 울룩불룩한 모양을 한 캐멀 케이스(camel case)다.

(이또한 이거 그대로 정의된 속성은 없다고 하셨던 거 같다. 설명의 편의를 위해 그냥 같은 단어를 쓰신거라구..)

 

 

 

■ margin에서 각 위치에서 여백 폭을 정의하는 방법

margin을 줄 때는 사각형의 위를 top으로 하여 시작해서 시계 방향으로 오른쪽은 right, 아래 쪽은 bottom, 왼쪽은 left라고 하여 top    right → bottom  → left를 기억하라고 하셨는데, 이걸 활용해서 margin 폭을 정의할 수 있기 때문이다.

 

margin의 변의 길이를 정의하는 방식은 가지이다.

정의 방식 의미
margin 0;  모든 변에서의 margin 폭이 0이다.
margin 10px, 10px, 10px, 10px; 모든 변에서의 margin 폭이 top    right → bottom  → left에 해당되게 10px 씩 정의됨
margin 10px, 20px  top    right 순으로 해당되게 margin 폭이 10px, 20px씩 정의되었고, 마주보는 변들인 bottom과 left의 margin 폭은 당연하게 각각 10px, 20px 씩 부여하겠다는 정의
margin 20px, 10px, 30px top    right → bottom  순으로 margin 폭을 20px, 10px, 30px을 각각 부여하고 right과 마주보는 left의 변에도 margin 폭을 10px에 정의한다는 의미.

 

 

 

<17:30 8교시>

html 기본 태그 : div 요소, p요소, h*요소(제목), ul요소, ol 요소, table요소, a요소, span요소, b와 strong요소, i와 em요소, code요소, dl요소

직접 입력해보기

더보기

div 요소

<!DOCTYPE html>
<html>
<head>
    <style>
        .container {
            width: 80%;
            margin: 0 auto;
            background-color: #f3f3f3;
            padding: 20px;
        }
        .header, .content, .footer {
            padding: 10px;
            margin: 10px 0;
        }
        .header {
            background-color: #4CAF50;
            color: white;
        }
        .content {
            background-color: #ffffff;
        }
        .footer {
            background-color: #ddd;
            text-align: center;
        }
    </style>
</head>
<body>

<div class="container">
    <div class="header">헤더 영역</div>
    <div class="content">콘텐츠 영역</div>
    <div class="footer">푸터 영역</div>
</div>

</body>
</html>

p요소

<!DOCTYPE html>
<html>
<head>
    <title>p 요소 예제</title>
</head>
<body>

<p>이것은 첫 번째 문단입니다. 문단 태그를 사용하여 텍스트를 문단 단위로 나눌 수 있습니다.</p>

<p>이것은 두 번째 문단입니다. 문단 태그는 텍스트를 그룹화하여 읽기 쉽고 정돈된 형태로 표시해 줍니다.</p>

</body>
</html>

 

h*요소(제목)

<!DOCTYPE html>
<html>
<head>
    <title>제목 요소 예시</title>
</head>
<body>

<h1>이것은 페이지의 주요 제목입니다 (h1)</h1>
<p>여기에는 페이지의 주요 내용을 소개하는 문장이 올 수 있습니다.</p>

<h2>이것은 첫 번째 섹션의 제목입니다 (h2)</h2>
<p>첫 번째 섹션의 내용을 설명하는 문단입니다.</p>

<h3>첫 번째 소제목입니다 (h3)</h3>
<p>소제목에 대한 상세한 설명이 들어갈 수 있습니다.</p>

<h2>이것은 두 번째 섹션의 제목입니다 (h2)</h2>
<p>두 번째 섹션의 내용을 설명하는 문단입니다.</p>

</body>
</html>

 

ul요소

<!DOCTYPE html>
<html>
<head>
    <title>ul 요소 예제</title>
</head>
<body>

<h2>과일 목록</h2>
<ul>
    <li>사과</li>
    <li>바나나</li>
    <li>체리</li>
    <li>포도</li>
</ul>

</body>
</html>

 

ol 요소

<!DOCTYPE html>
<html>
<head>
    <title>ol 요소 예제</title>
</head>
<body>

<h2>순서 있는 목록</h2>
<ol>
    <li>HTML 배우기</li>
    <li>CSS 배우기</li>
    <li>JavaScript 배우기</li>
    <li>프론트엔드 개발 완성</li>
</ol>

</body>
</html>

 

table요소

<!DOCTYPE html>
<html>
<head>
    <title>table 요소 예제</title>
</head>
<body>

<h2>학생 성적표</h2>
<table>
    <tr>
        <th>이름</th>
        <th>과목</th>
        <th>점수</th>
    </tr>
    <tr>
        <td>홍길동</td>
        <td>수학</td>
        <td>90</td>
    </tr>
    <tr>
        <td>이몽룡</td>
        <td>영어</td>
        <td>85</td>
    </tr>
</table>

</body>
</html>    
    <table>
        <thead>
            <tr>
                <th>이름</th>
                <th>나이</th>
                <th>직업</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>홍길동</td>
                <td>25</td>
                <td>개발자</td>
            </tr>
        </tbody>
    </table>
<table>
        <thead>
            <tr>
                <th>이름</th>
                <th>나이</th>
                <th>직업</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>홍길동</td>
                <td>25</td>
                <td>개발자</td>
            </tr>
            <tr>
                <td>김영희</td>
                <td>30</td>
                <td>디자이너</td>
            </tr>
        </tbody>
    </table>

a요소

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>책갈피 예제</title>
</head>
<body>
  <h1>HTML 책갈피 기능 예제</h1>

  <!-- 책갈피 링크 -->
  <a href="#section1">섹션 1로 이동</a>
  <a href="#section2">섹션 2로 이동</a>

  <!-- 책갈피 목적지 -->
  <h2 id="section1">섹션 1</h2>
  <p>여기는 섹션 1의 내용입니다.</p>

  <h2 id="section2">섹션 2</h2>
  <p>여기는 섹션 2의 내용입니다.</p>
</body>
</html>

 

span요소

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>span 요소 예제</title>
    <style>
        .highlight {
            color: red;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <p>이 문장에는 <span class="highlight">강조된 부분</span>이 포함되어 있습니다.</p>
</body>
</html>

 

b와 strong요소

<p>이 문장은 <strong>매우 중요한 내용</strong>을 포함하고 있습니다.</p>

 

i와 em요소

<p>이 문장은 <em>매우 중요한 내용</em>을 포함하고 있습니다.</p>

 

code요소

<p>사용자 이름을 입력하려면 <code>username</code> 속성을 사용하세요.</p>

 

 

dl요소

<dl>
  <dt>HTML</dt>
  <dd>웹 페이지의 구조를 정의하는 마크업 언어입니다.</dd>

  <dt>CSS</dt>
  <dd>HTML 요소의 스타일을 지정하는 스타일 시트 언어입니다.</dd>

  <dt>JavaScript</dt>
  <dd>웹 페이지에 동적인 기능을 추가하는 프로그래밍 언어입니다.</dd>
</dl>

 

8:10 학원 도착..

피곤하다.. 커피 중독을 해결하면서 공부를 해 나가보려는 선택이 맞을까 싶다가도 조금씩이지만 머리가 피로로 흐려진 느낌이 아니고 피로해도 맑아지는 느낌이 있어서 계속 시도해보려고는 한다.

그리고 솔직히 생각보다 약간 할만 하다 싶어서 인지 약간 방심하고 오만방자해진것도 있다

어찌되었든 오늘을 시작해보자.

복습+노트정리와 함께 명령프롬트에 연습하는 걸로 시작하자.

 

 

<9:30 1교시>

폭설로 차가 좀 막히는 분들이 있어서 10분뒤에 시작하기로 함.

이번 11월 폭설은 정말 엄청나게 아름다운 자연재해 같아.

 

고요하고 아릅답게 내려앉은 재앙.

눈 무게에 부러진 나무 사진을 봤거든 ㅋㅋ

무섭고도 눈부시다. 

 

음 이제 조만간 수업 시작하겠지..? 9시 40분.

 

 

오늘의 수업은 html 관련!

수업의 시작에선 운영체제에 맞는 vs code 프로그램을 찾아 다운로드 설치하는 것.

이것은 프리스쿨 때 이미 했던거라 일단 대기중.

 

앞으로 5개월간 사용할 폴더 만들고 -> vs code로 file > open folder 해서 폴더 열었음.

프리스쿨 때 배웠던 explorer 창과 새로운 파일 만들기, 새로운 폴더 만들기 아이콘

좌측의 탭들 (문서, 돋보기, 링크된거, 디버깅, 앱스 창들) 확인

더보기

수업의 시작 때는 직접 html:5 형식을 작성해보는 시간을 가졌다.

<!DOCTYPE html> <!--이 텍스트 문서는 html 형식이라고 알려주는 선언부-->
<html><!--html문서는 head와 body로 이루어져 있다-->
    <head><!--문서의 설정 정보가 들어간다-->
        <meta charset="UTF-8">
        <!--meta는 meta+tab 해도 닫는 괄호가 없고 열려있는데, 작성할 게 없는 요소이기 때문에 열어놓기만 하면 됨-->
        <!--메타는 꺽쇠 안에다가 뭔가 쓸 수 있고, 그 뭔가쓰는것도 단어 쓰고 원하는거에 tab 눌르면 자동 작성되는 게 많음-->
        <title>나의 웹페이지</title> <!--웹페이지의 제목을 나타냄-->
    </head>
    <body> <!--문서의 내용이 들어간다-->
        <h1>hello world!</h1><!--제목 쓸 때 사용하는 태그, h1~h5까지 존재-->
        <p>hello world!</p><!--p= paragraph 단락을 구성할 때 사용하는 태그-->
    </body>
</html> <!--html의 기본 구조-->

 

 

! +tab을 누르면 html:5를 자동으로 생성할 수 있다.

 

요소(tag, element)는 특정한 사용 목적을 가지고 있는 구조이다.

속성(attribute)은 어떤 요소에다가 특정 정보를 저장하기 위한 구조로, 속성명과 속성내용으로 서술된다.

 

 

<10:30 2교시> html의 개념과 html 의 기본 디자인으로 정보 나열해보기

HTML은 웹브라우저에서 읽게 되는 문서인데, 사람들의 언어로 전달하면 이해하지 못 한다.

예를 들어 본인의 이름 성별 주소를 작성하라고 하면 사람들은 자기 스타일 대로 적게 되는데 이 다양한 스타일을 컴퓨터가 이해하면 얼마나 좋겠어~ 그치만 이해 못함. 그래서 형식을 약속하고 이 형식에 맞게 작성해줘야 함.

 

HTML일종의 XML 문서이다.

XML 문서는 형식이 다양할 수 있다. 약속하기 나름이다.

 

 

■ XML 문서의 형식

더보기

XML 문서의 형식1
<person>
        <name>이름</name>
        <gender>성별</gender>
        <address>주소</address>
</person>


XML 문서의 형식2
<person name="이름" gender="성별" address="주소"/>
cf) XML 관점에서는 /로 닫아줘야하는데 html은 /로 닫아줄 필요까진 없음


XML 문서의 형식3
<person gender="남" address="주소">이름</person>

■ JSON 문서의 형식

더보기

JSON 문서 형식

일반화 : {"key":value, "key":value, ...} 
예시 : {"name":"이름", "gender":"남", "address":"주소"}

 

JSON 을 사용하는 이유

뜻 자체가 자바스크립트에서의 객체 표기법

-> 웹브라우저에서 사용하기가 좋고 DB의 정보를 JSON으로 변환해서 가져오기도 용이

-> 앱의 설정 정보도 JSON으로 표기되기도 함

 

 

■태그의 의미 모음

태그 태그의 의미 html 에서의 의미 
<ul></ul>  unordered list 순서가 중요하지 않은 리스트
<ol></ol> ordered list 순서가 중요한 리스트
<li></li> list 리스트에 들어갈 항목들을 각각 innertext로 나타냄
\n \next line 개행해라의 기호
\t \tab tab을 눌러 들여써라의 기호
<br> line break 웹페이지야, '여기서 줄을 끊을거야'라고 읽으렴
더보기
ul을 사용해서 만든 버킷리스트

 

ol을 사용해서 만든 버킷리스트

 

 

 

 

 

<11:30 3교시> html에 나열할 기본 정보를 예쁜 디자인으로 만들어보기

 

rgb의 괄호 안에 숫자들은 밝기를 나타내고 , 0은 밝기가 없는거, 255가 최대 밝기 ->3개가 다 밝으면 흰색이 됨

 

 

 

 

 

 

 

 

<12:30 4교시>

html : 웹페이지에 나타나는 글자들을 표현 (2교시)

css : 웹페이지에 나타나는 디자인적인 부분을 표현(3교시)

 

오후 수업 예고

javascript : 웹페이지에서 나타나는 수많은 상호작용 동작과 반응들

 

 

점심까지의 선생님과 한 코드 백업

더보기

수업시간에 한 코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>웹페이지 기초 단계 1 : 나의 정보</title>
    <style>
        h1{
            color:rgb(247, 179, 9);
            border-bottom: 2px solid rgb(247, 179,9);
            /*2px : 선의 굵기, solid : 선의 스타일이 실선, rgb : 선의 색깔*/
            text-align: center; /*디폴트 값은 left임*/
            font-size: 2.5rem; /*1rem=16px=디폴트 글자 크기*/
            padding-bottom: 10px;/*경계선과 콘텐츠 사이의 간격을 띄우기*/
        }
        ul{
            max-width: 300px ; /*ul의 폭을 이 값으로 고정해라, 인데 
            이러면 창 크기가 작아지면 UI가 잘린다. 
            width 앞에 max-를 붙이면 창 크기를 줄여도 UI가 줄어든다.*/
            margin-left: auto; margin-right:auto;
            /*margin 부분의 왼쪽과 오른쪽이 같아지게 놔둠*/
            padding: 0;/*패딩 영역을 삭제*/
            list-style-type: square;/*리스트 항목 표시 점을 네모 모양으로 바꿈*/
        }
        li /*li의 평상시 적용되는 스타일이면서,
        몇 가지는 li:hover에도 영향을 준다*/
        {
            font-size: 1.2rem;/*리스트의 폰트 사이즈*/
            background-color: #bfe7bc; /*배경색*/
            margin: 10px 0; /*마진 크기 바꾸기*/
            padding: 10px 15px; /*패딩 크기 바꾸기*/
            border-radius:8px;/*박스 모서리 둥글리기*/
            box-shadow: 3px 3px 6px rgba(0, 0, 0, 0.3);
            /*박스에 그림자주기인데 여기에 , 쓰면 안됨*/
            transition: all 0.3s; 
            /*li 위에 마우스 가져다 댈 때의 효과까지 걸리는 시간, 
            0.5가 넘으면 느리다고 느껴지기 시작*/

        }
        li:hover/*li 위에 마우스를 가져다 댔을 때의 스타일*/
        {
            background-color:rgb(78, 100, 83);
            transform: scale(1.05);
        }
        p{
            text-align: center; /
            color:#555;
            line-height:2;
        }
    </style>
</head>
<body>
    <h1>나의 버킷리스트</h1>
    <ul>
        <li>번지점프</li>
        <li>스카이 다이빙</li>
        <li>책 10,000권 읽기</li>
        <li>유럽여행</li>
    </ul>
    <p>죽기 전에 한번은 해봐야겠지? <br> 근데 자신은 없네 ㅠㅠ</p> 
</body>
</html>

 

내 마음대로 만들어본 코드와 웹페이지

더보기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>나의 버킷 리스트</title>
    <style>
        h1{
            color : rgb(255, 196, 0);
            font-size: 36;
            font-style: bold;
            font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;
            border-bottom: 3px solid orange;
            border-top: 3px solid orange;
            text-align: center;
            padding: 10px;
            margin-left: auto;
            margin-right: auto;
        }
        ul{ 
            max-width: 250px;
            margin-left: auto;
            margin-right: auto;
        }
        li{
            color: rgb(255, 196, 0);
            background-color: rgb(112, 128, 114);
            margin: 10px;
            padding: 5px;
            width: 200px;
            transition: all 0.3s;
            border-bottom: 3px solid orange;
            box-shadow: 3px 3px 6px rgba(0, 0, 0, 0.3);
        }
        li:hover{
            border-radius:7px;
            transform: scale(1.1);
            background-color: rgb(0, 0, 0);
           
        }
        /*br{
            margin-bottom: 1px;
            margin-bottom: 10px;
        }br은 속성을 부여할 수가 없다 그냥 \n 하고 끝*/
        p{
            text-align: center;
            line-height: 2;
            padding: 0px;            
            border-top: 3px solid orange;
            border-bottom: 3px solid orange;
            color: grey;
            background-color: rgb(255, 196, 0);

        }
    </style>
</head>
<body>
    <h1>Things I Wanna Do <br>Before The Day I die</h1>
    <ul>
        <li>스카이 다이빙</li>
        <li>아프리카 사파리</li>   
        <li>책 10,000권 읽기</li>  
        <li>이집트로 신혼여행</li>
        <li>미국 유학</li>
        <br>
        <p>엄청나!!!<br>
        기대돼!!!!<br>
        다 하고 가면 좋겠따!!!!! ^0^ </p>
    </ul>
</body>
</html>

<14:30 5교시 >

■ create as를 이용한 표의 복제(복사)

테이블 복제 방법 = create 새로운 표 as select * from 복제대상 표

(단, 제약 조건은 복사가 안 되고 제약 조건을 넣고 싶으면 따로 추가해줘야 함.)

 

create 새로운 표 as select * from 복제대상 표

이방법으로 할 때 as 뒤에 오는 게

select * from 복제대상 표 where 절

이어도 복제 가능

 

만약, 복제해 오는 표의 row 값은 존재하지 않지만, 복제대상 표의 형식(DESC)는 가져오고 싶으면,

where 절에 무조건 거짓인 조건을 붙이면 된다.

 

만약 이렇게 만들어진 빈 테이블에 같은 칼럼 형식의 다른 표에서 가져온 데이터를 집어 넣고 싶으면 

insert into 복제된 테이블

select * from 데이터가 있는 테이블

만 입력해도 된다.

 

 

SQL> --dept 테이블을 복사해서 dept2 테이블을 만들어 보세요
SQL> create table dept2 as select * from dept;

Table created.

SQL> --dept2의 deptno 칼럼에 primary key 제약 조건을 걸어보세요.
SQL> alter table dept2
  2  add constraint dept2_deptno_pk PRIMARY KEY(deptno);

Table altered.

SQL> -emp 테이블을 복사해서 emp2 테이블을 만들어보세요.
SP2-0734: unknown command beginning "-emp 테이..." - rest of line ignored.
SQL> --emp 테이블을 복사해서 emp2 테이블을 만들어보세요.
SQL> create table emp2 as select * from emp;

Table created.

SQL> --emp2의 empno 칼럼에 PRIMARY KEY 제약 조건을 걸어보세요.
SQL> alter table emp2
  2  add constraint emp2_empno_pk Primary key(empno);

Table altered.

SQL> --emp2의 deptno 칼럼이 dept2의 deptno 칼럼을 참조하도록 외래키 제약조건을 걸어보세요
SQL> alter table emp2
  2  add constraint emp2_deptno_fk references dept2_deptno_pk;
add constraint emp2_deptno_fk references dept2_deptno_pk
                                         *
ERROR at line 2:
ORA-00902: invalid datatype


SQL> --emp2의 deptno 칼럼이 dept2의 deptno 칼럼을 참조하도록 외래키 제약조건을 걸어보세요
SQL> alter table emp2
  2  add constraint emp2_deptno references dept2_deptno_pk;
add constraint emp2_deptno references dept2_deptno_pk
                                      *
ERROR at line 2:
ORA-00902: invalid datatype


SQL> --emp2의 deptno 칼럼이 dept2의 deptno 칼럼을 참조하도록 외래키 제약조건을 걸어보세요
SQL> alter table emp2
  2  add constraint emp2_deptno references dept2(deptno);
add constraint emp2_deptno references dept2(deptno)
                                            *
ERROR at line 2:
ORA-01735: invalid ALTER TABLE option


SQL> --emp2의 deptno 칼럼이 dept2의 deptno 칼럼을 참조하도록 외래키 제약조건을 걸어보세요
SQL> alter table emp2
  2  add constraint emp2_deptno references dept2(deptno);
                                              *
ERROR at line 2:
ORA-01735: invalid ALTER TABLE option


SQL> --emp2의 deptno 칼럼이 dept2의 deptno 칼럼을 참조하도록 외래키 제약조건을 걸어보세요
SQL> alter table emp2
  2  add constraint emp2_deptno_fk Foreign key(deptno) references dept2(deptno);

Table altered.

 

<15:30 6교시> HR/HR 계정을 활용해서 SELECT 문 다시 연습해보기

■ HR 계정 Unlock 하기

Microsoft Windows [Version 10.0.26100.2454]
(c) Microsoft Corporation. All rights reserved.

C:\Users\acorn>sqlplus system/

SQL*Plus: Release 11.2.0.2.0 Production on 수 11월 27 15:12:43 2024

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> alter user HR Account Unlock identified by HR;

User altered.

SQL>

■ HR 계정 사용해서 여러가지 연습 문제 풀기 -> 더보기로 닫아 놓기

더보기
SQL> --어떤 사원이 얼마를 받는지 궁금하다면?
SQL> select employee_id, first_name, Last_name, salary from employees;


SQL> --departments 테이블에서 부서의 아이디와 이름을 선택하세요.
SQL> select department_ID, department_name from departments;

SQL> select first_name||' '||Last_name FULL_NAME, salary from employees;

SQL> --부서가 없는 직원의 LAST_NAME 조회
SQL> select Last_name from employees where department_id is null;

LAST_NAME
--------------------------------------------------
Grant

SQL> --부서별(부서ID) 근무하는 직원의 수를 조회하세요
SQL> select department_id, count(first_name) from employees
  2  group by department_id;

DEPARTMENT_ID COUNT(FIRST_NAME)
------------- -----------------
          100                 6
           30                 6
                              1
           90                 3
           20                 2
           70                 1
          110                 2
           50                45
           80                34
           40                 1
           60                 5
           10                 1

12 rows selected.

SQL> --급여가 가장 높은 직원의 이름(LAST_NAME)과 급여를 조회하세요;
SQL> select last_name, salary from employees 
where salary = (select max(salary) from employees);

LAST_NAME                                              SALARY
-------------------------------------------------- ----------
King                                                    24000

SQL> --사원 id, 이름, 부서id, 부서명을 select
SQL> select e.employee_id 사원ID, first_name||' '||last_name 이름, d.department_id, d.department_name
  2  from employees e
  3  join departments d on e.department_id=d.department_id;

SQL> --각 직원의 매니저 이름을 조회
SQL> --(단 매니저가 없는 사원의 이름도 나오게)
SQL> select e.Last_name, m.last_name
  2  from employees e
  3  join employees m on e.manager_id=m.employee_id(+);
  
SQL> --위에꺼를 똑같이 ANSI JOIN 으로 
SQL> select e.Last_name, m.last_name
  2  from employees e
  3  left join employees m on e.manager_id=m.employee_id;

 

 

 

<16:30 7교시> DBeaver 이용해서 데이터베이스를 GUI로 접근해서 데이터를 선택하고 조회하는 방법

■ DBeaver란

데이터 베이스 잘하는 비버   데이터베이스를 GUI로 실행할 수 있는 애플리케이션

우리가 그동안 했던건 sqlplus로 명령프롬프트를 사용해서 데이터베이스의 데이터들을 다루었는데

DBeaver는 sqlplus와 같은 기능을 하는데 GUI를 제공하면서 시각적으로도, 기능적으로도 편리하게 대신 해주는 게 많다.

 

■ DBeaver 설치 및 실행(다운로드 링크)

데이터베이스 연결하기

ORACLE 선택 다음 > DRIVER PROPERTIES > DOWNLOAD 끝

>MAIN 가서 HOST는 로컬 호스트(내 컴퓨터에서 내 IP를 가리키는 방법=127.0.0.1), DATABASE XE, SID 선택

>localhost의 계정과 비밀번호 입력

>DB에 연결됨

 

 

■ DB로 직접 select 해보기

8:10 학원 도착. 올 겨울 첫눈이 엄청 많이 왔다. 나도 눈오리 만들고 싶은데 ㅠㅠ

오전 복습 시간에 해본 거 : ANSI JOIN 표현 확인하기

모든 사원의 이름, 부서번호, 부서명, 급여를 출력하세요.단, emp 테이블에 없는 부서도 출력해보세요.
OUTER JOIN의 ANSI 방법과 일반 방법의 차이

 

 

<9:30 1교시>

우리가 사용하는 ORACLE DATABSE 11g 는 네트워크 통신 포트로 디폴트값 1521을 사용한다고 한다.

윈도우가 이 1521포트를 방화벽으로 막지 않았다면 내 컴퓨터가 아닌 외부에서도 이 포트를 통해 데이터 베이스에 접속할 수 있다.

로그인할 때 입력하는 SQLPLUS가 1521 포트로의 접속을 가능하게 해주고, SQLPLUS는 더블클릭으로 실행할 수 있는  GUI가 아니고 명령 프롬프트로 직접 실행하는 프로그램이다.

 

■ 지난 시간 내용 복습

 

 

■ VIEW를 관리하는 데이터베이스 관리자가 잠깐 되어 보기 (아하 이런게 있구나)

 

DB 관리자들이 관리하는 정보들은 TABLE이라고 하지 않고 VIEW라는 가상의 테이블이라고 생각하면 된다.

 

 

 

<10:30 2교시>

외래키를 사용해서 참조된 부모 테이블은 자식 테이블보다 먼저 삭제될 수 없다.

(그러면 자식들이 미아가 된다!! 표현 엄청나!!)

 

■ 테이블의 변경 ALTER

ALTER 테이블에서 쓸 수 있는 여러 명령어

더보기

  - 테이블의 칼럼의 데이터 타입 수정

    MODIFY(칼럼 데이터타입) : 1개의 칼럼에 대한 데이터타입 수정 

    MODIFY(칼럼 데이터타입, 칼럼 데이터타입, ...) : 여러 개 칼럼에 대한 데이터타입 일괄 수정

  - 테이블에 칼럼을 추가하는 것

     ADD(칼럼 데이터 타입) : 1개의 칼럼 추가

     ADD(칼럼과 데이터 타입, 칼럼과 데이터타입, ...) : 여러개 컬럼, 데이터 타입 일괄 추가

  - 테이블에 칼럼 이름을 다시 붙이는 것

    RENAME COLUMN 변경전칼럼이름 TO 변경후칼럼이름

 

  - 테이블 이름 다시 짓기

    RENAME 변경전테이블이름 TO 변경후테이블이름

 

  - 테이블에 제약 조건을 추가하는 것

    ADD CONSTRAINT 표이름_칼럼이름_제약조건약자 제약조건풀네임(칼럼이름)

  - 테이블에 제약 조건을 삭제하는 것

    DROP CONSTRAINT 표이름_칼럼이름_제약조건약자

  - 테이블에 제약 조건을 비활성화 하는 것 : 개발 초기에 부여해둔 제약조건을 비활성화 시킴

    DISABLE CONSTRAINT 표이름_칼럼이름_제약조건약자

  - 테이블에 제약 조건을 활성화 하는 것 : 비활성화한 제약조건을 다시 활성화 시키는 것

    ENABLE CONSTRAINT 표이름_칼럼이름_제약조건약자

 

SQL> CREATE TABLE TEST(NUM NUMBER);

Table created.

SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER

SQL> ALTER TABLE TEST
  2  ADD NAME varchar2(10);

Table altered.

SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(10)

SQL> -- TEST 테이블에 ADDR VARCHAR2(20)을 추가해보세요
SQL> ALTER TABLE TEST
  2  ADD ADDR VARCHAR2(20);

Table altered.

SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(10)
 ADDR                                                           VARCHAR2(20)

SQL> ALTER TABLE TEST
  2  MODIFY NAME VARCHAR2(30)
  3  ;

Table altered.

SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(30)
 ADDR                                                           VARCHAR2(20)
 
 
SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(30)
 ADDRESS                                                        VARCHAR2(20)
 
 
 SQL> ALTER TABLE TEST
  2  DROP ADDRESS;
DROP ADDRESS
     *
ERROR at line 2:
ORA-00905: missing keyword


SQL> ALTER TABLE TEST
  2  DROP(ADDRESS);

Table altered.

SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(30)
 
 
 SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(30)

SQL> ALTER TABLE TEST
  2  DROP(NAME)
  3  ;

Table altered.

SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 
 
SQL> CREATE TABLE TEST(NUM NUMBER);

Table created.
SQL> ALTER TABLE TEST
  2  ADD(NAME VARCHAR2(20), ADDR VARCHAR(30));

Table altered.


SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(20)
 ADDR                                                           VARCHAR2(30)
 
 
 
SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(20)
 ADDR                                                           VARCHAR2(30)

SQL> ALTER TABLE TEST
  2  DROP(NAME, ADDR);

Table altered.

SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 
 SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER

SQL> RENAME TEST TO TRY;

Table renamed.

SQL> DESC TRY
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM

 

테이블의 변경 여러가지 연습과 정답이 섞인 삽질

더보기

SQL> ALTER TABLE TEST
  2  DROP(ADDRESS);

Table altered.

SQL> DESC TABLE;
ERROR:
ORA-00931: missing identifier


SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(30)

SQL> ALTER TABLE TEST
  2  DROP(NAME)
  3  ;

Table altered.

SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER

SQL> DROP TABLE;
DROP TABLE
         *
ERROR at line 1:
ORA-00903: invalid table name


SQL> DROP TABLE TEST;

Table dropped.

SQL> CREATE TABLE TEST(NUM NUMBER);

Table created.

SQL> ALTER TABLE TEST
  2  ADD(NAME, NEIGHBOR, ADDR);
ADD(NAME, NEIGHBOR, ADDR)
    *
ERROR at line 2:
ORA-02263: need to specify the datatype for this column


SQL> ALTER TABLE TEST
  2  ADD(NAME VARCHAR2(20) ADDR VARCHAR(30));
ADD(NAME VARCHAR2(20) ADDR VARCHAR(30))
                      *
ERROR at line 2:
ORA-00907: missing right parenthesis


SQL> ALTER TABLE TEST
  2  ADD(NAME VARCHAR2(20), ADDR VARCHAR(30));

Table altered.

SQL> DESC TABLE
ERROR:
ORA-00931: missing identifier


SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(20)
 ADDR                                                           VARCHAR2(30)

SQL> ALTER TABLE TEST
  2  DROP(NAME, ADDR);

Table altered.

SQL> DESC TEST
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER

SQL> RENAME TEST TO TRY;

Table renamed.

SQL> DESC TRY
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER

SQL> ALTER TABLE TRY
  2  ADD (NAME VARCHAR2(6), PHONE VARCHAR2(10));

Table altered.

SQL> DESC TRY
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(6)
 PHONE                                                          VARCHAR2(10)

SQL> ALTER TABLE TRY
  2  ADD(REGDATE DATE);

Table altered.

SQL> ALTER TABLE TRY
  2  ;

*
ERROR at line 2:
ORA-02210: no options specified for ALTER TABLE


SQL> DESC TRY
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(6)
 PHONE                                                          VARCHAR2(10)
 REGDATE                                                        DATE

SQL> RENAME TABLE TRY REGISTER
  2  ;
RENAME TABLE TRY REGISTER
       *
ERROR at line 1:
ORA-00903: invalid table name


SQL> RENAME TRY TO REGISTER;

Table renamed.

SQL> DESC TRY
ERROR:
ORA-04043: object TRY does not exist


SQL> DESC REIGSTER
ERROR:
ORA-04043: object REIGSTER does not exist


SQL> DESC REGISTER
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(6)
 PHONE                                                          VARCHAR2(10)
 REGDATE                                                        DATE

SQL> ALTER TABLE REGISTER
  2  RENAME REGDATE TO REGI;
RENAME REGDATE TO REGI
       *
ERROR at line 2:
ORA-14155: missing PARTITION or SUBPARTITION keyword


SQL> ALTER TABLE REGISTER
  2  RENAME COLUMN REGDATE TO REGI;

Table altered.

SQL> DESC REGISTER;
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(6)
 PHONE                                                          VARCHAR2(10)
 REGI                                                           DATE

SQL>

 

 

LOC에 CHECK 제약 조건을 부여해보기 'SEOUL' OR 'BUSAN'만 가능하도록하는 조건 예제 풀어보는데 망했음 ㅋㅋ

더보기

SQL> --LOC에 CHECK 제약 조건을 부여해보기 'SEOUL' OR 'BUSAN'만 가능하도록
SQL> ADD LOC CONSTRAINT DEPT2_LOC_CK CHECK IN('SEOUL', 'BUSAN';
SP2-0734: unknown command beginning "ADD LOC CO..." - rest of line ignored.
SQL> --LOC에 CHECK 제약 조건을 부여해보기 'SEOUL' OR 'BUSAN'만 가능하도록
SQL> ALTER TABLE DEPT2 ADD LOC CONSTRAINT DEPT2_LOC_CK CHECK IN('SEOUL', 'BUSAN');
ALTER TABLE DEPT2 ADD LOC CONSTRAINT DEPT2_LOC_CK CHECK IN('SEOUL', 'BUSAN')
                                                        *
ERROR at line 1:
ORA-00906: missing left parenthesis


SQL> ALTER TABLE DEPT2
  2  ALTER TABLE DEPT2 ADD LOC CONSTRAINT DEPT2_LOC_CK CHECK IN('SEOUL', 'BUSAN');
ALTER TABLE DEPT2 ADD LOC CONSTRAINT DEPT2_LOC_CK CHECK IN('SEOUL', 'BUSAN')
*
ERROR at line 2:
ORA-01735: invalid ALTER TABLE option


SQL> ALTER TABLE DEPT2
  2  ADD LOC CONSTRAINT DEPT2_LOC_CK CHECK IN('SEOUL', 'BUSAN');
ADD LOC CONSTRAINT DEPT2_LOC_CK CHECK IN('SEOUL', 'BUSAN')
                                      *
ERROR at line 2:
ORA-00906: missing left parenthesis


SQL> --LOC에 CHECK 제약 조건을 부여해보기 'SEOUL' OR 'BUSAN'만 가능하도록
SQL> ALTER TABLE DEPT2
  2  ADD CONSTRAINT DEPT2_LOC_CK CHECK(LOC IN('SEOUL', 'BUSAN'));

Table altered.

SQL>

 

SQL> -- 제약 조건 추가
SQL> ALTER TABLE DEPT2
  2  ADD CONSTRAINT DEPT2_DEPTNO_PK PRIMARY KEY(DEPTNO);

Table altered.

SQL> -- 제약 조건 비활성화 하기 : 프로젝트 시작할 때 부여해둔 제약 조건을 꺼두기
SQL> ALTER TABLE DEPT2 
  2  DISABLE CONSTRAINT DEPT2_DEPTNO_PK;

Table altered.

SQL> --제약 조건 활성화 하기 : 프로젝트 진행 중 꺼뒀던 제약 조건 다시 활성화 하기
SQL> ALTER TABLE DEPT2
  2  ENABLE CONSTRAINT DEPT2_DEPTNO_PK;

Table altered.

SQL> --제약 조건 삭제
SQL> ALTER TABLE DEPT2
  2  DROP CONSTRAINT DEPT2_DEPTNO_PK;

Table altered.

 

 

<11:30 3교시>

■ 선생님 컴퓨터에 접속해서 데이터 추가할 수 있도록 해보기

① 원격접속 시작 : 방화벽 내리기

더보기

내컴퓨터가 아닌 외부 컴퓨터가 내 컴퓨터의 오라클에 접속할 수 있도록 하기 위해서는 방화벽이 외부의 컴퓨터를 들여보낼 수 있게 해주는 방법이 필요하다.

내 컴퓨터의 오라클에 외부의 컴퓨터를 접속하게 해주기 위해선 방화벽의 인바운드 규칙을 설정할 필요가 있다.

인바운드 규칙을 설정하는 방법은 다음과 같다.

 

방화벽 열기 > 윈도우 검색창에 방화벽 검색 > 제어판의 방화벽 상태 확인 클릭 > 고급설정 클릭 > 인바운드 규칙 클릭 > 우측의 인바운드 규칙 하단의 새규칙 클릭 > 포트를 누르고 다음 클릭 -> TCP(일반 인터넷) 누르고 다음 클릭 -> 특정로컬포트에 1521 입력하고 다음 클릭 -> 연결허용하고 다음 클릭 -> 모두 선택 하고 다음 클릭 -> 이름입력(일단 테스트니까 아무렇게나 입력해도 됐지만 실제로 하게 되면 뭔가 관련 이름 해야겠지) > 마침 => 이후에 인바운드 목록에 방금 만든 인바운드 규칙이 뜸

 

② 원격접속하려는 PC의 IP 확인하기

더보기

명령 프롬프트에서 ipconfig를 엔터치면 자신의 컴퓨터의 IP를 확인할 수 있다. (맥OS면 ifconfig를 대신 입력해야 한다고 함)

IP 주소는 iPv4의 주소를 읽어서 192.168.X.XXX 이렇게 10자리로 구성된다. 이 IP주소는 가상 IP로, 컴퓨터를 재부팅하면 뒤에 X 부분 네 자리는 랜덤으로 채워진다고 한다.

③ 원격접속하기

더보기

원격 접속하려는 PC에 인바운드 규칙이 생성돼 있으면 아래와 같이

계정/비밀번호@IP주소:포트번호/XE <= SCOTT/TIGER@192.168.X.XXX:1521/XE

를 입력하면 원격 접속 된다.

 

내가 INSERT로 입력한member_seq.nextval, 거북, 서울을 commit 하면

선생님의 컴퓨터의 scott 계정의 table에 추가된다.

Microsoft Windows [Version 10.0.26100.2454]
(c) Microsoft Corporation. All rights reserved.

C:\Users\acorn>SQLPLUS SCOTT/TIGER@192.168.X.XXX:1521/XE

SQL*Plus: Release 11.2.0.2.0 Production on 수 11월 27 12:02:54 2024

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> -- 선생님 컴퓨터 MEMBER 테이블에 본인의 정보를 inserT 하고 COMMIT 해보세요
SQL> INSERT INTO MEMBER
  2  (NUM, NAME, ADDR)
  3  VALUES
  4  (MEMBER_SEQUENCE.NEXTVAL, 거북, '서울');
(MEMBER_SEQUENCE.NEXTVAL, 거북, '서울')
                          *
ERROR at line 4:
ORA-00984: column not allowed here

SQL> INSERT INTO MEMBER
  2  (NUM, NAME, ADDR)
  3  VALUES
  4  (MEMBER_SEQ.NEXTVAL, '거북', '서울');

1 row created.

SQL> COMMIT
  2  ;

Commit complete.

 

내가 만든 내 테이블에 선생님이 접속해서 코드를 입력해주시기도 했는데,

이 전에 내가 두 개 row를 입력했던 내용을 commit하지 않고 창을 닫았었는데,

선생님과 옆에 앉은 수강생이 내 컴퓨터에 원격 접속하여 데이터를 insert하고 갔는데,

sequence의 특징을 확인할 수가 있었다.

개인정보 보호를 위해 입력된 name, addr 에 입력된것만 바꿨는데 내가 입력 전에 insert 했던 1,2 두 개의 row가 commit되지 않았음에도 sequence가 이미 번호를 부여해버리고 현재 번호가 3이 되어버린 탓에 선생님께서 번호 부여하셨을 때엔 3, 옆자리 수강생이 했을 때엔 4가 부여된 것이었다!

SQL> select * from member;

       NUM NAME                     ADDR
---------- ------------------------ --------------------------------
         3 선생님                   XX동
         4 옆자리                   XX동

 

 

■ VIEW 권한 부여하고 만들기

VIEW는 테이블로부터 참고한 내용들을 보여주는 가상의 테이블로, 원래 사용하는 목적은 테이블에 포함된 기밀/민감 정보들을 가려서 보여주기 위함+단일테이블의 조인의 편리성 때문이라고 한다.

 

① GRANT CREATE VIEW

system 계정으로 로그인 해서 grant create view to 계정; 명령을 통해 view를 만들 수 있는 권한을 부여한다.

 

② VIEW (테이블) 다루기

VIEW는 다시 말하지만 임의의 테이블 역할을 하는 임시표이다. 

집계함수로 된 다중행 데이터는 특별한 명령 없이는 바로 VIEW로 선택되고 만들어질 수 없어서, 보통 VIEW는 단일행으로 이루어진 표이다. 그래서 VIEW에서 변경한 내용이 TABLE에도 적용될 수 잇는데, 이를테면 VIEW에서 삭제한 내용이 TABLE에서도 동일하게 삭제되는 것이다.

단, VIEW를 만들 때 JOIN으로 여러 개의 테이블을 합쳤다면 이 VIEW는 READ ONLY가 되어서 변형이 불가하다.

더보기
SQL> CREATE VIEW MEMBER_VIEW AS
  2  SELECT NUM, NAME
  3  FROM MEMBER;
CREATE VIEW MEMBER_VIEW AS
            *
ERROR at line 1:
ORA-01031: insufficient privileges


SQL> CREATE VIEW MEMBER_VIEW AS
  2  SELECT NUM, NAME
  3  FROM MEMBER;

View created.

SQL>
SQL> CREATE VIEW EMP_VIEW as
  2  select empno, ename, deptno
  3  from emp;

View created.

SQL> desc view emp_view
Usage: DESCRIBE [schema.]object[@db_link]
SQL> desc emp_view;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              VARCHAR2(10)
 DEPTNO                                             NUMBER(2)

SQL> select * from emp_view;

     EMPNO ENAME                    DEPTNO
---------- -------------------- ----------
      7369 SMITH                        20
      7499 ALLEN                        30
      7521 WARD                         30
      7566 JONES                        20
      7654 MARTIN                       30
      7698 BLAKE                        30
      7782 CLARK                        10
      7839 KING                         10
      7844 TURNER                       30
      7900 JAMES                        30
      7902 FORD                         20

     EMPNO ENAME                    DEPTNO
---------- -------------------- ----------
      7934 MILLER                       10

12 rows selected.

SQL> create view my_view as
  2  select empno, ename, sal, deptno, dname
  3  from emp
  4  join dept using(deptno);

View created.

SQL> select * from my_view;

     EMPNO ENAME                       SAL     DEPTNO
---------- -------------------- ---------- ----------
DNAME
----------------------------
      7369 SMITH                       800         20
RESEARCH

      7499 ALLEN                      1600         30
SALES

      7521 WARD                       1250         30
SALES


     EMPNO ENAME                       SAL     DEPTNO
---------- -------------------- ---------- ----------
DNAME
----------------------------
      7566 JONES                      2975         20
RESEARCH

      7654 MARTIN                     1250         30
SALES

      7698 BLAKE                      2850         30
SALES


     EMPNO ENAME                       SAL     DEPTNO
---------- -------------------- ---------- ----------
DNAME
----------------------------
      7782 CLARK                      2450         10
ACCOUNTING

      7839 KING                       5000         10
ACCOUNTING

      7844 TURNER                     1500         30
SALES


     EMPNO ENAME                       SAL     DEPTNO
---------- -------------------- ---------- ----------
DNAME
----------------------------
      7900 JAMES                       950         30
SALES

      7902 FORD                       3000         20
RESEARCH

      7934 MILLER                     1300         10
ACCOUNTING


12 rows selected.

 

 

<12:30 4교시>

오늘 1,2,3교시때 했던 내용 손에 익게 복습하라고 시간 주셨음.

블로그 2,3교시 때 한거 내용 정리하러 올라감.

 

 

+ 정리 다 못해서 8교시에도 하는 중

 

 

 

 

 

 

 

<14:30 5교시>

 

--부서 번호가 20인 직원 중 급여가 가장 높은 직원의 이름과 급여를 조회하시오

아래 코드에서 where deptno=20 and sal=(select max(sal) from emp where deptno=20);이라고 한 이유는 부서가 20이 아닌 곳에서 동일한 급여를 가진 사원의 이름도 같이 나올 수 있어서.

where deptno=20 and sal=(3000)이어

SQL> select ename, sal from emp
  2  where deptno=20 and sal=(select max(sal) from emp where deptno=20);

ENAME                       SAL
-------------------- ----------
FORD                       3000

 

--각 부서의 직원 수를 조회하시오(별칭은 한글이어도 띄어쓰기 없으면 문제 없음)

SQL> --각 부서의 직원 수를 조회하시오
SQL> select deptno, count(*) "직원수"
  2  from emp
  3  group by deptno;

    DEPTNO     직원수
---------- ----------
        30          6
        20          3
        10          3

--급여 합계가 5000 이상인 부서의 부서 번호와 급여 합계를 조회하시오.(로우의 배제 없음. 그룹의 배제 있음)

SQL> --급여 합계가 5000 이상인 부서의 부서 번호와 급여 합계를 조회하시오.
SQL> select deptno, sum(sal)
  2  from emp
  3  group by deptno
  4  having sum(sal)>=5000;

    DEPTNO   SUM(SAL)
---------- ----------
        30       9400
        20       6775
        10       8750

--부서별 최고 급여를 받는 직원의 이름과 급여를 조회하시오

SQL> --부서별 최고 급여를 받는 직원의 이름과 급여를 조회하시오
SQL> select deptno, ename, sal from emp where sal in(select max(sal) from emp group by deptno);

    DEPTNO ENAME                       SAL
---------- -------------------- ----------
        30 BLAKE                      2850
        10 KING                       5000
        20 FORD                       3000
        

SQL> select deptno, ename, sal from emp
  2  where (deptno, sal) in(select deptno, max(sal) from emp group by deptno);

    DEPTNO ENAME                       SAL
---------- -------------------- ----------
        30 BLAKE                      2850
        10 KING                       5000
        20 FORD                       3000

--급여가 부서별 평균급여보다 높은 직원의 이름, 급여를 조회하시오.

SQL>--급여가 부서별 평균급여보다 높은 직원의 이름, 급여를 조회하시오.
SQL> select ename,sal from emp
  2  where sal >(select AVG(sal) from emp group by deptno)
  3
SQL> select ename, sal
  2  from emp e1
  3  where sal > (select avg(Sal) from emp where deptno=e1.deptno);

ENAME                       SAL
-------------------- ----------
ALLEN                      1600
JONES                      2975
BLAKE                      2850
KING                       5000
FORD                       3000

 

 

<13:30 6교시>

 

 

 

 

--모든 직원의 급여와 평균 급여의 차이를 계산하시오.

 

 

와 미친 겁나 졸았음;;; ㅠㅠㅠㅠㅠ

졸다가 막판에 들은거 외래키 제약 조건 때문에 테이블 사이의 관계를 어떻게 할건지에 관련 관리 방법메모 한거 일단 대충 정리...

 

■ 관계형 DataBase

Table을 만들 때는 관계 설정을 해줘서 테이블 간에 서로 무결성이 없도록 관리해준다.

관계형 DATABASE의 외래키 제약 조건이 테이블 사이의 관계를 어떻게 관리하게 되는지에 대해서 배울 것.

보통 테이블을 만들 때 관계 설정이 필요한데, 보통 부모 테이블이라는 녀석을 먼저 만들고 이거에 연결 지어지는 다른 테이블들에 외래키 제약 조건을 추가한다. 

외래키 제약 조건이 들어가면 부모 테이블은 자식 테이블 보다 먼저 삭제될 수 없다. 다만, CASCADE라는 함수로 강제 삭제가 가능하다.

 

 

 

 

<16:30 7교시>

 

테이블을 만들 때 CONSTRAINT 뒤에 오는 제약 조건의 명령을 입력하지 않으면 SQL이 무작위의 이름을 마음대로 배정해놓기 때문에 이를 사용하기가 불편해서 우리가 보고 싶은 이름으로 정의하는 것이 좋다.

외래키를 설정한 테이블 칼럼에서 외래키의 범위에서 벗어난 값을 입력하면 외래키 제약 조건 위배로 row 값이 입력되지 않는다.

SQL> --연습용 테이블 dept2와 emp2 테이블을 만들어보자
SQL> CREATE TABLE dept2(deptno NUMBER(2) CONSTRAINT dept2_deptno_pk PRIMARY KEY,
  2  dname VARCHAR2(12) CONSTRaiNT dept2_dname_nn not null,
  3  loc VARCHAR2(12) Constraint dept2_loc_ck Check(loc In('Seoul', 'Busan')));

Table created.

SQL> create table emp2(empno NUMBER(4) CONSTRAINT emp2_empno_pk PRIMARY KEY,
  2  ename VARCHAR2(12) Constraint emp2_ename_nn not null,
  3  deptno NUMBER(2) CONsTRAINT emp2_deptno_fk REFEReNCES dept2(deptno));

Table created.

SQL> insert into dept2(deptno, dname, loc) values (11, '마케팅', 'Seoul');

1 row created.

SQL> insert into dept2(deptno, dname, loc) values (12, '리서치', 'Seoul');

1 row created.

SQL> insert into emp2(empno, ename, deptno) values (1, '유재석', 11);

1 row created.

SQL> insert into emp2(empno,ename, deptno) values(2, '하석진', 12);

1 row created.

SQL> select * from dept2;

    DEPTNO DNAME                    LOC
---------- ------------------------ ------------------------
        11 마케팅                   Seoul
        12 리서치                   Seoul

SQL> select * from emp2;

     EMPNO ENAME                        DEPTNO
---------- ------------------------ ----------
         1 유재석                           11
         2 하석진                           12

 

■ 테이블 수준 제약 조건

이번에는 제약 조건을 다른 방식으로 부여하는 테이블을 만들어보기로 함.

그동안은 칼럼을 정의하고 그 옆에 선언하는 제약 조건을 칼럼 수준(COLUMN LEVEL)에서 정의했던거인데

이번에는 테이블을 정의할 때 선언하는 제약조건(테이블 수준 제약 조건, TABLE LEVEL 제약 조건)을 배울 것.

제약 조건의 이름과 종류와 함께 칼럼명이 들어가야 함

CONSTRAINT emp2_empno_pk PRIMARY KEY(empno),

CONSTRAINT emp2_deptno_fk FOREIGN KEY(deptno) REFERENCES dept2(deptno))

단, NOT NULL 제약 조건은 테이블 수준 제약 조건으로 들어가지 못해서 칼럼 수준 제약 조건으로 정의한다.

 

SQL> CREATE TABLE dept2(deptno NUMBER(2) CONSTRAINT dept2_deptno_pk PRIMARY KEY,
  2  dname VARCHAR2(12) CONSTRaiNT dept2_dname_nn not null,
  3  loc VARCHAR2(12) Constraint dept2_loc_ck Check(loc In('Seoul', 'Busan')));

Table created.

SQL> create table emp2
  2  (empno NUMBER(4),
  3  ename VARCHAR2(12) constraint emp2_ename_nn NOt Null,
  4  deptno NUMBER(2),
  5  CONSTRAINT emp2_empno_pk PRIMARY KEY(empno),
  6  CONSTRAINT emp2_deptno_fk FOREIGN KEY(deptno) REFERENCES dept2(deptno))

CHECK 같은 명령어는 괄호 안에 있는 조건을 사용하여 TRUE이어야만 row가 입력된다.

 

 

 

■ 제약 조건 없이 테이블을 만들고, 따로 제약 조건을 부여하는 명령 : ALTER

보통 개발을 하게 되면 데이터가 거의 없는 상태에서 만들기 때문에 무엇에 제약 조건을 걸지가 명확하지 않다. 

그래서 날것의 테이블을 만들어 놓고 개발이 끝나고 데이터가 어느정도 수집되면서부터 제약 조건을 걸게 된다.

ALTER TABLE을 사용해 내용을 추가(ADD)하고, 이때의 문법은 테이블 수준의 제약 조건을 작성할 때와 똑같게 된다.

다만, NOT NULL은 독특한 애라 또 조금 다르게 추가(MODIFY)한다.

 

SQL> --연습용 테이블 dept2와 emp2 테이블을 만들어보자
SQL> CREATE TABLE dept2(deptno NUMBER(2) CONSTRAINT dept2_deptno_pk PRIMARY KEY,
  2  dname VARCHAR2(12) CONSTRaiNT dept2_dname_nn not null,
  3  loc VARCHAR2(12) Constraint dept2_loc_ck Check(loc In('Seoul', 'Busan')));

Table created.

SQL> create table emp2
  2  (empno NUMBER(4),
  3   ename VARCHAR2(12),
  4   deptno NUMBER(2)
  5  );

Table created.

SQL> ALTER TABLE emp2
  2  ADD constraint emp2_empno_pk primary key(empno);

Table altered.

SQL> ALTER TABLE emp2
  2  ADD constraint emp2_deptno_fk FOREIGN KEY(deptno) REFERENCES dept2(deptno);

Table altered.


SQL> ALTER TABLE emp2
  2  MODIFY ename Constraint emp2_ename_nn Not Null;

Table altered.

 

<17:30 8교시>

1. dept2 테이블과 emp2 테이블을 여러번 만들고 삭제하고를 반복해 보세요(제약 조건 활용!)

2. 만들어진 테이블에 row를 제약조건을 위배하지 않고 추가해보기.

3. 제약 조건을 위배하는 다양한 테스트 해보기.

 

 

<8교시 때 실습하면서 생각했던 것들>

  • 수업 때 dept2를 부모 테이블로, emp2를 자식 테이블로 만들어서 거꾸로 만들어볼 생각을 했는데, dept2를 부모 테이블로 만드는 게 훨씬 나은 선택일 거 같은게, dept는 emp랑 다르게 들어가는 칼럼 정보도 일단 deptno, dname, loc 세 개 뿐이고, 회사나 유저 입장에서 웹브라우저로 받아서 저장하는 정보 중에 부서의 변경 내용보다 emp의 변경 내용이 훨씬 많을 거고. 그래서 dept를 부모 테이블로 만드는 게 이래저래 맞는 방법이긴 한듯.
  • 표 정의할 때 VARCHAR2()를 자꾸 VARCHAR로 적음
  • 오타 자주 냄(특히 CONSTRAINTS, REFERENCE, dept인데 dpet, dpte이런거 개많음, table도 tabel 이런거 등등)
  • 괄호 위치, 콤마 위치, 작은따옴표인지 큰따옴표 인지 제대로 잘 하기...
  • 각 명령어 어떻게 쓰는지 계속 연습하기.... 자꾸 명령어 빼먹고 오류내고 그래...
SQL> --삽질 코드 CONSTRAINT 사라짐...
SQL> create table dept3
  2  (deptno NUMBER(3) dept3_deptno_pk PRIMARY KEY,
  3  dname VARCHAR2(16) dept3_dname_nn NOT NULL,
  4  loc VARCHAR2(16) dept3_loc_ck CHECK(loc in('seoul', 'los angeles', 'Paris')));
(deptno NUMBER(3) dept3_deptno_pk PRIMARY KEY,
                  *
ERROR at line 2:
ORA-00907: missing right parenthesis

SQL> --제약 조건 부모 테이블 만들었다
SQL> create table dept3
  2  (deptno NUMBER(3) constraint dept3_deptno_pk PRIMARY KEY,
  3  dname VARCHAR2(16) constraint dept3_dname_nn NOT NULL,
  4  loc VARCHAR2(16) constraint dept3_loc_ck CHECK(loc in('seoul', 'los angeles', 'Paris')));

Table created.

SQL>--empno number를 5로 해서 틀린줄 알았는데 constriant 때문이었어서 아예 지우고 다시 해봐야지 -> 해봤더니 ㅇㅇ NUMBER안의 문자열 길이는 문제되지 않음.
SQL> create table emp3
  2  (empno NUMBER(5) contraint emp3_empno_pk PRIMARY KEY,
  3  ename VARCHAR2(16) constraint emp3_ename_nn NOT NULL,
  4  deptno NUMBER(5) constraint emp3_deptno REFERENCE dept3(deptno));
(empno NUMBER(5) contraint emp3_empno_pk PRIMARY KEY,
                 *
ERROR at line 2:
ORA-00907: missing right parenthesis


SQL> create table emp3
  2  (empno NUMBER(5) contraint emp3_empno_pk PRIMARY KEY,
  3  ename VARCHAR2(16) constraint emp3_ename_nn NOT NULL,
  4  deptno NUMBER(5) constraint emp3_deptno REFERENCES dept3(deptno));
(empno NUMBER(5) contraint emp3_empno_pk PRIMARY KEY,
                 *
ERROR at line 2:
ORA-00907: missing right parenthesis


SQL> create table emp3
  2  (empno NUMBER(3) contraint emp3_empno_pk PRIMARY KEY,
  3  ename VARCHAR2(16) constraint emp3_ename_nn NOT NULL,
  4  deptno NUMBER(5) constraint emp3_deptno REFERENCES dept3(deptno));
(empno NUMBER(3) contraint emp3_empno_pk PRIMARY KEY,
                 *
ERROR at line 2:
ORA-00907: missing right parenthesis


SQL> create table emp3
  2  (empno NUMBER(3) constraint emp3_empno_pk PRIMARY KEY,
  3  ename VARCHAR2(16) constraint emp3_ename_nn NOT NULL,
  4  deptno NUMBER(5) constraint emp3_deptno REFERENCES dept3(deptno));

Table created.

 

 

<오늘 수업 마무리 하기>

중간에 나도 모르게 빠져들 듯이 졸고 있는 바람에 놓친 부분 선생님께서 차근차근 다시 해주셔서 간신히 수습한 것 같고

일단 SELECT 문 어려운 문제들(예제 8,9,10) 같은거는 우리가 익숙해지려고 연습하는 차원에서 한거지 실제 개발 환경에서 그렇게까지 어려운건 나올일 없다고 하시는데 아니 그래도 나는 정복하고 싶긴하다고? ㅋㅋㅋㅋㅋ ㅠㅠ

 

어제 너무 개나대서 오늘 피곤해져서 열심히 못한거 같으니까 오늘의 겸손함을 좀 오래 가져가려고 노력하면서 피로도 풀어야겠다 ㅠ

챗 지피티가 내가 졸린 이유가 오히려 커피를 너무 많이 마셔서 일 수도 있다고 했다! ㅠ

그렇다면 커피를 줄이긴 해야하는데 아득하긴 하다.

아침 한잔만 마시는 정도로 해야 할거 같긴한데 ㅠ

지금 아침 먹고 한잔, 지하철 내려서 학원 오면서 오전에 한잔 점심 먹구 오후에 한잔 최소 세 잔에 요 며칠은 오후에도 맛있다고 미쳐서 커피 마셨던 기억이..... 아니 커피 너무 맛있어 ㄹㅇ..

커피 줄이자.... 흑흑.. ㅠㅠ

 

 

7:55 무렵 학원 도착

수업 준비 세팅, 복습, 노트 정리하기

 

<9:30 1교시>

지난 시간 복습

테이블의 조인 방법 : ANSI(AMERICA NATIONAL STANDARD INSTITUTE, 미국국가표준협회) JOIN

테이블의 셀프 조인

테이블의 아우터 조인 

 

- outer join이면 빈공간이 되는 쪽에 (+) 해줘야 하고, outer join을 입력할거면 (+) 굳이 안써줘도 됨

 

- null 값이던 녀석에 값을 부여하고 싶으면 NVL을 활용하면 됨

테이블 3개의 조인 : 조인할 테이블 개수-1만큼의 join 절이 나온다.

USING 절을 활용한 테이블 3개의 조인

서브쿼리

 

+ 지난시간 복습에 추가된 내용

■ USING 절의 사용 : join 조건에서 칼럼명이 두 테이블에 동일하게 들어가 있을 때 간단하게 쓰는 방법

join 조건의 칼럼명이 같은 경우 좀 더 간단한 표현식을 쓸 수 있다. 이때는 select 에서의 칼럼명이 모호해도 되고, 

join 절에서 on 이후를 USING(칼럼명)으로 대체해서 쓰면 된다.

 

 

 

 

<10:30 2교시> 서브쿼리의 종류들, 서브쿼리를 이용한 페이징 방식의 기초 다지기

■ 서브쿼리의 유형 

- 단일행 서브쿼리 : 서브쿼리로 들어갈 SELECT 문에서 선택한 row 값이 1개

 

-다중행 서브쿼리 : 여러 row를 반환하는 서브쿼리, 주로 IN, ANY, ALL 연산자와 함께 사용됨

 

- 상관 서브쿼리

 

 

- FROM 절에서의 서브쿼리 : 서브쿼리가 임시 테이블처럼 작동하여 데이터를 제공한다

 

■ 서브쿼리를 활용한 페이징의 기초 다지기

우리가 만들게 되는 웹페이지에서 여러가지 글 등이 입력되면 우리는 웹브라우저 이용자들에게 1페이지에 모든 글을 제공하지 않고 페이지마다 몇 개의 글만 띄워주게 된다. 페이지당 보이는 글의 개수가 다른 것이다.

 

이걸 운동장에 모인 사람들에 비유하자면, 운동장에 모인 사람들을 키 순서로 정렬시키고 그 사람들에게 번호를 부여한 다음, 몇번부터 몇번까지 나오세요 라고 하면 된다는 거.

 

그래서 페이징의 핵심은

① 정렬하고(SELECT, ORDER BY) ② 순번을 부여하고(ROWNUM) ③ 번호를 추출하는 것(SELECT,WHERE)

SQL> --사원의 급여로 내림차순 정렬해서 위에서부터 5명씩 잘랐을 때 2번째 그룹의 사원번호, 사원 이름, 급여를 출력해보세요.

SQL> select empno, ename, sal
  2  from emp
  3  order by sal desc;

     EMPNO ENAME                       SAL
---------- -------------------- ----------
      7839 KING                       5000
      7902 FORD                       3000
      7566 JONES                      2975
      7698 BLAKE                      2850
      7782 CLARK                      2450
      7499 ALLEN                      1600
      7844 TURNER                     1500
      7934 MILLER                     1300
      7654 MARTIN                     1250
      7521 WARD                       1250
      7900 JAMES                       950
      7369 SMITH                       800

12 rows selected.

SQL> ed
Wrote file afiedt.buf

  1  select sub.*
  2* from (select empno, ename, sal from emp order by sal desc) sub
SQL> /

     EMPNO ENAME                       SAL
---------- -------------------- ----------
      7839 KING                       5000
      7902 FORD                       3000
      7566 JONES                      2975
      7698 BLAKE                      2850
      7782 CLARK                      2450
      7499 ALLEN                      1600
      7844 TURNER                     1500
      7934 MILLER                     1300
      7654 MARTIN                     1250
      7521 WARD                       1250
      7900 JAMES                       950
      7369 SMITH                       800

12 rows selected.

SQL> ed/

SQL> ed
Wrote file afiedt.buf

  1  select sub.*,ROWNUM
  2* from (select empno, ename, sal from emp order by sal desc) sub
SQL> /

     EMPNO ENAME                       SAL     ROWNUM
---------- -------------------- ---------- ----------
      7839 KING                       5000          1
      7902 FORD                       3000          2
      7566 JONES                      2975          3
      7698 BLAKE                      2850          4
      7782 CLARK                      2450          5
      7499 ALLEN                      1600          6
      7844 TURNER                     1500          7
      7934 MILLER                     1300          8
      7654 MARTIN                     1250          9
      7521 WARD                       1250         10
      7900 JAMES                       950         11
      7369 SMITH                       800         12

12 rows selected.

SQL> ed
Wrote file afiedt.buf

  1  select sub.*,ROWNUM order
  2* from (select empno, ename, sal from emp order by sal desc) sub
SQL> /
select sub.*,ROWNUM order
                    *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected


SQL> /
select sub.*,ROWNUM order
                    *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected


SQL> ed
Wrote file afiedt.buf

  1  select sub.*,ROWNUM  order
  2* from (select empno, ename, sal from emp order by sal desc) sub
SQL> /
select sub.*,ROWNUM  order
                     *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected


SQL> ed
Wrote file afiedt.buf

  1  select *
  2  from
  3  (select sub.*,ROWNUM  orderbunho
  4  from (select empno, ename, sal from emp order by sal desc) sub
  5* where orderbunho between 6 and 10
SQL> /
where orderbunho between 6 and 10
                                *
ERROR at line 5:
ORA-00907: missing right parenthesis


SQL> ed
Wrote file afiedt.buf

  1  select *
  2  from
  3  (select sub.*,ROWNUM  orderbunho
  4  from (select empno, ename, sal from emp order by sal desc) sub)
  5* where orderbunho between 6 and 10
SQL> /

     EMPNO ENAME                       SAL ORDERBUNHO
---------- -------------------- ---------- ----------
      7499 ALLEN                      1600          6
      7844 TURNER                     1500          7
      7934 MILLER                     1300          8
      7654 MARTIN                     1250          9
      7521 WARD                       1250         10

 

ROWNUM은 order라고 별칭을 지으면 안된다.

 

■ WITH절 서브쿼리서브쿼리의 사용은 식을 복잡하게 만들 수 있어서 사용하기 전에 WITH절을 이용해 미리 정의해준 것을 별칭처럼 사용해서 식을 더 간단하게 만들어 가독성을 높여줄 수 있다.아래는 약간의 삽질과 WITH절을 이용해서 만든 표.

 

SQL> with AvgSalaries As (select deptno, avg(sal) as avg_sal from
  2
SQL>
SQL> with AvgSalaries As (
  2                     select depno, avg(Sal) as avg_sal
  3                     from emp
  4                     group by deptno)
  5  select d.dname, a.avg_sal
  6  from AvgSalaries a
  7  join dept d on a.deptno = d.deptno;
                        select depno, avg(Sal) as avg_sal
                               *
ERROR at line 2:
ORA-00904: "DEPNO": invalid identifier


SQL> with AvgSalaries As (
  2                     select depno, avg(Sal) as avg_sal
  3                     from emp
  4                     group by deptno)
  5  select d.danme, a.avg_sal
  6  from AvgSalaries a
  7  join dept d on a.deptno = d.deptno;
                        select depno, avg(Sal) as avg_sal
                               *
ERROR at line 2:
ORA-00904: "DEPNO": invalid identifier


SQL> with AvgSalaries As (
  2                     select deptno, avg(Sal) as avg_sal
  3                     from emp
  4                     group by deptno)
  5  from AvgSalaries a
  6  join dept d on a.deptno = d.deptno;
from AvgSalaries a
*
ERROR at line 5:
ORA-00928: missing SELECT keyword


SQL> ed
Wrote file afiedt.buf

  1  with AvgSalaries As (
  2                     select deptno, avg(Sal) as avg_sal
  3                     from emp
  4                     group by deptno)
  5  select d.dname, a.avg_sal
  6  from AvgSalaries a
  7* join dept d on a.deptno = d.deptno
SQL> /

DNAME                           AVG_SAL
---------------------------- ----------
SALES                        1566.66667
RESEARCH                     2258.33333
ACCOUNTING                   2916.66667

삽질한 부분 : 오타와 문장 날린거 -> ed 누르고 엔터 -> 메모장에서 수정하고 저장하고 닫기 -> / 눌러 메모장에서 만든거 실행

 

 

<11:30 3교시>

데이터 출력 시 서브쿼리와 조인 방식이 모두 가능한 경우가 다수 존재.

물론 두 방법 다 적용하기 힘든 경우도 존재.

 

single row 서브쿼리에 여러 row 가 반환된 경우 오류가 나는데, 이럴 때는 IN을 써서 해결할 수 있다.

 

 

예제 삽질과 올바른 풀이(나머지 예제는 자습 시간에 마저 풀어봐야겠다)

SQL> select ename, sal, deptno
  2  from emp
  3  where sal IN(select sal from emp where Max(sal) group by deptno);
where sal IN(select sal from emp where Max(sal) group by deptno)
                                       *
ERROR at line 3:
ORA-00934: group function is not allowed here


SQL> select empno, sal, deptno
  2  from emp
  3  where sal IN(select Max(sal) from emp group by deptno);

     EMPNO        SAL     DEPTNO
---------- ---------- ----------
      7698       2850         30
      7839       5000         10
      7902       3000         20

여러 줄의 것이 단일 서브쿼리에 못 들어가서 sal과 단순 크기 비교가 불가능하기 때문에 in 을 사용

SQL> -- 정답 먼저 작성해봄
SQL> select deptno, dname, loc from dept where deptno in(select deptno from emp where job='MANAGER');

    DEPTNO DNAME                        LOC
---------- ---------------------------- --------------------------
        10 ACCOUNTING                   NEW YORK
        20 RESEARCH                     DALLAS
        30 SALES                        CHICAGO


SQL> -문제 보면서 작성을 시도 해봄
SQL> select deptno, dname, loc from emp where job in(select deptno from emp where job='MANAGER');
select deptno, dname, loc from emp where job in(select deptno from emp where job='MANAGER')
                      *
ERROR at line 1:
ORA-00904: "LOC": invalid identifier
SQL> -- 첫번째 에러는 loc from dept여야 하는데 from emp라고 적었던거

SQL> select deptno, dname, loc from dept where job in(select deptno from emp where job='MANAGER');
select deptno, dname, loc from dept where job in(select deptno from emp where job='MANAGER')
                                          *
ERROR at line 1:
ORA-00904: "JOB": invalid identifier
SQL> 두번째 에러는 from dept인데 여기서 job을 찾고 앉아 있었다는거

SQL> select deptno, dname, loc from dept where deptno in(select deptno from emp where job="MANAGER")
  2  ;
select deptno, dname, loc from dept where deptno in(select deptno from emp where job="MANAGER")
                                                                                     *
ERROR at line 1:
ORA-00904: "MANAGER": invalid identifier
SQL> 세번째 에러는 '' 써야하는데 "" 쓴거


SQL> select deptno, dname, loc from dept where deptno in(select deptno from emp where job='MANAGER')
  2  ;

    DEPTNO DNAME                        LOC
---------- ---------------------------- --------------------------
        10 ACCOUNTING                   NEW YORK
        20 RESEARCH                     DALLAS
        30 SALES                        CHICAGO

 

SQL> select empno, sal, deptno
  2  from emp
  3  where sal in (SELect Max(sal) from emp group by deptno);

     EMPNO        SAL     DEPTNO
---------- ---------- ----------
      7698       2850         30
      7839       5000         10
      7902       3000         20

SQL> select ename, sal from emp where sal > (select Max(Sal) from emp where deptno=30);

ENAME                       SAL
-------------------- ----------
JONES                      2975
KING                       5000
FORD                       3000

SQL> select ename, sal
  2  from emp
  3  where Max(sal) in (selec sal from emp where deptno=30)
  4  ;
where Max(sal) in (selec sal from emp where deptno=30)
      *
ERROR at line 3:
ORA-00934: group function is not allowed here


SQL> select ename, sal
  2  from emp
  3  where Max(sal) in (select sal from emp where deptno=30);
where Max(sal) in (select sal from emp where deptno=30)
      *
ERROR at line 3:
ORA-00934: group function is not allowed here


SQL> select ename, sal
  2  from emp
  3  where Max(sal) in(select sal from emp where deptno=30);
where Max(sal) in(select sal from emp where deptno=30)
      *
ERROR at line 3:
ORA-00934: group function is not allowed here


SQL> select ename, sal
  2  from emp
  3  where Max(sal) all(select sal from emp where deptno=30);
where Max(sal) all(select sal from emp where deptno=30)
      *
ERROR at line 3:
ORA-00934: group function is not allowed here


SQL> select ename, sal
  2  from emp
  3  where sal all(select sal from emp where deptno=30);
where sal all(select sal from emp where deptno=30)
          *
ERROR at line 3:
ORA-00920: invalid relational operator


SQL> select ename, sal
  2  from emp
  3  where sal> all(select sal from emp where deptno=30);

ENAME                       SAL
-------------------- ----------
JONES                      2975
FORD                       3000
KING                       5000

여기서 마지막 즈음에 

where sal>all(select sal from emp where deptno=30);

이것이 비교가 가능한 이유는 all이 다중행 서브 쿼리에 포함된 row들을 모두 비교하며 실행해주기 때문.

 

이 경우도 마찬가지로, sal > any가 비교 가능한 이유는 

(select sal from emp where job ='SALESMAN')이라는 다중행(multirow) 서브쿼리의 여러 row 중 어느 하나라도 만족하면 되니까 any가 sal에 대한 크기 비교를 각각 실행해서 가능하다.

 

 

<12:30 4교시> 오전 내용 각자 복습 및 예제 풀어보기

-- 급여가 3000이상인 직원의 이름과 급여를 조회하시오

SQL> -- 급여가 3000이상인 직원의 이름과 급여를 조회하시오
SQL> select ename, sal from emp
  2  where sal >=3000;

ENAME                       SAL
-------------------- ----------
KING                       5000
FORD                       3000

 

-- 매니저가 NULL인 직원의 이름을 조회하시오

SQL> -- 매니저가 NULL인 직원의 이름을 조회하시오
SQL> select ename from emp
  2  where mgr is NULL;

ENAME
--------------------
KING

 

--커미션이 NULL이 아닌 직원의 이름과 커미션을 조회하시오 (오타 에러 주의)

SQL> --커미션이 NULL이 아닌 직원의 이름과 커미션을 조회하시오
SQL> select ename, comm form emp where comm is not null;
select ename, comm form emp where comm is not null
                        *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected


SQL> select ename, comm from emp where comm is not null;

ENAME                      COMM
-------------------- ----------
ALLEN                       300
WARD                        500
MARTIN                     1400
TURNER                        0

--이름이 'A'로 시작하는 직원의 이름과 직책을 조회하시오

SQL> --이름이 'A'로 시작하는 직원의 이름과 직책을 조회하시오
SQL> select ename, job where ename = 'A%';
select ename, job where ename = 'A%'
                  *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected


SQL> select ename, job from emp where ename = 'A%';

no rows selected

SQL> select ename, job from emp where ename Like('A%');

ENAME                JOB
-------------------- ------------------
ALLEN                SALESMAN

--부서 번호가 20인 직원 중 급여가 가장 높은 직원의 이름과 급여를 조회하시오

SQL> --부서 번호가 20인 직원 중 급여가 가장 높은 직원의 이름과 급여를 조회하시오
SQL> select ename, sal from emp
  2  where sal (select max(sal) from emp where deptno=20);
where sal (select max(sal) from emp where deptno=20)
           *
ERROR at line 2:
ORA-00936: missing expression


SQL> select ename, sal from emp
  2  where sal=(select max(sal) from emp where deptno=20);

ENAME                       SAL
-------------------- ----------
FORD                       3000

--각 부서의 직원 수를 조회하시오

+ 응용 시도 --각 부서의 직원수를 조회하시오(직원수가 0인 부서도 함께 출력할것) : 실패

 

SQL> --각 부서의 직원 수를 조회하시오
SQL> select count(ename) from emp group by deptno;

COUNT(ENAME)
------------
           6
           3
           3

SQL> select deptno, count(ename)(+) from emp group by deptno;
select deptno, count(ename)(+) from emp group by deptno
                           *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected


SQL> select deptno, count(ename) from emp group by deptno;

    DEPTNO COUNT(ENAME)
---------- ------------
        30            6
        20            3
        10            3

SQL> select deptno, count(nvl(ename, '0')) from emp group by deptno;

    DEPTNO COUNT(NVL(ENAME,'0'))
---------- ---------------------
        30                     6
        20                     3
        10                     3


SQL>  --각 부서의 직원수를 조회하시오(직원수가 0인 부서도 함께 출력할것)
SQL> select deptno, count(nvl(deptno, '0')) from emp group by deptno;

    DEPTNO COUNT(NVL(DEPTNO,'0'))
---------- ----------------------
        30                      6
        20                      3
        10                      3

SQL> select deptno from emp group by deptno;

    DEPTNO
----------
        30
        20
        10

SQL> select deptno, ename from emp group by deptno;
select deptno, ename from emp group by deptno
               *
ERROR at line 1:
ORA-00979: not a GROUP BY expression

SQL> select deptno, count(ename) from emp e, dept d where e.deptno=d.deptno;
select deptno, count(ename) from emp e, dept d where e.deptno=d.deptno
       *
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL> select e.deptno, count(ename) form emp e, dept d where e.deptno=d.deptno;
select e.deptno, count(ename) form emp e, dept d where e.deptno=d.deptno
                                   *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected


SQL> select e.deptno, count(ename) from emp e, dept d where e.deptno=d.deptno;
select e.deptno, count(ename) from emp e, dept d where e.deptno=d.deptno
       *
ERROR at line 1:
ORA-00937: not a single-group group function


SQL> select e.deptno, count(ename) from emp e, dept d where e.deptno=d.deptno group by deptno;
select e.deptno, count(ename) from emp e, dept d where e.deptno=d.deptno group by deptno
                                                                                  *
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL> select e.deptno, count(ename) from emp e, dept d where e.deptno=d.deptno group by e.deptno;

    DEPTNO COUNT(ENAME)
---------- ------------
        30            6
        20            3
        10            3

SQL> select e.deptno, count(nvl(ename,'0')) from emp e, dept d where e.deptno=d.deptno group by e.dept
no;

    DEPTNO COUNT(NVL(ENAME,'0'))
---------- ---------------------
        30                     6
        20                     3
        10                     3

SQL> select e.deptno, count(nvl(e.deptno,'0')) from emp e, dept d where e.deptno=d.deptno group by e.d
eptno;

    DEPTNO COUNT(NVL(E.DEPTNO,'0'))
---------- ------------------------
        30                        6
        20                        3
        10                        3

--급여 합계가 5000 이상인 부서의 부서 번호와 급여 합계를 조회하시오.

일단 삽질의 흔적 더보기로 닫아 놓기...

더보기

SQL> --급여 합계가 5000 이상인 부서의 부서 번호와 급여 합계를 조회하시오.
SQL> select deptno, SUM(sal) from emp where SUM(sal)>=5000;
select deptno, SUM(sal) from emp where SUM(sal)>=5000
                                       *
ERROR at line 1:
ORA-00934: group function is not allowed here


SQL> select deptno, SUM(sal) from emp where SUM(sal)>=5000 group by deptno;
select deptno, SUM(sal) from emp where SUM(sal)>=5000 group by deptno
                                       *
ERROR at line 1:
ORA-00934: group function is not allowed here


SQL> select deptno, sum(sal) from (select deptno, sal from emp group by deptno) where sum(sal)>=5000;
select deptno, sum(sal) from (select deptno, sal from emp group by deptno) where sum(sal)>=5000
                                                                                 *
ERROR at line 1:
ORA-00934: group function is not allowed here


SQL> select deptno, sum_sal from (select deptno, sum(sal) SUM_SAL from emp group by deptno) where sum(
sal)>=5000;
select deptno, sum_sal from (select deptno, sum(sal) SUM_SAL from emp group by deptno) where sum(sal)>=5000
                                                                                             *
ERROR at line 1:
ORA-00934: group function is not allowed here


SQL> select deptno, Tot from emp where Sum(select sal from emp group by deptno) Tot>=5000;
select deptno, Tot from emp where Sum(select sal from emp group by deptno) Tot>=5000
                                  *
ERROR at line 1:
ORA-00934: group function is not allowed here


SQL> select deptno, sum(select sal from emp group by deptno) from emp;
select deptno, sum(select sal from emp group by deptno) from emp
                   *
ERROR at line 1:
ORA-00936: missing expression


SQL> select sal from emp group by deptno;
select sal from emp group by deptno
       *
ERROR at line 1:
ORA-00979: not a GROUP BY expression


SQL> select deptno, ename, sal from emp group by deptno;
select deptno, ename, sal from emp group by deptno
               *
ERROR at line 1:
ORA-00979: not a GROUP BY expression

삽질한 이유가...... 하.... group by 해놓고 where 절로 그룹을 없애려고 하고 앉아 있어서 그랬다는 거지~

HAVING 절 썼어야 함...

SQL> select deptno, sum(sal) from emp group by deptno;

    DEPTNO   SUM(SAL)
---------- ----------
        30       9400
        20       6775
        10       8750

SQL> select deptno, sum(Sal) from emp group by deptno where deptno;
select deptno, sum(Sal) from emp group by deptno where deptno
                                                 *
ERROR at line 1:
ORA-00933: SQL command not properly ended


SQL> select deptno, sum(Sal) from emp group by deptno where sum(sal)>=5000;
select deptno, sum(Sal) from emp group by deptno where sum(sal)>=5000
                                                 *
ERROR at line 1:
ORA-00933: SQL command not properly ended


SQL> select deptno, sum(Sal) from emp group by deptno having sum(sal)>=5000;

    DEPTNO   SUM(SAL)
---------- ----------
        30       9400
        20       6775
        10       8750

 

 

--부서별 최고 급여를 받는 직원의 이름과 급여를 조회하시오

->점심에도 실패 5교시로

--급여가 부서별 평균급여보다 높은 직원의 이름, 급여를 조회하시오.

->점심에도 실패 5교시로

--모든 직원의 급여와 평균 급여의 차이를 계산하시오.

->점심에도 실패 5교시로

 

<오전 수업 마무리>

오전에 자꾸 졸음도 오고 집중력도 떨어졌다 ㅠㅠ

밤에 자꾸 잠을 못 자서 그러는거 같긴한데.. 오늘은 더 일찍 자려고 시도해봐야겠...는데 또 4시간만 자고 깨버리면.. 음.. 어떡하지 ㅠ

 

 

7,8,9,10 예제는 삽질만 계속 했다.

뭔가 서브쿼리가 들어오면서 어제 배운 조인이랑 뒤죽박죽 섞인 느낌...

 

 

 

 

<14:30 5교시> 점심 전까지의 복습

 

복습 1. GROUP BY의 내용

특정 row를 그룹으로 묶어야 하는 경우 = ~~별, ~~인 특징에 대해 등등

공통된 특징으로 묶일 수 있는 row들은  GROUP BY를 활용해서 묶어준다.

-- 부서별 급여의 총합을 출력해보세요

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno;

 

복습 2. HAVING 절의 사용 복습

위에서 만들어진 그룹의 리스트 중에서 그룹을 배제하는 방법은 HAVING 절을 사용하기

-- 부서별 급여의 총합을 출력하되, 급여의 총합이 7000이상 부서만 출력

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno

HAVING SUM(sal) >=7000;

 

복습 3. SELECT문의 실행 순서 복습

별칭이 들어가는 순서를 아는게 중요하다!

예를들어 

 

①SELECT deptno, SUM(sal) sum_sal

②FROM emp

③GROUP BY deptno

④HAVING sum_sal>=7000;

 

이문장은 에러가 난다!

왜냐하면, 실행 순서가 ② ③ ④ ①이어서 HAVING 절에서 SUM_SAL을 모르는 상태에서 값을 비교를 할 수가 없어서 에러가 나기 때문이다.

 

복습 4. TABLE JOIN 복습

서로 다른 테이블에서 같은 이름의 칼럼이 존재할 때, 두 개의 테이블의 칼럼을

테이블이름.칼럼명으로 명확하게

각 테이블의 deptno를 정의해줘서 칼럼이 애매모호하게 구분된 상태를 해결한다.

SELECT 되는 값은 서로 다른 테이블의 같은 칼럼명을 가진 녀석 중 하나면 된다.

ex) emp.deptno = dept.deptno 인 상황에서 deptno를 select 하려면

     select emp.deptno 도 되고, select dept.deptno도 된다.

 

예제)

 

 

■ JOIN 조건의 복잡도를 해결하는 방법

 

ㅇANSI(미국국가표준기구) JOIN : JOIN 조건을 (INNER) JOIN ___ ON 문구를 써서 빼준다.(INNER는 생략 가능)

 

ㅇ테이블 명에 별칭 붙이기

실무에서 테이블명은 좀 긴 편이다. 그때마다 JOIN 문구 안에서 테이블 이름을 다 반복해버리면 복잡도가 높아지기 때문에 이를 해결하기 위해 테이블 이름에 별칭을 붙인다.

테이블 이름에 별칭을 붙이는 방법은 from 에서 테이블 이름을 참조할 때 테이블 이름 바로 뒤에 붙이고자 하는 별칭을 띄어쓰기 한 칸하고 붙여주면 된다. (emp e, dept d 처럼)

 

 

ANSI JOIN에서 테이블 이름 별칭 붙이기

 

예시 문제는 ANSI JOIN과 테이블명 별칭 등을 섞어서 써봤다.

 

 

<15:30 6교시> SELF JOIN, OUTER JOIN 학습

■ SELF JOIN

이번에는 하나의 테이블을 자기 자신과 JOIN 시켜서 데이터를 조회하는 방법을 시도해 보았다.

일단 혼자 시도하느라 삽질이 꽤 이어졌다.

힌트는 emp 테이블을 자기 자신과 JOIN 시키라는 거라고 말씀해주셨다.

 

SQL> --각 사원의 이름과 메니저의 이름을 출력하세요.
SQL> select ename "사원", ename "메니저"
  2  from emp e, emp m
  3  where e.empno=m.empno=e.mgr;
where e.empno=m.empno=e.mgr
                          *
ERROR at line 3:
ORA-00933: SQL command not properly ended


SQL> select ename "사원", ename "메니저"
  2  from emp e, emp m
  3  where e.mgr=e.empno;
select ename "사원", ename "메니저"
                       *
ERROR at line 1:
ORA-00918: column ambiguously defined


SQL> select e.ename "사원", m.ename "메니저"
  2  from emp e, emp m
  3  where e.mgr=e.empno;

no rows selected

SQL> select e.ename "사원", m.ename "메니저"
  2  from emp e, emp m
  3  where m.mgr=e.empno;

사원                 메니저
-------------------- --------------------
FORD                 SMITH
BLAKE                ALLEN
BLAKE                WARD
KING                 JONES
BLAKE                MARTIN
KING                 BLAKE
KING                 CLARK
BLAKE                TURNER
BLAKE                JAMES
JONES                FORD
CLARK                MILLER

11 rows selected.

SQL> select e.ename "사원", m.ename "메니저"
  2  from emp e, emp m
  3  where e.mgr=m.empno;

사원                 메니저
-------------------- --------------------
FORD                 JONES
JAMES                BLAKE
TURNER               BLAKE
MARTIN               BLAKE
WARD                 BLAKE
ALLEN                BLAKE
MILLER               CLARK
CLARK                KING
BLAKE                KING
JONES                KING
SMITH                FORD

11 rows selected.

힌트와 위에서 배운 테이블의 별칭 넣기를 적용하려고 시도했는데,

처음에는 뭘 대입해야하는건지 헷갈려서 틀리고, 그러다가 대입하는 것의 좌우를 헷갈려서 헤매고, 반대로 입력한것을 알고 난 후에야 좌우를 이해해서 제대로 구할 수 있었다.

 

 

 

 

■ OUTER JOIN : 조회한 결과에 NULL 인 데이터를 표시하고 싶을 때 사용

LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 방식이 있다.

LEFT OUTER JOIN

 

 

 

 

RIGHT OUTER JOIN

 

 

<17:30 7교시>

emp 테이블과 salgrade 테이블의 JOIN

나 혼자 막 해본거 ㅎㅎㅎ

 

 

테이블 3개를 조인시키기!!!!! 야호!!! 혼자 힘으로 해냈다!!!!!(맞으려나 모르겟찌만!!!! 캬캬)

e. 랑 s.을 생략해도 되던데 왜 되는지 아직 모르겠따!

→ 이건 sal, losal, hisal 얘네는 ambiguous하지 않으니까 e. s.을 쓰지 않아도 되고, 개발자로서 습관 들일려면 이렇게 생략하고 쓰는게 좋다고 하셨다!

ANSI 방법으로 3개의 테이블 JOIN하기

 

 

나혼자 해본거
서브쿼리를 이용해서 선생님과 한 것

 

<17:30 8교시>

오늘 한 거 Velog 보면서 따라서 복습해보기 + 나는 노트 정리도 하는 중

8:00 무렵 학원 도착

수업 준비 세팅, 복습, 노트 정리하기

 

<9:30 1교시> 지난 주에 했던 함수 내용 복습 : 문자열 함수, 숫자함수, 날짜 함수, 변환 함수

DQL은 데이터 베이스의 여러 테이블의 여러 row 중에서 원하는 data 값만 빼서 조회하는 언어이다.

 

 

 

 

 

변환 함수 to_date : 문자열을 날짜로 변환

 

 

<10:30 2교시> 단일행 함수 중 일반 함수, 복수행 함수 GROUP BY의 활용

※ 함수가 있는 위치는 함수가 반환하는 결과 값으로 대체된다.

※ row의 각 데이터만 대소문자가 구별되고, 명령어나 칼럼명 등의 식별자들은 대소문자를 가리지 않는다.

 

■ 단일행 함수 : 일반 함수

 

아래의 SELECT문은 직업이 'MANAGER'로 참인 사람들의 결과 값으로는 high를, 거짓인 사람들의 결과 값으로는 low를 입력하게 나타내는 일반 함수 decode 함수이다.

row의 데이터는 대소문자를 구분해주지 않으면 오류가 난다.

 

 

■ 복수행 함수

복수행 함수는 여러 개의 row로부터 1개의 row 값만 나타나게 추출하는 함수이다.

 

여전히, row의 데이터는 대소문자를 구분해주지 않으면 오류가 난다.

 

 

null 값이 있는 경우, null 값이 있는 row의 데이터는 무시되고 계산되기 때문에 null 값의 row의 경우를 포함한 평균이나 총합을 구하고 싶으면 null 값을 우선 0으로 부여하고 나서 진행해야 한다.

 

 

칼럼의 row 값 중 최대, 최소를 구하는 복수행 함수

 

단일행 함수로 얻는 결과 값과 복수행 함수로 얻는 결과 값을 같은 select(결과값)테이블로 만드는 것은 불가능하다.

 

■GROUP BY의 사용

DQL 명령어 중 GROUP BY는 row를 특정 조건으로 그룹으로 묶는다.

부서별, 직업별 등 그룹으로 묶는 상황들에 사용한다.

 

 

 

 

 

 

 

 

 

<11:30 3교시> 보다 복잡한 경우의 GROUP BY 명령어 사용, 테이블의 조인

 

 

■ 테이블의 조인

테이블의 공통 요소를 찾고 테이블 두 개를 연결해준다. 

 

 

공통요소는 표현될 수도 있고 표현되지 않아도 될 수도 있다.

 

 

 

<12: 30 4교시> 오전에 했던 내용을 정리하는 실습 자습 시간

지난 시간에 끝까지 풀지 못했던 이 문제를 풀 수 있을 것 같다. 

 

EMP 테이블에서 SAL(급여)과 COMM(수당)을 더한 값을 TOTAL_SALARY라는 이름으로 표시하며, ENAME, TOTAL_SALARY를 조회하세요.

 

지난 시간에는 NVL(null 값이 존재하는 변수, null 값에 집어 넣을 수) 함수를 배우지 않아서 위 질문에 대한 답을 아래와 같이 했었다.

지난 시간에 했던거 다시 타이핑 함. 이제 ALIAS 함수 as "" 대신 붙은 문구는 그냥 옆에 별칭 붙여주면 되는걸 앎.

 

이 식에서 문제가 됐던 것은 null 값인 comm 부분들이 비교 불가능 및 연산 불가능하여 null 인 comm과 더해진 sal 들도 다 알 수 없는 null 값이 되어 사라져버린 상태였던 것.

이걸 해결 하기 위해 nvl 함수를 활용해서 comm에서 null 값인 애들에 0을 부여한 다음 →nvl(comm,0)

nvl(comm,0)과 sal을 더해서 Total_Salary 라는 별칭을 주고 select 하는 것이다.

정답!!

 

 

응용으로 테이블 조인을 통해서 부서가 SALE 이면서 매니저인 사람들의 이름과 total_salary를 구해보자.

(엄청난 삽질의 시작)

더보기

삽질의 기록

SQL> --부서가 SALE 이면서 매니저인 사람들의 이름과 total_salary를 구해보자.
SQL>
SQL> select ename, sal+nvl(comm,0) total_salary
  2  from emp, dept
  3  where dname.dept = "SALES" AND emp.job="MANAGER";
where dname.dept = "SALES" AND emp.job="MANAGER"
                                       *
ERROR at line 3:
ORA-00904: "MANAGER": invalid identifier


SQL> select job, ename from emp;

JOB        ENAME
---------- ----------
CLERK      SMITH
SALESMAN   ALLEN
SALESMAN   WARD
MANAGER    JONES
SALESMAN   MARTIN
MANAGER    BLAKE
MANAGER    CLARK
PRESIDENT  KING
SALESMAN   TURNER
CLERK      JAMES
ANALYST    FORD
CLERK      MILLER

12 rows selected.

SQL> --부서가 SALE 이면서 매니저인 사람들의 이름과 total_salary를 구해보자.
SQL> select ename, sal+nvl(comm,0) total_salary
  2  from emp, dept
  3  where dept.dname ="SALES" and emp.job="MANAGER";
where dept.dname ="SALES" and emp.job="MANAGER"
                                      *
ERROR at line 3:
ORA-00904: "MANAGER": invalid identifier


SQL> --부서가 SALE 이면서 매니저인 사람들의 이름과 total_salary를 구해보자.
SQL> select ename, sal+nvl(comm,0) total_salary
  2  from emp, dept
  3  where dept.dname ="SALES" and job="MANAGER";
where dept.dname ="SALES" and job="MANAGER"
                                  *
ERROR at line 3:
ORA-00904: "MANAGER": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary
  2  from emp, dept
  3  where dept.dname = "SALES";
where dept.dname = "SALES"
                   *
ERROR at line 3:
ORA-00904: "SALES": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary
  2  from emp, dept
  3  where dept.dname "SALES" and job "MANAGER";
where dept.dname "SALES" and job "MANAGER"
                 *
ERROR at line 3:
ORA-00920: invalid relational operator


SQL> select ename, sal+nvl(comm,0) total_salary
  2  from emp, dept
  3  where dept.dname "SALES" and emp.job "MANAGER";
where dept.dname "SALES" and emp.job "MANAGER"
                 *
ERROR at line 3:
ORA-00920: invalid relational operator


SQL> select ename, sal+nvl(comm,0) total_salary
  2  from emp, dept
  3  where dname="SALES";
where dname="SALES"
            *
ERROR at line 3:
ORA-00904: "SALES": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary
  2  from emp, dept
  3  where dept.dname="SALES";
where dept.dname="SALES"
                 *
ERROR at line 3:
ORA-00904: "SALES": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary
  2  from emp, dept
  3  where dept.dname ="SALES" and emp.job="MANAGER" and dept.deptno=emp.deptno;
where dept.dname ="SALES" and emp.job="MANAGER" and dept.deptno=emp.deptno
                                      *
ERROR at line 3:
ORA-00904: "MANAGER": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary
  2  from emp, dept
  3  where dept.dname ="SALES" and emp.job="MANAGER" and dept.deptno=emp.deptno;
where dept.dname ="SALES" and emp.job="MANAGER" and dept.deptno=emp.deptno
                                      *
ERROR at line 3:
ORA-00904: "MANAGER": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary, dname
  2  from emp, dept
  3  where dept.dname ="SALES" and emp.job="MANAGER" and dept.deptno=emp.deptno;
where dept.dname ="SALES" and emp.job="MANAGER" and dept.deptno=emp.deptno
                                      *
ERROR at line 3:
ORA-00904: "MANAGER": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary, dname
  2  from emp, dept
  3  where dname="SALES" and job="MANAGER" and dept.deptno=emp.deptno;
where dname="SALES" and job="MANAGER" and dept.deptno=emp.deptno
                            *
ERROR at line 3:
ORA-00904: "MANAGER": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary, dname
  2  from emp, dept;

ENAME      TOTAL_SALARY DNAME
---------- ------------ ----------------------------
SMITH               800 ACCOUNTING
ALLEN              1900 ACCOUNTING
WARD               1750 ACCOUNTING
JONES              2975 ACCOUNTING
MARTIN             2650 ACCOUNTING
BLAKE              2850 ACCOUNTING
CLARK              2450 ACCOUNTING
KING               5000 ACCOUNTING
TURNER             1500 ACCOUNTING
JAMES               950 ACCOUNTING
FORD               3000 ACCOUNTING
MILLER             1300 ACCOUNTING
SMITH               800 RESEARCH
ALLEN              1900 RESEARCH
WARD               1750 RESEARCH
JONES              2975 RESEARCH
MARTIN             2650 RESEARCH

ENAME      TOTAL_SALARY DNAME
---------- ------------ ----------------------------
BLAKE              2850 RESEARCH
CLARK              2450 RESEARCH
KING               5000 RESEARCH
TURNER             1500 RESEARCH
JAMES               950 RESEARCH
FORD               3000 RESEARCH
MILLER             1300 RESEARCH
SMITH               800 SALES
ALLEN              1900 SALES
WARD               1750 SALES
JONES              2975 SALES
MARTIN             2650 SALES
BLAKE              2850 SALES
CLARK              2450 SALES
KING               5000 SALES
TURNER             1500 SALES
JAMES               950 SALES

ENAME      TOTAL_SALARY DNAME
---------- ------------ ----------------------------
FORD               3000 SALES
MILLER             1300 SALES
SMITH               800 OPERATIONS
ALLEN              1900 OPERATIONS
WARD               1750 OPERATIONS
JONES              2975 OPERATIONS
MARTIN             2650 OPERATIONS
BLAKE              2850 OPERATIONS
CLARK              2450 OPERATIONS
KING               5000 OPERATIONS
TURNER             1500 OPERATIONS
JAMES               950 OPERATIONS
FORD               3000 OPERATIONS
MILLER             1300 OPERATIONS

48 rows selected.

SQL> select ename, sal+nvl(comm,0) total_salary, dname
  2  from emp, dept;

ENAME      TOTAL_SALARY DNAME
---------- ------------ ----------------------------
SMITH               800 ACCOUNTING
ALLEN              1900 ACCOUNTING
WARD               1750 ACCOUNTING
JONES              2975 ACCOUNTING
MARTIN             2650 ACCOUNTING
BLAKE              2850 ACCOUNTING
CLARK              2450 ACCOUNTING
KING               5000 ACCOUNTING
TURNER             1500 ACCOUNTING
JAMES               950 ACCOUNTING
FORD               3000 ACCOUNTING
MILLER             1300 ACCOUNTING
SMITH               800 RESEARCH
ALLEN              1900 RESEARCH
WARD               1750 RESEARCH
JONES              2975 RESEARCH
MARTIN             2650 RESEARCH

ENAME      TOTAL_SALARY DNAME
---------- ------------ ----------------------------
BLAKE              2850 RESEARCH
CLARK              2450 RESEARCH
KING               5000 RESEARCH
TURNER             1500 RESEARCH
JAMES               950 RESEARCH
FORD               3000 RESEARCH
MILLER             1300 RESEARCH
SMITH               800 SALES
ALLEN              1900 SALES
WARD               1750 SALES
JONES              2975 SALES
MARTIN             2650 SALES
BLAKE              2850 SALES
CLARK              2450 SALES
KING               5000 SALES
TURNER             1500 SALES
JAMES               950 SALES

ENAME      TOTAL_SALARY DNAME
---------- ------------ ----------------------------
FORD               3000 SALES
MILLER             1300 SALES
SMITH               800 OPERATIONS
ALLEN              1900 OPERATIONS
WARD               1750 OPERATIONS
JONES              2975 OPERATIONS
MARTIN             2650 OPERATIONS
BLAKE              2850 OPERATIONS
CLARK              2450 OPERATIONS
KING               5000 OPERATIONS
TURNER             1500 OPERATIONS
JAMES               950 OPERATIONS
FORD               3000 OPERATIONS
MILLER             1300 OPERATIONS

48 rows selected.

SQL> select ename, sal+nvl(comm,0) total_salary, dname
  2  from emp, dept
  3  where dept.deptno=emp.deptno;

ENAME      TOTAL_SALARY DNAME
---------- ------------ ----------------------------
SMITH               800 RESEARCH
ALLEN              1900 SALES
WARD               1750 SALES
JONES              2975 RESEARCH
MARTIN             2650 SALES
BLAKE              2850 SALES
CLARK              2450 ACCOUNTING
KING               5000 ACCOUNTING
TURNER             1500 SALES
JAMES               950 SALES
FORD               3000 RESEARCH
MILLER             1300 ACCOUNTING

12 rows selected.

SQL> select ename, sal+nvl(comm,0) total_salary, dname
  2  from emp, dept
  3  where dept.deptno=emp.deptno and Dname = sales;
where dept.deptno=emp.deptno and Dname = sales
                                         *
ERROR at line 3:
ORA-00904: "SALES": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary, dname
  2  where dept.deptno=emp.deptno and Dname = sales;
where dept.deptno=emp.deptno and Dname = sales
*
ERROR at line 2:
ORA-00923: FROM keyword not found where expected


SQL> select ename, sal+nvl(comm,0) total_salary, dname
  2  from emp, dept
  3  where dept.deptno=emp.deptno and Dname = 'SALES';

ENAME      TOTAL_SALARY DNAME
---------- ------------ ----------------------------
ALLEN              1900 SALES
WARD               1750 SALES
MARTIN             2650 SALES
BLAKE              2850 SALES
TURNER             1500 SALES
JAMES               950 SALES

6 rows selected.

SQL> select ename, sal+nvl(comm,0) total_salary, dname, job
  2  from emp, dept
  3  where dept.deptno=emp.deptno and Dname = 'SALES' and job="MANAGER";
where dept.deptno=emp.deptno and Dname = 'SALES' and job="MANAGER"
                                                         *
ERROR at line 3:
ORA-00904: "MANAGER": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary, dname, job
  2  from emp, dept
  3  where dept.deptno=emp.deptno and Dname = 'SALES;
ERROR:
ORA-01756: quoted string not properly terminated


SQL> select ename, sal+nvl(comm,0) total_salary, dname, job
  2  where dept.deptno=emp.deptno and Dname = 'SALES;
ERROR:
ORA-01756: quoted string not properly terminated


SQL> select ename, sal+nvl(comm,0) total_salary, dname, job
  2  from emp, dept
  3  where dept.deptno=emp.deptno and Dname = 'SALES';

ENAME      TOTAL_SALARY DNAME                        JOB
---------- ------------ ---------------------------- ----------
ALLEN              1900 SALES                        SALESMAN
WARD               1750 SALES                        SALESMAN
MARTIN             2650 SALES                        SALESMAN
BLAKE              2850 SALES                        MANAGER
TURNER             1500 SALES                        SALESMAN
JAMES               950 SALES                        CLERK


6 rows selected.

SQL> select ename, sal+nvl(comm,0) total_salary, dname, job="MANAGER"
  2  from emp, dept
  3  where dept.deptno=emp.deptno and Dname = 'SALES';
select ename, sal+nvl(comm,0) total_salary, dname, job="MANAGER"
                                                      *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected


SQL>  select ename, sal+nvl(comm,0) total_salary, dname, job
  2    2  from emp, dept
  3    2  from emp, dept^Z^Z
;
  2  from emp, dept
  *
ERROR at line 2:
ORA-00923: FROM keyword not found where expected


SQL>  select ename, sal+nvl(comm,0) total_salary, dname, job
  2    2  from emp, dept
  3    where job="MANAGER" and dept.deptno=emp.deptno and Dname = 'SALES';
  2  from emp, dept
  *
ERROR at line 2:
ORA-00923: FROM keyword not found where expected


SQL>  select ename, sal+nvl(comm,0) total_salary, dname, job
  2  from emp, dept
  3    where job="MANAGER" and dept.deptno=emp.deptno and Dname = 'SALES';
  where job="MANAGER" and dept.deptno=emp.deptno and Dname = 'SALES'
            *
ERROR at line 3:
ORA-00904: "MANAGER": invalid identifier


SQL> select ename, sal+nvl(comm,0)
  2  from (select ename, sal+nvl(comm,0) total_salary, dname, job
  3  from emp, dept
  4  where dept.deptno=emp.deptno and Dname = 'SALES';)
  5  where job="MANAGER";
where dept.deptno=emp.deptno and Dname = 'SALES';)
                                                *
ERROR at line 4:
ORA-00911: invalid character


SQL> select ename, sal+nvl(comm,0)
  2  from (select ename, sal+nvl(comm,0) total_salary, dname, job
  3  from emp, dept
  4  where dept.deptno=emp.deptno and Dname = 'SALES')
  5  where job="MANAGER";
where job="MANAGER"
          *
ERROR at line 5:
ORA-00904: "MANAGER": invalid identifier


SQL> select ename, job from emp where job="MANAGER"
  2  ;
select ename, job from emp where job="MANAGER"
                                     *
ERROR at line 1:
ORA-00904: "MANAGER": invalid identifier


SQL> select * from emp
  2  ;

     EMPNO ENAME      JOB               MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- ---------- ---------- -------- ---------- ---------- ----------
      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
      7839 KING       PRESIDENT             81/11/17       5000                    10
      7844 TURNER     SALESMAN         7698 81/09/08       1500          0         30
      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

12 rows selected.

SQL> select ename, sal+nvl(comm,0)
  2  from (select ename, sal+nvl(comm,0) total_salary, dname, job
  3  from emp, dept
  4  where dept.deptno=emp.deptno and Dname = 'SALES')
  5  where job='MANAGER';
select ename, sal+nvl(comm,0)
                      *
ERROR at line 1:
ORA-00904: "COMM": invalid identifier


SQL> select ename, sal+nvl(comm,0) total_salary, dname, job
  2  from emp, dept
  3  where dept.deptno=emp.deptno and Dname = 'SALES' and job='MANAGER';

ENAME      TOTAL_SALARY DNAME                        JOB
---------- ------------ ---------------------------- ----------
BLAKE              2850 SALES                        MANAGER

 

그럼 또 이거 응용으로 부서가 SALES이면서 SALESMAN인 사람들의 이름과 total_salary를 구해보자.

--부서가 SALES 이면서 SALESMAN인 사람들의 이름과 total_salary를 구해보자. //로 시작하고 어딘가 더 추가해서 중간과정이 드러난 모지리 풀이 과정 ㅋㅋ

아싸뵹

이제 이거 마스터한듯? ㅋ.

ㅋ ㅋ ㅋㅋㅋ

 

ㅋㅋㅋㅋㅋㅋㅋㅋ

 

+ 13:44 추가)

아까 배고프고 바보짓 탈출하고 성공했다는 기쁨에 겨워서dname이랑 job은 굳이 select 할 필요도 없단걸 완탕면 먹으면서 깨달음.

--부서가 SALES 이면서 SALESMAN인 사람들의 이름과 total_salary를 구해보자.

 

크하하하하하하하하하하하하하하하하핫

크하핳ㅅ

 

+ 13:55추가)

응용으로 LIKE 함수도 써봄 ㅎ 크하하하하하하핫 

부서가 SALES 이면서 SALESMAN인 사원들 중 이름에 E가 포함된 사원의 이름과 total_salary를 구해보자.

 

+ Recent posts