[DB] SQL

Yujin·2023년 10월 10일
0
post-thumbnail

기존의 데이터 저장 방식

  1. 파일(File) 이용
    • 어디에서나 쉽게 사용 가능
    • 데이터를 구조적으로 관리하기 어려움
  2. 스프레드 시트(Spreadsheet) 이용
    • 테이블의 열과 행을 사용하여 데이터를 구조적으로 관리
    • 한계
      • 크기 : 일반적으로 약 100만 행까지만 저장 가능
      • 보안 : 단순히 파일 또는 링크 소유 여부에 따른 단순한 접근 권한 기능 제공
      • 정확성 : 특정 값이 변경되었을 때, 테이블 모든 위치에서 해당 값을 업데이트 해야 됨
        • 찾기 및 바꾸기 기능을 사용하여 바꿀 수 있지만 데이터가 여러 시트에 분산되어 있는 경우 변경에 누락이 생기거나 추가 문제 발생 가능

데이터베이스 역할

  • 데이터를 저장하고 조작
    • 저장 : 구조적 저장
    • 조작 : CRUD

관계형 데이터베이스

  • 데이터 간에 관계가 있는 데이터 항목들의 모음
  • 테이블, 행, 열의 정보를 구조화하는 방식
  • 서로 관련된 데이터 포인터를 저장하고 이에 대한 액세스 제공
  • 관계 : 여러 테이블 간의 논리적 연결
  • Table (Relation)
    • 데이터를 기록하는 곳
    • 테이블에는 행에서 고유하게 식별 가능한 기본 키라는 속성이 있으며, 외래 키를 사용하여 각 행에서 서로 다른 테이블 간의 관계를 만들 수 있음
  • Field (Column, Attribute)
    • 각 필드에는 고유한 데이터 형식(타입)이 지정됨
  • Record (Row, Tuple)
    • 각 레코드에는 구체적인 데이터 이 저장됨
  • Database (Schema)
    • 테이블의 집합
  • Primary Key (기본 키)
    • 각 레코드의 고유한 값
    • 관계형 데이터베이스에서 레코드의 식별자로 활용
  • Foreign Key (외래 키)
    • 테이블의 필드 중 다른 테이블의 레코드를 식별할 수 있는 키
    • 다른 테이블의 기본 키를 참조
    • 각 레코드에서 서로 다른 테이블 간의 관계를 만드는 데 사용
    • 참조 모델의 고유한 식별 값
    • 외래 키가 반드시 pk일 필요는 없지만 고유한 값을 저장하기 위해 pk를 외래 키로 활용한다.

DMBS

  • Database Management System
  • 데이터베이스를 관리하는 소프트웨어 프로그램
  • 데이터의 저장 및 관리를 용이하게 함
  • 데이터베이스와 사용자 간의 인터페이스 역할
  • 사용자가 데이터 구성, 업데이트, 모니터링, 백업, 복구 등을 할 수 있도록 도움

RDMBS

  • Relational Database Management System
  • 관계형 데이터베이스를 관리하는 소프트웨어 프로그램
  • 종류 - SQLite, MySQL, PorstgreSQL, Oracle Database, …

SQL

  • Structure Query Language
  • 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어
  • 테이블의 형태로 구조화된 관계형 데이터베이스에게 요청을 질의(요청)

SQL Syntax

  • SELECT column_name FROM table_name;
  • SQL 키워드는 대소문자를 구분하지 않음
    • 단, 대문자로 작성하는 것을 권장 (명시적 구문)
  • 각 SQL Statements 끝에는 세미콜론(;) 필요
    • 세미콜론(;)은 각 SQL Statements을 구분하는 방법 (명령어의 마침표)
    • SQL Statements : SQL을 구성하는 가장 기본적인 코드 블록

SQL Statements의 4가지 유형

  1. DDL (Data Definition Language)
  • 데이터의 기본 구조 및 형식 변경
  • CREATE, DROP, ALTER
  1. DQL (Data Query Language)
  • 데이터 검색
  • SELECT
  1. DML (Data Manipulation Language)
  • 데이터 조작 (추가, 수정, 삭제)
  • INSERT, UPDATE, DELETE
  1. DCL (Data Control Language)
  • 데이터 및 작업에 대한 사용자 권한 제어
  • COMMIT, ROLLBACK, GRANT, REVOKE

