우리는 Oracle의 sql을 사용할 것이기에 Oracle의 SQL Developer에서 소프트웨어를 다운받아보자.
docker로 선생님께서 만든 서버를 다운받을 것이다. 이 서버에 접속하기 위해서는 프로그램이 필요한데 이 때 사용할 수 있는 프로그램 중 하나가 오라클이다.
예전에 데이터베이스가 없던 시절에는 파일에 정보를 저장했지만, 관리도 힘들고 수정도 힘들어 이를 보완하기위해 데이터베이스라는 것이 생기게 되었다. 이 것들을 접속해서 관리를 하는 프로그램이 필요한데 이것을 DBMS(datbase managemant system)이고 그 중 하나가 oracle이다.
오라클과 서버를 설치했으니 오라클에서 서버에 접속해보자.

오라클에 들어가서 새 데이터베이스 접속을 눌러 데이터베이스에 오라클을 연결해 줄수 있다.
들어가면
이 것들을 입력하고 테스트를 눌러 성공이 뜨면 연결 된 것이다. 이 컴퓨터가 가지는 ip(localhost)를 인식하여 이 컴퓨터에 있는 데이터베이스중 서비스 이름과 같은 데이터베이스를 찾아서 연결한다.
실무에서는 슈퍼컴퓨터나 클라우드회사에 서버를 설치하고 거기에 팀원들이 오라클로 서버에 접속을 하는 것이다. 오라클로 db에 접속해 데이터들을 관리할 수 있다.
(1) 왼쪽창 접속정보 오른쪽 클릭 -> 속성 : 접속정보 창이 뜸
(2) Name : 접속정보 이름(별명)
(3) 사용자이름 : system (관리자계정), 최초 설치하면 계정이 있음
(4) 비밀번호 : Ds1234567890
(5) 호스트이름 : ip주소 (인터넷주소) 또는 localhost(개인pc)
(6) 포트 : 1521 (오라클 DB 기본 포트(port) 정보)
- 복습 예): ip주소 : 192.168.0.1:80, 뷰실습 : http://localhost:8080
(7) 서비스 이름 : xepdb1 (DB 이름)
개발자가 개발을 할 때 많은 권한이 부여되면 사고를 칠 수 있으니까 관리자는 권한을 제한할 수 있다.
CREATE USER SCOTT IDENTIFIED BY "!Ds1234567890" //
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;
// scott개발자는 users폴더와 temp폴더만 접근할 수 있도록 접근권한을 제한하였다.
// 유저가 사용할 기본 공간 : USERS 공간
// 유저가 사용할 임시 공간 : TEMP
GRANT CONNECT, RESOURCE, CREATE VIEW TO SCOTT; // 개발자는 이 권한만 갖게 된다.
GRANT UNLIMITED TABLESPACE TO SCOTT;
-- CONNECT 권한 : 접속 권한
-- RESOURCE 권한 : 테이블 등을 사용할 권한
-- CREATE VIEW 권한 : 뷰를 만들 권한
-- UNLIMITED TABLESPACE 권한 : 테이블 생성시 사용할 물리공간 무한으로 사용하는 권한
// 사용법) GRANT 권한명,권한명2... TO 계정명;
이렇게만 권한을 부여하도록 할 수 있다. 그런데 이런 일은 관리자가 보통 하는 일이라 참고만 해도 좋을 듯 하다.

사용자 이름에 scott을 넣어주면 관리자가 scott에 부여한 권한을 갖는 계정을 만들 수 있다. 만약 관리자가 먼저 개발자 계정 설정을 안 해주면 만들 수 없다.
db접속파일이 한개 더 생겼다.
테이블은 컴퓨터 폴더와 비슷한 개념으로, db의 가장 작은 공간이다.
여기에 테이블 자료가 있다.
여기서 세로 줄은 컬럼(COLUMN)이라고 하고 가로줄은 행(ROW)라고 한다.
SELECT * FROM department;
select에 CULUMN명 from 테이블명을 해주면 해당 테이블에서 특정 컬럼에 해당하는 조회가 가능하다. 이걸 실행해주면 다음과 같은 테이블이 결과로 출력된다.
여기서 *은 전체를 의미한다.
SELECT에 여러개의 컬럼을 주면 그 컬럼을 모두 조회가 가능하다.
SELECT ENO, ENAME FROM EMPLOYEE;
사원넘버와 사원명을 가져와보자

다음과같이 두 컬럼에 해당하는 값을 테이블 형태로 가져올수 있다.
컬럼은 연산이 가능하다. 값이 숫자인 컬럼은 곱하기 연산이 가능하다.
SELECT SALARY * 12 FROM employee;

월급에 12가 곱한 값이 나왔다.
물론 더하기 연산도 가능하다.
SELECT SALARY * 12 + commission FROM employee;
월급에 12를 곱해 연봉을 구하고 상여금을 더해주었다.

