Fullstack-Study-241204-250625

커리큘럼(12-30/변경)

01. Java
02. git
03. Database (v)
04. Jsp [Server]

05. 미니프로젝트 (3W)
06. HTML,CSS  
07. JS

08. SpringFramework , SrpingBoot
09. React JS [Front-end]
10. 중간프로젝트 (1M)
11. Linux 명령어
12. AWS 클라우드
13. DevOps - Docker
14. App - Android
15. 최종프로젝트 (1M)

SQL

DML(Data Manipulation Language)

  • 새로운 행 추가(Insert)
  • 기존의 행 변경(Update)
  • 기존의 행 제거(Delete)
  • 작업의 논리적인 단위 형태인 DML 문장의 모음

INSERT

INSERT INTO TABLE명 [(COLUMN1,COLUMN2,...)]
VALUES [(VALUE1,VALUE2,....)];
  • 각각의 열에 대한 값을 포함하는 새로운 행 삽입
  • 테이블에 있는 열의 디폴트 순서로 값 나열
  • INSERT 절에서 열을 선택적으로 나열
  • 문자와 날짜 값은 단일 따옴표 내에 둠
-- 1ST ( 컬럼을 정확히 일치시키는 경우)
INSERT INTO DEPARTMENTS VALUES(280,'DEVELOPER',NULL,1700);

-- 2ND( 컬럼을 지정해서 넣는 경우)
INSERT INTO DEPARTMENTS(DEPARTMENT_ID,DEPARTMENT_NAME,LOCATION_ID) VALUES(280,'DEVELOPER',1700);
INSERT INTO DEPARTMENTS(DEPARTMENT_ID,DEPARTMENT_NAME,LOCATION_ID,MANAGER_ID) VALUES(290,'DBA',1700,100);
  • INSERT문의 서브쿼리리
  • VALUES 절을 사용하지 않음
  • 서브쿼리의 열 수와 INSERT 절의 열 수는 일치해야 함
-- 1ST
INSERT INTO EMPS (EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID)
(SELECT EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID FROM EMPLOYEES WHERE JOB_ID LIKE '%MAN');

-- 2ND
INSERT INTO EMPS (EMPLOYEE_ID, LAST_NAME,EMAIL,HIRE_DATE,JOB_ID)
VALUES( (SELECT EMPLOYEE_ID FROM EMPLOYEES WHERE FIRST_NAME='Lex'),'EXAMPLE','EXAMPLE',SYSDATE,'EXAMPLE');

UPDATE

UPDATE table명
SET column = value [, colum = value, ....]
[WHERE condition]; -- WHERE절이 없으면 모든 행에 대해서 UPDATE구문이 적용되기 때문에 조건설정이 필요
  • 기존의 행 갱신
  • 하나 이상의 행을 갱신 가능
UPDATE EMPS
SET FIRST_NAME='HONG', SALARY=3000, COMMISSION_PCT=0.1
WHERE EMPLOYEE_ID = 120;
  • UPDATE문의 서브쿼리
-- UPDATE문의 서브쿼리
UPDATE EMPS
SET (MANAGER_ID,JOB_ID,SALARY) = (SELECT MANAGER_ID, JOB_ID, SALARY FROM EMPLOYEES WHERE EMPLOYEE_ID=201)
WHERE EMPLOYEE_ID = 120;

DELETE

DELETE FROM table명
[WHERE condition]; -- 조건 설정을 하지 않을 경우 모든 행 삭제
  • 테이블로부터 기존의 행 제거
  • 참조 무결성 제약 조건에 주의해야 함
DELETE FROM EMPS WHERE EMPLOYEE_ID=120;
  • DELETE문의 서브쿼리
DELETE FROM EMPS WHERE JOB_ID = (SELECT JOB_ID FROM EMPLOYEES WHERE EMPLOYEE_ID=121);

MERGE

MERGE INTO table
USING (taget / view / subquery)
ON (join_condition)
WHEN MATCHED THEN
UPDATE SET column1=value1[,....]
WHEN NOT MATCHED THEN
INSERT (column_lists) VALUES (value_lists);
  • DB에 INSERT 또는 UPDATE할 때, 데이터가 존재하는지 여부를 체크하고 존재하면 UPDATE를 하고, 존재하지 않으면 INSERT를 수행
