주소창에 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이라고 나온다.
<!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든 모바일이든, 사용자 화면의 창의 크기에 맞게 저절로 조절되는 특징이 있다.
<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 같은 스타일 속성이 적용되지 않지만, 특정 조건에서는 인라인요소임에도 일부 스타일 속성을 적용할 수도 있다.
<!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요소
<!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>
<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>
<!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은 웹브라우저에서 읽게 되는 문서인데, 사람들의 언어로 전달하면 이해하지 못 한다.
예를 들어 본인의 이름 성별 주소를 작성하라고 하면 사람들은 자기 스타일 대로 적게 되는데 이 다양한 스타일을 컴퓨터가 이해하면 얼마나 좋겠어~ 그치만 이해 못함. 그래서 형식을 약속하고 이 형식에 맞게 작성해줘야 함.
만약, 복제해 오는 표의 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>
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> 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));
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.
내컴퓨터가 아닌 외부 컴퓨터가 내 컴퓨터의 오라클에 접속할 수 있도록 하기 위해서는 방화벽이 외부의 컴퓨터를 들여보낼 수 있게 해주는 방법이 필요하다.
내 컴퓨터의 오라클에 외부의 컴퓨터를 접속하게 해주기 위해선 방화벽의 인바운드 규칙을 설정할 필요가 있다.
인바운드 규칙을 설정하는 방법은 다음과 같다.
방화벽 열기 > 윈도우 검색창에 방화벽 검색 > 제어판의 방화벽 상태 확인 클릭 > 고급설정 클릭 > 인바운드 규칙 클릭 > 우측의 인바운드 규칙 하단의 새규칙 클릭 > 포트를 누르고 다음 클릭 -> TCP(일반 인터넷) 누르고 다음 클릭 -> 특정로컬포트에 1521 입력하고 다음 클릭 -> 연결허용하고 다음 클릭 -> 모두 선택 하고 다음 클릭 -> 이름입력(일단 테스트니까 아무렇게나 입력해도 됐지만 실제로 하게 되면 뭔가 관련 이름 해야겠지) > 마침 => 이후에 인바운드 목록에 방금 만든 인바운드 규칙이 뜸
내가 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가 되어서 변형이 불가하다.
아래 코드에서 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 값이 입력되지 않는다.
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) 같은거는 우리가 익숙해지려고 연습하는 차원에서 한거지 실제 개발 환경에서 그렇게까지 어려운건 나올일 없다고 하시는데 아니 그래도 나는 정복하고 싶긴하다고? ㅋㅋㅋㅋㅋ ㅠㅠ
어제 너무 개나대서 오늘 피곤해져서 열심히 못한거 같으니까 오늘의 겸손함을 좀 오래 가져가려고 노력하면서 피로도 풀어야겠다 ㅠ
챗 지피티가 내가 졸린 이유가 오히려 커피를 너무 많이 마셔서 일 수도 있다고 했다! ㅠ
그렇다면 커피를 줄이긴 해야하는데 아득하긴 하다.
아침 한잔만 마시는 정도로 해야 할거 같긴한데 ㅠ
지금 아침 먹고 한잔, 지하철 내려서 학원 오면서 오전에 한잔 점심 먹구 오후에 한잔 최소 세 잔에 요 며칠은 오후에도 맛있다고 미쳐서 커피 마셨던 기억이..... 아니 커피 너무 맛있어 ㄹㅇ..
테이블의 조인 방법 : ANSI(AMERICA NATIONAL STANDARD INSTITUTE, 미국국가표준협회) JOIN
테이블의 셀프 조인
테이블의 아우터 조인
- outer join이면 빈공간이 되는 쪽에 (+) 해줘야 하고, outer join을 입력할거면 (+) 굳이 안써줘도 됨
- null 값이던 녀석에 값을 부여하고 싶으면 NVL을 활용하면 됨
테이블 3개의 조인 : 조인할 테이블 개수-1만큼의 join 절이 나온다.
서브쿼리
+ 지난시간 복습에 추가된 내용
■ 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
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
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시간만 자고 깨버리면.. 음.. 어떡하지 ㅠ
왜냐하면, 실행 순서가 ② ③ ④ ①이어서 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 처럼)
<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 방식이 있다.
RIGHT OUTER JOIN
<17:30 7교시>
emp 테이블과 salgrade 테이블의 JOIN
테이블 3개를 조인시키기!!!!! 야호!!! 혼자 힘으로 해냈다!!!!!(맞으려나 모르겟찌만!!!! 캬캬)
e. 랑 s.을 생략해도 되던데 왜 되는지 아직 모르겠따!
→ 이건 sal, losal, hisal 얘네는 ambiguous하지 않으니까 e. s.을 쓰지 않아도 되고, 개발자로서 습관 들일려면 이렇게 생략하고 쓰는게 좋다고 하셨다!
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';
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';