Query

  • 데이터베이스로부터 정보를 요청하는 것
  • 일반적으로 SQL로 작성하는 코드를 쿼리문(SQL문)이라고 한다.

SELECT statement

  • 테이블에서 데이터를 조회
  • SELECT 키워드 이후 데이터를 선택하려는 필드(열)를 하나 이상 지정
  • FROM 키워드 이후 데이터를 선택하려는 테이블의 이름을 지정
SELECT
    select_list
FROM
    table_name;
  • ‘*’를 사용하여 모든 필드 선택 가능
  • 실행 순서 : FROM → SELECT → ORDER BY
    1. 테이블에서 (FROM)
    2. 조회하여 (SELECT)
    3. 정렬 (ORDER BY)

ORDER BY statement

  • 조회 결과의 레코드를 정렬
  • FROM clause 뒤에 위치
  • 하나 이상의 컬럼을 기준으로 결과를 오름차순(ASC, 기본 값), 내림차순(DES)으로 정렬

정렬에서의 NULL

  • NULL 값이 존재할 경우 오름차순 정렬시 결과에 NULL이 가장 작은 값으로 판단되어 먼저 출력

DISTINCT statement

  • 조회 결과에서 중복된 레코드를 제거
SELECT DISTINCT
  select_list
FROM
  table_name;
  • SELECT 키워드 바로 뒤에 작성
  • SELECT DISTINCT 키워드 다음에 고유한 값을 선택하려는 하나 이상의 필드를 지정

WHERE statement

SELECT
  select_list
FROM
  table_name
WHERE
  search_condition;
  • FROM clause 뒤에 위치
  • search_condition은 비교 연산자 및 논리 연산자(AND, OR NOT 등)를 사용하는 구문이 사용됨
-- 테이블 customers에서 City필드 값인 'Prague'인 데이터의 LastName, FirstName, City 조회
SELECT
  LastName, FirstName, City
FROM
  customers
WHERE
  City = 'Prague';

-- 테이블 customers에서 City필드 값인 'Prague'가 아닌 데이터의 LastName, FirstName, City 조회
SELECT
  LastName, FirstName, City
FROM
  customers
WHERE
  City != 'Prague';

-- 테이블 customers에서 Company 필드 값이 NULL이고 Country 필드 값이 'USA'인 데이터의 LastNme, FirstName, Company, Country 조회
SELECT 
  LastName, FirstName, Company, Country
FROM
  customers
WHERE
  Company IS NULL -- NULL일 땐 IS 사용. (Company = NULL X)
  AND Country = 'USA'; 

-- 테이블 tracks에서 Bytes 필드 값이 100000 이상 500000 이하인 데이터의 Name, Bytes 조회
SELECT 
  Name, Bytes
FROM
 tracks
WHERE
  Bytes BETWEEN 100000 AND 500000;

-- 테이블 tracks에서 Bytes 필드 값이 100000 이상 500000 이하인 데이터의 Name, Bytes를 기준으로 오름차순 조회
SELECT 
  Name, Bytes
FROM
 tracks
WHERE
  Bytes BETWEEN 100000 AND 500000
ORDER BY
  Bytes;

-- 테이블 customers에서 Country 필드 값이 'Canada' 또는 'Germany' 또는 'France'인 데이터의 LastName, FirstName, Country 조회
SELECT
  LastName, FirstName, Country
FROM
  customers
WHERE
  Country IN ('Canada', 'Germany', 'France');
-- WHERE
--   Country = 'Canada'
--   OR Country = 'Germany'
--   OR Country = 'France';

-- 테이블 customers에서 Country 필드 값이 'Canada' 또는 'Germany' 또는 'France'가 아닌 데이터의 LastName, FirstName, Country 조회
SELECT
  LastName, FirstName, Country
FROM
  customers
WHERE
  Country NOT IN ('Canada', 'Germany', 'France');

-- 테이블 customers에서 LastName 필드 값이 son으로 끝나는 데이터의 LastName, FirstName 조회
SELECT
  LastName, FirstName
FROM
  customers
WHERE
  LastName LIKE '%son';