-- 1ST : : 동일한 테이블 구조를 가지고 있는 다른 테이블로부터 데이터를 옮길 떄 
MERGE INTO EMPS E1 -- MERGE를 시킬 타겟테이블
USING (SELECT * FROM EMPLOYEES WHERE JOB_ID LIKE '%MAN') E2 -- 병합할 테이블(서브쿼리)
ON (E1.EMPLOYEE_ID = E2.EMPLOYEE_ID) -- E1과 E2 데이터가 연결되는 조건
WHEN MATCHED THEN -- 일치할 때 수행할 작업
    UPDATE SET E1.SALARY=E2.SALARY, E1.COMMISSION_PCT = E2.COMMISSION_PCT
WHEN NOT MATCHED THEN -- 일치하지 않을 때 수행할 작업
    INSERT (EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID)
    VALUES (E2.EMPLOYEE_ID,E2.LAST_NAME,E2.EMAIL,E2.HIRE_DATE,E2.JOB_ID);

-- 2ND : MERGE문으로 직접 특정 데이터에 값을 넣고자 할 때 사용할 수 있음
MERGE INTO EMPS E1
USING DUAL
ON (E1.EMPLOYEE_ID = 200)
WHEN MATCHED THEN
    UPDATE SET E1.SALARY =10000,
               E1.HIRE_DATE = SYSDATE
WHEN NOT MATCHED THEN
    INSERT(LAST_NAME,EMAIL,HIRE_DATE,JOB_ID)
    VALUES('EXAMPLE','EXAMPLE',SYSDATE,'EXAMPLE');

CTAS(CREATE TABLE AS SELECT)

CREATE TABLE <talbe명> AS SELECT <statement>

  • 현재 있는 테이블과 같은 구조를 갖는 테이블을 생성
  • CTAS 구문을 이요한 테이블 복제시 NOT NULL 제약조건을 제외한 다른 제약조건은 복사되지 않음
CREATE TABLE EMP1 AS (SELECT * FROM EMPLOYEES);
SELECT * FROM EMP1;
CREATE TABLE EMP2 AS (SELECT * FROM EMPLOYEES WHERE 1 =2 ); -- 테이블 구조만 복사
SELECT * FROM EMP2;

트랜잭션(Transaction)

문장 설명
COMMIT 모든 미결정 데이터를 영구적으로 변경함으로서 현재 트랜잭션을 종료
SAVEPOING savepoint_name 현재 트랜잭션 내에 savepoint를 표시
ROLLBACK [[TO [SAVEPOINT]] savepoint_name] ROLLBACK은 모든 미결정 데이터 변경을 버림으로써 현재의 트랜잭션을 종료
COMMIT;
SELECT * FROM DEPTS;

DELETE FROM DEPTS WHERE DEPARTMENT_ID = 10;
SAVEPOINT DEL10; -- 현재 시점을 세이브포인트로 기록

DELETE FROM DEPTS WHERE DEPARTMENT_ID = 20;
SAVEPOINT DEL20;

-- ROLLBACK TO 세이브포인트명
ROLLBACK TO DEL20;
SELECT * FROM DEPTS;

ROLLBACK TO DEL10;
SELECT * FROM DEPTS;

ROLLBACK; -- 마지막 커밋 이후로 돌아가게 됨
SELECT * FROM DEPTS;

-- 커밋( 데이터 변경을 실제 반영) >> COMMIT이후에는 되돌릴 수 없음
INSERT INTO DEPTS VALUES(280,'AAA',NULL,1800);
COMMIT;

DDL(Data Definition Language)

CREATE

CREATE TABLE [schema.] table_name(
column data_type [DEFAULY expr],
....
);
  • 이름 생성 규칙
  • 테이블 이름과 열 이름은 문자로 시작해야 하며 1-30 문자 길이를 가질 수 있음
  • 이름은 오직 A-Z,a-z,0-9,_(underscore),$,# 문자만을 포함
  • 예약어 사용 불가
  • 대소문자 구분하지 않음
  • 데이터형
