logo
Search검색어를 포함하는 게시물들이 최신순으로 표시됩니다.
    Table of Contents
    [SQL] SQL의 CRUD

    이미지 보기

    [SQL] SQL의 CRUD

    • 22.03.14 작성

    • 읽는 데 6

    TOC

    SQL문 CRUD

    • 대문자로 작성
    • 테이블이나 컬럼 이름과 구분 가능

    CREATE : 테이블 생성 및 확인

    문법

    CREATE TABLE [table_name] (col1 val1, col2 val2,..);
    

    예시

    -- classmate 테이블과 함께 data type과 column을 정의
    CREATE TABLE classmate (
      id INTEGER PRIMARY KEY,
      name TEXT
    );
    

    INSERT : 테이블에 데이터 삽입

    문법 1 : 컬럼 명시

    INSERT INTO [table_name] (col1, col2,...) VALUES (val1, val2, ...);
    

    문법 2 : 컬럼 명시 X

    모든 열에 대한 데이터를 순서대로 넣을 때에는 컬럼 생략 가능

    INSERT INTO [table_name] VALUES (val1, val2, ...);
    

    rowid

    Q. id는 어디 있을까?

    • SQLite는 PK 속성 컬럼을 따로 작성하지 않으면, 자동 증가 PK 옵션의 rowid 컬럼을 정의
    • 아래처럼 출력에서 확인할 수 있다.
    SELECT rowid, * FROM classmates;
    

    NOT NULL

    Q. 정의된 어떤 컬럼에 대해 값이 없는 레코드, 이대로 괜찮은가?

    • 스키마를 지정할 때 NOT NULL 속성값을 함께 지정
    • 반드시 들어가야 하는 필드를 특정한다.
    CREATE TABLE classmate (
      id INTEGER PRIMARY KEY,
      name TEXT NOT NULL,
      age INT NOT NULL,
      addresss TEXT NOT NULL
    );
    

    PRIMARY KEY 속성값을 넣는 field의 data type은 반드시 INTEGER 여야 한다!!


    • 스키마에 id를 직접 작성하도록 하였다.
    • 이 테이블 정의 이후 id 없이 INSERT한다면 아래와 같은 오류 발생
    Parse error near line 4: table classmate has 4 columns but 3 values were supplied
    

    id 지정?

    id를 직접 넣는다.

    INSERT INTO classmate VALUES (1, '홍길순', 20, '서울');
    

    column을 선택하고 그에 맞는 value를 매칭해서 넣는다.

    INSERT INTO classmate (name, age, address) VALUES ('홍길동', 30, '서울');
    

    다중 데이터 입력

    • values 뒤의 tuple에 comma로 이어붙이면 된다.
    • 맨 마지막 tuple 뒤에는 semicolon(;) 붙인다.
    INSERT INTO classmates
    VALUES
    ('홍길동', 30, '서울'),
    ('김철수', 30, '대전'),
    ('이벡터', 26, '대구'),
    ('박청년', 29, '전주'),
    ('최정보', 30, '부산');
    

    READ : SELECT

    • 테이블에서 데이터 조회
    • 다양한 절(clause)와 함께 사용
    • ORDER BY, DISTINCT, WHERE, LIMIT, GROUP BY...

    기본 문법

    전체 컬럼 조회

    SELECT * FROM [table_name];
    

    특정 컬럼 조회

    SELECT col1, col2, ... FROM [table_name];
    

    절(Clause)

    LIMIT

    쿼리에서 반환되는 행 수 제한


    문법

    SELECT col1, col2, ... FROM [table_name] LIMIT [num];
    

    예시

    SELECT rowid, name FROM classmates LIMIT 1;
    

    LIMIT OFFSET

    • 특정 행부터 조회 시작
    • OFFSET : 동일 오브젝트 안에서의 변위차
    • 0부터 시작한다고 생각하기
    SELECT rowid, name FROM classmates LIMIT 1 OFFSET 2;
    

    class 테이블의 3번째 레코드부터 1개를 SELECT


    WEHRE

    • 쿼리에서 반환된 행에 대한 특정 검색 조건 지정
    • filter의 역할
    SELECT rowid, name FROM classmates WHERE address = '서울';
    

    SELECT DISTINCT

    • 조회 결과에서 중복 행 제거
    • SELECT 바로 뒤에 위치!!
    SELECT DISTINCT age FROM classmates;
    

    age가 중복되는 상황에서 중복을 제거하고 age만 SELECT


    DELETE

    DELETE FROM [table_name] WHERE [조건]
    
    • DELETE는 테이블을 삭제하는 것이 아니라 레코드를 삭제하는 것
    • 중복 불가능한(UNIQUE) 값인 rowid 위주로 삭제하는 것이 좋다.

    DELETE FROM classmates WHERE rowid=5;
    
    • 이 이후에 레코드를 추가하면 id를 5번부터 누적
    • 즉, id를 재사용한다는 것!

    ID의 재사용?

    Django는 id 재사용 안 하는데요?

    • 기본적으로 SQLite는 id 재사용
    • django는 AUTOINCREMENT 속성을 사용해 id 재사용을 피함!

    AUTOINCREMENT

    • SQLite가 사용되지 않은 값이나 이전에 삭제된 행의 값을 재사용하는 것을 방지
    • 테이블 정의시 초기에 지정
    CREATE TABLE [table_name] (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      ...
    );
    

    DROP : 테이블 삭제

    DROP TABLE [table_name];
    

    UPDATE

    • 기존 행의 데이터 수정
    • SET 절에서 테이블의 각 열에 대해 새로운 값 설정
    UPDATE [table_name] SET col1=val1, col2=val2, ... WHERE [조건]
    
    • SET 이후 수정할 컬럼과 값을 지정
    • 어떤 record를 수정할지 조건절(WHERE)이 추가될 수 있다.

    예시

    UPDATE classmates
    SET name='홍길동', address='제주도'
    WHERE rowid=5;
    

    id가 5인 record의 이름과 주소를 수정

    profile

    FE Developer 박승훈

    노력하는 자는 즐기는 자를 이길 수 없다