자바풀스택 과정/자바 풀 스택 : 수업내용정리

자바 풀 스택 11/22 오전 기록 002-1

파티피플지선 2024. 11. 22. 14:04

7:50 경 학원 도착

8:15 오늘 계획 세우기, 수업 전 준비 세팅 해놓기

 

8:30 어제 내용 복습한 거 노트 정리 : 한손 노트에 CREATE USER 부터 DROP까지 정리함

9:20 명령 프롬프트 실행해보기

 

<9:30 1교시 시작>

윈도우 검색에서 > 서비스를 검색해서 들어가면 백그라운드에서 UI 없이 실행되는 앱들을 볼 수 있다.

OracleServiceXE가 우리가 사용하는 오라클 앱이고, OracleXETNSListener가 누군가의 요청에 접속을 하게 해주는 리스너이다.

이 둘의 시작 유형이 자동으로 되어 있어서 재부팅 시 자동으로 실행되는데, 서버 컴퓨터는 껐다 킬 일이 없어서 거의 문제 없지만, 우리는 껐다 켰다 할거라서 이게 자동으로 실행됐는지 여부를 [서비스]창에서 확인할 수 있다.

오라클 앱이 꽤 무겁게 돌아가기 때문에 집에서 사용한다면 시작 유형을 수동으로 해놓고 필요할 때만 켤 수 있다.

 

 

■ DUAL TABLE 

임의로 입력한 데이터를 확인하고 싶을 때는 DUAL TABLE을 활용한다.

DUAL TABLE은 SQL이 갖고 있는 DUMMY TABLE로, 1X1짜리 임시 테이블이다.

여기서 칼럼명은 DUMMY이고 들어있는 임시 값은 X이다.

이미지에서 'hello'라는 칼럼명을 가진 임시의 듀얼 테이블에 hello라는 row 값이 출력됨

연산한 값을 dual로 조회할 때는 연산한 계산 식이나 계산식의 별칭이 DUMMY 자리에 들어가 칼럼 이름이 되고, X 자리에 연산된 값이 들어간다.

 

 

 

■ SEQUENCE 만들기

SEQUENCE는 특정 값이 일정하게 증가하는 수열을 만드는 명령어라고 생각하면 될 것 같다.

CREATE SEQUENCE (표이름)_seq;로 생성한다. (표 이름을 넣어주는 이유는 SEQUENCE 숫자가 한 두개가 아닐 때 서로를 식별하기 위함)

SEQUENCE를 만드는 이유는 내가 인위적으로 row의 고유 식별값을 넣어주는 번거로움을 없애고 자동화하기 위함이다.

 

글 번호가 항상 연속되는 숫자일 필요는 없다. 중간에 삭제된 데이터일 수도 있고 스킵될 수도 있는데 어쨌든 1개의 고유한 숫자가 부여되니까.

 

이번에는 값이 1만큼 증가하는게 아니라 특정 값만큼 증가하는 시퀀스를 만들어본다.

(그러니까 수열을 만들 껀데 등차수열을 만들겠다는 것이다)

예를 들어 10씩 증가하는 시퀀스를 만들기 위해 increment by 10;이란 조건을 추가하면 디폴트 값인 1부터 10씩 증가하는 시퀀스가 만들어진다. (다른 말로는 a1= 1이고 공차가 +10 인 수열이 만들어진다는거)

디폴트 값을 10으로 바꾸고 싶다면, start with 10이라는 조건을 추가하고 increment by 10;으로 완결하면 10부터 10씩 증가하는 시퀀스가 만들어진다.(다른 말로는 a1=10이라는 설정을 하고, 등차를 10인 등차수열을 만들겠다는 것)

 

 

SEQUENCE는 오라클에서 돌리기에 다소 무거운 명령어라고 한다.

그래서 우리가 보기에는 찰나에 시퀀스가 부여되며 값이 저장되거나 읽힘에도, 컴퓨터 입장에선 버거운 녀석이라 평소에 메모리에 여러 개의 시퀀스(이를테면 1부터 20까지)를 올려놓고 있다가 웹 브라우저에서 입력된 값이 웹 서버에 의해 추출되고 데이터베이스에 저장될 때 자동으로 부여할 수 있도록 준비하고 있다고 한다.

 

그런데 메모리란 녀석은 컴퓨터가 꺼지면 저장되어 있던 정보들이 증발되는 휘발성 저장공간이다.

 

보통 서버 컴퓨터는 따로 꺼지지 않고 켜져 있기 때문에 메모리에 로딩된 몇 개의 시퀀스 식별값이 없어질 일이 없지만,

우리가 연습하는 과정에서는 컴퓨터가 계속 꺼졌다 켜졌다 하기 때문에 나중에 서버를 만들어 시퀀스 값들을 부여할 일이 생기면 중간에 메모리에 로딩되어 있던 몇개의 시퀀스들이 통째로 사라져버리는 일들이 발생할 수 있다고 말씀해주셨다.

