SQL-DML(1)

Sejin·2025년 5월 13일
0

Data, DB공부

목록 보기
18/26

SQL

  • 1970년
    SQL(Structured Query Language)은 IBM이 1970년대 초에 SEQUEL(Structured English Query Language)로 개발 → SQL로 변경
  • 1987년
    ISO(국제 표준화 기구)에서 SQL을 표준으로 제정

특징

  • 문법이 사용하기 쉬움

  • 실행 순서와 상관없이 처리 내용을 명령할 수 있음

  • 데이터의 검색, 조작, 정의가 용이함

  • 표준 언어로 구성되어 있음

  • 데이터의 검색, 조작, 정의가 용이함


명령어 종류

DDL(Data Definition Language, 정의어)

  • CREATE, ALTER, DROP(테이블 정의, 수정, 삭제)

DML(Data Manipilation Language, 조작어)

  • SELECT, INSERT, UPDATE, DELETE(검색, 삽입, 수정, 삭제)

DCL(Data Control Language, 제어어)

  • GRANT, REVOKE(접근 권한 관리)
  • TCL((Transaction Control Language)
    : COMMIT, ROLLBACK, SAVEPOINT

SQL문 작성 규칙

  • SQL 문은 대·소문자 구분하지 않음(SELECT와 select는 동일하게 작동)

  • SQL 문은 한 줄 또는 여러 줄로 작성이 가능함

  • 문장 마지막은 세미콜론(;)으로 끝남
    예) SELECT * FROM users WHERE name = 'John' AND birth_date = '2025-01-01';

  • 날짜와 문자열에는 작은 따옴표를 사용함

  • 단어와 단어 사이는 공백 또는 줄바꿈으로 구분함

주석 작성

  • 주석은 SQL 문에 포함되지만 실행되지 않음

  • 단일 행 주석 : -- 로 시작

  • 여러 줄 주석 : /**/로 묶음

  • 예) -- 이것은 단일 행 주석입니다.

  • 예) /* 이것은 여러 줄 주석입니다.*/


테이블 생성 규칙

테이블명

  • 객체를 의미할 수 있는 이름으로, 단수형 사용을 권장함
  • 다른 테이블의 이름과 중복되지 않아야 함

예)

CREATE TABLE 수강 (
수강코드 CHAR(10) PRIMARY KEY,
학번 CHAR(10) NOT NULL,
과목코드 CHAR(10) NOT NULL,
수강일 DATE NOT NULL,
점수 NUMBER,
CONSTRAINT fk_수강_학생 FOREIGN KEY (학번) REFERENCES 학생(학번),
CONSTRAINT fk_수강_과목 FOREIGN KEY (과목코드) REFERENCES 과목(과목코드)
);

칼럼명

  • 한 테이블 내에서는 칼럼이름이 중복되지 않아야 함
  • 테이블 생성시 각 칼럼들은 괄호 내에서 콤마로 구분함
  • 칼럼 뒤에는 데이터 유형을 반드시 지정해야 함