DB에서 아무값이 들어가 있지 않으면 null로 표시된다. 이것은 산술이 안되기에 이것을 숫자 0으로 바꿔주는 함수를 사용해서 산술을 할 수 도 있다.
문제점 : DB 에서 NULL 은 아무것도 없는 값을 의미, 특징은 산술연산이 안됨 : NULL * 숫자 = NULL
해결 : NULL -> 숫자로 바꾸는 함수를 사용해서 개선할 수 있음 :
NVL(컬럼, 0) => 컬럼에 NULL 값은 0으로 변경됨
SELECT ENAME, SALARY * 12 + NVL(COMMISSION, 0) FROM employee;

NULL이 모두 사라지고 0으로서 계산된 것을 확인 할 수 있다.
컬럼에 연산이 들어가면 결과화면에 나오는 컬럼이름이 보기싫게 길어진다. 이것은 개발자가 다른이름으로 바꿀수 있다.(실제로 컬럼의 제목은 변하지 않음 보기에만 변함)
SELECT ENAME, SALARY * 12 + NVL(COMMISSION, 0) AS 연봉 FROM employee;
이름이 연봉으로 바꼈다.

EMPLOYEE에 DNO는 중복된 값이 많이 있다. 이 값을 출력할때는 중복된 값을 없애서 출력되게 해보자
SELECT DISTINCT DNO FROM EMPLOYEE;

중복된 값을 제외하고 값이 나온 것을 확인할 수 있다.
DB에서는 문자열을 홑따옴표를 이용해서 나타낸다.
SELECT '홍길동' FROM DUAL;

여기서 DUAL은 오라클에서 제공하는 테이블로 계산이나 출력의 결과를 보여줄때 사용된다.
SELECT 4*5+1 FROM DUAL;

SELECT SYSDATE FROM DUAL;

조건을주면 그 조건에 해당하는 내용만 출력이 되게 할 수 있다.
예를들어 월급이 1500 이상인 사원만 조회하고 싶은 경우가 있다. 이때 where을 사용하여 조건을 줄 수 있다.
DB에서 비교연산자는 자바와 비슷하지만 같다와 같지않다가 차이가 있다.
where은 from뒤에 테이블명이 다 끝난뒤 제일 마지막에 붙여준다.
SELECT ENAME, SALARY FROM EMPLOYEE
WHERE SALARY >= 1500;

월급이 1500이상인 사람의 이름과 샐러리를 볼 수 있다.
문자열도 "="으로 비교가 가능하다.
SELECT * FROM employee
WHERE JOB = 'CLERK';

직업이 CLERK인 것만 출력이된다.
DB에서는 날짜도 문자열형태로 비교가 가능하다. 홑따옴표를 이용해서 비교를 하면된다.
SELECT * FROM EMPLOYEE
WHERE HIREDATE <= '81/01/01';
입사일이 81년 1월 1일 이상인 사람만 출력하게 했다.

날짜는 이상 이하도 비교가 가능한데, 이상이면 이후의 날짜이고 이하면 이전의 날짜이다.
DB의 논리 연산자에는 AND, OR, NOT이 있다. WEHRE조건문에 이것들을 부여하면서 범위를 좁힐 수 있다.
SELECT * FROM employee
WHERE dno = 10 AND job = 'MANAGER';
사원번호가 10이면서 직업이 매니저인 사람들을 출력해보자

AND를 이용해 조건을 주어줬다.
여기서 NOT은 특정 조건이 아닌 모든 것들을 보여준다. WHERE 바로 뒤에 사용하면 된다. 물론 <>를 사용할 수도 있다.
SELECT * FROM employee
WHERE NOT dno = 10;

10번없이 잘 출력되었다.
부등호를 이용해서 특정 수 사이의 값을 구할 수도있지만 BETWEEN을 이용해서 구할 수도 있다.
SELECT * FROM employee
WHERE SALARY BETWEEN 1000 AND 1500;
다음과 같이 사용하면 셀러리의 값이 1000과 1500사이의 DATA가 나오게 된다.
참고로 사잇값은 특정값을 포함하는 값이다.
BETWEEN은 사이값을 구하는 예약어였는데 여기에 NOT을 붙이면 그 값을 제외하고 남은 값들을 구하게 된다. 그래서 특정값은 포함되지 않는다.
SELECT * FROM employee
WHERE SALARY NOT BETWEEN 1000 AND 1500;

1000미만 1500초과인 DATA만 출력이 된다.
IN은 OR이 여러개 사용될때 이것의 불편함을 덜어 줄 수 있다. OR을쓰는대신 IN()의 괄호안에 조건을 여러개 넣으면 된다.
SELECT * FROM employee
WHERE DNO IN(10, 20);
DNO가 10이거나 20인 사람들의 data를 출력한다.

IN 앞에 NOT을 붙이면 IN에 포함된 것들을 제외한 데이터들을 출력한다.
SELECT * FROM EMPLOYEE
WHERE COMMISSION NOT IN (300, 500, 1400);
COMMISSION이 300도 아니고, 500도 아니고, 1400도 아닌 값들만 출력되었다.