예를 들어, 전날 입력한 데이터 값이 5번까지 입력되어 있다가 작업을 끝내고 컴퓨터를 끄고 다음날 작업을 이어서 하려고 켰을 때 전날 메모리에 로딩되어 있던 애들이 1~20까지 였으면 6번부터 20번까지는 날라간 채로 그 다음 순서인 21번부터 40번까지 메모리에 로딩되어 올라간단 의미라 한다. (기능적인 문제는 될 게 없지만 왜 중간 숫자가 증발한거지? 라는 것에 대한 답을 미리 알려주신 거라고 한다)

 

 

이런 식으로 중간에 6번부터 20번까지 날리는 일을 겪고 싶지 않으면 create sequence 후 nocache라는 명령어를 추가해서 애초에 시퀀스로 계산한 값들 여러개가 메모리에 올라갈 일이 아예 없도록 하면 된다고 한다.

 

 

■ DML과 DQL

 DML(data manipulation language) : INSERT, UPDATE, DELETE (커밋과 롤백이 가능)

 DQL(data query language) : SELECT (커밋의 개념이 없음)

 

■ DQL의 구조

5 SELECT  필요한내용 : 필요한 내용을 선택하여 새로운 결과 테이블을 만들어 냄

1 FROM 표이름 : 대상 설정

2 WHERE 조건 : 필요없는 ROW를 배제

3 GROUP BY : 여러 개의 ROW를 하나의 그룹으로 묶인 ROW로 만들어 줌

4 HAVING : 필요 없는 GROUP을 배제한다

6 ORDER BY : 찾은 내용을 정렬하는 방식

 

 

<10:30 2교시 ~3교시> 예제 연습 + 기타 팁들

emp 테이블에서 사원이름과 입사일을 출력하세요.

 

emp테이블에서 사원이름, 급여를 출력하세요.(단 급여가 적은 순서대로)

 

emp 테이블에서 사원번호, 사원이름, 직업을 출력하세요
emp 테이블에서 사원번호, 급여, 부서번호를 출력하세요(단, 급여가 많은 순서대로)
emp 테이블에서 사원 번호, 급여, 입사일을 출력해보세요(단, 급여가 적은 순서대로)
emp 테이블에서 직업, 급여를 출력하세요(직업명으로 오름차순, 급여로 내림차순 정렬하기) → 같은 직업끼리 몰려 있음, 그 다음 같은 직업 내부에서 다른 조건으로 정렬이 됨 →나중에 댓글과 대댓글의 정렬에 사용됨
emp 테이블에서 급여가 2000이상인 사원의 사원번호, 사원이름, 급여를 출력하세요
emp 테이블에서 사원번호,사원이름, 급여를 출력하세요(조건에 맞는 것을 출력하기)-> 10=10이라는 조건은 모두 참이니까 모든 값이 출력됨

 

emp테이블에서 사원번호, 사원이름, 급여를 출력하세요(조건에 맞는 것을 출력하기) -> 10!=10(10이 아닌게 10이다)이라는 조건은 거짓이니까 아무것도 출력되지 않음

 

emp 테이블에서 부서번호가 10번인 사원들의 모든 정보를 출력하세요.
emp 테이블에서 입사일이 '81/02/20'인 사원의 사원번호, 이름, 입사일을 출력하세요.
emp 테이블에서 직업이 'SALESMAN'인 사람들의 이름, 직업, 급여를 출력하세요(단, 급여가 높은 순서대로)
select 한 결과 테이블의 칼럼 영에 별명 붙이기 empno ->사원번호, ename->사원이름으로 변경됨
as와 쌍따옴표를 없애도 되는데, 쌍따옴표를 없앨라면 별칭에 공백이 없어야 함
산술연산자의 값을 확인하기 위해 dual 테이블을 활용하기 : row 값은 20, 칼럼 명은 10+10 또는 RESULT
부서번호가 10번인 사원들의 급여를 출력하되 10%인상된 금액으로 출력하기
부서번호가 10번인 사원들의 급여를 출력하되 10%인상된 금액에 별칭을 개이득으로 붙여서 출력하기

 

 

기존 sal과 10%인상된 sal을 함께 출력하기

 

급여가 3000이상인 사원들의 모든 정보 출력하기

 

부서번호가 30번이 아닌 사람들의 이름과 부서번호를 출력해보세요.

 

논리 연산자 연습 : 부서번호가 10이고, 급여가 3000이상인 사원들의 이름과 급여를 출력하세요.
논리연산자 OR 연습 : 직업이 SALESMAN이거나 MANAGER인 사원의 사원번호, 부서번호를 출력하세요.
부서번호가 10번이거나 20번인 사원의 사원번호와 이름, 부서번호 출력하기

 

 