데이터 형 설명
VARCHAR2(size) 가변 길이 문자 데이터(최대 크기를 명시해야 하며, 최소크기는 1, 최대 크기는 4000바이트)
CHAR(size) size Byte길이의 고정 길이 문자 데이터(디폴트이며 최소 크기는 1, 최대 크기는 2000바이트)
NUMBER(p,s) 전체 p자리와 소수점 이하 s자리를 가지는 숫자(정수부분 자리수 = p-s)
DATE January 1, 4712 B.C.와 December 31,9999 A.D.사이의 날짜와 시간 값
LONG 2GB까지의 가변 길이 문자 데이터
CLOB 4GB까지의 단일 바이트 문자 데이터
RAW(size) size길이의 원시 이진 데이터
LONG RAW 2GB까지의 가변 길이 원시 이진 데이터
BLOB 4GB까지의 이진데이터
BFILE 4GB까지의 외부 파일에 저장된 이진 데이터
CREATE TABLE DEPTS(
    DEPT_NO NUMBER(2), -- 숫자 2자리
    DEPT_NAME VARCHAR2(30), -- 30BYTE(한글은 15글자, 영어는 30글자)
    DEPT_YN CHAR(1), -- 고정 문자 1B ( 고정 크기의 1BYTE 사용)
    DEPT_DATE DATE, --날짜 타입
    DEPT_BONUS NUMBER(10,2), -- 전체 숫자 19자리, 숫자2자리 사용
    DEPT_CONTENT LONG -- 최대 2기가 가변문자열(VARCHAR2 보다 더큰 문제 
);

ALTER

  • 열 추가
ALTER TABLE table_name
ADD         (column data_type[DEFAULT expr]
            [,column data_type]_);
  • ADD절을 사용해 테이블에 열을 추가할 수 있음
  • 새로운 열이 마지막 열이 됨
ALTER TABLE DEPTS ADD (DEPT_COUNT NUMBER(3) );
SELECT * FROM DEPTS;
  • 열 이름 변경
ALTER TABLE table_name
RENAME COLUMN old_name TO new_name;
  • RENAME COLUMN절을 사용해 테이블의 열 이름 변경
ALTER TABLE DEPTS RENAME COLUMN DEPT_COUNT TO EMP_COUNT;
SELECT * FROM DEPTS;
  • 열 수정
ALTER TABLE table_name
MODIFY      (column data_type [DEFAULT expr]
        [, column data_type] _ );
  • MODIFY절을 사용해 기존의 열을 변경
  • 기존의 데이터를 손상되게 크기를 조정할 수는 없음
ALTER TABLE DEPTS MODIFY EMP_COUNT NUMBER(5);
ALTER TABLE DEPTS MODIFY DEPT_NAME VARCHAR2(1); -- 기존 데이터가 변경할 크기를 넘어가는 경우, 변경 불가
DESC DEPTS;
  • 열 삭제
ALTER TABLE table명
DROP COLUMN column명;
  • DROP COLUMN절을 사용해 테이블에서 열을 삭제
ALTER TABLE DEPTS DROP COLUMN EMP_COUNT;
SELECT * FROM DEPTS;

DROP

DROP TABLE table_name [CASCADE CONSTRAINTS];

  • 테이블의 모든 데이터와 구조가 삭제
  • 어떤 결정되지 않은 트랜잭션이 커밋
  • 모든 인덱스가 삭제
  • 이 문장은 롤백할 수 없음
DROP TABLE DEPTS;

TRUNCATE

TRUNCATE TABLE table_name;

  • 테이블의 모든 행을 삭제(테이블의 구조만 남음)
  • 해당 테이블에 사용된 기억공간을 해제
  • TRUNCATE로 삭제한 행은 롤백 할 수 없음
  • 대안으로, DELETE 문장을 사용해 행을 삭제
TRUNCATE TABLE DEPTS;

제약조건

SELECT * FROM user_constraints;

제약조건 설명
NOT NULL 이 열은 NULL값을 포함하지 않음을 지정
UNIQUE KEY 테이블의 모든 행에 대해 유일해야 하는 값을 가진 열 또는 열의 조합 지정(NULL 허용)
PRIMARY KEY 유일하게 테이블의 각 행을 식별(== NOT NULL + UNIQUE)
FOREIGN KEY 열과 참조된 테이블의 열 사이의 외래키 관계를 적용하고 설정(중복, NULL 허용)
CHECK 참이어야 하는 조건을 지정
CREATE TABLE DEPTS(
    DEPT_NO NUMBER(2)       CONSTRAINT DEPTS_DEPT_NO_PK PRIMARY KEY,
    DEPT_NAME VARCHAR2(30)  CONSTRAINT DEPTS_DEPT_NAME_NN NOT NULL,
    DEPT_DATE DATE          DEFAULT SYSDATE, -- 값이 들어오지 않을 떄 자동으로 지정되는 값
    DEPT_PHONE VARCHAR2(30) CONSTRAINT DPETS_DEPT_PHONE_UK UNIQUE,
    DEPT_GENDER CHAR(1)     CONSTRAINT DEPTS_DEPT_GENDER_CK CHECK(DEPT_GENDER IN ('F','M')),
    LOCA_ID NUMBER(4)       CONSTRAINT DEPTS_LOCA_ID_FK REFERENCES LOCATIONS(LOCATION_ID)
);
DESC DEPTS;

-- CONSTRAINTS는 생략가능
DROP TABLE DEPTS;
CREATE TABLE DEPTS(
    DEPT_NO NUMBER(2)       PRIMARY KEY,
    DEPT_NAME VARCHAR2(30)  NOT NULL,
    DEPT_DATE DATE          DEFAULT SYSDATE, -- 값이 들어오지 않을 떄 자동으로 지정되는 값
    DEPT_PHONE VARCHAR2(30) UNIQUE,
    DEPT_GENDER CHAR(1)     CHECK(DEPT_GENDER IN ('F','M')),
    LOCA_ID NUMBER(4)       REFERENCES LOCATIONS(LOCATION_ID)
);
CREATE TABLE EMP4(
    EMPNO NUMBER(4),
    ENAME VARCHAR2(10) NOT NULL,
    SAL NUMBER(7,2),
    DEPTNO NUMBER(2),
    CONSTRAINT emp5_empno_pk PRIMARY KEY(EMPNO),
    CONSTRAINT emp5_sal_ck CHECK(SAL<=10000),
    CONSTRAINT emp5_deptno_dept_deptid_fk
        FOREIGN KEY (DEPTNO) REFERENCES DEPARTMENTS(DEPARTMENT_ID)
);
  • 제약 조건의 추가 또는 삭제는 가능하나 수정은 불가능
  • 제약조건의 활성화 또는 비활성화 가능
  • MODIFY절을 사용해 NOT NULL조건 추가 가능

ALTER TABLE DEPTS ADD CONSTRAINT DEPT_NO_PK PRIMARY KEY(DEPT_NO); -- PK추가 ALTER TABLE DEPTS MODIFY DEPT_NAME VARCHAR(30) NOT NULL;-- NOT NULL은 MODIFY 구문으로 열 변경으로 추가 ALTER TABLE DEPTS ADD CONSTRAINT DEPT_PHONE_UK UNIQUE (DEPT_PHONE); -- UK 추가 ALTER TABLE DEPTS ADD CONSTRAINT DEPT_GENDER_CK CHECK(DEPT_GENDER IN ('F','M')); -- CK 추가 ALTER TABLE DEPTS ADD CONSTRAINT DEPT_LOCA_ID_FK FOREIGN KEY(LOCA_ID) REFERENCES LOCATIONS(LOCATION_ID); -- FK추가

-- 제약 조건의 삭제 ALTER TABLE DEPTS DROP PRIMARY KEY; -- 이렇게 지울수 있음 ALTER TABLE DEPTS DROP CONSTRAINT DEPT_LOCA_ID_FK;