테이블명 & 칼럼명

  • 사전에 정의된 예약어(Reserved word)는 사용이 불가함
  • 허용되는 문자 : 문자, 숫자, 일부 기호(_, $, #)
  • 반드시 문자로 시작해야 하며 숫자나 기호로 시작할 수 없음

제약 조건명

  • 다른 제약 조건의 이름과 중복되지 않아야 함

Oracle 주요 데이터 타입

CHAR

  • 고정 길이 문자열을 저장(최대 2000 바이트)
  • 지정된 길이보다 짧으면 공백으로 채움
  • 'abc = 'abc(공백)'

VARCHAR2

  • 가변 길이 문자열을 저장(최대 4000 바이트)
  • 저장 크기는 입력 데이터의 길이에 따라 결정됨
  • 남는 공간은 사용하지 않음
  • 'abc != 'abc(공백)'

NUMBER

  • 정수 및 소수를 저장
  • 기본값은 가변 길이
  • NUMBER(p, s) : p는 전체 자릿수, s는 소수점 이하 자릿수

  • - NUMBER(8,2) => 전체자리 수 8이고 소수 부분 2자리
    - 3.141592→3.14
    - 167.8888 → 167.89
    - 12345678.88888 → 오류

DATE

  • 날짜와 시간을 저장
    (연, 월, 일, 시, 분, 초 포함)

제약 조건(Constraints)

제약 조건명을 명시적으로 부여할 수 있고, 묵시적으로 제약 조건명 없이 제약 조건을 설정할 수 도 있음

PRIMARY KEY (기본 키)

  • 기본 키를 정의함 (하나의 테이블에 하나의 기본 키 제약만 정의 가능)
  • NOT NULL & UNIQUE

FOREIGN KEY (외래키)

  • 다른 테이블의 기본 키를 참조
  • 외래키 지정시 참조 무결성 제약 옵션 선택

NOT NULL

  • NULL 값의 입력을 허용하지 않는 제약 조건

UNIQUE

  • 해당 칼럼의 값이 테이블 내에서 유일해야 함을
    제약하는 조건

CHECK

  • 입력할 수 있는 값을 제한하는 조건
CHECK (재고량 >= 0 AND 재고량 <= 10000)
CONSTRAINT CHK_CPY CHECK (제조업체 = '한빛제과');

DDL

예제 : 학적정보

CREATE TABLE 학생 [
학번 CHAR(10) PRIMARY KEY CHECK (학번 LIKE 'S%"), -- 학번은 반드시 'S'로 시작
이름 VARCHAR2(50) NOT NULL
성별 CHAR(1) CHECK (성벌 IN ('M", 'F')),
생년월일 DATE NOT NULL,
전공 VARCHAR2(100)

-- 성별믄 'M" 또는 'F'
-- 생년월밀은 NULL 허용 안 함

INSERT ALL
INTO 학생 VALUES ('S001234567', "정수현", "M', TO_DATE('2004-10-09', 'YYYY-MM-DD'), '컴퓨터공학')
INTO 학생 VALUES ('S001234568',"정민기', 'F', TO_DATE('2003-06-01', "YYYY-MM-DD'), '경제학')
:
INTO 학생 VALUES ('S001234588', '무지개",'F', TO_DATE('2001-07-04',"YYYY-MM-DD'), 'Al')
SELECT * FROM dual;

CREATE TABLE 장학금 (
잠학금코드 CHAR(10) PRIMARY KEY,
학번 CHAR(10) NOT NULL,
금액 NUMBER(10,2) NOT NULL,
장학금종류 VARCHAR2(50),
지급일 DATE DEFAULT SYSDATE,.
CONSTRAINT fk_장학금_학생 FOREIGN KEY (학번) REFERENCES 학생(학번) -- 학생 테미블의 학번을 참조

INSERT ALL
INTO 장학금 VALUES('SCH001', 'S001234567', 1000000, '기초 장학금', TO_DATE('2025-01-01', "YYYY-MM-DD'})
INTO 장학금 VALUES('SCH002', 'S001234567', 500000, '성적 장학금', TO_DATE('2025-06-01', "YYYY-MM-DD'))
::
INTO 장학금 VALUES ('SCH007', 'S001234570', 1200000, '기초 장학금', TO_DATE('2025-01-01', "YYYY-MM-DD'})
INTO 장학금 VALUES('SCH008', 'S001234570', 800000, '성적 장학금', TO_DATE('2025-06-01', "YYYY-MM-DD'])
SELECT * FROM dual;
  • 테이블 목록 확인
SELECT * FROM TAB;
  • 테이블 구조 확인
DESCRIBE 학생;
-- 또는
DESC 학생;


제약 조건

  • 모든 제약 조건 조회
SELECT * FROM ALL_CONSTRAINTS;
  • 특정테이블의 제약 조건 조회
SELECT * FROM ALL_CONSTRAINTS
WHERE TABLE_NAME IN ('학생', '수강')
ORDER BYTABLE_NAME;

FK 제약 조건의 옵션

예시 )

CONSTRAINT fk_수강_과목 FOREIGN KEY (과목코드) REFERENCES 과목(과목코드)
ON DELETE CASCADE ON UPDATE RESTRICT;

참조동작

  • ON UPDATE
    외래 키가 참조하는 기본 키가 갱신될 때의 동작을 정의함
  • ON DELETE
    외래 키가 참조하는 기본 키가 삭제될 때의 동작을 정함

참조동작 옵션

  • RESTRICT
    삭제 또는 갱신을 거부함
  • NO ACTION
    RESTRICT과 동일하게 동작함
  • CASCADE
    - 기본 키가 삭제되면 해당 값을 외래 키로 갖는 레코드또 삭제됨
    - 기본 키가 갱신되면 이를 참조하는 외래 키또 새로운 값으로 업데이트됨
  • SET NULL
    기본 키가 삭제되거나 갱신되면 이를 참조하는 외래 키를 NULL로 업데이트함

찹조 무결성 제약 조건 유지

ON DELETE 옵션

  • NO ACTION
    참조되는 튜플을 삭제하지 못하게 함

  • CASCADE
    참조되는 튜플이 삭제될 때 관련 튜플도 함께 삭제함

  • SET NULL
    참조되는 튜플이 삭제될 때 관련 튜플의 외래 키 값을 NULL로 변경함

  • SET DEFAULT
    참조되는 튜플이 삭제될 때 관련 튜플의 외래 키 값을 미리 지정한 기본 값으로 변경함

ON UPDATE 옵션

  • NO ACTION
    참조되는 튜플을 변경하지 못하게 함

  • CASCADE
    참조되는 튜플의 값이 변경될 때 관련 튜플의 외래 키 값도 함께 변경함

  • SET NULL
    참조되는 튜플이 변경될 때 관련 튜플의 외래 키 값을 NULL로 변경함

  • SET DEFAULT
    참조되는 튜플이 변경될 때 관련 튜플의 외래 키 값을 미리 지정한 기본 값으로 변경함

예시1

예시2

테이블 복제

DROP  학생TEMP CASCADE CONSTRAINTS;
CREATETABLE  TABLE 학생TEMP
AS SELECT * FROM 학생;
  • 제약 조건은 NOT NULL만 복제됨
  • PK, FK, UNIQUE, CHECK 등은 수동으로 추가해야 함
SELECT * FROM 학생:
SELECT * FROM 학생TEMP;
SELECT * FROM
WHERE ALL_CONSTRAINTS
TABLE_NAME IN ('학생', '학생TEMP')
ORDER BYTABLE_NAME;

ALTER 문을 통한 테이블 변경

  • 칼럼
    추가/삭제/수정

  • 제약 조건
    추가/삭제

1. 칼럼의 추가(ADD)

새로 추가한 칼럼은 테이블의 맨 마지막에 추가됨

ALTER TABLE 학생TEMP ADD(ADDRESS VARCHAR(80));
DESC 학생TEMP;

2. 칼럼의 삭제(DROP COLUMN)

삭제 후 최소 하나 이상의 칼럼이 테이블에 존재해 야 함

ALTER TABLE 학생TEMP DROP COLUMN ADDRESS;
DESC 학생TEMP;

3. 칼럼명 변경(RENAME COLUMN)

해당 칼럼의 모든 정의가 그대로 유지됨

ALTER TABLE 학생TEMP RENAME COLUMN 학번 TO STUDENT_ID;

DESCRIBE 학생TEMP;

4. 칼럼의 정의 수정(MODIFY)

  • 칼럼의 크기를 확대하는 경우

  • 칼럼의 크기를 확대하는 것은 항상 가능
    칼럼의 크기를 축소하는 경우

  • 테이블에 아무 행도 없을 때
    이 경우에는 칼럼 크기를 자유롭게 축소할 수 있음

  • 해당 칼럼이 NULL만 갖고 있을 때
    NULL 값만 있는 경우에도 칼럼 크기를 축소할 수 있음

• 현재 저장된 값을 수용할 수 있는 크기로의 축소 가능

4. 칼럼의 정의 수정(MODIFY) contʼd

  • NOT NULL 제약 조건 추가
    • 테이블에 아무 행도 없는 경우 가능
    • 해당 칼럼에 NULL이 없을 때 가능

  • NOT NULL 제약 조건 삭제 → 항상 가능
    - NOT NULL 제약 조건 추가/변경
    - NOT NULL 추가
    -- ALTER TABLE 테이블명 MODIFY (속성명 NOT NULL);
    - NULL로 변경
    -- ALTER TABLE 테이블명 MODIFY (속성명 NULL);

  • 예)
    학생TEMP 테이블에서 '이름' 속성이 NULL값을 허용하도록 정의를 변경하시오.

SELECT * FROM 학생TEMP;
DESC 학생TEMP;

ALTER TABLE 학생TEMP MODIFY(이름 NULL);
DESC 학생TEMP;

5. 제약 조건의 추가/삭제(ADD/DROP CONSTRAINT)

테이블 생성 이후에도 제약 조건을 추가/삭제할 수 있음

  • 예)
    TEMP테이블의 'STUDENT_ID' → '학생'테이블의 '학번'을 참조하는 외래키
-- 제약 조건 확인
SELECT * FROM ALL_CONSTRAINTS
WHERE TABLE_NAME ='학생TEMP';

RENAME 문을 통한 테이블 명칭 변경

RENAME 기존 테이블명 TO 새 테이블명

학생TEMP 테이블의 명칭을 OLD_학생TEMP로 변경

DROP 문을 통한 테이블 삭제

DROP TABLE 학생_TEMP; -- 오류  

DROP TABLE 학생 TEMP CASCADE CONSTRAINTS;
-- 제약조건 함께 삭제
profile
Sejin's Journey for Developers

0개의 댓글