-- sql developer 에서 한 줄 주석문
/**/ sql developer 에서 여러 줄 주석문
작성 후 Ctrl + Enter 누르면 작성문 실행 됨
1. 테이블
2. 행
3. 열
1. DDL(Data Define Language : 데이터 정의 언어)
- CREATE : 데이터베이스 또는 테이블을 생성하는 명령어
- ALTER : 테이블을 수정하는 명령어
- DROP : 데이터베이스 또는 테이블을 삭제하는 명령어
- TRUNCATE : 테이블을 초기화하는 명령어
2. DML(Data Manipulation Language : 데이터 조작 언어)
==> 데이터베이스에서 가장 많이 사용하는 명령어
- SELECT : 데이터를 검색하는 명령어
- INSERT : 데이터를 추가하는 명령어
- UPDATE : 데이터를 수정하는 명령어
- DELETE : 데이터를 삭제하는 명령어
3. DCL(Data Control Language : 데이터 제어 언어)
- GRANT : 특정 데이터베이스 사용자에게 작업의 특정 수행 권한을 부여하는 명령어
- REVOKE : 특정 데이터베이스 사용자에게 작업의 특정 수행 권한을 삭제하는 명령어
- COMMIT : 트랜잭션 작업을 완료하는 명령어
- ROLLBACK : 트랜잭션 작업을 취소하거나, 이전 상태로 복구하는 역할을 하는 명령어
1. number(n, n1): 숫자 자료형(정수, 실수)
2. char(n) : 문자열 n개가 저장되는 자료형 ==> 고정 자료형
3. varchar(n) : 문자열 n개가 저장되는 자료형 ==> 가변 자료형
※ 현재 오라클에서는 사용하지 않는 자료형
4. varchar2(n) : 문자열 n개가 저장되는 자료형 ==> 가변 자료형
※ 한글은 무조건 한 글자당 2바이트씩 사용됨
5. date : 날짜가 저장되는 자료형 ==> 시스템의 현재 날짜 및 시간이 저장됨
무결성(Integrity) : 데이터베이스에 저장된 값과 그것이 표현하는 현실
세계의 실제 값이 일치하는 정확성을 의미함
무결성 제약조건 : 데이터베이스에 저장된 데이터의 정확성을 보장하기 위해서 정확하지 않은 데이터가 데이터 베이스 내에 저장되는 것을 방지하기 위한 조건
데이터베이스 내에서 사용되는 무결성 제약조선의 종류
1. unique 제약 조건
==> 중복이 되면 안 되는 제약 조건
2. not null 제약 조건
==> 공백(null)을 허용하지 않는 제약 조건
3. check 제약 조건
==> 특정한 값이 아닌 데이터가 들어오지 못하게 하는 제약 조건
4. 기본키(primary key) 제약 조건
==> nuique + not null 제약 조건
==> 기본 키는 해당 테이블을 데표하는 컬럼으로써의 역할을 수행하며, 다른 테블에서 외래키들이 참조할 수 있는 키로써의 자격을 가짐
5. 외래 키(foreign key) 제약 조건
==> 외래키는 다른 테이블의 기본 키(primary key)를 참조하는 컬럼의 집합임 여기서의 외래 키 값은 참조하고 있는 테이블의 기본 키에 없는 내용을 참조할 수 없음 이를 참조 무결성(Referential Integrity)이라고 함
학생 테이블을 만들어 보자
구성 요소(컬럼 - 속성)
==> 학번, 이름, 학과, 연락처, 주소, 재학여부, 등록일(입학일) 등등
테이블을 만드는 형식
형식)
create table 테이블명(
학번 자료형(크기) [제약조건 - 생략 가능],
이름 자료형(크기) [제약조건],
학과 자료형(크기) [제약조건],
연락처 자료형(크기) [제약조건],
주소 자료형(크기) [제약조건],
재학여부 자료형(크기) [제약조건],
등록일 자료형(크기) [제약조건]
--> 이름은 한글, 영어 다 가능하며 제약조건 생략시 제약조건 없음
);
create문 작성

create table student(
hakbun VARCHAR2(10) PRIMARY KEY,
name VARCHAR2(30) not null,
major VARCHAR2(40),
phone VARCHAR2(20) not null,
addr VARCHAR2(200),
status VARCHAR2(1),
regdate date not null, -- 컬럼 상에서의 제약조건
CONSTRAINT status_chk CHECK(status in('y','n')) -- 테이블 상에서의 제약조건
-- status 컬럼에는 y나 n만 들어갈 수 있음
); -- Ctrl + Enter 누르면 실행
student 테이블에 들어가면 컬럼들을 확인할 수 있음
student 테이블에 데이터(학생 정보)를 추가해 보자
형식1)
insert into 테이블명 values(컬럼1 데이터,컬럼2 데이터,...마지막 컬럼 데이터);
==> 모든 컬럼에 데이터를 넣어야 함
INSERT INTO student VALUES('2024_001','홍길동','경제학과','010-1111-1234','서울','y',sysdate);
형식 2)
insert into 테이블명(not null 제약 조건 컬럼명을 기재)
VALUES();
==> 제약 조건 컬럼명과 값은 1대1로 매칭이 되어야 함 수가 다르면 오류 뜸
INSERT into student(hakbun, name, phone, regdate)
VALUES('2024_002','세종대왕','010-2222-2345',sysdate);
-- 1대1로 매칭이 되어야 함 수가 다르면 오류 뜸
commit --> insert문을 작성했더라도 COMMIT이 없으면 다시 해야 됨
COMMIT;

형식1로 삽입 시 만약 check로 설정한 y,n 외의 문자가 들어가면 오류발생

정확한 내용으로 삽입을 해 주면 Student 테이블 데이터에 맞는 값이 들어가짐