-- 테이블 customers에서 FirstName 필드 값이 4자리면서 'a'로 끝나는 데이터의 LastName, FirstName 조회
SELECT
  LastName, FirstName
FROM
  customers
WHERE
  FirstName LIKE '___a';

비교 연산자

=, ≥, ≤, ≠, IS, LIKE, IN, BETWEEN … AND

논리 연산자

AND(&&), OR(||), NOT(!)

IN Operator

  • 값이 특정 목록 안에 있는지 확인

LIKE Operator

  • 값이 특정 패턴에 일치하는지 여부 확인
  • Wildcards와 함께 사용

Wildcard Characters

  • % : 0개 이상의 문자열과 일치하는지 확인
    • 아래 예시에서 son 앞에 문자가 있는지 여부는 상관 없음
      -- 테이블 customers에서 LastName 필드 값이 son으로 끝나는 데이터의 LastName, FirstName 조회
      SELECT
        LastName, FirstName
      FROM
        customers
      WHERE
        LastName LIKE '%son';
  • _ : 단일 문자와 일치하는지 확인

LIMIT clause

  • 조회하는 레코드 수를 제한
SELECT
  select_list
FROM
  table_name
LIMIT [offset,] row_count;
  • 하나 또는 두 개의 인자를 사용 (0 또는 양의 정수)
  • offset : 선택 사항
  • row_count : 조회하는 최대 레코드 수 지정
  • EX. 앞에 2개 건너뛰고 이후부터 5개 조회
    SELECT
      ..
    FROM
      ..
    LIMIT 2, 5;
  • LIMIT 활용
    -- 테이블 tracks에서 TrackId, Name, Bytes 필드 데이터를 Bytes 기준 내림차순으로 7개만 조회
    SELECT
      TrackId, Name, Bytes
    FROM
      tracks
    ORDER BY
      Bytes DESC
    LIMIT 7;
    
    -- 테이블 tracks에서 TrackId, Name, Bytes 필드 데이터를 Bytes 기준 내림차순으로 4번째부터 7개만 조회
    SELECT
      TrackId, Name, Bytes
    FROM
      tracks
    ORDER BY
      Bytes DESC
    LIMIT 3, 4;
    -- LIMIT 4 OFFSET 3;
    

GROUP BY clause

  • 레코드를 그룹화하여 요약본 생성
  • ‘집계 함수’와 함께 사용
    • 집계 함수(Aggregation Functions)
      • 값에 대한 계산을 수행하고 단일한 값을 반환하는 함수
      • SUM, AVG, MAX, MIN, COUNT
  • FROM과 WHERE 절 뒤에 배치
  • GROUP BY 절 뒤에 그룹화할 필드 목록을 작성
-- Country 필드를 그룹화
SELECT
  Country
FROM
  customers
GROUP BY
  Country;

-- COUNT 함수를 통해 각 그룹에 대한 집계된 값을 계산
SELECT
  Country, COUNT(*)
FROM
  customers
GROUP BY
  Country;

HAVING 절

집계 항목에 대한 조건은 WHERE 절이 아닌 HAVING 절을 사용

-- 에러 발생 (Invalid use of group function)
-- 테이블 tracks에서 Composer 필드를 그룹화하여 각 그룹에 대한 Millieseconds의 평균 값이 10 미만인 데이터 조회
-- 단, Millieseconds 필드는 60000으로 나누어 분 단위 값의 평균으로 계산
SELECT
  Composer,
  AVG(Milliseconds / 60000) AS avgOfMinute
FROM
  tracks
WHERE
  avgOfMinute < 10
GROUP BY
  Composer;

-- 에러 해결 (HAVING clause 사용)
SELECT
  Composer,
  AVG(Milliseconds / 60000) AS avgOfMinute
FROM
  tracks
GROUP BY
  Composer
HAVING
  avgOfMinute < 10;

SELECT statement 실행 순서

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

  1. 테이블에서 (FROM)
  2. 특정 조건에 맞추어 (WHERE)
  3. 그룹화하고 (GROUP BY)
  4. 만약 그룹 중에서 조건이 있을 경우 맞추고 (HAVING)
  5. 조회하여 (SELECT)
  6. 정렬하고 (ORDER BY)
  7. 특정 위치의 값을 가져옴 (LIMIT)

0개의 댓글