부서번호가 10번이거나 20번인 사원의 사원번호와 이름, 부서번호를 In을 사용해서 출력하기
Any 연산자 : 급여가 1000, 2000, 3000 중 어느 하나보다도 큰 로우를 비교하고, 조건을 비교하여 어느 하나라도 맞으면 다 선택 => 급여가 1000이상인 로우를 선택하게 되는 결과

 

예시에서는 쓸모 없어보였지만, ANY 연산자를 쓰는 이유는 ()괄호 안에 SELECT 문이 들어갈 수 있기 때문에 배운다.

직업이 매니저인 사원의 급여보다 많이 받는 사원의 사원번호와 급여를 출력하세요.

 

급여가 1000보다도 크고 2000보다도 크고 3000보다도 큰 사원의 사원번호와 급여를 출력하세요.
부서번호가 10인 사원의 급여 중 가장 큰 값보다 더 많은 급여를 받는 사원의 사원번호와 급여를 출력하세요.

 

BETWEEN 연산자 : 급여가 1000과 2000 사이인 사원들의 사원번호, 이름, 급여를 출력하세요.
사원 이름이 FORD와 TURNER 사이에 있는 사원의 사원번호와 사원 이름을 출력하세요.

 

 

■ sql 파일을 이용해서 표를 간단한 방법으로 보기 좋게 만들기

select 로 선택한 값을 출력(조회)할 때 그 위에 출력시에만 형식을 변환시켜주는 방법은 다음과 같다.

ENAME과 JOB의 문자열 길이를 10으로 줄임

근데 이것을 매번 타이핑 하자니 4줄이나 타이핑 해야하니까, 이걸 아예 sql문서로 바꾸고 @에 끌어다 적용시켜서 한줄 만으로도 반복적으로 형식 변형이 용이하게 바꾸는 방법이다.

그 시작은 host로 나가서 메모장에 sql 파일을 만드는 것이다. ( notepad ini.sql )

메모장에 제목.sql 파일이 뜨면 여기다가 항상 간편하게 적용하고 싶은 형식을 모두 긁어 복사 붙여넣기하고

SQL>

을 모두 지우거나

아예 메모장에 형식만을 작성한다.

SQL에서 host로 나와 메모장에 ini.sql을 생성한 모습
메모장에 형식만 작성된 형태

 

메모장에 dir해보면 ini.sql이 81 바이트 크기로 만들어져 있고, host에서 exit 하여 SQL로 돌아와 @ini.sql을 입력하고 하고자 했던 SELECT 문을 실행하면 ini.sql에 네줄로 입력된 형식이 자동 적용된 조회 결과가 나타난다.

 

프롬프트 창을 닫았다 켜서 전체 표를 조회할 때 @ini.sql을 적용해 바로 정돈된 형식을 불러온 화면

이렇게 ini.sql로 만든 파일은 프롬프트 창을 아예 닫았다가 끄고 다시 적용해도 쉽게 적용할 수 있다는 장점이 있다.

 

 

<12:30 4교시>

1~3교시 때 배운 걸로 연습!

나는 챗 GPT에게 scott.sql 의 select 연습문제 좀 알려달라고 했다.

쉬운 문제 몇 개 해보고 시작!

 

EMP 테이블에서 직원의 이름과 급여만 조회하세요.
DEPT 테이블에서 부서 이름과 부서 번호만 조회하세요.
EMP 테이블에서 직무가 'CLERK'인 직원들의 급여( SAL )와 부서 번호( DEPTNO )를 조회하세요.

 

emp 테이블에서 부서 번호가 10과 30 사이에 있는 사원의 사원 번호와 이름을 출력하세요.

 

 

더보기

조건 비교 연산자

EMP 테이블에서 SAL(급여)가 3000 이상인 직원들의 ENAME(이름), JOB(직무), SAL을 조회하세요.


AND, OR 연산자

EMP 테이블에서 DEPTNO(부서번호)가 10번이고 SAL(급여)가 2500 이상인 직원들의 ENAME, JOB, SAL을 조회하세요.


또는 DEPTNO가 20번인 직원들의 ENAME, JOB, SAL을 조회하세요.


BETWEEN 연산자

EMP 테이블에서 HIREDATE(입사일)가 '1981-01-01'과 '1985-12-31' 사이에 해당하는 직원들의 ENAME, HIREDATE를 조회하세요.


IN 연산자

EMP 테이블에서 DEPTNO(부서번호)가 10, 20, 30 중 하나인 직원들의 ENAME, DEPTNO를 조회하세요. -> 변형해서 만듦

 

수학 연산자

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

오호, comm에 null 값이 들어 있던 애들은 더한 값도 null 값이 되네

null 관련 sql 연산자는 아직 안 배웠으니까... 어케 되려나... 음... 음... null을 전부 0으로 바꾸고 더해줘도 될 것 같긴한데. -> 이건 함수 배워야할 수 있다고 하심