null 값을 허용했기에 형식2로 삽입해주느 2번에는 null이 들어가도 됨
insert into student VALUES('2024_003','이순신','체육학과','010-3333-3456','경기도','y',sysdate);
Insert into student VALUES('2024_004','유관순','역사학과','010-4444-4567','전라도','n',sysdate);
insert INTO student (hakbun,name,phone,regdate)
VALUES('2024_005','심사임당','010-5555-5678',sysdate);
commit;


테이블의 컬럼을 수정하는 방법(컬럼의 전체적인 내용 수정)
형식) alter table 테이블명 modify(컬럼명 자료형(크기));
ALTER TABLE student MODIFY(age VARCHAR2(3));


테이블의 컬럼명을 변경해야 하는 경우
형식) alter table 테이블명 rename column 기존컬럼명 to 변경할컬럼명;
ALTER TABLE student RENAME COLUMN name to IRUM;


-- 테이블의 컬럼을 삭제해야 하는 경우
형식) alter table 테이블명 drop column 컬럼명;
ALTER TABLE student DROP COLUMN age;

모든 명령은 ctrl + Enter을 통해 수행하며 출력된 스크립트를 확인하고 student 테이블에서 변경된 내용들을 확인할 수 있음

데이터를 수정하는 방법 (primary로 된 값은 수정이 안 됨)
형식) update 테이블명 set 수정할 컬럼명 = 값, 수정할 컬럼명 = 값
where 기본키컬럼명 = 값;
UPDATE student SET major = '국문학과', addr = '서울시 중구', status='y'
WHERE hakbun = '2024_002';


UPDATE student SET addr = '서울시 구로구'
WHERE hakbun = '2024_001';

null 값이 아닌 곳도 변경 가능

테이블에서 데이터를 삭제하는 방법
형식) delete from 테이블이름 where 기본컬럼명 = 값;
DELETE from student WHERE hakbun = '2024_004';

데이터를 검색하는 명령어
student 테이블에 있는 모든 데이터를 화면에 보여주세요
형식) select * from 테이블명;
SELECT * FROM student;

보고 싶은 컬럼만 보이게 하고 싶은 경우
형식) select 컬럼명, 컬럼명2, 컬럼명3,... from 테이블명;
SELECT hakbun, irum FROM student;

COMMIT;
ROLLBACK;

[문제1] emp 테이블에서 empno, ename, job, deptno 컬럼을 화면에 보여주세요
SELECT empno, ename, job, deptno FROM emp;

[문제2] emp 테이블에서 이름, 입사일, 급여를 화면에 보여주세요
SELECT ENAME, HIREDATE, SAL FROM EMP;

[문제3] emp 테이블에서 사번, 이름, 담장업무, 보너스를 화면에 보여주세요
SELECT EMPNO, ENAME, JOB, COMM FROM EMP;

[문제4] emp 테이블에서 사번, 이름, 급여, 보너스, 급여 + 보너스 결과를 화면에 보여주세요
SELECT EMPNO, ENAME, SAL, COMM, SAL+COMM FROM EMP;

둘 다 값이 있는 경우 계산이 되지만 NULL을 갖고 있는 경우 null 값이 우선순위가 높아서 null 값이 나오게 됨
--> null 값을 가지는 컬럼은 다른 컬럼과 연산을 하게 되면 모두 null 값으로 처리가 되는 문제 발생
null 값을 특정한 값으로 변경시켜 주는 함수
형식) NVL(null 값이 들어가 있는 컬럼명, 변경할 값)
SELECT EMPNO, ENAME, SAL, COMM, SAL+NVL(COMM,0) FROM EMP;

자바에서의 3항연산자와 비슷한 함수
형식) NVL2(컬럼명,EXPR1, EXPR2)
-- ==> 컬럼에 들어 있는 값이 null이 아니면 expr1 값을 반환, null이면 expr2 값을 반환
SELECT EMPNO, ENAME, SAL, COMM, SAL + NVL2(COMM, COMM, 0) FROM EMP;

-- AS 키워드 : 컬럼의 제목(TITLE)의 이름을 변경시키는 키워드, 별칭 또는 별명이라고도 하며 사용 시에는 컬럼명 바로 뒤에 사용을 함
-- 컬럼명과 별칭 사이에 as라는 키워드를 넣어주면 되며 보통 별칭은 ""(쌍따움표) 안에 작성
SELECT EMPNO, ENAME, SAL, COMM, SAL + NVL2(COMM, COMM, 0) as "급여 + 보너스" FROM EMP;
as 라는 키워드를 생략해도 됨
SELECT EMPNO, ENAME, SAL, COMM, SAL + NVL2(COMM, COMM, 0) "급여 + 보너스" FROM EMP;

[문제5] emp 테이블에서 사번, 이름, 급여, 급여의 10% 인상액을 화면에 보여주세요
SELECT EMPNO, ENAME, SAL, (SAL+(SAL*0.1)) AS "10%인상급여" FROM EMP;
SELECT EMPNO, ENAME, SAL, SAL*1.1 "10%인상급여" FROM EMP;

SELECT JOB FROM EMP;

SELECT mgr FROM emp;

distinct 키워드 : 중복을 제거해 주는 명령어(키워드)
- 주로 하나의 컬럼에서 중복된 값을 제거하고 보여줄 때 사용
- distinct 키워드는 항상 select 키워드 다음에 기술
- distinct 키워드 뒤에 나오는 컬럼들은 모두 distinct의 영향을 받음
- distinct 키워드 뒤에 여러 개의 칼럼이 기술이 되면해당 컬럼들은 중복이 되지 않게 나타난다
select DISTINCT job from emp;

SELECT DISTINCT mgr FROM emp;

SELECT DISTINCT job, mgr, deptno from emp;
